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

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

Issue 12383048: Improve support for HTTP 1.0 clients (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
« no previous file with comments | « sdk/lib/io/http_impl.dart ('k') | tests/standalone/io/http_content_length_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/standalone/io/http_10_test.dart
diff --git a/tests/standalone/io/http_10_test.dart b/tests/standalone/io/http_10_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..a923562f6c8a000b0ce80b83ced4129fab1fc8bc
--- /dev/null
+++ b/tests/standalone/io/http_10_test.dart
@@ -0,0 +1,212 @@
+// Copyright (c) 2013, 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.
+
+// VMOptions=
+// VMOptions=--short_socket_read
+// VMOptions=--short_socket_write
+// VMOptions=--short_socket_read --short_socket_write
+
+import "dart:isolate";
+import "dart:io";
+
+// Client makes a HTTP 1.0 request without connection keep alive. The
+// server sets a content length but still needs to close the
+// connection as there is no keep alive.
+void testHttp10NoKeepAlive() {
+ HttpServer.bind().then((server) {
+ server.listen(
+ (HttpRequest request) {
+ Expect.isNull(request.headers.value('content-length'));
+ Expect.equals(-1, request.contentLength);
+ var response = request.response;
+ response.contentLength = 1;
+ Expect.equals("1.0", request.protocolVersion);
+ response.done
+ .then((_) => Expect.fail("Unexpected response completion"))
+ .catchError((e) => Expect.isTrue(e.error is HttpException));
+ response.addString("Z");
+ response.addString("Z");
+ response.close();
+ Expect.throws(() => response.addString("x"),
+ (e) => e is StateError);
+ },
+ onError: (e) => Expect.fail("Unexpected error $e"));
+
+ int count = 0;
+ makeRequest() {
+ Socket.connect("127.0.0.1", server.port).then((socket) {
+ socket.addString("GET / HTTP/1.0\r\n\r\n");
+
+ List<int> response = [];
+ socket.listen(
+ response.addAll,
+ onDone: () {
+ count++;
+ socket.destroy();
+ String s = new String.fromCharCodes(response).toLowerCase();
+ Expect.equals("z", s[s.length - 1]);
+ Expect.isTrue(s.indexOf("\r\ncontent-length: 1\r\n") > 0);
+ Expect.equals(-1, s.indexOf("keep-alive"));
+ if (count < 10) {
+ makeRequest();
+ } else {
+ server.close();
+ }
+ });
+ });
+ }
+ makeRequest();
+ });
+}
+
+
+// Client makes a HTTP 1.0 request and the server does not set a
+// content length so it has to close the connection to mark the end of
+// the response.
+void testHttp10ServerClose() {
+ HttpServer.bind().then((server) {
+ server.listen(
+ (HttpRequest request) {
+ Expect.isNull(request.headers.value('content-length'));
+ Expect.equals(-1, request.contentLength);
+ var response = request.response;
+ Expect.equals("1.0", request.protocolVersion);
+ response.addString("Z");
+ response.close();
+ },
+ onError: (e) => Expect.fail("Unexpected error $e"));
+
+ int count = 0;
+ makeRequest() {
+ Socket.connect("127.0.0.1", server.port).then((socket) {
+ socket.addString("GET / HTTP/1.0\r\n\r\n");
+ socket.addString("Connection: Keep-Alive\r\n\r\n");
+
+ List<int> response = [];
+ socket.listen(
+ response.addAll,
+ onDone: () {
+ socket.destroy();
+ count++;
+ String s = new String.fromCharCodes(response).toLowerCase();
+ print(s);
+ Expect.equals("z", s[s.length - 1]);
+ Expect.equals(-1, s.indexOf("content-length:"));
+ Expect.equals(-1, s.indexOf("keep-alive"));
+ if (count < 10) {
+ makeRequest();
+ } else {
+ server.close();
+ }
+ },onError: (e) => print(e));
+ });
+ }
+ makeRequest();
+ });
+}
+
+
+// Client makes a HTTP 1.0 request with connection keep alive. The
+// server sets a content length so the persistent connection can be
+// used.
+void testHttp10KeepAlive() {
+ HttpServer.bind().then((server) {
+ server.listen(
+ (HttpRequest request) {
+ Expect.isNull(request.headers.value('content-length'));
+ Expect.equals(-1, request.contentLength);
+ var response = request.response;
+ response.contentLength = 1;
+ Expect.equals("1.0", request.protocolVersion);
+ response.addString("Z");
+ response.close();
+ },
+ onError: (e) => Expect.fail("Unexpected error $e"));
+
+ Socket.connect("127.0.0.1", server.port).then((socket) {
+ void sendRequest() {
+ socket.addString("GET / HTTP/1.0\r\n");
+ socket.addString("Connection: Keep-Alive\r\n\r\n");
+ }
+
+ List<int> response = [];
+ int count = 0;
+ socket.listen(
+ (d) {
+ response.addAll(d);
+ if (response[response.length - 1] == "Z".codeUnitAt(0)) {
+ String s = new String.fromCharCodes(response).toLowerCase();
+ Expect.isTrue(s.indexOf("\r\nconnection: keep-alive\r\n") > 0);
+ Expect.isTrue(s.indexOf("\r\ncontent-length: 1\r\n") > 0);
+ count++;
+ if (count < 10) {
+ response = [];
+ sendRequest();
+ } else {
+ socket.close();
+ }
+ }
+ },
+ onDone: () {
+ socket.destroy();
+ server.close();
+ });
+ sendRequest();
+ });
+ });
+}
+
+
+// Client makes a HTTP 1.0 request with connection keep alive. The
+// server does not set a content length so it cannot honor connection
+// keep alive.
+void testHttp10KeepAliveServerCloses() {
+ HttpServer.bind().then((server) {
+ server.listen(
+ (HttpRequest request) {
+ Expect.isNull(request.headers.value('content-length'));
+ Expect.equals(-1, request.contentLength);
+ var response = request.response;
+ Expect.equals("1.0", request.protocolVersion);
+ response.addString("Z");
+ response.close();
+ },
+ onError: (e) => Expect.fail("Unexpected error $e"));
+
+ int count = 0;
+ makeRequest() {
+ Socket.connect("127.0.0.1", server.port).then((socket) {
+ socket.addString("GET / HTTP/1.0\r\n");
+ socket.addString("Connection: Keep-Alive\r\n\r\n");
+
+ List<int> response = [];
+ socket.listen(
+ response.addAll,
+ onDone: () {
+ socket.destroy();
+ count++;
+ String s = new String.fromCharCodes(response).toLowerCase();
+ Expect.equals("z", s[s.length - 1]);
+ Expect.equals(-1, s.indexOf("content-length"));
+ Expect.equals(-1, s.indexOf("connection"));
+ if (count < 10) {
+ makeRequest();
+ } else {
+ server.close();
+ }
+ });
+ });
+ }
+ makeRequest();
+ });
+}
+
+
+void main() {
+ testHttp10NoKeepAlive();
+ // TODO(8871): This test fails with short socket writes.
+ //testHttp10ServerClose();
+ testHttp10KeepAlive();
+ testHttp10KeepAliveServerCloses();
+}
« no previous file with comments | « sdk/lib/io/http_impl.dart ('k') | tests/standalone/io/http_content_length_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698