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

Unified Diff: tests/standalone/io/web_socket_compression_test.dart

Issue 1437623002: Ensure proper response to chrome client_max_window_bits (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Add window resize test Created 5 years, 1 month 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 | « sdk/lib/io/websocket_impl.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/standalone/io/web_socket_compression_test.dart
diff --git a/tests/standalone/io/web_socket_compression_test.dart b/tests/standalone/io/web_socket_compression_test.dart
index f992a9f16b462110674f15dcf8bd4f91142c6ee9..b1fd13ffd9fb36ab4bf6d8461071d52f37638353 100644
--- a/tests/standalone/io/web_socket_compression_test.dart
+++ b/tests/standalone/io/web_socket_compression_test.dart
@@ -11,6 +11,7 @@ import "dart:async";
import "dart:convert";
import "dart:io";
import "dart:typed_data";
+import "dart:math";
import "package:async_helper/async_helper.dart";
import "package:crypto/crypto.dart";
@@ -46,6 +47,46 @@ class SecurityConfiguration {
// TODO(whesse): Add client context argument to WebSocket.connect
WebSocket.connect('${secure ? "wss" : "ws"}://$HOST_NAME:$port/');
+ Future<HttpClientResponse> createWebsocket(String url, String headerValue) {
+ HttpClient _httpClient = new HttpClient();
+ Uri uri = Uri.parse(url);
+
+ Random random = new Random();
+ // Generate 16 random bytes.
+ Uint8List nonceData = new Uint8List(16);
+ for (int i = 0; i < 16; i++) {
+ nonceData[i] = random.nextInt(256);
+ }
+ String nonce = CryptoUtils.bytesToBase64(nonceData);
+
+ uri = new Uri(
+ scheme: uri.scheme == "wss" ? "https" : "http",
+ userInfo: uri.userInfo,
+ host: uri.host,
+ port: uri.port,
+ path: uri.path,
+ query: uri.query,
+ fragment: uri.fragment);
+ return _httpClient.openUrl("GET", uri).then((request) {
+ if (uri.userInfo != null && !uri.userInfo.isEmpty) {
+ // If the URL contains user information use that for basic
+ // authorization.
+ String auth = CryptoUtils.bytesToBase64(UTF8.encode(uri.userInfo));
+ request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
+ }
+ // Setup the initial handshake.
+ request.headers
+ ..set(HttpHeaders.CONNECTION, "Upgrade")
+ ..set(HttpHeaders.UPGRADE, "websocket")
+ ..set("Sec-WebSocket-Key", nonce)
+ ..set("Cache-Control", "no-cache")
+ ..set("Sec-WebSocket-Version", "13")
+ ..set("Sec-WebSocket-Extensions", headerValue);
+
+ return request.close();
+ });
+ }
+
void testCompressionSupport({server: false,
client: false,
contextTakeover: false}) {
@@ -130,6 +171,51 @@ class SecurityConfiguration {
});
}
+ void testReturnHeaders(String headerValue, String expected) {
+ asyncStart();
+ createServer().then((server) {
+ server.listen((request) {
+ // Stuff
+ Expect.isTrue(WebSocketTransformer.isUpgradeRequest(request));
+ WebSocketTransformer.upgrade(request).then((webSocket) {
+ webSocket.listen((message) {
+ Expect.equals("Hello World", message);
+
+ webSocket.add(message);
+ webSocket.close();
+ });
+ });
+ });
+
+ var url = '${secure ? "wss" : "ws"}://$HOST_NAME:${server.port}/';
+ createWebsocket(url, headerValue)
+ .then((HttpClientResponse response) {
+ Expect.equals(response.statusCode, HttpStatus.SWITCHING_PROTOCOLS);
+ print(response.headers.value('Sec-WebSocket-Extensions'));
+ Expect.equals(response.headers.value("Sec-WebSocket-Extensions"),
+ expected);
+
+ String accept = response.headers.value("Sec-WebSocket-Accept");
+ Expect.isNotNull(accept);
+
+ var protocol = response.headers.value('Sec-WebSocket-Protocol');
+ return response.detachSocket().then((socket) =>
+ new WebSocket.fromUpgradedSocket(
+ socket, protocol: protocol, serverSide: false));
+ }).then((websocket) {
+ var future = websocket.listen((message) {
+ Expect.equals("Hello", message);
+ websocket.close();
+ }).asFuture();
+ websocket.add("Hello World");
+ return future;
+ }).then((_) {
+ server.close();
+ asyncEnd();
+ });
+ }); // End createServer
+ }
+
void runTests() {
// No compression or takeover
testCompressionSupport();
@@ -143,6 +229,17 @@ class SecurityConfiguration {
testCompressionSupport(server: true);
testCompressionHeaders();
+ // Chrome headers
+ testReturnHeaders('permessage-deflate; client_max_window_bits',
+ "permessage-deflate; client_max_window_bits=15");
+ // Firefox headers
+ testReturnHeaders('permessage-deflate',
+ "permessage-deflate; client_max_window_bits=15");
+ // Ensure max_window_bits resize appropriately.
+ testReturnHeaders('permessage-deflate; server_max_window_bits=10',
+ "permessage-deflate;"
+ " server_max_window_bits=10;"
+ " client_max_window_bits=10");
}
}
« no previous file with comments | « sdk/lib/io/websocket_impl.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698