| Index: tests/standalone/src/io/HttpParserTest.dart
|
| diff --git a/tests/standalone/src/io/HttpParserTest.dart b/tests/standalone/src/io/HttpParserTest.dart
|
| deleted file mode 100644
|
| index 7165fc4ccec475a68d26b3539e3c4980a3265893..0000000000000000000000000000000000000000
|
| --- a/tests/standalone/src/io/HttpParserTest.dart
|
| +++ /dev/null
|
| @@ -1,851 +0,0 @@
|
| -// Copyright (c) 2012, 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.
|
| -
|
| -#source("../../../../runtime/bin/http_parser.dart");
|
| -
|
| -class HttpParserTest {
|
| - static void runAllTests() {
|
| - testParseRequest();
|
| - testParseResponse();
|
| - testParseInvalidRequest();
|
| - testParseInvalidResponse();
|
| - }
|
| -
|
| - static void _testParseRequest(String request,
|
| - String expectedMethod,
|
| - String expectedUri,
|
| - [int expectedContentLength = -1,
|
| - int expectedBytesReceived = 0,
|
| - Map expectedHeaders = null,
|
| - bool chunked = false,
|
| - bool upgrade = false,
|
| - int unparsedLength = 0,
|
| - bool connectionClose = false,
|
| - String expectedVersion = "1.1"]) {
|
| - _HttpParser httpParser;
|
| - bool headersCompleteCalled;
|
| - bool dataEndCalled;
|
| - String method;
|
| - String uri;
|
| - String version;
|
| - Map headers;
|
| - int contentLength;
|
| - int bytesReceived;
|
| -
|
| - void reset() {
|
| - httpParser = new _HttpParser();
|
| - httpParser.requestStart = (m, u, v) { method = m; uri = u; version = v; };
|
| - httpParser.responseStart = (s, r, v) { Expect.fail("Expected request"); };
|
| - httpParser.headerReceived = (f, v) {
|
| - Expect.isFalse(headersCompleteCalled);
|
| - headers[f] = v;
|
| - };
|
| - httpParser.headersComplete = () {
|
| - Expect.isFalse(headersCompleteCalled);
|
| - if (!chunked) {
|
| - Expect.equals(expectedContentLength, httpParser.contentLength);
|
| - } else {
|
| - Expect.equals(-1, httpParser.contentLength);
|
| - }
|
| - if (expectedHeaders != null) {
|
| - expectedHeaders.forEach(
|
| - (String name, String value) =>
|
| - Expect.equals(value, headers[name]));
|
| - }
|
| - Expect.equals(upgrade, httpParser.upgrade);
|
| - Expect.equals(connectionClose, !httpParser.persistentConnection);
|
| - headersCompleteCalled = true;
|
| - };
|
| - httpParser.dataReceived = (List<int> data) {
|
| - Expect.isTrue(headersCompleteCalled);
|
| - bytesReceived += data.length;
|
| - };
|
| - httpParser.dataEnd = (close) {
|
| - Expect.isFalse(close);
|
| - dataEndCalled = true;
|
| - };
|
| -
|
| - headersCompleteCalled = false;
|
| - dataEndCalled = false;
|
| - method = null;
|
| - uri = null;
|
| - headers = new Map();
|
| - bytesReceived = 0;
|
| - }
|
| -
|
| - void testWrite(List<int> requestData, [int chunkSize = -1]) {
|
| - if (chunkSize == -1) chunkSize = requestData.length;
|
| - reset();
|
| - int written = 0;
|
| - int unparsed;
|
| - for (int pos = 0; pos < requestData.length; pos += chunkSize) {
|
| - int remaining = requestData.length - pos;
|
| - int writeLength = Math.min(chunkSize, remaining);
|
| - written += writeLength;
|
| - int parsed = httpParser.writeList(requestData, pos, writeLength);
|
| - unparsed = writeLength - parsed;
|
| - if (httpParser.upgrade) {
|
| - unparsed += requestData.length - written;
|
| - break;
|
| - } else {
|
| - Expect.equals(0, unparsed);
|
| - }
|
| - }
|
| - Expect.equals(expectedMethod, method);
|
| - Expect.equals(expectedUri, uri);
|
| - Expect.equals(expectedVersion, version);
|
| - Expect.isTrue(headersCompleteCalled);
|
| - Expect.equals(expectedBytesReceived, bytesReceived);
|
| - if (!upgrade) Expect.isTrue(dataEndCalled);
|
| - if (unparsedLength == 0) {
|
| - Expect.equals(0, unparsed);
|
| - } else {
|
| - Expect.equals(unparsedLength, unparsed);
|
| - }
|
| - }
|
| -
|
| - // Test parsing the request three times delivering the data in
|
| - // different chunks.
|
| - List<int> requestData = request.charCodes();
|
| - testWrite(requestData);
|
| - testWrite(requestData, 10);
|
| - testWrite(requestData, 1);
|
| - }
|
| -
|
| - static void _testParseInvalidRequest(String request) {
|
| - _HttpParser httpParser;
|
| - bool errorCalled;
|
| -
|
| - void reset() {
|
| - httpParser = new _HttpParser();
|
| - httpParser.responseStart = (s, r) { Expect.fail("Expected request"); };
|
| - httpParser.error = (e) {
|
| - errorCalled = true;
|
| - };
|
| -
|
| - errorCalled = false;
|
| - }
|
| -
|
| - void testWrite(List<int> requestData, [int chunkSize = -1]) {
|
| - if (chunkSize == -1) chunkSize = requestData.length;
|
| - reset();
|
| - for (int pos = 0; pos < requestData.length; pos += chunkSize) {
|
| - int remaining = requestData.length - pos;
|
| - int writeLength = Math.min(chunkSize, remaining);
|
| - httpParser.writeList(requestData, pos, writeLength);
|
| - }
|
| - Expect.isTrue(errorCalled);
|
| - }
|
| -
|
| - // Test parsing the request three times delivering the data in
|
| - // different chunks.
|
| - List<int> requestData = request.charCodes();
|
| - testWrite(requestData);
|
| - testWrite(requestData, 10);
|
| - testWrite(requestData, 1);
|
| - }
|
| -
|
| - static void _testParseResponse(String response,
|
| - int expectedStatusCode,
|
| - String expectedReasonPhrase,
|
| - [int expectedContentLength = -1,
|
| - int expectedBytesReceived = 0,
|
| - Map expectedHeaders = null,
|
| - bool chunked = false,
|
| - bool close = false,
|
| - String responseToMethod = null,
|
| - bool connectionClose = false,
|
| - bool upgrade = false,
|
| - int unparsedLength = 0,
|
| - String expectedVersion = "1.1"]) {
|
| - _HttpParser httpParser;
|
| - bool headersCompleteCalled;
|
| - bool dataEndCalled;
|
| - bool dataEndClose;
|
| - int statusCode;
|
| - String reasonPhrase;
|
| - String version;
|
| - Map headers;
|
| - int contentLength;
|
| - int bytesReceived;
|
| -
|
| - void reset() {
|
| - httpParser = new _HttpParser();
|
| - if (responseToMethod != null) {
|
| - httpParser.responseToMethod = responseToMethod;
|
| - }
|
| - httpParser.requestStart = (m, u, v) => Expect.fail("Expected response");
|
| - httpParser.responseStart = (s, r, v) {
|
| - statusCode = s;
|
| - reasonPhrase = r;
|
| - version = v;
|
| - };
|
| - httpParser.headerReceived = (f, v) {
|
| - Expect.isFalse(headersCompleteCalled);
|
| - headers[f] = v;
|
| - };
|
| - httpParser.headersComplete = () {
|
| - Expect.isFalse(headersCompleteCalled);
|
| - if (!chunked && !close) {
|
| - Expect.equals(expectedContentLength, httpParser.contentLength);
|
| - } else {
|
| - Expect.equals(-1, httpParser.contentLength);
|
| - }
|
| - if (expectedHeaders != null) {
|
| - expectedHeaders.forEach((String name, String value) {
|
| - Expect.equals(value, headers[name]);
|
| - });
|
| - }
|
| - Expect.equals(upgrade, httpParser.upgrade);
|
| - headersCompleteCalled = true;
|
| - };
|
| - httpParser.dataReceived = (List<int> data) {
|
| - Expect.isTrue(headersCompleteCalled);
|
| - bytesReceived += data.length;
|
| - };
|
| - httpParser.dataEnd = (close) {
|
| - dataEndCalled = true;
|
| - dataEndClose = close;
|
| - };
|
| -
|
| - headersCompleteCalled = false;
|
| - dataEndCalled = false;
|
| - dataEndClose = null;
|
| - statusCode = -1;
|
| - reasonPhrase = null;
|
| - headers = new Map();
|
| - bytesReceived = 0;
|
| - }
|
| -
|
| - void testWrite(List<int> requestData, [int chunkSize = -1]) {
|
| - if (chunkSize == -1) chunkSize = requestData.length;
|
| - reset();
|
| - int written = 0;
|
| - int unparsed;
|
| - for (int pos = 0; pos < requestData.length; pos += chunkSize) {
|
| - int remaining = requestData.length - pos;
|
| - int writeLength = Math.min(chunkSize, remaining);
|
| - written += writeLength;
|
| - int parsed = httpParser.writeList(requestData, pos, writeLength);
|
| - unparsed = writeLength - parsed;
|
| - if (httpParser.upgrade) {
|
| - unparsed += requestData.length - written;
|
| - break;
|
| - } else {
|
| - Expect.equals(0, unparsed);
|
| - }
|
| - }
|
| - if (close) httpParser.connectionClosed();
|
| - Expect.equals(expectedVersion, version);
|
| - Expect.equals(expectedStatusCode, statusCode);
|
| - Expect.equals(expectedReasonPhrase, reasonPhrase);
|
| - Expect.isTrue(headersCompleteCalled);
|
| - Expect.equals(expectedBytesReceived, bytesReceived);
|
| - if (!upgrade) {
|
| - Expect.isTrue(dataEndCalled);
|
| - if (close) Expect.isTrue(dataEndClose);
|
| - Expect.equals(dataEndClose, connectionClose);
|
| - }
|
| - if (unparsedLength == 0) {
|
| - Expect.equals(0, unparsed);
|
| - } else {
|
| - Expect.equals(unparsedLength, unparsed);
|
| - }
|
| - }
|
| -
|
| - // Test parsing the request three times delivering the data in
|
| - // different chunks.
|
| - List<int> responseData = response.charCodes();
|
| - testWrite(responseData);
|
| - testWrite(responseData, 10);
|
| - testWrite(responseData, 1);
|
| - }
|
| -
|
| - static void _testParseInvalidResponse(String response, [bool close = false]) {
|
| - _HttpParser httpParser;
|
| - bool errorCalled;
|
| -
|
| - void reset() {
|
| - httpParser = new _HttpParser();
|
| - httpParser.requestStart = (m, u) => Expect.fail("Expected response");
|
| - httpParser.error = (e) => errorCalled = true;
|
| -
|
| - errorCalled = false;
|
| - }
|
| -
|
| - void testWrite(List<int> requestData, [int chunkSize = -1]) {
|
| - if (chunkSize == -1) chunkSize = requestData.length;
|
| - reset();
|
| - for (int pos = 0; pos < requestData.length; pos += chunkSize) {
|
| - int remaining = requestData.length - pos;
|
| - int writeLength = Math.min(chunkSize, remaining);
|
| - httpParser.writeList(requestData, pos, writeLength);
|
| - }
|
| - if (close) httpParser.connectionClosed();
|
| - Expect.isTrue(errorCalled);
|
| - }
|
| -
|
| - // Test parsing the request three times delivering the data in
|
| - // different chunks.
|
| - List<int> responseData = response.charCodes();
|
| - testWrite(responseData);
|
| - testWrite(responseData, 10);
|
| - testWrite(responseData, 1);
|
| - }
|
| -
|
| - static void testParseRequest() {
|
| - String request;
|
| - Map headers;
|
| - request = "GET / HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "GET", "/");
|
| -
|
| - request = "POST / HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "POST", "/");
|
| -
|
| - request = "GET /index.html HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "GET", "/index.html");
|
| -
|
| - request = "POST /index.html HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "POST", "/index.html");
|
| -
|
| - request = "H /index.html HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "H", "/index.html");
|
| -
|
| - request = "HT /index.html HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "HT", "/index.html");
|
| -
|
| - request = "HTT /index.html HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "HTT", "/index.html");
|
| -
|
| - request = "HTTP /index.html HTTP/1.1\r\n\r\n";
|
| - _testParseRequest(request, "HTTP", "/index.html");
|
| -
|
| - request = "GET / HTTP/1.0\r\n\r\n";
|
| - _testParseRequest(request, "GET", "/", expectedVersion: "1.0", connectionClose: true);
|
| -
|
| - request = "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n";
|
| - _testParseRequest(request, "GET", "/", expectedVersion: "1.0");
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -AAA: AAA\r
|
| -\r
|
| -""";
|
| - _testParseRequest(request, "POST", "/test");
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -\r
|
| -""";
|
| - _testParseRequest(request, "POST", "/test");
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Header-A: AAA\r
|
| -X-Header-B: bbb\r
|
| -\r
|
| -""";
|
| - headers = new Map();
|
| - headers["header-a"] = "AAA";
|
| - headers["x-header-b"] = "bbb";
|
| - _testParseRequest(request, "POST", "/test", expectedHeaders: headers);
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Empty-Header-1:\r
|
| -Empty-Header-2:\r
|
| - \r
|
| -\r
|
| -""";
|
| - headers = new Map();
|
| - headers["empty-header-1"] = "";
|
| - headers["empty-header-2"] = "";
|
| - _testParseRequest(request, "POST", "/test", expectedHeaders: headers);
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Header-A: AAA\r
|
| -X-Header-B:\t \t bbb\r
|
| -\r
|
| -""";
|
| - headers = new Map();
|
| - headers["header-a"] = "AAA";
|
| - headers["x-header-b"] = "bbb";
|
| - _testParseRequest(request, "POST", "/test", expectedHeaders: headers);
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Header-A: AA\r
|
| - A\r
|
| -X-Header-B: b\r
|
| - b\r
|
| -\t b\r
|
| -\r
|
| -""";
|
| - headers = new Map();
|
| - headers["header-a"] = "AAA";
|
| - headers["x-header-b"] = "bbb";
|
| - _testParseRequest(request, "POST", "/test", expectedHeaders: headers);
|
| -
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Content-Length: 10\r
|
| -\r
|
| -0123456789""";
|
| - _testParseRequest(request,
|
| - "POST",
|
| - "/test",
|
| - expectedContentLength: 10,
|
| - expectedBytesReceived: 10);
|
| -
|
| - // Test connection close header.
|
| - request = "GET /test HTTP/1.1\r\nConnection: close\r\n\r\n";
|
| - _testParseRequest(request, "GET", "/test", connectionClose: true);
|
| -
|
| - // Test chunked encoding.
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Transfer-Encoding: chunked\r
|
| -\r
|
| -5\r
|
| -01234\r
|
| -5\r
|
| -56789\r
|
| -0\r\n\r\n""";
|
| - _testParseRequest(request,
|
| - "POST",
|
| - "/test",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 10,
|
| - chunked: true);
|
| -
|
| - // Test mixing chunked encoding and content length (content length
|
| - // is ignored).
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Content-Length: 7\r
|
| -Transfer-Encoding: chunked\r
|
| -\r
|
| -5\r
|
| -01234\r
|
| -5\r
|
| -56789\r
|
| -0\r\n\r\n""";
|
| - _testParseRequest(request,
|
| - "POST",
|
| - "/test",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 10,
|
| - chunked: true);
|
| -
|
| - // Test mixing chunked encoding and content length (content length
|
| - // is ignored).
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Transfer-Encoding: chunked\r
|
| -Content-Length: 3\r
|
| -\r
|
| -5\r
|
| -01234\r
|
| -5\r
|
| -56789\r
|
| -0\r\n\r\n""";
|
| - _testParseRequest(request,
|
| - "POST",
|
| - "/test",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 10,
|
| - chunked: true);
|
| -
|
| - // Test upper and lower case hex digits in chunked encoding.
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Transfer-Encoding: chunked\r
|
| -\r
|
| -1E\r
|
| -012345678901234567890123456789\r
|
| -1e\r
|
| -012345678901234567890123456789\r
|
| -0\r\n\r\n""";
|
| - _testParseRequest(request,
|
| - "POST",
|
| - "/test",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 60,
|
| - chunked: true);
|
| -
|
| - // Test chunk extensions in chunked encoding.
|
| - request = """
|
| -POST /test HTTP/1.1\r
|
| -Transfer-Encoding: chunked\r
|
| -\r
|
| -1E;xxx\r
|
| -012345678901234567890123456789\r
|
| -1E;yyy=zzz\r
|
| -012345678901234567890123456789\r
|
| -0\r\n\r\n""";
|
| - _testParseRequest(request,
|
| - "POST",
|
| - "/test",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 60,
|
| - chunked: true);
|
| -
|
| - // Test HTTP upgrade.
|
| - request = """
|
| -GET /irc HTTP/1.1\r
|
| -Upgrade: irc/1.2\r
|
| -Connection: Upgrade\r
|
| -\r\n\x01\x01\x01\x01\x01\x02\x02\x02\x02\xFF""";
|
| - headers = new Map();
|
| - headers["upgrade"] = "irc/1.2";
|
| - _testParseRequest(request,
|
| - "GET",
|
| - "/irc",
|
| - expectedHeaders: headers,
|
| - upgrade: true,
|
| - unparsedLength: 10);
|
| -
|
| - // Test HTTP upgrade with protocol data.
|
| - request = """
|
| -GET /irc HTTP/1.1\r
|
| -Upgrade: irc/1.2\r
|
| -Connection: Upgrade\r
|
| -\r\n""";
|
| - headers = new Map();
|
| - headers["upgrade"] = "irc/1.2";
|
| - _testParseRequest(request,
|
| - "GET",
|
| - "/irc",
|
| - expectedHeaders: headers,
|
| - upgrade: true);
|
| -
|
| - // Test websocket upgrade.
|
| - request = """
|
| -GET /chat HTTP/1.1\r
|
| -Host: server.example.com\r
|
| -Upgrade: websocket\r
|
| -Connection: Upgrade\r
|
| -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r
|
| -Origin: http://example.com\r
|
| -Sec-WebSocket-Version: 13\r
|
| -\r\n""";
|
| - headers = new Map();
|
| - headers["host"] = "server.example.com";
|
| - headers["upgrade"] = "websocket";
|
| - headers["sec-websocket-key"] = "dGhlIHNhbXBsZSBub25jZQ==";
|
| - headers["origin"] = "http://example.com";
|
| - headers["sec-websocket-version"] = "13";
|
| - _testParseRequest(request,
|
| - "GET",
|
| - "/chat",
|
| - expectedHeaders: headers,
|
| - upgrade: true);
|
| -
|
| -
|
| - // Test websocket upgrade with protocol data. NOTE: When using the
|
| - // WebSocket protocol this should never happen as the client
|
| - // should not send protocol data before processing the request
|
| - // part of the opening handshake. However the HTTP parser should
|
| - // still handle this.
|
| - request = """
|
| -GET /chat HTTP/1.1\r
|
| -Host: server.example.com\r
|
| -Upgrade: websocket\r
|
| -Connection: Upgrade\r
|
| -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r
|
| -Origin: http://example.com\r
|
| -Sec-WebSocket-Version: 13\r
|
| -\r\n0123456""";
|
| - headers = new Map();
|
| - headers["host"] = "server.example.com";
|
| - headers["upgrade"] = "websocket";
|
| - headers["sec-websocket-key"] = "dGhlIHNhbXBsZSBub25jZQ==";
|
| - headers["origin"] = "http://example.com";
|
| - headers["sec-websocket-version"] = "13";
|
| - _testParseRequest(request,
|
| - "GET",
|
| - "/chat",
|
| - expectedHeaders: headers,
|
| - upgrade: true,
|
| - unparsedLength: 7);
|
| - }
|
| -
|
| - static void testParseResponse() {
|
| - String response;
|
| - Map headers;
|
| - response = "HTTP/1.1 100 Continue\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseResponse(response, 100, "Continue", expectedContentLength: 0);
|
| -
|
| - response = "HTTP/1.1 100 Continue\r\nContent-Length: 10\r\n\r\n";
|
| - _testParseResponse(response,
|
| - 100,
|
| - "Continue",
|
| - expectedContentLength: 10,
|
| - expectedBytesReceived: 0);
|
| -
|
| - response = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: Close\r\n\r\n";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - expectedContentLength: 0,
|
| - connectionClose: true);
|
| -
|
| - response = "HTTP/1.0 200 OK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - expectedContentLength: 0,
|
| - expectedVersion: "1.0",
|
| - connectionClose: true);
|
| -
|
| - response = "HTTP/1.0 200 OK\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n";
|
| - _testParseResponse(response, 200, "OK", expectedContentLength: 0, expectedVersion: "1.0");
|
| -
|
| - response = "HTTP/1.1 204 No Content\r\nContent-Length: 11\r\n\r\n";
|
| - _testParseResponse(response,
|
| - 204,
|
| - "No Content",
|
| - expectedContentLength: 11,
|
| - expectedBytesReceived: 0);
|
| -
|
| - response = "HTTP/1.1 304 Not Modified\r\nContent-Length: 12\r\n\r\n";
|
| - _testParseResponse(response,
|
| - 304,
|
| - "Not Modified",
|
| - expectedContentLength: 12,
|
| - expectedBytesReceived: 0);
|
| -
|
| - response = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseResponse(response, 200, "OK", expectedContentLength: 0);
|
| -
|
| - response = "HTTP/1.1 404 Not found\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseResponse(response, 404, "Not found", expectedContentLength: 0);
|
| -
|
| - response = "HTTP/1.1 500 Server error\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseResponse(response, 500, "Server error", expectedContentLength: 0);
|
| -
|
| - // Test response to HEAD request.
|
| - response = """
|
| -HTTP/1.1 200 OK\r
|
| -Content-Length: 20\r
|
| -Content-Type: text/html\r
|
| -\r\n""";
|
| - headers = new Map();
|
| - headers["content-length"] = "20";
|
| - headers["content-type"] = "text/html";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - responseToMethod: "HEAD",
|
| - expectedContentLength: 20,
|
| - expectedBytesReceived: 0,
|
| - expectedHeaders: headers);
|
| -
|
| - // Test content.
|
| - response = """
|
| -HTTP/1.1 200 OK\r
|
| -Content-Length: 20\r
|
| -\r
|
| -01234567890123456789""";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - expectedContentLength: 20,
|
| - expectedBytesReceived: 20);
|
| -
|
| - // Test upper and lower case hex digits in chunked encoding.
|
| - response = """
|
| -HTTP/1.1 200 OK\r
|
| -Transfer-Encoding: chunked\r
|
| -\r
|
| -1A\r
|
| -01234567890123456789012345\r
|
| -1f\r
|
| -0123456789012345678901234567890\r
|
| -0\r\n\r\n""";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 57,
|
| - chunked: true);
|
| -
|
| - // Test connection close header.
|
| - response = """
|
| -HTTP/1.1 200 OK\r
|
| -Content-Length: 0\r
|
| -Connection: close\r
|
| -\r\n""";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - expectedContentLength: 0,
|
| - connectionClose: true);
|
| -
|
| - // Test HTTP response without any transfer length indications
|
| - // where closing the connections indicates end of body.
|
| - response = """
|
| -HTTP/1.1 200 OK\r
|
| -\r
|
| -01234567890123456789012345
|
| -0123456789012345678901234567890
|
| -""";
|
| - _testParseResponse(response,
|
| - 200,
|
| - "OK",
|
| - expectedContentLength: -1,
|
| - expectedBytesReceived: 59,
|
| - close: true,
|
| - connectionClose: true);
|
| -
|
| - // Test HTTP upgrade.
|
| - response = """
|
| -HTTP/1.1 101 Switching Protocols\r
|
| -Upgrade: irc/1.2\r
|
| -Connection: Upgrade\r
|
| -\r\n""";
|
| - headers = new Map();
|
| - headers["upgrade"] = "irc/1.2";
|
| - _testParseResponse(response,
|
| - 101,
|
| - "Switching Protocols",
|
| - expectedHeaders: headers,
|
| - upgrade: true);
|
| -
|
| - // Test HTTP upgrade with protocol data.
|
| - response = """
|
| -HTTP/1.1 101 Switching Protocols\r
|
| -Upgrade: irc/1.2\r
|
| -Connection: Upgrade\r
|
| -\r\n\x00\x10\x20\x30\x40\x50\x60\x70\x80\x90\xA0\xB0\xC0\xD0\xE0\xF0""";
|
| - headers = new Map();
|
| - headers["upgrade"] = "irc/1.2";
|
| - _testParseResponse(response,
|
| - 101,
|
| - "Switching Protocols",
|
| - expectedHeaders: headers,
|
| - upgrade: true,
|
| - unparsedLength: 16);
|
| -
|
| - // Test websocket upgrade.
|
| - response = """
|
| -HTTP/1.1 101 Switching Protocols\r
|
| -Upgrade: websocket\r
|
| -Connection: Upgrade\r
|
| -Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r
|
| -\r\n""";
|
| - headers = new Map();
|
| - headers["upgrade"] = "websocket";
|
| - headers["sec-websocket-accept"] = "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=";
|
| - _testParseResponse(response,
|
| - 101,
|
| - "Switching Protocols",
|
| - expectedHeaders: headers,
|
| - upgrade: true);
|
| -
|
| - // Test websocket upgrade with protocol data.
|
| - response = """
|
| -HTTP/1.1 101 Switching Protocols\r
|
| -Upgrade: websocket\r
|
| -Connection: Upgrade\r
|
| -Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r
|
| -\r\nABCD""";
|
| - headers = new Map();
|
| - headers["upgrade"] = "websocket";
|
| - headers["sec-websocket-accept"] = "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=";
|
| - _testParseResponse(response,
|
| - 101,
|
| - "Switching Protocols",
|
| - expectedHeaders: headers,
|
| - upgrade: true,
|
| - unparsedLength: 4);
|
| - }
|
| -
|
| - static void testParseInvalidRequest() {
|
| - String request;
|
| - request = "GET /\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "GET / \r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "/ HTTP/1.1\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "GET HTTP/1.1\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = " / HTTP/1.1\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "@ / HTTP/1.1\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "GET / TTP/1.1\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "GET / HTTP/1.\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| -
|
| - request = "GET / HTTP/1.1\r\nKeep-Alive: False\r\nbadheader\r\n\r\n";
|
| - _testParseInvalidRequest(request);
|
| - }
|
| -
|
| - static void testParseInvalidResponse() {
|
| - String response;
|
| -
|
| - response = "HTTP/1.1\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 \r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 200\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 200 \r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 OK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "200 OK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1. 200 OK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 200 O\rK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 000 OK\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 999 Server Error\r\nContent-Length: 0\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 200 OK\r\nContent-Length: x\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = "HTTP/1.1 200 OK\r\nbadheader\r\n\r\n";
|
| - _testParseInvalidResponse(response);
|
| -
|
| - response = """
|
| -HTTP/1.1 200 OK\r
|
| -Transfer-Encoding: chunked\r
|
| -\r
|
| -1A\r
|
| -01234567890123456789012345\r
|
| -1g\r
|
| -0123456789012345678901234567890\r
|
| -0\r\n\r\n""";
|
| - _testParseInvalidResponse(response);
|
| - }
|
| -}
|
| -
|
| -
|
| -void main() {
|
| - HttpParserTest.runAllTests();
|
| -}
|
|
|