Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Side by Side Diff: runtime/bin/http.dart

Issue 11337019: Use patching for dart:io. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 /**
6 * HTTP status codes.
7 */
8 abstract class HttpStatus {
9 static const int CONTINUE = 100;
10 static const int SWITCHING_PROTOCOLS = 101;
11 static const int OK = 200;
12 static const int CREATED = 201;
13 static const int ACCEPTED = 202;
14 static const int NON_AUTHORITATIVE_INFORMATION = 203;
15 static const int NO_CONTENT = 204;
16 static const int RESET_CONTENT = 205;
17 static const int PARTIAL_CONTENT = 206;
18 static const int MULTIPLE_CHOICES = 300;
19 static const int MOVED_PERMANENTLY = 301;
20 static const int FOUND = 302;
21 static const int MOVED_TEMPORARILY = 302; // Common alias for FOUND.
22 static const int SEE_OTHER = 303;
23 static const int NOT_MODIFIED = 304;
24 static const int USE_PROXY = 305;
25 static const int TEMPORARY_REDIRECT = 307;
26 static const int BAD_REQUEST = 400;
27 static const int UNAUTHORIZED = 401;
28 static const int PAYMENT_REQUIRED = 402;
29 static const int FORBIDDEN = 403;
30 static const int NOT_FOUND = 404;
31 static const int METHOD_NOT_ALLOWED = 405;
32 static const int NOT_ACCEPTABLE = 406;
33 static const int PROXY_AUTHENTICATION_REQUIRED = 407;
34 static const int REQUEST_TIMEOUT = 408;
35 static const int CONFLICT = 409;
36 static const int GONE = 410;
37 static const int LENGTH_REQUIRED = 411;
38 static const int PRECONDITION_FAILED = 412;
39 static const int REQUEST_ENTITY_TOO_LARGE = 413;
40 static const int REQUEST_URI_TOO_LONG = 414;
41 static const int UNSUPPORTED_MEDIA_TYPE = 415;
42 static const int REQUESTED_RANGE_NOT_SATISFIABLE = 416;
43 static const int EXPECTATION_FAILED = 417;
44 static const int INTERNAL_SERVER_ERROR = 500;
45 static const int NOT_IMPLEMENTED = 501;
46 static const int BAD_GATEWAY = 502;
47 static const int SERVICE_UNAVAILABLE = 503;
48 static const int GATEWAY_TIMEOUT = 504;
49 static const int HTTP_VERSION_NOT_SUPPORTED = 505;
50 // Client generated status code.
51 static const int NETWORK_CONNECT_TIMEOUT_ERROR = 599;
52 }
53
54
55 /**
56 * HTTP server.
57 */
58 abstract class HttpServer {
59 factory HttpServer() => new _HttpServer();
60
61 /**
62 * Start listening for HTTP requests on the specified [host] and
63 * [port]. If a [port] of 0 is specified the server will choose an
64 * ephemeral port. The optional argument [backlog] can be used to
65 * specify the listen backlog for the underlying OS listen
66 * setup. See [addRequestHandler] and [defaultRequestHandler] for
67 * information on how incoming HTTP requests are handled.
68 */
69 void listen(String host, int port, [int backlog]);
70
71 /**
72 * Attach the HTTP server to an existing [:ServerSocket:]. If the
73 * [HttpServer] is closed, the [HttpServer] will just detach itself,
74 * and not close [serverSocket].
75 */
76 void listenOn(ServerSocket serverSocket);
77
78 /**
79 * Adds a request handler to the list of request handlers. The
80 * function [matcher] is called with the request and must return
81 * [:true:] if the [handler] should handle the request. The first
82 * handler for which [matcher] returns [:true:] will be handed the
83 * request.
84 */
85 addRequestHandler(bool matcher(HttpRequest request),
86 void handler(HttpRequest request, HttpResponse response));
87
88 /**
89 * Sets the default request handler. This request handler will be
90 * called if none of the request handlers registered by
91 * [addRequestHandler] matches the current request. If no default
92 * request handler is set the server will just respond with status
93 * code [:NOT_FOUND:] (404).
94 */
95 void set defaultRequestHandler(
96 void handler(HttpRequest request, HttpResponse response));
97
98 /**
99 * Stop server listening.
100 */
101 void close();
102
103 /**
104 * Returns the port that the server is listening on. This can be
105 * used to get the actual port used when a value of 0 for [port] is
106 * specified in the [listen] call.
107 */
108 int get port;
109
110 /**
111 * Sets the error handler that is called when a connection error occurs.
112 */
113 void set onError(void callback(e));
114
115 /**
116 * Set the timeout, in seconds, for sessions of this HTTP server. Default
117 * is 20 minutes.
118 */
119 int set sessionTimeout(int timeout);
120 }
121
122
123 /**
124 * Access to the HTTP headers for requests and responses. In some
125 * situations the headers will be imutable and the mutating methods
126 * will then throw exceptions.
127 *
128 * For all operation on HTTP headers the header name is
129 * case-insensitive.
130 */
131 abstract class HttpHeaders {
132 static const ACCEPT = "Accept";
133 static const ACCEPT_CHARSET = "Accept-Charset";
134 static const ACCEPT_ENCODING = "Accept-Encoding";
135 static const ACCEPT_LANGUAGE = "Accept-Language";
136 static const ACCEPT_RANGES = "Accept-Ranges";
137 static const AGE = "Age";
138 static const ALLOW = "Allow";
139 static const AUTHORIZATION = "Authorization";
140 static const CACHE_CONTROL = "Cache-Control";
141 static const CONNECTION = "Connection";
142 static const CONTENT_ENCODING = "Content-Encoding";
143 static const CONTENT_LANGUAGE = "Content-Language";
144 static const CONTENT_LENGTH = "Content-Length";
145 static const CONTENT_LOCATION = "Content-Location";
146 static const CONTENT_MD5 = "Content-MD5";
147 static const CONTENT_RANGE = "Content-Range";
148 static const CONTENT_TYPE = "Content-Type";
149 static const DATE = "Date";
150 static const ETAG = "ETag";
151 static const EXPECT = "Expect";
152 static const EXPIRES = "Expires";
153 static const FROM = "From";
154 static const HOST = "Host";
155 static const IF_MATCH = "If-Match";
156 static const IF_MODIFIED_SINCE = "If-Modified-Since";
157 static const IF_NONE_MATCH = "If-None-Match";
158 static const IF_RANGE = "If-Range";
159 static const IF_UNMODIFIED_SINCE = "If-Unmodified-Since";
160 static const LAST_MODIFIED = "Last-Modified";
161 static const LOCATION = "Location";
162 static const MAX_FORWARDS = "Max-Forwards";
163 static const PRAGMA = "Pragma";
164 static const PROXY_AUTHENTICATE = "Proxy-Authenticate";
165 static const PROXY_AUTHORIZATION = "Proxy-Authorization";
166 static const RANGE = "Range";
167 static const REFERER = "Referer";
168 static const RETRY_AFTER = "Retry-After";
169 static const SERVER = "Server";
170 static const TE = "TE";
171 static const TRAILER = "Trailer";
172 static const TRANSFER_ENCODING = "Transfer-Encoding";
173 static const UPGRADE = "Upgrade";
174 static const USER_AGENT = "User-Agent";
175 static const VARY = "Vary";
176 static const VIA = "Via";
177 static const WARNING = "Warning";
178 static const WWW_AUTHENTICATE = "WWW-Authenticate";
179
180 static const GENERAL_HEADERS = const [CACHE_CONTROL,
181 CONNECTION,
182 DATE,
183 PRAGMA,
184 TRAILER,
185 TRANSFER_ENCODING,
186 UPGRADE,
187 VIA,
188 WARNING];
189
190 static const ENTITY_HEADERS = const [ALLOW,
191 CONTENT_ENCODING,
192 CONTENT_LANGUAGE,
193 CONTENT_LENGTH,
194 CONTENT_LOCATION,
195 CONTENT_MD5,
196 CONTENT_RANGE,
197 CONTENT_TYPE,
198 EXPIRES,
199 LAST_MODIFIED];
200
201
202 static const RESPONSE_HEADERS = const [ACCEPT_RANGES,
203 AGE,
204 ETAG,
205 LOCATION,
206 PROXY_AUTHENTICATE,
207 RETRY_AFTER,
208 SERVER,
209 VARY,
210 WWW_AUTHENTICATE];
211
212 static const REQUEST_HEADERS = const [ACCEPT,
213 ACCEPT_CHARSET,
214 ACCEPT_ENCODING,
215 ACCEPT_LANGUAGE,
216 AUTHORIZATION,
217 EXPECT,
218 FROM,
219 HOST,
220 IF_MATCH,
221 IF_MODIFIED_SINCE,
222 IF_NONE_MATCH,
223 IF_RANGE,
224 IF_UNMODIFIED_SINCE,
225 MAX_FORWARDS,
226 PROXY_AUTHORIZATION,
227 RANGE,
228 REFERER,
229 TE,
230 USER_AGENT];
231
232 /**
233 * Returns the list of values for the header named [name]. If there
234 * is no headers with the provided name [:null:] will be returned.
235 */
236 List<String> operator[](String name);
237
238 /**
239 * Convenience method for the value for a single values header. If
240 * there is no header with the provided name [:null:] will be
241 * returned. If the header has more than one value an exception is
242 * thrown.
243 */
244 String value(String name);
245
246 /**
247 * Adds a header value. The header named [name] will have the value
248 * [value] added to its list of values. Some headers are single
249 * values and for these adding a value will replace the previous
250 * value. If the value is of type Date a HTTP date format will be
251 * applied. If the value is a [:List:] each element of the list will
252 * be added separately. For all other types the default [:toString:]
253 * method will be used.
254 */
255 void add(String name, Object value);
256
257 /**
258 * Sets a header. The header named [name] will have all its values
259 * cleared before the value [value] is added as its value.
260 */
261 void set(String name, Object value);
262
263 /**
264 * Removes a specific value for a header name. Some headers have
265 * system supplied values and for these the system supplied values
266 * will still be added to the collection of values for the header.
267 */
268 void remove(String name, Object value);
269
270 /**
271 * Remove all values for the specified header name. Some headers
272 * have system supplied values and for these the system supplied
273 * values will still be added to the collection of values for the
274 * header.
275 */
276 void removeAll(String name);
277
278 /**
279 * Enumerate the headers applying the function [f] to each
280 * header. The header name passed in [name] will be all lower
281 * case.
282 */
283 void forEach(void f(String name, List<String> values));
284
285 /**
286 * Disable folding for the header named [name] when sending the HTTP
287 * header. By default, multiple header values are folded into a
288 * single header line by separating the values with commas. The
289 * Set-Cookie header has folding disabled by default.
290 */
291 void noFolding(String name);
292
293 /**
294 * Gets and sets the date. The value of this property will
295 * reflect the "Date" header.
296 */
297 Date date;
298
299 /**
300 * Gets and sets the expiry date. The value of this property will
301 * reflect the "Expires" header.
302 */
303 Date expires;
304
305 /**
306 * Gets and sets the 'if-modified-since' date. The value of this property will
307 * reflect the "if-modified-since" header.
308 */
309 Date ifModifiedSince;
310
311 /**
312 * Gets and sets the host part of the "Host" header for the
313 * connection.
314 */
315 String host;
316
317 /**
318 * Gets and sets the port part of the "Host" header for the
319 * connection.
320 */
321 int port;
322
323 /**
324 * Gets and sets the content type. Note that the content type in the
325 * header will only be updated if this field is set
326 * directly. Mutating the returned current value will have no
327 * effect.
328 */
329 ContentType contentType;
330 }
331
332
333 /**
334 * Representation of a header value in the form:
335 *
336 * [:value; parameter1=value1; parameter2=value2:]
337 *
338 * [HeaderValue] can be used to conveniently build and parse header
339 * values on this form.
340 *
341 * To build an [:Accepts:] header with the value
342 *
343 * text/plain; q=0.3, text/html
344 *
345 * use code like this:
346 *
347 * HttpClientRequest request = ...;
348 * var v = new HeaderValue();
349 * v.value = "text/plain";
350 * v.parameters["q"] = "0.3"
351 * request.headers.add(HttpHeaders.ACCEPT, v);
352 * request.headers.add(HttpHeaders.ACCEPT, "text/html");
353 *
354 * To parse the header values use the [:fromString:] constructor.
355 *
356 * HttpRequest request = ...;
357 * List<String> values = request.headers[HttpHeaders.ACCEPT];
358 * values.forEach((value) {
359 * HeaderValue v = new HeaderValue.fromString(value);
360 * // Use v.value and v.parameters
361 * });
362 */
363 abstract class HeaderValue {
364 /**
365 * Creates a new header value object setting the value part.
366 */
367 factory HeaderValue([String value = ""]) => new _HeaderValue(value);
368
369 /**
370 * Creates a new header value object from parsing a header value
371 * string with both value and optional parameters.
372 */
373 factory HeaderValue.fromString(String value,
374 {String parameterSeparator: ";"}) {
375 return new _HeaderValue.fromString(
376 value, parameterSeparator: parameterSeparator);
377 }
378
379 /**
380 * Gets and sets the header value.
381 */
382 String value;
383
384 /**
385 * Gets the map of parameters.
386 */
387 Map<String, String> get parameters;
388
389 /**
390 * Returns the formatted string representation in the form:
391 *
392 * value; parameter1=value1; parameter2=value2
393 */
394 String toString();
395 }
396
397 abstract class HttpSession {
398 /**
399 * Get the id for the current session.
400 */
401 String get id;
402
403 /**
404 * Access the user-data associated with the session.
405 */
406 Dynamic data;
407
408 /**
409 * Destroy the session. This will terminate the session and any further
410 * connections with this id will be given a new id and session.
411 */
412 void destroy();
413
414 /**
415 * Set a callback that will be called when the session is timed out.
416 */
417 void set onTimeout(void callback());
418 }
419
420
421 /**
422 * Representation of a content type.
423 */
424 abstract class ContentType implements HeaderValue {
425 /**
426 * Creates a new content type object setting the primary type and
427 * sub type.
428 */
429 factory ContentType([String primaryType = "", String subType = ""]) {
430 return new _ContentType(primaryType, subType);
431 }
432
433 /**
434 * Creates a new content type object from parsing a Content-Type
435 * header value. As primary type, sub type and parameter names and
436 * values are not case sensitive all these values will be converted
437 * to lower case. Parsing this string
438 *
439 * text/html; charset=utf-8
440 *
441 * will create a content type object with primary type [:text:], sub
442 * type [:html:] and parameter [:charset:] with value [:utf-8:].
443 */
444 factory ContentType.fromString(String value) {
445 return new _ContentType.fromString(value);
446 }
447
448 /**
449 * Gets and sets the content type in the form "primaryType/subType".
450 */
451 String value;
452
453 /**
454 * Gets and sets the primary type.
455 */
456 String primaryType;
457
458 /**
459 * Gets and sets the sub type.
460 */
461 String subType;
462
463 /**
464 * Gets and sets the character set.
465 */
466 String charset;
467 }
468
469
470 /**
471 * Representation of a cookie. For cookies received by the server as
472 * Cookie header values only [:name:] and [:value:] fields will be
473 * set. When building a cookie for the Set-Cookie header in the server
474 * and when receiving cookies in the client as Set-Cookie headers all
475 * fields can be used.
476 */
477 abstract class Cookie {
478 /**
479 * Creates a new cookie optionally setting the name and value.
480 */
481 factory Cookie([String name, String value]) => new _Cookie(name, value);
482
483 /**
484 * Creates a new cookie by parsing a header value from a Set-Cookie
485 * header.
486 */
487 factory Cookie.fromSetCookieValue(String value) {
488 return new _Cookie.fromSetCookieValue(value);
489 }
490
491 /**
492 * Gets and sets the name.
493 */
494 String name;
495
496 /**
497 * Gets and sets the value.
498 */
499 String value;
500
501 /**
502 * Gets and sets the expiry date.
503 */
504 Date expires;
505
506 /**
507 * Gets and sets the max age. A value of [:0:] means delete cookie
508 * now.
509 */
510 int maxAge;
511
512 /**
513 * Gets and sets the domain.
514 */
515 String domain;
516
517 /**
518 * Gets and sets the path.
519 */
520 String path;
521
522 /**
523 * Gets and sets whether this cookie is secure.
524 */
525 bool secure;
526
527 /**
528 * Gets and sets whether this cookie is HTTP only.
529 */
530 bool httpOnly;
531
532 /**
533 * Returns the formatted string representation of the cookie. The
534 * string representation can be used for for setting the Cookie or
535 * Set-Cookie headers
536 */
537 String toString();
538 }
539
540
541 /**
542 * Http request delivered to the HTTP server callback.
543 */
544 abstract class HttpRequest {
545 /**
546 * Returns the content length of the request body. If the size of
547 * the request body is not known in advance this -1.
548 */
549 int get contentLength;
550
551 /**
552 * Returns the persistent connection state signaled by the client.
553 */
554 bool get persistentConnection;
555
556 /**
557 * Returns the method for the request.
558 */
559 String get method;
560
561 /**
562 * Returns the URI for the request.
563 */
564 String get uri;
565
566 /**
567 * Returns the path part of the URI.
568 */
569 String get path;
570
571 /**
572 * Returns the query string.
573 */
574 String get queryString;
575
576 /**
577 * Returns the parsed query string.
578 */
579 Map<String, String> get queryParameters;
580
581 /**
582 * Returns the request headers.
583 */
584 HttpHeaders get headers;
585
586 /**
587 * Returns the cookies in the request (from the Cookie headers).
588 */
589 List<Cookie> get cookies;
590
591 /**
592 * Returns, or initialize, a session for the given request. If the session is
593 * being initialized by this call, [init] will be called with the
594 * newly create session. Here the [:HttpSession.data:] field can be set, if
595 * needed.
596 * See [:HttpServer.sessionTimeout:] on how to change default timeout.
597 */
598 HttpSession session([init(HttpSession session)]);
599
600 /**
601 * Returns the input stream for the request. This is used to read
602 * the request data.
603 */
604 InputStream get inputStream;
605
606 /**
607 * Returns the HTTP protocol version used in the request. This will
608 * be "1.0" or "1.1".
609 */
610 String get protocolVersion;
611
612 /**
613 * Get information about the client connection. Returns [null] if the socket
614 * isn't available.
615 */
616 HttpConnectionInfo get connectionInfo;
617 }
618
619
620 /**
621 * HTTP response to be send back to the client.
622 */
623 abstract class HttpResponse {
624 /**
625 * Gets and sets the content length of the response. If the size of
626 * the response is not known in advance set the content length to
627 * -1 - which is also the default if not set.
628 */
629 int contentLength;
630
631 /**
632 * Gets and sets the status code. Any integer value is accepted. For
633 * the official HTTP status codes use the fields from
634 * [HttpStatus]. If no status code is explicitly set the default
635 * value [HttpStatus.OK] is used.
636 */
637 int statusCode;
638
639 /**
640 * Gets and sets the reason phrase. If no reason phrase is explicitly
641 * set a default reason phrase is provided.
642 */
643 String reasonPhrase;
644
645 /**
646 * Gets and sets the persistent connection state. The initial value
647 * of this property is the persistent connection state from the
648 * request.
649 */
650 bool persistentConnection;
651
652 /**
653 * Returns the response headers.
654 */
655 HttpHeaders get headers;
656
657 /**
658 * Cookies to set in the client (in the Set-Cookie header).
659 */
660 List<Cookie> get cookies;
661
662 /**
663 * Returns the output stream for the response. This is used to write
664 * the response data. When all response data has been written close
665 * the stream to indicate the end of the response.
666 *
667 * When this is accessed for the first time the response header is
668 * send. Calling any methods that will change the header after
669 * having retrieved the output stream will throw an exception.
670 */
671 OutputStream get outputStream;
672
673 /**
674 * Detach the underlying socket from the HTTP server. When the
675 * socket is detached the HTTP server will no longer perform any
676 * operations on it.
677 *
678 * This is normally used when a HTTP upgrade request is received
679 * and the communication should continue with a different protocol.
680 */
681 DetachedSocket detachSocket();
682
683 /**
684 * Get information about the client connection. Returns [null] if the socket
685 * isn't available.
686 */
687 HttpConnectionInfo get connectionInfo;
688 }
689
690
691 /**
692 * HTTP client factory. The [HttpClient] handles all the sockets associated
693 * with the [HttpClientConnection]s and when the endpoint supports it, it will
694 * try to reuse opened sockets for several requests to support HTTP 1.1
695 * persistent connections. This means that sockets will be kept open for some
696 * time after a requests have completed, unless HTTP procedures indicate that it
697 * must be closed as part of completing the request. Use [:HttpClient.shutdown:]
698 * to force close the idle sockets.
699 */
700 abstract class HttpClient {
701 static const int DEFAULT_HTTP_PORT = 80;
702
703 factory HttpClient() => new _HttpClient();
704
705 /**
706 * Opens a HTTP connection. The returned [HttpClientConnection] is
707 * used to register callbacks for asynchronous events on the HTTP
708 * connection. The "Host" header for the request will be set to the
709 * value [host]:[port]. This can be overridden through the
710 * HttpClientRequest interface before the request is sent. NOTE if
711 * [host] is an IP address this will still be set in the "Host"
712 * header.
713 */
714 HttpClientConnection open(String method, String host, int port, String path);
715
716 /**
717 * Opens a HTTP connection. The returned [HttpClientConnection] is
718 * used to register callbacks for asynchronous events on the HTTP
719 * connection. The "Host" header for the request will be set based
720 * the host and port specified in [url]. This can be overridden
721 * through the HttpClientRequest interface before the request is
722 * sent. NOTE if the host is specified as an IP address this will
723 * still be set in the "Host" header.
724 */
725 HttpClientConnection openUrl(String method, Uri url);
726
727 /**
728 * Opens a HTTP connection using the GET method. See [open] for
729 * details. Using this method to open a HTTP connection will set the
730 * content length to 0.
731 */
732 HttpClientConnection get(String host, int port, String path);
733
734 /**
735 * Opens a HTTP connection using the GET method. See [openUrl] for
736 * details. Using this method to open a HTTP connection will set the
737 * content length to 0.
738 */
739 HttpClientConnection getUrl(Uri url);
740
741 /**
742 * Opens a HTTP connection using the POST method. See [open] for details.
743 */
744 HttpClientConnection post(String host, int port, String path);
745
746 /**
747 * Opens a HTTP connection using the POST method. See [openUrl] for details.
748 */
749 HttpClientConnection postUrl(Uri url);
750
751 /**
752 * Sets the function to be called when a site is requesting
753 * authentication. The URL requested and the security realm from the
754 * server are passed in the arguments [url] and [realm].
755 *
756 * The function returns a [Future] which should complete when the
757 * authentication has been resolved. If credentials cannot be
758 * provided the [Future] should complete with [false]. If
759 * credentials are available the function should add these using
760 * [addCredentials] before completing the [Future] with the value
761 * [true].
762 *
763 * If the [Future] completes with true the request will be retried
764 * using the updated credentials. Otherwise response processing will
765 * continue normally.
766 */
767 set authenticate(Future<bool> f(Uri url, String scheme, String realm));
768
769 /**
770 * Add credentials to be used for authorizing HTTP requests.
771 */
772 void addCredentials(Uri url, String realm, HttpClientCredentials credentials);
773
774 /**
775 * Sets the function used to resolve the proxy server to be used for
776 * opening a HTTP connection to the specified [url]. If this
777 * function is not set, direct connections will always be used.
778 *
779 * The string returned by [f] must be in the format used by browser
780 * PAC (proxy auto-config) scripts. That is either
781 *
782 * "DIRECT"
783 *
784 * for using a direct connection or
785 *
786 * "PROXY host:port"
787 *
788 * for using the proxy server [:host:] on port [:port:].
789 *
790 * A configuration can contain several configuration elements
791 * separated by semicolons, e.g.
792 *
793 * "PROXY host:port; PROXY host2:port2; DIRECT"
794 */
795 set findProxy(String f(Uri url));
796
797 /**
798 * Shutdown the HTTP client releasing all resources.
799 */
800 void shutdown();
801 }
802
803
804 /**
805 * A [HttpClientConnection] is returned by all [HttpClient] methods
806 * that initiate a connection to an HTTP server. The handlers will be
807 * called as the connection state progresses.
808 *
809 * The setting of all handlers is optional. If [onRequest] is not set
810 * the request will be send without any additional headers and an
811 * empty body. If [onResponse] is not set the response will be read
812 * and discarded.
813 */
814 abstract class HttpClientConnection {
815 /**
816 * Sets the handler that is called when the connection is established.
817 */
818 void set onRequest(void callback(HttpClientRequest request));
819
820 /**
821 * Sets callback to be called when the request has been send and
822 * the response is ready for processing. The callback is called when
823 * all headers of the response are received and data is ready to be
824 * received.
825 */
826 void set onResponse(void callback(HttpClientResponse response));
827
828 /**
829 * Sets the handler that gets called if an error occurs while
830 * connecting or processing the HTTP request.
831 */
832 void set onError(void callback(e));
833
834 /**
835 * Set this property to [:true:] if this connection should
836 * automatically follow redirects. The default is [:true:].
837 */
838 bool followRedirects;
839
840 /**
841 * Set this property to the maximum number of redirects to follow
842 * when [followRedirects] is [:true:]. If this number is exceeded the
843 * [onError] callback will be called with a [RedirectLimitExceeded]
844 * exception. The default value is 5.
845 */
846 int maxRedirects;
847
848 /**
849 * Returns the series of redirects this connection has been through.
850 */
851 List<RedirectInfo> get redirects;
852
853 /**
854 * Redirect this connection to a new URL. The default value for
855 * [method] is the method for the current request. The default value
856 * for [url] is the value of the [:HttpStatus.LOCATION:] header of
857 * the current response. All body data must have been read from the
858 * current response before calling [redirect].
859 */
860 void redirect([String method, Uri url]);
861
862 /**
863 * Detach the underlying socket from the HTTP client. When the
864 * socket is detached the HTTP client will no longer perform any
865 * operations on it.
866 *
867 * This is normally used when a HTTP upgrade is negotiated and the
868 * communication should continue with a different protocol.
869 */
870 DetachedSocket detachSocket();
871
872 /**
873 * Get information about the client connection. Returns [null] if the socket
874 * isn't available.
875 */
876 HttpConnectionInfo get connectionInfo;
877 }
878
879
880 /**
881 * HTTP request for a client connection.
882 */
883 abstract class HttpClientRequest {
884 /**
885 * Gets and sets the content length of the request. If the size of
886 * the request is not known in advance set content length to -1,
887 * which is also the default.
888 */
889 int contentLength;
890
891 /**
892 * Returns the request headers.
893 */
894 HttpHeaders get headers;
895
896 /**
897 * Cookies to present to the server (in the Cookie header).
898 */
899 List<Cookie> get cookies;
900
901 /**
902 * Gets and sets the requested persistent connection state.
903 * The default value is [:true:].
904 */
905 bool persistentConnection;
906
907 /**
908 * Returns the output stream for the request. This is used to write
909 * the request data. When all request data has been written close
910 * the stream to indicate the end of the request.
911 *
912 * When this is accessed for the first time the request header is
913 * send. Calling any methods that will change the header after
914 * having retrieved the output stream will throw an exception.
915 */
916 OutputStream get outputStream;
917 }
918
919
920 /**
921 * HTTP response for a client connection.
922 */
923 abstract class HttpClientResponse {
924 /**
925 * Returns the status code.
926 */
927 int get statusCode;
928
929 /**
930 * Returns the reason phrase associated with the status code.
931 */
932 String get reasonPhrase;
933
934 /**
935 * Returns the content length of the request body. If the size of
936 * the request body is not known in advance this -1.
937 */
938 int get contentLength;
939
940 /**
941 * Gets the persistent connection state returned by the server.
942 */
943 bool get persistentConnection;
944
945 /**
946 * Returns whether the status code is one of the normal redirect
947 * codes [:HttpStatus.MOVED_PERMANENTLY:], [:HttpStatus.FOUND:],
948 * [:HttpStatus.MOVED_TEMPORARILY:], [:HttpStatus.SEE_OTHER:] and
949 * [:HttpStatus.TEMPORARY_REDIRECT:].
950 */
951 bool get isRedirect;
952
953 /**
954 * Returns the response headers.
955 */
956 HttpHeaders get headers;
957
958 /**
959 * Cookies set by the server (from the Set-Cookie header).
960 */
961 List<Cookie> get cookies;
962
963 /**
964 * Returns the input stream for the response. This is used to read
965 * the response data.
966 */
967 InputStream get inputStream;
968 }
969
970
971 abstract class HttpClientCredentials { }
972
973
974 /**
975 * Represent credentials for basic authentication.
976 */
977 abstract class HttpClientBasicCredentials extends HttpClientCredentials {
978 factory HttpClientBasicCredentials(String username, String password) =>
979 new _HttpClientBasicCredentials(username, password);
980 }
981
982
983 /**
984 * Represent credentials for digest authentication.
985 */
986 abstract class HttpClientDigestCredentials extends HttpClientCredentials {
987 factory HttpClientDigestCredentials(String username, String password) =>
988 new _HttpClientDigestCredentials(username, password);
989 }
990
991
992 /**
993 * Connection information.
994 */
995 abstract class HttpConnectionInfo {
996 String get remoteHost;
997 int get remotePort;
998 int get localPort;
999 }
1000
1001
1002 /**
1003 * Redirect information.
1004 */
1005 abstract class RedirectInfo {
1006 /**
1007 * Returns the status code used for the redirect.
1008 */
1009 int get statusCode;
1010
1011 /**
1012 * Returns the method used for the redirect.
1013 */
1014 String get method;
1015
1016 /**
1017 * Returns the location for the redirect.
1018 */
1019 Uri get location;
1020 }
1021
1022
1023 /**
1024 * When detaching a socket from either the [:HttpServer:] or the
1025 * [:HttpClient:] due to a HTTP connection upgrade there might be
1026 * unparsed data already read from the socket. This unparsed data
1027 * together with the detached socket is returned in an instance of
1028 * this class.
1029 */
1030 abstract class DetachedSocket {
1031 Socket get socket;
1032 List<int> get unparsedData;
1033 }
1034
1035
1036 class HttpException implements Exception {
1037 const HttpException([String this.message = ""]);
1038 String toString() => "HttpException: $message";
1039 final String message;
1040 }
1041
1042
1043 class RedirectException extends HttpException {
1044 const RedirectException(String message,
1045 List<RedirectInfo> this.redirects) : super(message);
1046 final List<RedirectInfo> redirects;
1047 }
1048
1049
1050 class RedirectLimitExceededException extends RedirectException {
1051 const RedirectLimitExceededException(List<RedirectInfo> redirects)
1052 : super("Redirect limit exceeded", redirects);
1053 }
1054
1055
1056 class RedirectLoopException extends RedirectException {
1057 const RedirectLoopException(List<RedirectInfo> redirects)
1058 : super("Redirect loop detected", redirects);
1059 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698