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

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

Issue 10938010: Switch from interfaces to abstract classes in dart:io. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address review comments. Add test binaries. Created 8 years, 3 months 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
« no previous file with comments | « runtime/bin/file.dart ('k') | runtime/bin/http_impl.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 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 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * HTTP status codes. 6 * HTTP status codes.
7 */ 7 */
8 interface HttpStatus { 8 abstract class HttpStatus {
9 static const int CONTINUE = 100; 9 static const int CONTINUE = 100;
10 static const int SWITCHING_PROTOCOLS = 101; 10 static const int SWITCHING_PROTOCOLS = 101;
11 static const int OK = 200; 11 static const int OK = 200;
12 static const int CREATED = 201; 12 static const int CREATED = 201;
13 static const int ACCEPTED = 202; 13 static const int ACCEPTED = 202;
14 static const int NON_AUTHORITATIVE_INFORMATION = 203; 14 static const int NON_AUTHORITATIVE_INFORMATION = 203;
15 static const int NO_CONTENT = 204; 15 static const int NO_CONTENT = 204;
16 static const int RESET_CONTENT = 205; 16 static const int RESET_CONTENT = 205;
17 static const int PARTIAL_CONTENT = 206; 17 static const int PARTIAL_CONTENT = 206;
18 static const int MULTIPLE_CHOICES = 300; 18 static const int MULTIPLE_CHOICES = 300;
(...skipping 29 matching lines...) Expand all
48 static const int GATEWAY_TIMEOUT = 504; 48 static const int GATEWAY_TIMEOUT = 504;
49 static const int HTTP_VERSION_NOT_SUPPORTED = 505; 49 static const int HTTP_VERSION_NOT_SUPPORTED = 505;
50 // Client generated status code. 50 // Client generated status code.
51 static const int NETWORK_CONNECT_TIMEOUT_ERROR = 599; 51 static const int NETWORK_CONNECT_TIMEOUT_ERROR = 599;
52 } 52 }
53 53
54 54
55 /** 55 /**
56 * HTTP server. 56 * HTTP server.
57 */ 57 */
58 interface HttpServer default _HttpServer { 58 abstract class HttpServer {
59 HttpServer(); 59 factory HttpServer() => new _HttpServer();
60 60
61 /** 61 /**
62 * Start listening for HTTP requests on the specified [host] and 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 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 64 * ephemeral port. The optional argument [backlog] can be used to
65 * specify the listen backlog for the underlying OS listen 65 * specify the listen backlog for the underlying OS listen
66 * setup. See [addRequestHandler] and [defaultRequestHandler] for 66 * setup. See [addRequestHandler] and [defaultRequestHandler] for
67 * information on how incoming HTTP requests are handled. 67 * information on how incoming HTTP requests are handled.
68 */ 68 */
69 void listen(String host, int port, [int backlog]); 69 void listen(String host, int port, [int backlog]);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 115
116 116
117 /** 117 /**
118 * Access to the HTTP headers for requests and responses. In some 118 * Access to the HTTP headers for requests and responses. In some
119 * situations the headers will be imutable and the mutating methods 119 * situations the headers will be imutable and the mutating methods
120 * will then throw exceptions. 120 * will then throw exceptions.
121 * 121 *
122 * For all operation on HTTP headers the header name is 122 * For all operation on HTTP headers the header name is
123 * case-insensitive. 123 * case-insensitive.
124 */ 124 */
125 interface HttpHeaders default _HttpHeaders { 125 abstract class HttpHeaders {
126 static const ACCEPT = "Accept"; 126 static const ACCEPT = "Accept";
127 static const ACCEPT_CHARSET = "Accept-Charset"; 127 static const ACCEPT_CHARSET = "Accept-Charset";
128 static const ACCEPT_ENCODING = "Accept-Encoding"; 128 static const ACCEPT_ENCODING = "Accept-Encoding";
129 static const ACCEPT_LANGUAGE = "Accept-Language"; 129 static const ACCEPT_LANGUAGE = "Accept-Language";
130 static const ACCEPT_RANGES = "Accept-Ranges"; 130 static const ACCEPT_RANGES = "Accept-Ranges";
131 static const AGE = "Age"; 131 static const AGE = "Age";
132 static const ALLOW = "Allow"; 132 static const ALLOW = "Allow";
133 static const AUTHORIZATION = "Authorization"; 133 static const AUTHORIZATION = "Authorization";
134 static const CACHE_CONTROL = "Cache-Control"; 134 static const CACHE_CONTROL = "Cache-Control";
135 static const CONNECTION = "Connection"; 135 static const CONNECTION = "Connection";
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 * 347 *
348 * To parse the header values use the [:fromString:] constructor. 348 * To parse the header values use the [:fromString:] constructor.
349 * 349 *
350 * HttpRequest request = ...; 350 * HttpRequest request = ...;
351 * List<String> values = request.headers[HttpHeaders.ACCEPT]; 351 * List<String> values = request.headers[HttpHeaders.ACCEPT];
352 * values.forEach((value) { 352 * values.forEach((value) {
353 * HeaderValue v = new HeaderValue.fromString(value); 353 * HeaderValue v = new HeaderValue.fromString(value);
354 * // Use v.value and v.parameters 354 * // Use v.value and v.parameters
355 * }); 355 * });
356 */ 356 */
357 interface HeaderValue default _HeaderValue { 357 abstract class HeaderValue {
358 /** 358 /**
359 * Creates a new header value object setting the value part. 359 * Creates a new header value object setting the value part.
360 */ 360 */
361 HeaderValue([String value]); 361 factory HeaderValue([String value = ""]) => new _HeaderValue(value);
362 362
363 /** 363 /**
364 * Creates a new header value object from parsing a header value 364 * Creates a new header value object from parsing a header value
365 * string with both value and optional parameters. 365 * string with both value and optional parameters.
366 */ 366 */
367 HeaderValue.fromString(String value); 367 factory HeaderValue.fromString(String value) {
368 return new _HeaderValue.fromString(value);
369 }
368 370
369 /** 371 /**
370 * Gets and sets the header value. 372 * Gets and sets the header value.
371 */ 373 */
372 String value; 374 String value;
373 375
374 /** 376 /**
375 * Gets the map of parameters. 377 * Gets the map of parameters.
376 */ 378 */
377 Map<String, String> get parameters; 379 Map<String, String> get parameters;
378 380
379 /** 381 /**
380 * Returns the formatted string representation in the form: 382 * Returns the formatted string representation in the form:
381 * 383 *
382 * value; parameter1=value1; parameter2=value2 384 * value; parameter1=value1; parameter2=value2
383 */ 385 */
384 String toString(); 386 String toString();
385 } 387 }
386 388
387 389
388 /** 390 /**
389 * Representation of a content type. 391 * Representation of a content type.
390 */ 392 */
391 interface ContentType extends HeaderValue default _ContentType { 393 abstract class ContentType implements HeaderValue {
392 /** 394 /**
393 * Creates a new content type object setting the primary type and 395 * Creates a new content type object setting the primary type and
394 * sub type. If either is not passed their values will be the empty 396 * sub type.
395 * string.
396 */ 397 */
397 ContentType([String primaryType, String subType]); 398 factory ContentType([String primaryType = "", String subType = ""]) {
399 return new _ContentType(primaryType, subType);
400 }
398 401
399 /** 402 /**
400 * Creates a new content type object from parsing a Content-Type 403 * Creates a new content type object from parsing a Content-Type
401 * header value. As primary type, sub type and parameter names and 404 * header value. As primary type, sub type and parameter names and
402 * values are not case sensitive all these values will be converted 405 * values are not case sensitive all these values will be converted
403 * to lower case. Parsing this string 406 * to lower case. Parsing this string
404 * 407 *
405 * text/html; charset=utf-8 408 * text/html; charset=utf-8
406 * 409 *
407 * will create a content type object with primary type [:text:], sub 410 * will create a content type object with primary type [:text:], sub
408 * type [:html:] and parameter [:charset:] with value [:utf-8:]. 411 * type [:html:] and parameter [:charset:] with value [:utf-8:].
409 */ 412 */
410 ContentType.fromString(String value); 413 factory ContentType.fromString(String value) {
414 return new _ContentType.fromString(value);
415 }
411 416
412 /** 417 /**
413 * Gets and sets the content type in the form "primaryType/subType". 418 * Gets and sets the content type in the form "primaryType/subType".
414 */ 419 */
415 String value; 420 String value;
416 421
417 /** 422 /**
418 * Gets and sets the primary type. 423 * Gets and sets the primary type.
419 */ 424 */
420 String primaryType; 425 String primaryType;
(...skipping 10 matching lines...) Expand all
431 } 436 }
432 437
433 438
434 /** 439 /**
435 * Representation of a cookie. For cookies received by the server as 440 * Representation of a cookie. For cookies received by the server as
436 * Cookie header values only [:name:] and [:value:] fields will be 441 * Cookie header values only [:name:] and [:value:] fields will be
437 * set. When building a cookie for the Set-Cookie header in the server 442 * set. When building a cookie for the Set-Cookie header in the server
438 * and when receiving cookies in the client as Set-Cookie headers all 443 * and when receiving cookies in the client as Set-Cookie headers all
439 * fields can be used. 444 * fields can be used.
440 */ 445 */
441 interface Cookie default _Cookie { 446 abstract class Cookie {
442 /** 447 /**
443 * Creates a new cookie optionally setting the name and value. 448 * Creates a new cookie optionally setting the name and value.
444 */ 449 */
445 Cookie([String name, String value]); 450 factory Cookie([String name, String value]) => new _Cookie(name, value);
446 451
447 /** 452 /**
448 * Creates a new cookie by parsing a header value from a Set-Cookie 453 * Creates a new cookie by parsing a header value from a Set-Cookie
449 * header. 454 * header.
450 */ 455 */
451 Cookie.fromSetCookieValue(String value); 456 factory Cookie.fromSetCookieValue(String value) {
457 return new _Cookie.fromSetCookieValue(value);
458 }
452 459
453 /** 460 /**
454 * Gets and sets the name. 461 * Gets and sets the name.
455 */ 462 */
456 String name; 463 String name;
457 464
458 /** 465 /**
459 * Gets and sets the value. 466 * Gets and sets the value.
460 */ 467 */
461 String value; 468 String value;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 * string representation can be used for for setting the Cookie or 503 * string representation can be used for for setting the Cookie or
497 * Set-Cookie headers 504 * Set-Cookie headers
498 */ 505 */
499 String toString(); 506 String toString();
500 } 507 }
501 508
502 509
503 /** 510 /**
504 * Http request delivered to the HTTP server callback. 511 * Http request delivered to the HTTP server callback.
505 */ 512 */
506 interface HttpRequest default _HttpRequest { 513 abstract class HttpRequest {
507 /** 514 /**
508 * Returns the content length of the request body. If the size of 515 * Returns the content length of the request body. If the size of
509 * the request body is not known in advance this -1. 516 * the request body is not known in advance this -1.
510 */ 517 */
511 int get contentLength; 518 int get contentLength;
512 519
513 /** 520 /**
514 * Returns the persistent connection state signaled by the client. 521 * Returns the persistent connection state signaled by the client.
515 */ 522 */
516 bool get persistentConnection; 523 bool get persistentConnection;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 * Get information about the client connection. Returns [null] if the socket 573 * Get information about the client connection. Returns [null] if the socket
567 * isn't available. 574 * isn't available.
568 */ 575 */
569 HttpConnectionInfo get connectionInfo; 576 HttpConnectionInfo get connectionInfo;
570 } 577 }
571 578
572 579
573 /** 580 /**
574 * HTTP response to be send back to the client. 581 * HTTP response to be send back to the client.
575 */ 582 */
576 interface HttpResponse default _HttpResponse { 583 abstract class HttpResponse {
577 /** 584 /**
578 * Gets and sets the content length of the response. If the size of 585 * Gets and sets the content length of the response. If the size of
579 * the response is not known in advance set the content length to 586 * the response is not known in advance set the content length to
580 * -1 - which is also the default if not set. 587 * -1 - which is also the default if not set.
581 */ 588 */
582 int contentLength; 589 int contentLength;
583 590
584 /** 591 /**
585 * Gets and sets the status code. Any integer value is accepted, but 592 * Gets and sets the status code. Any integer value is accepted, but
586 * for the official HTTP status codes use the fields from 593 * for the official HTTP status codes use the fields from
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 649
643 /** 650 /**
644 * HTTP client factory. The [HttpClient] handles all the sockets associated 651 * HTTP client factory. The [HttpClient] handles all the sockets associated
645 * with the [HttpClientConnection]s and when the endpoint supports it, it will 652 * with the [HttpClientConnection]s and when the endpoint supports it, it will
646 * try to reuse opened sockets for several requests to support HTTP 1.1 653 * try to reuse opened sockets for several requests to support HTTP 1.1
647 * persistent connections. This means that sockets will be kept open for some 654 * persistent connections. This means that sockets will be kept open for some
648 * time after a requests have completed, unless HTTP procedures indicate that it 655 * time after a requests have completed, unless HTTP procedures indicate that it
649 * must be closed as part of completing the request. Use [:HttpClient.shutdown:] 656 * must be closed as part of completing the request. Use [:HttpClient.shutdown:]
650 * to force close the idle sockets. 657 * to force close the idle sockets.
651 */ 658 */
652 interface HttpClient default _HttpClient { 659 abstract class HttpClient {
653 static const int DEFAULT_HTTP_PORT = 80; 660 static const int DEFAULT_HTTP_PORT = 80;
654 661
655 HttpClient(); 662 factory HttpClient() => new _HttpClient();
656 663
657 /** 664 /**
658 * Opens a HTTP connection. The returned [HttpClientConnection] is 665 * Opens a HTTP connection. The returned [HttpClientConnection] is
659 * used to register callbacks for asynchronous events on the HTTP 666 * used to register callbacks for asynchronous events on the HTTP
660 * connection. The "Host" header for the request will be set to the 667 * connection. The "Host" header for the request will be set to the
661 * value [host]:[port]. This can be overridden through the 668 * value [host]:[port]. This can be overridden through the
662 * HttpClientRequest interface before the request is sent. NOTE if 669 * HttpClientRequest interface before the request is sent. NOTE if
663 * [host] is an IP address this will still be set in the "Host" 670 * [host] is an IP address this will still be set in the "Host"
664 * header. 671 * header.
665 */ 672 */
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 /** 717 /**
711 * A [HttpClientConnection] is returned by all [HttpClient] methods 718 * A [HttpClientConnection] is returned by all [HttpClient] methods
712 * that initiate a connection to an HTTP server. The handlers will be 719 * that initiate a connection to an HTTP server. The handlers will be
713 * called as the connection state progresses. 720 * called as the connection state progresses.
714 * 721 *
715 * The setting of all handlers is optional. If [onRequest] is not set 722 * The setting of all handlers is optional. If [onRequest] is not set
716 * the request will be send without any additional headers and an 723 * the request will be send without any additional headers and an
717 * empty body. If [onResponse] is not set the response will be read 724 * empty body. If [onResponse] is not set the response will be read
718 * and discarded. 725 * and discarded.
719 */ 726 */
720 interface HttpClientConnection { 727 abstract class HttpClientConnection {
721 /** 728 /**
722 * Sets the handler that is called when the connection is established. 729 * Sets the handler that is called when the connection is established.
723 */ 730 */
724 void set onRequest(void callback(HttpClientRequest request)); 731 void set onRequest(void callback(HttpClientRequest request));
725 732
726 /** 733 /**
727 * Sets callback to be called when the request has been send and 734 * Sets callback to be called when the request has been send and
728 * the response is ready for processing. The callback is called when 735 * the response is ready for processing. The callback is called when
729 * all headers of the response are received and data is ready to be 736 * all headers of the response are received and data is ready to be
730 * received. 737 * received.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 * Get information about the client connection. Returns [null] if the socket 786 * Get information about the client connection. Returns [null] if the socket
780 * isn't available. 787 * isn't available.
781 */ 788 */
782 HttpConnectionInfo get connectionInfo; 789 HttpConnectionInfo get connectionInfo;
783 } 790 }
784 791
785 792
786 /** 793 /**
787 * HTTP request for a client connection. 794 * HTTP request for a client connection.
788 */ 795 */
789 interface HttpClientRequest default _HttpClientRequest { 796 abstract class HttpClientRequest {
790 /** 797 /**
791 * Gets and sets the content length of the request. If the size of 798 * Gets and sets the content length of the request. If the size of
792 * the request is not known in advance set content length to -1, 799 * the request is not known in advance set content length to -1,
793 * which is also the default. 800 * which is also the default.
794 */ 801 */
795 int contentLength; 802 int contentLength;
796 803
797 /** 804 /**
798 * Returns the request headers. 805 * Returns the request headers.
799 */ 806 */
(...skipping 19 matching lines...) Expand all
819 * send. Calling any methods that will change the header after 826 * send. Calling any methods that will change the header after
820 * having retrieved the output stream will throw an exception. 827 * having retrieved the output stream will throw an exception.
821 */ 828 */
822 OutputStream get outputStream; 829 OutputStream get outputStream;
823 } 830 }
824 831
825 832
826 /** 833 /**
827 * HTTP response for a client connection. 834 * HTTP response for a client connection.
828 */ 835 */
829 interface HttpClientResponse default _HttpClientResponse { 836 abstract class HttpClientResponse {
830 /** 837 /**
831 * Returns the status code. 838 * Returns the status code.
832 */ 839 */
833 int get statusCode; 840 int get statusCode;
834 841
835 /** 842 /**
836 * Returns the reason phrase associated with the status code. 843 * Returns the reason phrase associated with the status code.
837 */ 844 */
838 String get reasonPhrase; 845 String get reasonPhrase;
839 846
(...skipping 29 matching lines...) Expand all
869 /** 876 /**
870 * Returns the input stream for the response. This is used to read 877 * Returns the input stream for the response. This is used to read
871 * the response data. 878 * the response data.
872 */ 879 */
873 InputStream get inputStream; 880 InputStream get inputStream;
874 } 881 }
875 882
876 /** 883 /**
877 * Connection information. 884 * Connection information.
878 */ 885 */
879 interface HttpConnectionInfo { 886 abstract class HttpConnectionInfo {
880 String get remoteHost; 887 String get remoteHost;
881 int get remotePort; 888 int get remotePort;
882 int get localPort; 889 int get localPort;
883 } 890 }
884 891
885 892
886 /** 893 /**
887 * Redirect information. 894 * Redirect information.
888 */ 895 */
889 interface RedirectInfo { 896 abstract class RedirectInfo {
890 /** 897 /**
891 * Returns the status code used for the redirect. 898 * Returns the status code used for the redirect.
892 */ 899 */
893 int get statusCode; 900 int get statusCode;
894 901
895 /** 902 /**
896 * Returns the method used for the redirect. 903 * Returns the method used for the redirect.
897 */ 904 */
898 String get method; 905 String get method;
899 906
900 /** 907 /**
901 * Returns the location for the redirect. 908 * Returns the location for the redirect.
902 */ 909 */
903 Uri get location; 910 Uri get location;
904 } 911 }
905 912
906 913
907 /** 914 /**
908 * When detaching a socket from either the [:HttpServer:] or the 915 * When detaching a socket from either the [:HttpServer:] or the
909 * [:HttpClient:] due to a HTTP connection upgrade there might be 916 * [:HttpClient:] due to a HTTP connection upgrade there might be
910 * unparsed data already read from the socket. This unparsed data 917 * unparsed data already read from the socket. This unparsed data
911 * together with the detached socket is returned in an instance of 918 * together with the detached socket is returned in an instance of
912 * this class. 919 * this class.
913 */ 920 */
914 interface DetachedSocket default _DetachedSocket { 921 abstract class DetachedSocket {
915 Socket get socket; 922 Socket get socket;
916 List<int> get unparsedData; 923 List<int> get unparsedData;
917 } 924 }
918 925
919 926
920 class HttpException implements Exception { 927 class HttpException implements Exception {
921 const HttpException([String this.message = ""]); 928 const HttpException([String this.message = ""]);
922 String toString() => "HttpException: $message"; 929 String toString() => "HttpException: $message";
923 final String message; 930 final String message;
924 } 931 }
925 932
926 933
927 class RedirectException extends HttpException { 934 class RedirectException extends HttpException {
928 const RedirectException(String message, 935 const RedirectException(String message,
929 List<RedirectInfo> this.redirects) : super(message); 936 List<RedirectInfo> this.redirects) : super(message);
930 final List<RedirectInfo> redirects; 937 final List<RedirectInfo> redirects;
931 } 938 }
932 939
933 940
934 class RedirectLimitExceededException extends RedirectException { 941 class RedirectLimitExceededException extends RedirectException {
935 const RedirectLimitExceededException(List<RedirectInfo> redirects) 942 const RedirectLimitExceededException(List<RedirectInfo> redirects)
936 : super("Redirect limit exceeded", redirects); 943 : super("Redirect limit exceeded", redirects);
937 } 944 }
938 945
939 946
940 class RedirectLoopException extends RedirectException { 947 class RedirectLoopException extends RedirectException {
941 const RedirectLoopException(List<RedirectInfo> redirects) 948 const RedirectLoopException(List<RedirectInfo> redirects)
942 : super("Redirect loop detected", redirects); 949 : super("Redirect loop detected", redirects);
943 } 950 }
OLDNEW
« no previous file with comments | « runtime/bin/file.dart ('k') | runtime/bin/http_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698