Index: mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart |
diff --git a/mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart b/mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8aac366859ef1ce5eddb9878a557db27729d6774 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart |
@@ -0,0 +1,61 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library shelf_web_socket; |
+ |
+import 'package:shelf/shelf.dart'; |
+ |
+import 'src/web_socket_handler.dart'; |
+ |
+/// A typedef used to determine if a function takes two arguments or not. |
+typedef _BinaryFunction(arg1, arg2); |
+ |
+/// Creates a Shelf handler that upgrades HTTP requests to WebSocket |
+/// connections. |
+/// |
+/// Only valid WebSocket upgrade requests are upgraded. If a request doesn't |
+/// look like a WebSocket upgrade request, a 404 Not Found is returned; if a |
+/// request looks like an upgrade request but is invalid, a 400 Bad Request is |
+/// returned; and if a request is a valid upgrade request but has an origin that |
+/// doesn't match [allowedOrigins] (see below), a 403 Forbidden is returned. |
+/// This means that this can be placed first in a [Cascade] and only upgrade |
+/// requests will be handled. |
+/// |
+/// The [onConnection] must take a [CompatibleWebSocket] as its first argument. |
+/// It may also take a string, the [WebSocket subprotocol][], as its second |
+/// argument. The subprotocol is determined by looking at the client's |
+/// `Sec-WebSocket-Protocol` header and selecting the first entry that also |
+/// appears in [protocols]. If no subprotocols are shared between the client and |
+/// the server, `null` will be passed instead. Note that if [onConnection] takes |
+/// two arguments, [protocols] must be passed. |
+/// |
+/// [WebSocket subprotocol]: https://tools.ietf.org/html/rfc6455#section-1.9 |
+/// |
+/// If [allowedOrigins] is passed, browser connections will only be accepted if |
+/// they're made by a script from one of the given origins. This ensures that |
+/// malicious scripts running in the browser are unable to fake a WebSocket |
+/// handshake. Note that non-browser programs can still make connections freely. |
+/// See also the WebSocket spec's discussion of [origin considerations][]. |
+/// |
+/// [origin considerations]: https://tools.ietf.org/html/rfc6455#section-10.2 |
+Handler webSocketHandler(Function onConnection, {Iterable<String> protocols, |
+ Iterable<String> allowedOrigins}) { |
+ if (protocols != null) protocols = protocols.toSet(); |
+ if (allowedOrigins != null) { |
+ allowedOrigins = allowedOrigins |
+ .map((origin) => origin.toLowerCase()).toSet(); |
+ } |
+ |
+ if (onConnection is! _BinaryFunction) { |
+ if (protocols != null) { |
+ throw new ArgumentError("If protocols is non-null, onConnection must " |
+ "take two arguments, the WebSocket and the protocol."); |
+ } |
+ |
+ var innerOnConnection = onConnection; |
+ onConnection = (webSocket, _) => innerOnConnection(webSocket); |
+ } |
+ |
+ return new WebSocketHandler(onConnection, protocols, allowedOrigins).handle; |
+} |