f5432d7164
https://tools.ietf.org/html/rfc2616\#section-19.3 advises to allow CR*LF wherever CRLF line terminator is expected. Issue https://github.com/dart-lang/sdk/issues/43916 TEST=http_client_parser_crlf_tolerant_test, http_100_continue_test Change-Id: I8c6d263bdb950b2f3992b69921eff0ee75704c10 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/192120 Commit-Queue: Alexander Aprelev <aam@google.com> Reviewed-by: Siva Annamalai <asiva@google.com>
78 lines
1.7 KiB
Dart
78 lines
1.7 KiB
Dart
// Copyright (c) 2015, 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.
|
|
|
|
import "dart:async";
|
|
import 'dart:convert';
|
|
import "dart:io";
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
void test(responseBytes, bodyLength) async {
|
|
fullRequest(bytes) {
|
|
var len = bytes.length;
|
|
return len > 4 &&
|
|
bytes[len - 4] == 13 &&
|
|
bytes[len - 3] == 10 &&
|
|
bytes[len - 2] == 13 &&
|
|
bytes[len - 1] == 10;
|
|
}
|
|
|
|
handleSocket(socket) async {
|
|
var bytes = [];
|
|
await for (var data in socket) {
|
|
bytes.addAll(data);
|
|
if (fullRequest(bytes)) {
|
|
socket.add(responseBytes);
|
|
socket.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
var server = await ServerSocket.bind('127.0.0.1', 0);
|
|
server.listen(handleSocket);
|
|
|
|
var client = new HttpClient();
|
|
var request =
|
|
await client.getUrl(Uri.parse('http://127.0.0.1:${server.port}/'));
|
|
var response = await request.close();
|
|
Expect.equals(response.statusCode, 200);
|
|
Expect.equals(bodyLength,
|
|
(await response.fold<List<int>>(<int>[], (p, e) => p..addAll(e))).length);
|
|
server.close();
|
|
}
|
|
|
|
main() {
|
|
var r1 = '''
|
|
HTTP/1.1 100 Continue\r
|
|
\r
|
|
HTTP/1.1 200 OK\r
|
|
\r
|
|
''';
|
|
|
|
var r2 = '''
|
|
HTTP/1.1 100 Continue\r
|
|
My-Header-1: hello\r
|
|
My-Header-2: world\r
|
|
\r
|
|
HTTP/1.1 200 OK\r
|
|
\r
|
|
''';
|
|
|
|
var r3 = '''
|
|
HTTP/1.1 100 Continue\r
|
|
\r
|
|
HTTP/1.1 200 OK\r
|
|
Content-Length: 2\r
|
|
\r
|
|
AB''';
|
|
|
|
test(ascii.encode(r1), 0);
|
|
test(ascii.encode(r2), 0);
|
|
test(ascii.encode(r3), 2);
|
|
|
|
test(ascii.encode(r1.replaceAll('\r\n', '\n')), 0);
|
|
test(ascii.encode(r2.replaceAll('\r\n', '\n')), 0);
|
|
test(ascii.encode(r3.replaceAll('\r\n', '\n')), 2);
|
|
}
|