| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 /// A Shelf adapter for handling [HttpRequest] objects from `dart:io`. | 5 /// A Shelf adapter for handling [HttpRequest] objects from `dart:io`. |
| 6 /// | 6 /// |
| 7 /// One can provide an instance of [HttpServer] as the `requests` parameter in | 7 /// One can provide an instance of [HttpServer] as the `requests` parameter in |
| 8 /// [serveRequests]. | 8 /// [serveRequests]. |
| 9 /// | 9 /// |
| 10 /// The `dart:io` adapter supports request hijacking; see [Request.hijack]. | 10 /// The `dart:io` adapter supports request hijacking; see [Request.hijack]. |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 | 114 |
| 115 response.headers.forEach((header, value) { | 115 response.headers.forEach((header, value) { |
| 116 if (value == null) return; | 116 if (value == null) return; |
| 117 httpResponse.headers.set(header, value); | 117 httpResponse.headers.set(header, value); |
| 118 }); | 118 }); |
| 119 | 119 |
| 120 if (response.headers[HttpHeaders.SERVER] == null) { | 120 if (response.headers[HttpHeaders.SERVER] == null) { |
| 121 var value = httpResponse.headers.value(HttpHeaders.SERVER); | 121 var value = httpResponse.headers.value(HttpHeaders.SERVER); |
| 122 httpResponse.headers.set(HttpHeaders.SERVER, '$value with Shelf'); | 122 httpResponse.headers.set(HttpHeaders.SERVER, '$value with Shelf'); |
| 123 } | 123 } |
| 124 |
| 125 if (!response.headers.containsKey(HttpHeaders.DATE)) { |
| 126 httpResponse.headers.date = new DateTime.now().toUtc(); |
| 127 } |
| 128 |
| 124 return httpResponse.addStream(response.read()) | 129 return httpResponse.addStream(response.read()) |
| 125 .then((_) => httpResponse.close()); | 130 .then((_) => httpResponse.close()); |
| 126 } | 131 } |
| 127 | 132 |
| 128 // TODO(kevmoo) A developer mode is needed to include error info in response | 133 // TODO(kevmoo) A developer mode is needed to include error info in response |
| 129 // TODO(kevmoo) Make error output plugable. stderr, logging, etc | 134 // TODO(kevmoo) Make error output plugable. stderr, logging, etc |
| 130 Response _logError(String message, [StackTrace stackTrace]) { | 135 Response _logError(String message, [StackTrace stackTrace]) { |
| 131 var chain = new Chain.current(); | 136 var chain = new Chain.current(); |
| 132 if (stackTrace != null) { | 137 if (stackTrace != null) { |
| 133 chain = new Chain.forTrace(stackTrace); | 138 chain = new Chain.forTrace(stackTrace); |
| 134 } | 139 } |
| 135 chain = chain | 140 chain = chain |
| 136 .foldFrames((frame) => frame.isCore || frame.package == 'shelf') | 141 .foldFrames((frame) => frame.isCore || frame.package == 'shelf') |
| 137 .terse; | 142 .terse; |
| 138 | 143 |
| 139 stderr.writeln('ERROR - ${new DateTime.now()}'); | 144 stderr.writeln('ERROR - ${new DateTime.now()}'); |
| 140 stderr.writeln(message); | 145 stderr.writeln(message); |
| 141 stderr.writeln(chain); | 146 stderr.writeln(chain); |
| 142 return new Response.internalServerError(); | 147 return new Response.internalServerError(); |
| 143 } | 148 } |
| OLD | NEW |