Files
sdk/tests/standalone/io/http_100_continue_test.dart
T
Alexander Aprelev f5432d7164 [io/http] Relax http parsing constraints around CRLF.
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>
2021-03-20 03:11:28 +00:00

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);
}