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

Unified Diff: sdk/lib/io/websocket_impl.dart

Issue 12400002: Add individual HTTP request to web socket upgrade support (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: sdk/lib/io/websocket_impl.dart
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 2dfa26dce2b089daba8c59729ff4fe0e6000d6c0..a849ae1850c41afd52f7a7d72cfbbfe1f523e0e0 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -363,40 +363,42 @@ class _WebSocketTransformerImpl implements WebSocketTransformer {
Stream<WebSocket> bind(Stream<HttpRequest> stream) {
stream.listen((request) {
- var response = request.response;
- if (!_isWebSocketUpgrade(request)) {
- _controller.signalError(
- new AsyncError(
- new WebSocketException("Invalid WebSocket upgrade request")));
- request.listen((_) {}, onDone: () {
- response.statusCode = HttpStatus.BAD_REQUEST;
- response.contentLength = 0;
- response.close();
- });
- return;
- }
- // Send the upgrade response.
- response.statusCode = HttpStatus.SWITCHING_PROTOCOLS;
- response.headers.add(HttpHeaders.CONNECTION, "Upgrade");
- response.headers.add(HttpHeaders.UPGRADE, "websocket");
- String key = request.headers.value("Sec-WebSocket-Key");
- SHA1 sha1 = new SHA1();
- sha1.add("$key$_webSocketGUID".codeUnits);
- String accept = _Base64._encode(sha1.close());
- response.headers.add("Sec-WebSocket-Accept", accept);
- response.headers.contentLength = 0;
- response.detachSocket()
- .then((socket) {
- _controller.add(new _WebSocketImpl._fromSocket(socket));
- }, onError: (error) {
- _controller.signalError(error);
- });
+ _upgrade(request)
+ .then((WebSocket webSocket) => _controller.add(webSocket))
+ .catchError((error) => _controller.signalError(error));
});
return _controller.stream;
}
- bool _isWebSocketUpgrade(HttpRequest request) {
+ static Future<WebSocket> _upgrade(HttpRequest request) {
+ var response = request.response;
+ if (!_isUpgradeRequest(request)) {
+ // Send error response and drain the request.
+ request.listen((_) {}, onDone: () {
+ response.statusCode = HttpStatus.BAD_REQUEST;
+ response.contentLength = 0;
+ response.close();
+ });
+ return new Future.immediateError(
+ new WebSocketException("Invalid WebSocket upgrade request"));
+ }
+
+ // Send the upgrade response.
+ response.statusCode = HttpStatus.SWITCHING_PROTOCOLS;
+ response.headers.add(HttpHeaders.CONNECTION, "Upgrade");
+ response.headers.add(HttpHeaders.UPGRADE, "websocket");
+ String key = request.headers.value("Sec-WebSocket-Key");
+ SHA1 sha1 = new SHA1();
+ sha1.add("$key$_webSocketGUID".codeUnits);
+ String accept = _Base64._encode(sha1.close());
+ response.headers.add("Sec-WebSocket-Accept", accept);
+ response.headers.contentLength = 0;
+ return response.detachSocket()
+ .then((socket) => new _WebSocketImpl._fromSocket(socket));
+ }
+
+ static bool _isUpgradeRequest(HttpRequest request) {
if (request.method != "GET") {
return false;
}

Powered by Google App Engine
This is Rietveld 408576698