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

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

Issue 1208473005: WebSocket Compression (Closed) Base URL: https://github.com/dart-lang/sdk.git
Patch Set: Created 5 years, 6 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
« no previous file with comments | « no previous file | sdk/lib/io/websocket_impl.dart » ('j') | sdk/lib/io/websocket_impl.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/websocket.dart
diff --git a/sdk/lib/io/websocket.dart b/sdk/lib/io/websocket.dart
index 599e295c60ac92923dc620303830b986b8522f96..3a65685259c89df5d92999645ca84c3c1fa846d4 100644
--- a/sdk/lib/io/websocket.dart
+++ b/sdk/lib/io/websocket.dart
@@ -24,6 +24,93 @@ abstract class WebSocketStatus {
}
/**
+ * The [CompressionOptions] class allows you to control
+ * the options of WebSocket compression.
+ */
+class CompressionOptions {
+ /**
+ * Default WebSocket Compression options.
+ * Compression will be enabled with the following options:
+ * clientNoContextTakeover: false
+ * serverNoContextTakeover: false
+ * clientMaxWindowBits: 15
+ * serverMaxWindowBits: 15
+ */
+ static const CompressionOptions DEFAULT = const CompressionOptions();
+
+ /**
+ * Disables WebSocket Compression.
+ */
+ static const CompressionOptions OFF = const CompressionOptions(enabled: false);
Søren Gjesse 2015/06/25 15:41:26 Long line, see https://www.dartlang.org/articles/s
+
+ /**
+ * Control whether the client will reuse it's compression instances.
+ */
+ final bool clientNoContextTakeover;
+
+ /**
+ * Control whether the server will reuse it's compression instances.
+ */
+ final bool serverNoContextTakeover;
+
+ /**
+ * Sets the Max Window Bits for the Client.
+ */
+ final int clientMaxWindowBits;
+
+ /**
+ * Sets the Max Window Bits for the Server.
+ */
+ final int serverMaxWindowBits;
+
+ /**
+ * Enables or disables WebSocket compression.
+ */
+ final bool enabled;
+
+ const CompressionOptions({this.clientNoContextTakeover: false,
Søren Gjesse 2015/06/25 15:41:26 Please reformat the arguments, see https://www.dar
+ this.serverNoContextTakeover: false, this.clientMaxWindowBits,
+ this.serverMaxWindowBits, this.enabled: true});
+
+ /**
+ * Create a Compression Header
+ */
+ String _createHeader([List<String> requested]) {
+ if (!enabled) {
+ return "";
+ }
+
+ var header = "permessage-deflate";
+
+ if (requested == null) {
+ header += "; client_max_window_bits";
+ } else {
+ if (requested.contains("client_max_window_bits")) {
+ var myMaxWindowBits = clientMaxWindowBits == null ? 15 : clientMaxWindowBits;
Søren Gjesse 2015/06/25 15:41:26 Long line.
+ header += "; client_max_window_bits=${myMaxWindowBits}";
+ }
+ }
+
+ if (clientNoContextTakeover && (requested != null
Søren Gjesse 2015/06/25 15:41:27 Please look at https://www.dartlang.org/articles/s
+ && requested.contains("client_no_context_takeover"))) {
+ header += "; client_no_context_takeover";
+ }
+
+ if (serverNoContextTakeover && (requested != null
+ && requested.contains("server_no_context_takeover"))) {
+ header += "; server_no_context_takeover";
+ }
+
+ if (requested != null) {
+ var mwb = serverMaxWindowBits == null ? 15 : serverMaxWindowBits;
+ header += "; server_max_window_bits=${mwb}";
+ }
+
+ return header;
+ }
+}
+
+/**
* The [WebSocketTransformer] provides the ability to upgrade a
* [HttpRequest] to a [WebSocket] connection. It supports both
* upgrading a single [HttpRequest] and upgrading a stream of
@@ -63,8 +150,9 @@ abstract class WebSocketTransformer
* completing with a [String]. The [String] must exist in the list of
* protocols.
*/
- factory WebSocketTransformer({protocolSelector(List<String> protocols)})
- => new _WebSocketTransformerImpl(protocolSelector);
+ factory WebSocketTransformer({protocolSelector(List<String> protocols),
+ CompressionOptions compression: CompressionOptions.DEFAULT})
+ => new _WebSocketTransformerImpl(protocolSelector, compression);
/**
* Upgrades a [HttpRequest] to a [WebSocket] connection. If the
@@ -80,8 +168,9 @@ abstract class WebSocketTransformer
* protocols.
*/
static Future<WebSocket> upgrade(HttpRequest request,
- {protocolSelector(List<String> protocols)}) {
- return _WebSocketTransformerImpl._upgrade(request, protocolSelector);
+ {protocolSelector(List<String> protocols),
+ CompressionOptions compression: CompressionOptions.DEFAULT}) {
+ return _WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
}
/**
@@ -176,12 +265,12 @@ abstract class WebSocket implements Stream, StreamSink {
* act as the server and will not mask its messages.
*/
factory WebSocket.fromUpgradedSocket(Socket socket, {String protocol,
- bool serverSide}) {
+ bool serverSide, CompressionOptions compression: CompressionOptions.DEFAULT}) {
if (serverSide == null) {
throw new ArgumentError("The serverSide argument must be passed "
"explicitly to WebSocket.fromUpgradedSocket.");
}
- return new _WebSocketImpl._fromSocket(socket, protocol, serverSide);
+ return new _WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
}
/**
« no previous file with comments | « no previous file | sdk/lib/io/websocket_impl.dart » ('j') | sdk/lib/io/websocket_impl.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698