| // 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. |
| |
| library dart._http; |
| |
| import "dart:async"; |
| import "dart:collection"; |
| import "dart:convert"; |
| import "dart:developer"; |
| import "dart:io"; |
| import "dart:isolate"; |
| import "dart:math"; |
| import "dart:typed_data"; |
| |
| import "package:expect/expect.dart"; |
| |
| import "../../../sdk/lib/internal/internal.dart" |
| show Since, valueOfNonNullableParamWithDefault, HttpStatus; |
| |
| part "../../../sdk/lib/_http/crypto.dart"; |
| part "../../../sdk/lib/_http/embedder_config.dart"; |
| part "../../../sdk/lib/_http/http_impl.dart"; |
| part "../../../sdk/lib/_http/http_date.dart"; |
| part "../../../sdk/lib/_http/http_parser.dart"; |
| part "../../../sdk/lib/_http/http_headers.dart"; |
| part "../../../sdk/lib/_http/http_session.dart"; |
| |
| void testMultiValue() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.isNull(headers[HttpHeaders.pragmaHeader]); |
| headers.add(HttpHeaders.pragmaHeader, "pragma1"); |
| Expect.equals(1, headers[HttpHeaders.pragmaHeader]!.length); |
| Expect.equals(1, headers["pragma"]!.length); |
| Expect.equals(1, headers["Pragma"]!.length); |
| Expect.equals(1, headers["pragma"]!.length); |
| Expect.equals("pragma1", headers.value(HttpHeaders.pragmaHeader)); |
| |
| headers.add(HttpHeaders.pragmaHeader, "pragma2"); |
| Expect.equals(2, headers[HttpHeaders.pragmaHeader]!.length); |
| Expect.throws( |
| () => headers.value(HttpHeaders.pragmaHeader), (e) => e is HttpException); |
| |
| headers.add(HttpHeaders.pragmaHeader, ["pragma3", "pragma4"]); |
| Expect.listEquals(["pragma1", "pragma2", "pragma3", "pragma4"], |
| headers[HttpHeaders.pragmaHeader]!); |
| |
| headers.remove(HttpHeaders.pragmaHeader, "pragma3"); |
| Expect.equals(3, headers[HttpHeaders.pragmaHeader]!.length); |
| Expect.listEquals( |
| ["pragma1", "pragma2", "pragma4"], headers[HttpHeaders.pragmaHeader]!); |
| |
| headers.remove(HttpHeaders.pragmaHeader, "pragma3"); |
| Expect.equals(3, headers[HttpHeaders.pragmaHeader]!.length); |
| |
| headers.set(HttpHeaders.pragmaHeader, "pragma5"); |
| Expect.equals(1, headers[HttpHeaders.pragmaHeader]!.length); |
| |
| headers.set(HttpHeaders.pragmaHeader, ["pragma6", "pragma7"]); |
| Expect.equals(2, headers[HttpHeaders.pragmaHeader]!.length); |
| |
| headers.removeAll(HttpHeaders.pragmaHeader); |
| Expect.isNull(headers[HttpHeaders.pragmaHeader]); |
| } |
| |
| void testDate() { |
| DateTime date1 = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0); |
| String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT"; |
| DateTime date2 = new DateTime.utc(2000, DateTime.august, 16, 12, 34, 56, 0); |
| String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT"; |
| |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.isNull(headers.date); |
| headers.date = date1; |
| Expect.equals(date1, headers.date); |
| Expect.equals(httpDate1, headers.value(HttpHeaders.dateHeader)); |
| Expect.equals(1, headers[HttpHeaders.dateHeader]!.length); |
| headers.add(HttpHeaders.dateHeader, httpDate2); |
| Expect.equals(1, headers[HttpHeaders.dateHeader]!.length); |
| Expect.equals(date2, headers.date); |
| Expect.equals(httpDate2, headers.value(HttpHeaders.dateHeader)); |
| headers.set(HttpHeaders.dateHeader, httpDate1); |
| Expect.equals(1, headers[HttpHeaders.dateHeader]!.length); |
| Expect.equals(date1, headers.date); |
| Expect.equals(httpDate1, headers.value(HttpHeaders.dateHeader)); |
| |
| headers.set(HttpHeaders.dateHeader, "xxx"); |
| Expect.equals("xxx", headers.value(HttpHeaders.dateHeader)); |
| Expect.equals(null, headers.date); |
| } |
| |
| void testExpires() { |
| DateTime date1 = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0); |
| String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT"; |
| DateTime date2 = new DateTime.utc(2000, DateTime.august, 16, 12, 34, 56, 0); |
| String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT"; |
| |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.isNull(headers.expires); |
| headers.expires = date1; |
| Expect.equals(date1, headers.expires); |
| Expect.equals(httpDate1, headers.value(HttpHeaders.expiresHeader)); |
| Expect.equals(1, headers[HttpHeaders.expiresHeader]!.length); |
| headers.add(HttpHeaders.expiresHeader, httpDate2); |
| Expect.equals(1, headers[HttpHeaders.expiresHeader]!.length); |
| Expect.equals(date2, headers.expires); |
| Expect.equals(httpDate2, headers.value(HttpHeaders.expiresHeader)); |
| headers.set(HttpHeaders.expiresHeader, httpDate1); |
| Expect.equals(1, headers[HttpHeaders.expiresHeader]!.length); |
| Expect.equals(date1, headers.expires); |
| Expect.equals(httpDate1, headers.value(HttpHeaders.expiresHeader)); |
| |
| headers.set(HttpHeaders.expiresHeader, "xxx"); |
| Expect.equals("xxx", headers.value(HttpHeaders.expiresHeader)); |
| Expect.equals(null, headers.expires); |
| } |
| |
| void testIfModifiedSince() { |
| DateTime date1 = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0); |
| String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT"; |
| DateTime date2 = new DateTime.utc(2000, DateTime.august, 16, 12, 34, 56, 0); |
| String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT"; |
| |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.isNull(headers.ifModifiedSince); |
| headers.ifModifiedSince = date1; |
| Expect.equals(date1, headers.ifModifiedSince); |
| Expect.equals(httpDate1, headers.value(HttpHeaders.ifModifiedSinceHeader)); |
| Expect.equals(1, headers[HttpHeaders.ifModifiedSinceHeader]!.length); |
| headers.add(HttpHeaders.ifModifiedSinceHeader, httpDate2); |
| Expect.equals(1, headers[HttpHeaders.ifModifiedSinceHeader]!.length); |
| Expect.equals(date2, headers.ifModifiedSince); |
| Expect.equals(httpDate2, headers.value(HttpHeaders.ifModifiedSinceHeader)); |
| headers.set(HttpHeaders.ifModifiedSinceHeader, httpDate1); |
| Expect.equals(1, headers[HttpHeaders.ifModifiedSinceHeader]!.length); |
| Expect.equals(date1, headers.ifModifiedSince); |
| Expect.equals(httpDate1, headers.value(HttpHeaders.ifModifiedSinceHeader)); |
| |
| headers.set(HttpHeaders.ifModifiedSinceHeader, "xxx"); |
| Expect.equals("xxx", headers.value(HttpHeaders.ifModifiedSinceHeader)); |
| Expect.equals(null, headers.ifModifiedSince); |
| } |
| |
| void testHost() { |
| String host = "www.google.com"; |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.isNull(headers.host); |
| Expect.isNull(headers.port); |
| headers.host = host; |
| Expect.equals(host, headers.value(HttpHeaders.hostHeader)); |
| headers.port = 1234; |
| Expect.equals("$host:1234", headers.value(HttpHeaders.hostHeader)); |
| headers.port = HttpClient.defaultHttpPort; |
| Expect.equals(host, headers.value(HttpHeaders.hostHeader)); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, host); |
| Expect.equals(host, headers.host); |
| Expect.equals(HttpClient.defaultHttpPort, headers.port); |
| headers.add(HttpHeaders.hostHeader, "$host:4567"); |
| Expect.equals(1, headers[HttpHeaders.hostHeader]!.length); |
| Expect.equals(host, headers.host); |
| Expect.equals(4567, headers.port); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, "$host:xxx"); |
| Expect.equals("$host:xxx", headers.value(HttpHeaders.hostHeader)); |
| Expect.equals(host, headers.host); |
| Expect.isNull(headers.port); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, ":1234"); |
| Expect.equals(":1234", headers.value(HttpHeaders.hostHeader)); |
| Expect.isNull(headers.host); |
| Expect.equals(1234, headers.port); |
| |
| // ipv4 |
| host = "123.45.67.89"; |
| int port = 1234; |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, "$host:$port"); |
| Expect.equals("$host:$port", headers.value(HttpHeaders.hostHeader)); |
| Expect.equals(host, headers.host); |
| Expect.equals(port, headers.port); |
| |
| // ipv6: host+port |
| host = "[2001:db8::1]"; |
| port = 1234; |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, "$host:$port"); |
| Expect.equals("$host:$port", headers.value(HttpHeaders.hostHeader)); |
| Expect.equals(host, headers.host); |
| Expect.equals(port, headers.port); |
| |
| // ipv6: host only |
| host = "[2001:db8::1]"; |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, "$host"); |
| Expect.equals("$host", headers.value(HttpHeaders.hostHeader)); |
| Expect.equals(host, headers.host); |
| Expect.equals(headers.port, HttpClient.defaultHttpPort); |
| |
| // ipv6: host + invalid port |
| host = "[2001:db8::1]"; |
| headers = new _HttpHeaders("1.1"); |
| headers.add(HttpHeaders.hostHeader, "$host:xxx"); |
| Expect.equals("$host:xxx", headers.value(HttpHeaders.hostHeader)); |
| Expect.equals(host, headers.host); |
| Expect.isNull(headers.port); |
| } |
| |
| void testTransferEncoding() { |
| expectChunked(headers) { |
| Expect.listEquals(headers['transfer-encoding'], ['chunked']); |
| Expect.isTrue(headers.chunkedTransferEncoding); |
| } |
| |
| expectNonChunked(headers) { |
| Expect.isNull(headers['transfer-encoding']); |
| Expect.isFalse(headers.chunkedTransferEncoding); |
| } |
| |
| _HttpHeaders headers; |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.chunkedTransferEncoding = true; |
| expectChunked(headers); |
| headers.set('transfer-encoding', ['chunked']); |
| expectChunked(headers); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.set('transfer-encoding', ['chunked']); |
| expectChunked(headers); |
| headers.chunkedTransferEncoding = true; |
| expectChunked(headers); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.chunkedTransferEncoding = true; |
| headers.chunkedTransferEncoding = false; |
| expectNonChunked(headers); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.chunkedTransferEncoding = true; |
| headers.remove('transfer-encoding', 'chunked'); |
| expectNonChunked(headers); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.set('transfer-encoding', ['chunked']); |
| headers.chunkedTransferEncoding = false; |
| expectNonChunked(headers); |
| |
| headers = new _HttpHeaders("1.1"); |
| headers.set('transfer-encoding', ['chunked']); |
| headers.remove('transfer-encoding', 'chunked'); |
| expectNonChunked(headers); |
| } |
| |
| void testEnumeration() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.isNull(headers[HttpHeaders.pragmaHeader]); |
| headers.add("My-Header-1", "value 1"); |
| headers.add("My-Header-2", "value 2"); |
| headers.add("My-Header-1", "value 3"); |
| bool myHeader1 = false; |
| bool myHeader2 = false; |
| int totalValues = 0; |
| headers.forEach((String name, List<String> values) { |
| totalValues += values.length; |
| if (name == "my-header-1") { |
| myHeader1 = true; |
| Expect.isTrue(values.indexOf("value 1") != -1); |
| Expect.isTrue(values.indexOf("value 3") != -1); |
| } |
| if (name == "my-header-2") { |
| myHeader2 = true; |
| Expect.isTrue(values.indexOf("value 2") != -1); |
| } |
| }); |
| Expect.isTrue(myHeader1); |
| Expect.isTrue(myHeader2); |
| Expect.equals(3, totalValues); |
| } |
| |
| void testHeaderValue() { |
| void check(HeaderValue headerValue, String value, |
| [Map<String, String?>? parameters]) { |
| Expect.equals(value, headerValue.value); |
| if (parameters != null) { |
| Expect.equals(parameters.length, headerValue.parameters.length); |
| parameters.forEach((String name, String? value) { |
| Expect.equals(value, headerValue.parameters[name]); |
| }); |
| } else { |
| Expect.equals(0, headerValue.parameters.length); |
| } |
| } |
| |
| HeaderValue headerValue; |
| headerValue = HeaderValue.parse(""); |
| check(headerValue, "", {}); |
| headerValue = HeaderValue.parse(";"); |
| check(headerValue, "", {}); |
| headerValue = HeaderValue.parse(";;"); |
| check(headerValue, "", {}); |
| headerValue = HeaderValue.parse("v;a"); |
| check(headerValue, "v", {"a": null}); |
| headerValue = HeaderValue.parse("v;a="); |
| check(headerValue, "v", {"a": ""}); |
| Expect.throws(() => HeaderValue.parse("v;a=\""), (e) => e is HttpException); |
| headerValue = HeaderValue.parse("v;a=\"\""); |
| check(headerValue, "v", {"a": ""}); |
| Expect.throws(() => HeaderValue.parse("v;a=\"\\"), (e) => e is HttpException); |
| Expect.throws( |
| () => HeaderValue.parse("v;a=\";b=\"c\""), (e) => e is HttpException); |
| Expect.throws(() => HeaderValue.parse("v;a=b c"), (e) => e is HttpException); |
| headerValue = HeaderValue.parse("æ;ø=å"); |
| check(headerValue, "æ", {"ø": "å"}); |
| headerValue = |
| HeaderValue.parse("xxx; aaa=bbb; ccc=\"\\\";\\a\"; ddd=\" \""); |
| check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": " "}); |
| headerValue = |
| new HeaderValue("xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": " "}); |
| check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": " "}); |
| |
| headerValue = HeaderValue.parse("attachment; filename=genome.jpeg;" |
| "modification-date=\"Wed, 12 February 1997 16:29:51 -0500\""); |
| var parameters = { |
| "filename": "genome.jpeg", |
| "modification-date": "Wed, 12 February 1997 16:29:51 -0500" |
| }; |
| check(headerValue, "attachment", parameters); |
| headerValue = new HeaderValue("attachment", parameters); |
| check(headerValue, "attachment", parameters); |
| headerValue = HeaderValue.parse(" attachment ;filename=genome.jpeg ;" |
| "modification-date = \"Wed, 12 February 1997 16:29:51 -0500\""); |
| check(headerValue, "attachment", parameters); |
| headerValue = HeaderValue.parse("xxx; aaa; bbb; ccc"); |
| check(headerValue, "xxx", {"aaa": null, "bbb": null, "ccc": null}); |
| headerValue = HeaderValue.parse("v; a=A; b=B, V; c=C", valueSeparator: ";"); |
| check(headerValue, "v", {}); |
| headerValue = HeaderValue.parse("v; a=A; b=B, V; c=C", valueSeparator: ","); |
| check(headerValue, "v", {"a": "A", "b": "B"}); |
| Expect.throws(() => HeaderValue.parse("v; a=A; b=B, V; c=C")); |
| |
| Expect.equals("", HeaderValue().toString()); |
| Expect.equals("", HeaderValue("").toString()); |
| Expect.equals("v", HeaderValue("v").toString()); |
| Expect.equals("v", HeaderValue("v", {}).toString()); |
| Expect.equals("v; ", HeaderValue("v", {"": null}).toString()); |
| Expect.equals("v; a", HeaderValue("v", {"a": null}).toString()); |
| Expect.equals("v; a; b", HeaderValue("v", {"a": null, "b": null}).toString()); |
| Expect.equals( |
| "v; a; b=c", HeaderValue("v", {"a": null, "b": "c"}).toString()); |
| Expect.equals( |
| "v; a=c; b", HeaderValue("v", {"a": "c", "b": null}).toString()); |
| Expect.equals("v; a=\"\"", HeaderValue("v", {"a": ""}).toString()); |
| Expect.equals("v; a=\"b c\"", HeaderValue("v", {"a": "b c"}).toString()); |
| Expect.equals("v; a=\",\"", HeaderValue("v", {"a": ","}).toString()); |
| Expect.equals( |
| "v; a=\"\\\\\\\"\"", HeaderValue("v", {"a": "\\\""}).toString()); |
| Expect.equals("v; a=\"ø\"", HeaderValue("v", {"a": "ø"}).toString()); |
| } |
| |
| void testContentType() { |
| void check(ContentType contentType, String primaryType, String subType, |
| [Map<String, String?>? parameters]) { |
| Expect.equals(primaryType, contentType.primaryType); |
| Expect.equals(subType, contentType.subType); |
| Expect.equals("$primaryType/$subType", contentType.value); |
| if (parameters != null) { |
| Expect.equals(parameters.length, contentType.parameters.length); |
| parameters.forEach((String name, String? value) { |
| Expect.equals(value, contentType.parameters[name]); |
| }); |
| } else { |
| Expect.equals(0, contentType.parameters.length); |
| } |
| } |
| |
| ContentType contentType; |
| contentType = new ContentType("", ""); |
| Expect.equals("", contentType.primaryType); |
| Expect.equals("", contentType.subType); |
| Expect.equals("/", contentType.value); |
| Expect.throwsUnsupportedError(() => contentType.parameters["xxx"] = "yyy"); |
| |
| contentType = ContentType.parse("text/html"); |
| check(contentType, "text", "html"); |
| Expect.equals("text/html", contentType.toString()); |
| contentType = new ContentType("text", "html", charset: "utf-8"); |
| check(contentType, "text", "html", {"charset": "utf-8"}); |
| Expect.equals("text/html; charset=utf-8", contentType.toString()); |
| Expect.throwsUnsupportedError(() => contentType.parameters["xxx"] = "yyy"); |
| |
| contentType = new ContentType("text", "html", |
| parameters: {"CHARSET": "UTF-8", "xxx": "YYY"}); |
| check(contentType, "text", "html", {"charset": "utf-8", "xxx": "YYY"}); |
| String s = contentType.toString(); |
| bool expectedToString = (s == "text/html; charset=utf-8; xxx=YYY" || |
| s == "text/html; xxx=YYY; charset=utf-8"); |
| Expect.isTrue(expectedToString); |
| contentType = ContentType.parse("text/html; CHARSET=UTF-8; xxx=YYY"); |
| check(contentType, "text", "html", {"charset": "utf-8", "xxx": "YYY"}); |
| Expect.throwsUnsupportedError(() => contentType.parameters["xxx"] = "yyy"); |
| |
| contentType = new ContentType("text", "html", |
| charset: "ISO-8859-1", parameters: {"CHARSET": "UTF-8", "xxx": "yyy"}); |
| check(contentType, "text", "html", {"charset": "iso-8859-1", "xxx": "yyy"}); |
| s = contentType.toString(); |
| expectedToString = (s == "text/html; charset=iso-8859-1; xxx=yyy" || |
| s == "text/html; xxx=yyy; charset=iso-8859-1"); |
| Expect.isTrue(expectedToString); |
| |
| contentType = ContentType.parse("text/html"); |
| check(contentType, "text", "html"); |
| contentType = ContentType.parse(" text/html "); |
| check(contentType, "text", "html"); |
| contentType = ContentType.parse("text/html; charset=utf-8"); |
| check(contentType, "text", "html", {"charset": "utf-8"}); |
| contentType = ContentType.parse(" text/html ; charset = utf-8 "); |
| check(contentType, "text", "html", {"charset": "utf-8"}); |
| contentType = ContentType.parse("text/html; charset=utf-8; xxx=yyy"); |
| check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"}); |
| contentType = |
| ContentType.parse(" text/html ; charset = utf-8 ; xxx=yyy "); |
| check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"}); |
| contentType = ContentType.parse('text/html; charset=utf-8; xxx="yyy"'); |
| check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"}); |
| contentType = |
| ContentType.parse(" text/html ; charset = utf-8 ; xxx=yyy "); |
| check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"}); |
| |
| contentType = ContentType.parse("text/html; charset=;"); |
| check(contentType, "text", "html", {"charset": ""}); |
| contentType = ContentType.parse("text/html; charset;"); |
| check(contentType, "text", "html", {"charset": null}); |
| |
| // Test builtin content types. |
| check(ContentType.text, "text", "plain", {"charset": "utf-8"}); |
| check(ContentType.html, "text", "html", {"charset": "utf-8"}); |
| check(ContentType.json, "application", "json", {"charset": "utf-8"}); |
| check(ContentType.binary, "application", "octet-stream"); |
| } |
| |
| void testKnownContentTypes() { |
| // Well known content types used by the VM service. |
| ContentType.parse('text/html; charset=UTF-8'); |
| ContentType.parse('application/dart; charset=UTF-8'); |
| ContentType.parse('application/javascript; charset=UTF-8'); |
| ContentType.parse('text/css; charset=UTF-8'); |
| ContentType.parse('image/gif'); |
| ContentType.parse('image/png'); |
| ContentType.parse('image/jpeg'); |
| ContentType.parse('image/jpeg'); |
| ContentType.parse('image/svg+xml'); |
| ContentType.parse('text/plain'); |
| } |
| |
| void testContentTypeCache() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.set(HttpHeaders.contentTypeHeader, "text/html"); |
| Expect.equals("text", headers.contentType?.primaryType); |
| Expect.equals("html", headers.contentType?.subType); |
| Expect.equals("text/html", headers.contentType?.value); |
| headers.set(HttpHeaders.contentTypeHeader, "text/plain; charset=utf-8"); |
| Expect.equals("text", headers.contentType?.primaryType); |
| Expect.equals("plain", headers.contentType?.subType); |
| Expect.equals("text/plain", headers.contentType?.value); |
| headers.removeAll(HttpHeaders.contentTypeHeader); |
| Expect.isNull(headers.contentType); |
| } |
| |
| void testCookie() { |
| test(String name, String value) { |
| void checkCookiesEquals(a, b) { |
| Expect.equals(a.name, b.name); |
| Expect.equals(a.value, b.value); |
| Expect.equals(a.expires, b.expires); |
| Expect.equals(a.toString(), b.toString()); |
| } |
| |
| void checkCookie(cookie, s) { |
| Expect.equals(s, cookie.toString()); |
| var c = new _Cookie.fromSetCookieValue(s); |
| checkCookiesEquals(cookie, c); |
| } |
| |
| Cookie cookie; |
| cookie = new Cookie(name, value); |
| Expect.equals("$name=$value; HttpOnly", cookie.toString()); |
| DateTime date = new DateTime.utc(2014, DateTime.january, 5, 23, 59, 59, 0); |
| cookie.expires = date; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Expires=Sun, 05 Jan 2014 23:59:59 GMT" |
| "; HttpOnly"); |
| cookie.maxAge = 567; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Expires=Sun, 05 Jan 2014 23:59:59 GMT" |
| "; Max-Age=567" |
| "; HttpOnly"); |
| cookie.domain = "example.com"; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Expires=Sun, 05 Jan 2014 23:59:59 GMT" |
| "; Max-Age=567" |
| "; Domain=example.com" |
| "; HttpOnly"); |
| cookie.path = "/xxx"; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Expires=Sun, 05 Jan 2014 23:59:59 GMT" |
| "; Max-Age=567" |
| "; Domain=example.com" |
| "; Path=/xxx" |
| "; HttpOnly"); |
| cookie.secure = true; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Expires=Sun, 05 Jan 2014 23:59:59 GMT" |
| "; Max-Age=567" |
| "; Domain=example.com" |
| "; Path=/xxx" |
| "; Secure" |
| "; HttpOnly"); |
| cookie.httpOnly = false; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Expires=Sun, 05 Jan 2014 23:59:59 GMT" |
| "; Max-Age=567" |
| "; Domain=example.com" |
| "; Path=/xxx" |
| "; Secure"); |
| cookie.expires = null; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Max-Age=567" |
| "; Domain=example.com" |
| "; Path=/xxx" |
| "; Secure"); |
| cookie.maxAge = null; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Domain=example.com" |
| "; Path=/xxx" |
| "; Secure"); |
| cookie.domain = null; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Path=/xxx" |
| "; Secure"); |
| cookie.path = null; |
| checkCookie( |
| cookie, |
| "$name=$value" |
| "; Secure"); |
| cookie.secure = false; |
| checkCookie(cookie, "$name=$value"); |
| } |
| |
| test("name", "value"); |
| test("abc", "def"); |
| test("ABC", "DEF"); |
| test("Abc", "Def"); |
| test("SID", "sJdkjKSJD12343kjKj78"); |
| } |
| |
| void testInvalidCookie() { |
| Expect.throws(() => new _Cookie.fromSetCookieValue("")); |
| Expect.throws(() => new _Cookie.fromSetCookieValue("=")); |
| Expect.throws(() => new _Cookie.fromSetCookieValue("=xxx")); |
| Expect.throws(() => new _Cookie.fromSetCookieValue("xxx")); |
| Expect.throws( |
| () => new _Cookie.fromSetCookieValue("xxx=yyy; expires=12 jan 2013")); |
| Expect.throws(() => new _Cookie.fromSetCookieValue("x x = y y")); |
| Expect.throws(() => new _Cookie("[4", "y")); |
| Expect.throws(() => new _Cookie("4", "y\"")); |
| |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.set( |
| 'Cookie', 'DARTSESSID=d3d6fdd78d51aaaf2924c32e991f4349; undefined'); |
| Expect.equals('DARTSESSID', headers._parseCookies().single.name); |
| Expect.equals( |
| 'd3d6fdd78d51aaaf2924c32e991f4349', headers._parseCookies().single.value); |
| } |
| |
| void testHeaderLists() { |
| HttpHeaders.generalHeaders.forEach((x) => null); |
| HttpHeaders.entityHeaders.forEach((x) => null); |
| HttpHeaders.responseHeaders.forEach((x) => null); |
| HttpHeaders.requestHeaders.forEach((x) => null); |
| } |
| |
| void testInvalidFieldName() { |
| void test(String field) { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.throwsFormatException(() => headers.add(field, "value")); |
| Expect.throwsFormatException(() => headers.set(field, "value")); |
| Expect.throwsFormatException(() => headers.remove(field, "value")); |
| Expect.throwsFormatException(() => headers.removeAll(field)); |
| } |
| |
| test('\r'); |
| test('\n'); |
| test(','); |
| test('test\x00'); |
| } |
| |
| void testInvalidFieldValue() { |
| void test(value, {bool remove: true}) { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| Expect.throwsFormatException(() => headers.add("field", value)); |
| Expect.throwsFormatException(() => headers.set("field", value)); |
| if (remove) { |
| Expect.throwsFormatException(() => headers.remove("field", value)); |
| } |
| } |
| |
| test('\r'); |
| test('\n'); |
| test('test\x00'); |
| // Test we handle other types correctly. |
| test(new StringBuffer('\x00'), remove: false); |
| } |
| |
| void testClear() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.add("a", "b"); |
| headers.contentLength = 7; |
| headers.chunkedTransferEncoding = true; |
| headers.clear(); |
| Expect.isNull(headers["a"]); |
| Expect.equals(headers.contentLength, -1); |
| Expect.isFalse(headers.chunkedTransferEncoding); |
| } |
| |
| void testFolding() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.add("a", "b"); |
| headers.add("a", "c"); |
| headers.add("a", "d"); |
| // no folding by default |
| Expect.isTrue(headers.toString().contains('b, c, d')); |
| // Header name should be case insensitive |
| headers.noFolding('A'); |
| var str = headers.toString(); |
| Expect.isTrue(str.contains(': b')); |
| Expect.isTrue(str.contains(': c')); |
| Expect.isTrue(str.contains(': d')); |
| } |
| |
| void testLowercaseAdd() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.add('A', 'a'); |
| Expect.equals(headers['a']![0], headers['A']![0]); |
| Expect.equals(headers['A']![0], 'a'); |
| headers.add('Foo', 'Foo', preserveHeaderCase: true); |
| Expect.equals(headers['Foo']![0], 'Foo'); |
| // Header field is Foo. |
| Expect.isTrue(headers.toString().contains('Foo:')); |
| |
| headers.add('FOo', 'FOo', preserveHeaderCase: true); |
| // Header field changes to FOo. |
| Expect.isTrue(headers.toString().contains('FOo:')); |
| |
| headers.add('FOO', 'FOO', preserveHeaderCase: false); |
| // Header field |
| Expect.isTrue(!headers.toString().contains('Foo:')); |
| Expect.isTrue(!headers.toString().contains('FOo:')); |
| Expect.isTrue(headers.toString().contains('FOO')); |
| } |
| |
| void testLowercaseSet() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.add('test', 'lower cases'); |
| // 'Test' should override 'test' entity |
| headers.set('TEST', 'upper cases', preserveHeaderCase: true); |
| Expect.isTrue(headers.toString().contains('TEST: upper cases')); |
| Expect.equals(1, headers['test']!.length); |
| Expect.equals(headers['test']![0], 'upper cases'); |
| |
| // Latest header will be stored. |
| headers.set('Test', 'mixed cases', preserveHeaderCase: true); |
| Expect.isTrue(headers.toString().contains('Test: mixed cases')); |
| Expect.equals(1, headers['test']!.length); |
| Expect.equals(headers['test']![0], 'mixed cases'); |
| } |
| |
| void testForEach() { |
| _HttpHeaders headers = new _HttpHeaders("1.1"); |
| headers.add('header1', 'value 1'); |
| headers.add('header2', 'value 2'); |
| headers.add('HEADER1', 'value 3', preserveHeaderCase: true); |
| headers.add('HEADER3', 'value 4', preserveHeaderCase: true); |
| |
| BytesBuilder builder = BytesBuilder(); |
| headers._build(builder); |
| |
| Expect.isTrue(utf8.decode(builder.toBytes()).contains('HEADER1')); |
| |
| bool myHeader1 = false; |
| bool myHeader2 = false; |
| bool myHeader3 = false; |
| int totalValues = 0; |
| headers.forEach((String name, List<String> values) { |
| totalValues += values.length; |
| if (name == "HEADER1") { |
| myHeader1 = true; |
| Expect.isTrue(values.indexOf("value 1") != -1); |
| Expect.isTrue(values.indexOf("value 3") != -1); |
| } |
| if (name == "header2") { |
| myHeader2 = true; |
| Expect.isTrue(values.indexOf("value 2") != -1); |
| } |
| if (name == "HEADER3") { |
| myHeader3 = true; |
| Expect.isTrue(values.indexOf("value 4") != -1); |
| } |
| }); |
| Expect.isTrue(myHeader1); |
| Expect.isTrue(myHeader2); |
| Expect.isTrue(myHeader3); |
| Expect.equals(4, totalValues); |
| } |
| |
| main() { |
| testMultiValue(); |
| testDate(); |
| testExpires(); |
| testIfModifiedSince(); |
| testHost(); |
| testTransferEncoding(); |
| testEnumeration(); |
| testHeaderValue(); |
| testContentType(); |
| testKnownContentTypes(); |
| testContentTypeCache(); |
| testCookie(); |
| testInvalidCookie(); |
| testHeaderLists(); |
| testInvalidFieldName(); |
| testInvalidFieldValue(); |
| testClear(); |
| testFolding(); |
| testLowercaseAdd(); |
| testLowercaseSet(); |
| testForEach(); |
| } |