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

Side by Side Diff: lib/shelf_io.dart

Issue 837193005: pkg/shelf: formatted code (Closed) Base URL: https://github.com/dart-lang/shelf.git@master
Patch Set: nits Created 5 years, 11 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
« no previous file with comments | « example/example_server.dart ('k') | lib/src/cascade.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) 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].
11 library shelf.io; 11 library shelf.io;
12 12
13 import 'dart:async'; 13 import 'dart:async';
14 import 'dart:io'; 14 import 'dart:io';
15 15
16 import 'package:stack_trace/stack_trace.dart'; 16 import 'package:stack_trace/stack_trace.dart';
17 17
18 import 'shelf.dart'; 18 import 'shelf.dart';
19 import 'src/util.dart'; 19 import 'src/util.dart';
20 20
21 /// Starts an [HttpServer] that listens on the specified [address] and 21 /// Starts an [HttpServer] that listens on the specified [address] and
22 /// [port] and sends requests to [handler]. 22 /// [port] and sends requests to [handler].
23 /// 23 ///
24 /// See the documentation for [HttpServer.bind] for more details on [address], 24 /// See the documentation for [HttpServer.bind] for more details on [address],
25 /// [port], and [backlog]. 25 /// [port], and [backlog].
26 Future<HttpServer> serve(Handler handler, address, int port, 26 Future<HttpServer> serve(Handler handler, address, int port, {int backlog}) {
27 {int backlog}) {
28 if (backlog == null) backlog = 0; 27 if (backlog == null) backlog = 0;
29 return HttpServer.bind(address, port, backlog: backlog).then((server) { 28 return HttpServer.bind(address, port, backlog: backlog).then((server) {
30 serveRequests(server, handler); 29 serveRequests(server, handler);
31 return server; 30 return server;
32 }); 31 });
33 } 32 }
34 33
35 /// Serve a [Stream] of [HttpRequest]s. 34 /// Serve a [Stream] of [HttpRequest]s.
36 /// 35 ///
37 /// [HttpServer] implements [Stream<HttpRequest>] so it can be passed directly 36 /// [HttpServer] implements [Stream<HttpRequest>] so it can be passed directly
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 "Caught HijackException, but the request wasn't hijacked.", 73 "Caught HijackException, but the request wasn't hijacked.",
75 stackTrace); 74 stackTrace);
76 } 75 }
77 76
78 return _logError('Error thrown by handler.\n$error', stackTrace); 77 return _logError('Error thrown by handler.\n$error', stackTrace);
79 }).then((response) { 78 }).then((response) {
80 if (response == null) { 79 if (response == null) {
81 response = _logError('null response from handler.'); 80 response = _logError('null response from handler.');
82 } else if (!shelfRequest.canHijack) { 81 } else if (!shelfRequest.canHijack) {
83 var message = new StringBuffer() 82 var message = new StringBuffer()
84 ..writeln("Got a response for hijacked request " 83 ..writeln("Got a response for hijacked request "
85 "${shelfRequest.method} ${shelfRequest.requestedUri}:") 84 "${shelfRequest.method} ${shelfRequest.requestedUri}:")
86 ..writeln(response.statusCode); 85 ..writeln(response.statusCode);
87 response.headers.forEach((key, value) => 86 response.headers
88 message.writeln("${key}: ${value}")); 87 .forEach((key, value) => message.writeln("${key}: ${value}"));
89 throw new Exception(message.toString().trim()); 88 throw new Exception(message.toString().trim());
90 } 89 }
91 90
92 return _writeResponse(response, request.response); 91 return _writeResponse(response, request.response);
93 }).catchError((error, stackTrace) { 92 }).catchError((error, stackTrace) {
94 // Ignore HijackExceptions. 93 // Ignore HijackExceptions.
95 if (error is! HijackException) throw error; 94 if (error is! HijackException) throw error;
96 }); 95 });
97 } 96 }
98 97
99 /// Creates a new [Request] from the provided [HttpRequest]. 98 /// Creates a new [Request] from the provided [HttpRequest].
100 Request _fromHttpRequest(HttpRequest request) { 99 Request _fromHttpRequest(HttpRequest request) {
101 var headers = {}; 100 var headers = {};
102 request.headers.forEach((k, v) { 101 request.headers.forEach((k, v) {
103 // Multiple header values are joined with commas. 102 // Multiple header values are joined with commas.
104 // See http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-21#page-22 103 // See http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-21#page-22
105 headers[k] = v.join(','); 104 headers[k] = v.join(',');
106 }); 105 });
107 106
108 onHijack(callback) { 107 onHijack(callback) {
109 return request.response.detachSocket(writeHeaders: false) 108 return request.response
109 .detachSocket(writeHeaders: false)
110 .then((socket) => callback(socket, socket)); 110 .then((socket) => callback(socket, socket));
111 } 111 }
112 112
113 return new Request(request.method, request.requestedUri, 113 return new Request(request.method, request.requestedUri,
114 protocolVersion: request.protocolVersion, headers: headers, 114 protocolVersion: request.protocolVersion,
115 body: request, onHijack: onHijack); 115 headers: headers,
116 body: request,
117 onHijack: onHijack);
116 } 118 }
117 119
118 Future _writeResponse(Response response, HttpResponse httpResponse) { 120 Future _writeResponse(Response response, HttpResponse httpResponse) {
119 httpResponse.statusCode = response.statusCode; 121 httpResponse.statusCode = response.statusCode;
120 122
121 response.headers.forEach((header, value) { 123 response.headers.forEach((header, value) {
122 if (value == null) return; 124 if (value == null) return;
123 httpResponse.headers.set(header, value); 125 httpResponse.headers.set(header, value);
124 }); 126 });
125 127
126 if (!response.headers.containsKey(HttpHeaders.SERVER)) { 128 if (!response.headers.containsKey(HttpHeaders.SERVER)) {
127 httpResponse.headers.set(HttpHeaders.SERVER, 'dart:io with Shelf'); 129 httpResponse.headers.set(HttpHeaders.SERVER, 'dart:io with Shelf');
128 } 130 }
129 131
130 if (!response.headers.containsKey(HttpHeaders.DATE)) { 132 if (!response.headers.containsKey(HttpHeaders.DATE)) {
131 httpResponse.headers.date = new DateTime.now().toUtc(); 133 httpResponse.headers.date = new DateTime.now().toUtc();
132 } 134 }
133 135
134 return httpResponse.addStream(response.read()) 136 return httpResponse
137 .addStream(response.read())
135 .then((_) => httpResponse.close()); 138 .then((_) => httpResponse.close());
136 } 139 }
137 140
138 // TODO(kevmoo) A developer mode is needed to include error info in response 141 // TODO(kevmoo) A developer mode is needed to include error info in response
139 // TODO(kevmoo) Make error output plugable. stderr, logging, etc 142 // TODO(kevmoo) Make error output plugable. stderr, logging, etc
140 Response _logError(String message, [StackTrace stackTrace]) { 143 Response _logError(String message, [StackTrace stackTrace]) {
141 var chain = new Chain.current(); 144 var chain = new Chain.current();
142 if (stackTrace != null) { 145 if (stackTrace != null) {
143 chain = new Chain.forTrace(stackTrace); 146 chain = new Chain.forTrace(stackTrace);
144 } 147 }
145 chain = chain 148 chain = chain
146 .foldFrames((frame) => frame.isCore || frame.package == 'shelf') 149 .foldFrames((frame) => frame.isCore || frame.package == 'shelf').terse;
147 .terse;
148 150
149 stderr.writeln('ERROR - ${new DateTime.now()}'); 151 stderr.writeln('ERROR - ${new DateTime.now()}');
150 stderr.writeln(message); 152 stderr.writeln(message);
151 stderr.writeln(chain); 153 stderr.writeln(chain);
152 return new Response.internalServerError(); 154 return new Response.internalServerError();
153 } 155 }
OLDNEW
« no previous file with comments | « example/example_server.dart ('k') | lib/src/cascade.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698