| // 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. |
| |
| // @dart = 2.9 |
| |
| 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([], (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); |
| } |