| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of dart.io; | 5 part of dart.io; |
| 6 | 6 |
| 7 const int _OUTGOING_BUFFER_SIZE = 8 * 1024; | 7 const int _OUTGOING_BUFFER_SIZE = 8 * 1024; |
| 8 | 8 |
| 9 class _HttpIncoming extends Stream<List<int>> { | 9 class _HttpIncoming extends Stream<List<int>> { |
| 10 final int _transferLength; | 10 final int _transferLength; |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 | 422 |
| 423 bool _bufferOutput = true; | 423 bool _bufferOutput = true; |
| 424 | 424 |
| 425 final Uri _uri; | 425 final Uri _uri; |
| 426 final _HttpOutgoing _outgoing; | 426 final _HttpOutgoing _outgoing; |
| 427 | 427 |
| 428 final _HttpHeaders headers; | 428 final _HttpHeaders headers; |
| 429 | 429 |
| 430 _HttpOutboundMessage(Uri uri, | 430 _HttpOutboundMessage(Uri uri, |
| 431 String protocolVersion, | 431 String protocolVersion, |
| 432 _HttpOutgoing outgoing) | 432 _HttpOutgoing outgoing, |
| 433 {_HttpHeaders initialHeaders}) |
| 433 : super(outgoing, null), | 434 : super(outgoing, null), |
| 434 _uri = uri, | 435 _uri = uri, |
| 435 headers = new _HttpHeaders( | 436 headers = new _HttpHeaders( |
| 436 protocolVersion, | 437 protocolVersion, |
| 437 defaultPortForScheme: uri.scheme == 'https' ? | 438 defaultPortForScheme: uri.scheme == 'https' ? |
| 438 HttpClient.DEFAULT_HTTPS_PORT : | 439 HttpClient.DEFAULT_HTTPS_PORT : |
| 439 HttpClient.DEFAULT_HTTP_PORT), | 440 HttpClient.DEFAULT_HTTP_PORT, |
| 441 initialHeaders: initialHeaders), |
| 440 _outgoing = outgoing { | 442 _outgoing = outgoing { |
| 441 _outgoing.outbound = this; | 443 _outgoing.outbound = this; |
| 442 _encodingMutable = false; | 444 _encodingMutable = false; |
| 443 } | 445 } |
| 444 | 446 |
| 445 int get contentLength => headers.contentLength; | 447 int get contentLength => headers.contentLength; |
| 446 void set contentLength(int contentLength) { | 448 void set contentLength(int contentLength) { |
| 447 headers.contentLength = contentLength; | 449 headers.contentLength = contentLength; |
| 448 } | 450 } |
| 449 | 451 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 int _statusCode = 200; | 498 int _statusCode = 200; |
| 497 String _reasonPhrase; | 499 String _reasonPhrase; |
| 498 List<Cookie> _cookies; | 500 List<Cookie> _cookies; |
| 499 _HttpRequest _httpRequest; | 501 _HttpRequest _httpRequest; |
| 500 Duration _deadline; | 502 Duration _deadline; |
| 501 Timer _deadlineTimer; | 503 Timer _deadlineTimer; |
| 502 | 504 |
| 503 _HttpResponse(Uri uri, | 505 _HttpResponse(Uri uri, |
| 504 String protocolVersion, | 506 String protocolVersion, |
| 505 _HttpOutgoing outgoing, | 507 _HttpOutgoing outgoing, |
| 508 HttpHeaders defaultHeaders, |
| 506 String serverHeader) | 509 String serverHeader) |
| 507 : super(uri, protocolVersion, outgoing) { | 510 : super(uri, protocolVersion, outgoing, initialHeaders: defaultHeaders) { |
| 508 if (serverHeader != null) headers._add('server', serverHeader); | 511 if (serverHeader != null) headers.set('server', serverHeader); |
| 509 } | 512 } |
| 510 | 513 |
| 511 bool get _isConnectionClosed => _httpRequest._httpConnection._isClosing; | 514 bool get _isConnectionClosed => _httpRequest._httpConnection._isClosing; |
| 512 | 515 |
| 513 List<Cookie> get cookies { | 516 List<Cookie> get cookies { |
| 514 if (_cookies == null) _cookies = new List<Cookie>(); | 517 if (_cookies == null) _cookies = new List<Cookie>(); |
| 515 return _cookies; | 518 return _cookies; |
| 516 } | 519 } |
| 517 | 520 |
| 518 int get statusCode => _statusCode; | 521 int get statusCode => _statusCode; |
| (...skipping 1511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2030 if (closing) destroy(); | 2033 if (closing) destroy(); |
| 2031 }); | 2034 }); |
| 2032 // Only handle one incoming request at the time. Keep the | 2035 // Only handle one incoming request at the time. Keep the |
| 2033 // stream paused until the request has been send. | 2036 // stream paused until the request has been send. |
| 2034 _subscription.pause(); | 2037 _subscription.pause(); |
| 2035 _state = _ACTIVE; | 2038 _state = _ACTIVE; |
| 2036 var outgoing = new _HttpOutgoing(_socket); | 2039 var outgoing = new _HttpOutgoing(_socket); |
| 2037 var response = new _HttpResponse(incoming.uri, | 2040 var response = new _HttpResponse(incoming.uri, |
| 2038 incoming.headers.protocolVersion, | 2041 incoming.headers.protocolVersion, |
| 2039 outgoing, | 2042 outgoing, |
| 2043 _httpServer.defaultResponseHeaders, |
| 2040 _httpServer.serverHeader); | 2044 _httpServer.serverHeader); |
| 2041 var request = new _HttpRequest(response, incoming, _httpServer, this); | 2045 var request = new _HttpRequest(response, incoming, _httpServer, this); |
| 2042 _streamFuture = outgoing.done | 2046 _streamFuture = outgoing.done |
| 2043 .then((_) { | 2047 .then((_) { |
| 2044 response.deadline = null; | 2048 response.deadline = null; |
| 2045 if (_state == _DETACHED) return; | 2049 if (_state == _DETACHED) return; |
| 2046 if (response.persistentConnection && | 2050 if (response.persistentConnection && |
| 2047 request.persistentConnection && | 2051 request.persistentConnection && |
| 2048 incoming.fullBodyRead && | 2052 incoming.fullBodyRead && |
| 2049 !_httpParser.upgrade && | 2053 !_httpParser.upgrade && |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2148 | 2152 |
| 2149 | 2153 |
| 2150 // HTTP server waiting for socket connections. | 2154 // HTTP server waiting for socket connections. |
| 2151 class _HttpServer | 2155 class _HttpServer |
| 2152 extends Stream<HttpRequest> with _ServiceObject | 2156 extends Stream<HttpRequest> with _ServiceObject |
| 2153 implements HttpServer { | 2157 implements HttpServer { |
| 2154 // Use default Map so we keep order. | 2158 // Use default Map so we keep order. |
| 2155 static Map<int, _HttpServer> _servers = new Map<int, _HttpServer>(); | 2159 static Map<int, _HttpServer> _servers = new Map<int, _HttpServer>(); |
| 2156 | 2160 |
| 2157 String serverHeader; | 2161 String serverHeader; |
| 2162 final HttpHeaders defaultResponseHeaders = _initDefaultResponseHeaders(); |
| 2158 | 2163 |
| 2159 Duration _idleTimeout; | 2164 Duration _idleTimeout; |
| 2160 Timer _idleTimer; | 2165 Timer _idleTimer; |
| 2161 | 2166 |
| 2162 static Future<HttpServer> bind(address, int port, int backlog) { | 2167 static Future<HttpServer> bind(address, int port, int backlog) { |
| 2163 return ServerSocket.bind(address, port, backlog: backlog).then((socket) { | 2168 return ServerSocket.bind(address, port, backlog: backlog).then((socket) { |
| 2164 return new _HttpServer._(socket, true); | 2169 return new _HttpServer._(socket, true); |
| 2165 }); | 2170 }); |
| 2166 } | 2171 } |
| 2167 | 2172 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2190 } | 2195 } |
| 2191 | 2196 |
| 2192 _HttpServer.listenOn(this._serverSocket) : _closeServer = false { | 2197 _HttpServer.listenOn(this._serverSocket) : _closeServer = false { |
| 2193 _controller = new StreamController<HttpRequest>(sync: true, | 2198 _controller = new StreamController<HttpRequest>(sync: true, |
| 2194 onCancel: close); | 2199 onCancel: close); |
| 2195 idleTimeout = const Duration(seconds: 120); | 2200 idleTimeout = const Duration(seconds: 120); |
| 2196 _servers[_serviceId] = this; | 2201 _servers[_serviceId] = this; |
| 2197 try { _serverSocket._owner = this; } catch (_) {} | 2202 try { _serverSocket._owner = this; } catch (_) {} |
| 2198 } | 2203 } |
| 2199 | 2204 |
| 2205 static HttpHeaders _initDefaultResponseHeaders() { |
| 2206 var defaultResponseHeaders = new _HttpHeaders('1.1'); |
| 2207 defaultResponseHeaders.contentType = ContentType.TEXT; |
| 2208 defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN'); |
| 2209 defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff'); |
| 2210 defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block'); |
| 2211 return defaultResponseHeaders; |
| 2212 } |
| 2213 |
| 2200 Duration get idleTimeout => _idleTimeout; | 2214 Duration get idleTimeout => _idleTimeout; |
| 2201 | 2215 |
| 2202 void set idleTimeout(Duration duration) { | 2216 void set idleTimeout(Duration duration) { |
| 2203 if (_idleTimer != null) { | 2217 if (_idleTimer != null) { |
| 2204 _idleTimer.cancel(); | 2218 _idleTimer.cancel(); |
| 2205 _idleTimer = null; | 2219 _idleTimer = null; |
| 2206 } | 2220 } |
| 2207 _idleTimeout = duration; | 2221 _idleTimeout = duration; |
| 2208 if (_idleTimeout != null) { | 2222 if (_idleTimeout != null) { |
| 2209 _idleTimer = new Timer.periodic(_idleTimeout, (_) { | 2223 _idleTimer = new Timer.periodic(_idleTimeout, (_) { |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2803 const _RedirectInfo(this.statusCode, this.method, this.location); | 2817 const _RedirectInfo(this.statusCode, this.method, this.location); |
| 2804 } | 2818 } |
| 2805 | 2819 |
| 2806 String _getHttpVersion() { | 2820 String _getHttpVersion() { |
| 2807 var version = Platform.version; | 2821 var version = Platform.version; |
| 2808 // Only include major and minor version numbers. | 2822 // Only include major and minor version numbers. |
| 2809 int index = version.indexOf('.', version.indexOf('.') + 1); | 2823 int index = version.indexOf('.', version.indexOf('.') + 1); |
| 2810 version = version.substring(0, index); | 2824 version = version.substring(0, index); |
| 2811 return 'Dart/$version (dart:io)'; | 2825 return 'Dart/$version (dart:io)'; |
| 2812 } | 2826 } |
| OLD | NEW |