|
2 | 2 | // for details. All rights reserved. Use of this source code is governed by a
|
3 | 3 | // BSD-style license that can be found in the LICENSE file.
|
4 | 4 |
|
5 |
| -import 'dart:async'; |
6 |
| -import 'dart:io'; |
7 |
| - |
| 5 | +import 'package:async/async.dart'; |
8 | 6 | import 'package:http/http.dart';
|
| 7 | +import 'package:stream_channel/stream_channel.dart'; |
9 | 8 | import 'package:test/test.dart';
|
10 | 9 |
|
11 |
| -/// Tests that the [Client] correctly processes response headers e.g. |
12 |
| -/// 'Content-Length'. |
| 10 | +import 'utils.dart'; |
| 11 | + |
| 12 | +/// Tests that the [Client] correctly processes response headers. |
13 | 13 | void testResponseHeaders(Client client) async {
|
14 | 14 | group('server headers', () {
|
| 15 | + late String host; |
| 16 | + late StreamChannel<Object?> httpServerChannel; |
| 17 | + late StreamQueue<Object?> httpServerQueue; |
| 18 | + |
| 19 | + setUp(() async { |
| 20 | + httpServerChannel = await startServer('response_headers_server.dart'); |
| 21 | + httpServerQueue = StreamQueue(httpServerChannel.stream); |
| 22 | + host = 'localhost:${await httpServerQueue.next}'; |
| 23 | + }); |
| 24 | + |
15 | 25 | test('single header', () async {
|
16 |
| - final server = (await HttpServer.bind('localhost', 0)) |
17 |
| - ..listen((request) async { |
18 |
| - await request.drain<void>(); |
19 |
| - var response = request.response; |
20 |
| - response.headers.set('foo', 'bar'); |
21 |
| - unawaited(response.close()); |
22 |
| - }); |
23 |
| - final response = |
24 |
| - await client.get(Uri.http('localhost:${server.port}', '')); |
| 26 | + httpServerChannel.sink.add({'foo': 'bar'}); |
| 27 | + |
| 28 | + final response = await client.get(Uri.http(host, '')); |
25 | 29 | expect(response.headers['foo'], 'bar');
|
26 |
| - await server.close(); |
27 | 30 | });
|
28 | 31 |
|
29 | 32 | test('UPPERCASE header', () async {
|
30 |
| - final server = (await HttpServer.bind('localhost', 0)) |
31 |
| - ..listen((request) async { |
32 |
| - await request.drain<void>(); |
33 |
| - var response = request.response; |
34 |
| - response.headers.set('FOO', 'BAR', preserveHeaderCase: true); |
35 |
| - unawaited(response.close()); |
36 |
| - }); |
| 33 | + httpServerChannel.sink.add({'foo': 'BAR'}); |
| 34 | + |
| 35 | + final response = await client.get(Uri.http(host, '')); |
37 | 36 | // RFC 2616 14.44 states that header field names are case-insensive.
|
38 | 37 | // http.Client canonicalizes field names into lower case.
|
39 |
| - final response = |
40 |
| - await client.get(Uri.http('localhost:${server.port}', '')); |
41 | 38 | expect(response.headers['foo'], 'BAR');
|
42 |
| - await server.close(); |
43 | 39 | });
|
44 | 40 |
|
45 | 41 | test('multiple headers', () async {
|
46 |
| - final server = (await HttpServer.bind('localhost', 0)) |
47 |
| - ..listen((request) async { |
48 |
| - await request.drain<void>(); |
49 |
| - var response = request.response; |
50 |
| - response.headers |
51 |
| - ..set('field1', 'value1') |
52 |
| - ..set('field2', 'value2') |
53 |
| - ..set('field3', 'value3'); |
54 |
| - unawaited(response.close()); |
55 |
| - }); |
56 |
| - final response = |
57 |
| - await client.get(Uri.http('localhost:${server.port}', '')); |
| 42 | + httpServerChannel.sink |
| 43 | + .add({'field1': 'value1', 'field2': 'value2', 'field3': 'value3'}); |
| 44 | + |
| 45 | + final response = await client.get(Uri.http(host, '')); |
58 | 46 | expect(response.headers['field1'], 'value1');
|
59 | 47 | expect(response.headers['field2'], 'value2');
|
60 | 48 | expect(response.headers['field3'], 'value3');
|
61 |
| - await server.close(); |
62 | 49 | });
|
63 | 50 |
|
64 | 51 | test('multiple values per header', () async {
|
65 |
| - final server = (await HttpServer.bind('localhost', 0)) |
66 |
| - ..listen((request) async { |
67 |
| - await request.drain<void>(); |
68 |
| - var response = request.response; |
69 |
| - // RFC 2616 14.44 states that header field names are case-insensive. |
70 |
| - response.headers |
71 |
| - ..add('list', 'apple') |
72 |
| - ..add('list', 'orange') |
73 |
| - ..add('List', 'banana'); |
74 |
| - unawaited(response.close()); |
75 |
| - }); |
76 |
| - final response = |
77 |
| - await client.get(Uri.http('localhost:${server.port}', '')); |
| 52 | + httpServerChannel.sink.add({'list': 'apple, orange, banana'}); |
| 53 | + |
| 54 | + final response = await client.get(Uri.http(host, '')); |
78 | 55 | expect(response.headers['list'], 'apple, orange, banana');
|
79 |
| - await server.close(); |
80 | 56 | });
|
81 | 57 | });
|
82 | 58 | }
|
0 commit comments