forked from google/webdriver.dart
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathasync_io_request_client.dart
66 lines (53 loc) · 2 KB
/
async_io_request_client.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import 'dart:async';
import 'dart:convert';
import 'dart:io' show ContentType, HttpClient, HttpClientRequest, HttpHeaders;
import '../../support/async.dart';
import '../common/request.dart';
import '../common/request_client.dart';
/// Async request client using dart:io package.
class AsyncIoRequestClient extends AsyncRequestClient {
final HttpClient client = HttpClient();
final Map<String, String> _headers;
final Lock _lock = Lock();
AsyncIoRequestClient(super.prefix, {Map<String, String> headers = const {}})
: _headers = headers;
@override
Future<WebDriverResponse> sendRaw(WebDriverRequest request) async {
await _lock.acquire();
late HttpClientRequest httpRequest;
switch (request.method) {
case HttpMethod.httpGet:
httpRequest = await client.getUrl(resolve(request.uri!));
break;
case HttpMethod.httpPost:
httpRequest = await client.postUrl(resolve(request.uri!));
break;
case HttpMethod.httpDelete:
httpRequest = await client.deleteUrl(resolve(request.uri!));
break;
}
httpRequest.followRedirects = true;
_headers.forEach(httpRequest.headers.add);
httpRequest.headers.add(HttpHeaders.acceptHeader, 'application/json');
httpRequest.headers.add(HttpHeaders.acceptCharsetHeader, utf8.name);
httpRequest.headers.add(HttpHeaders.cacheControlHeader, 'no-cache');
if (request.body != null && request.body!.isNotEmpty) {
httpRequest.headers.contentType =
ContentType('application', 'json', charset: 'utf-8');
final body = utf8.encode(request.body!);
httpRequest.contentLength = body.length;
httpRequest.add(body);
}
try {
final response = await httpRequest.close();
return WebDriverResponse(response.statusCode, response.reasonPhrase,
await utf8.decodeStream(response.cast<List<int>>()));
} finally {
_lock.release();
}
}
@override
String toString() => 'AsyncIo';
@override
void close() => client.close(force: true);
}