Skip to content

Commit 11fca7b

Browse files
donny-dontnex3
authored andcommitted
Add a dart:io client (#82)
1 parent 128c0bc commit 11fca7b

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

lib/src/io_client.dart

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import 'dart:io';
88
import 'package:async/async.dart';
99

1010
import 'base_client.dart';
11-
import 'base_request.dart';
1211
import 'exception.dart';
13-
import 'streamed_response.dart';
12+
import 'request.dart';
13+
import 'response.dart';
1414

1515
/// A `dart:io`-based HTTP client.
1616
///
@@ -23,45 +23,42 @@ class IOClient extends BaseClient {
2323
IOClient([HttpClient inner]) : _inner = inner ?? new HttpClient();
2424

2525
/// Sends an HTTP request and asynchronously returns the response.
26-
Future<StreamedResponse> send(BaseRequest request) async {
27-
var stream = request.finalize();
28-
26+
Future<Response> send(Request request) async {
2927
try {
3028
var ioRequest = await _inner.openUrl(request.method, request.url);
29+
var context = request.context;
3130

3231
ioRequest
33-
..followRedirects = request.followRedirects
34-
..maxRedirects = request.maxRedirects
32+
..followRedirects = context['io.followRedirects'] ?? true
33+
..maxRedirects = context['io.maxRedirects'] ?? 5
3534
..contentLength = request.contentLength == null
3635
? -1
3736
: request.contentLength
38-
..persistentConnection = request.persistentConnection;
37+
..persistentConnection = context['io.persistentConnection'] ?? true;
3938
request.headers.forEach((name, value) {
4039
ioRequest.headers.set(name, value);
4140
});
4241

43-
var response = await stream.pipe(
44-
DelegatingStreamConsumer.typed(ioRequest));
42+
request.read().pipe(DelegatingStreamConsumer.typed<List<int>>(ioRequest));
43+
var response = await ioRequest.done;
44+
4545
var headers = <String, String>{};
4646
response.headers.forEach((key, values) {
4747
headers[key] = values.join(',');
4848
});
4949

50-
return new StreamedResponse(
51-
DelegatingStream.typed/*<List<int>>*/(response).handleError((error) =>
52-
throw new ClientException(error.message, error.uri),
53-
test: (error) => error is HttpException),
50+
return new Response(
51+
_responseUrl(request, response),
5452
response.statusCode,
55-
contentLength: response.contentLength == -1
56-
? null
57-
: response.contentLength,
58-
request: request,
59-
headers: headers,
60-
isRedirect: response.isRedirect,
61-
persistentConnection: response.persistentConnection,
62-
reasonPhrase: response.reasonPhrase);
53+
reasonPhrase: response.reasonPhrase,
54+
body: DelegatingStream.typed<List<int>>(response).handleError(
55+
(error) => throw new ClientException(error.message, error.uri),
56+
test: (error) => error is HttpException),
57+
headers: headers);
6358
} on HttpException catch (error) {
6459
throw new ClientException(error.message, error.uri);
60+
} on SocketException catch (error) {
61+
throw new ClientException(error.message, request.url);
6562
}
6663
}
6764

@@ -71,4 +68,19 @@ class IOClient extends BaseClient {
7168
if (_inner != null) _inner.close(force: true);
7269
_inner = null;
7370
}
71+
72+
/// Determines the finalUrl retrieved by evaluating any redirects received in
73+
/// the [response] based on the initial [request].
74+
Uri _responseUrl(Request request, HttpClientResponse response) {
75+
var finalUrl = request.url;
76+
77+
for (var redirect in response.redirects) {
78+
var location = redirect.location;
79+
80+
// Redirects can either be absolute or relative
81+
finalUrl = location.isAbsolute ? location : finalUrl.resolveUri(location);
82+
}
83+
84+
return finalUrl;
85+
}
7486
}

0 commit comments

Comments
 (0)