@@ -8,9 +8,9 @@ import 'dart:io';
8
8
import 'package:async/async.dart' ;
9
9
10
10
import 'base_client.dart' ;
11
- import 'base_request.dart' ;
12
11
import 'exception.dart' ;
13
- import 'streamed_response.dart' ;
12
+ import 'request.dart' ;
13
+ import 'response.dart' ;
14
14
15
15
/// A `dart:io` -based HTTP client.
16
16
///
@@ -23,45 +23,42 @@ class IOClient extends BaseClient {
23
23
IOClient ([HttpClient inner]) : _inner = inner ?? new HttpClient ();
24
24
25
25
/// 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 {
29
27
try {
30
28
var ioRequest = await _inner.openUrl (request.method, request.url);
29
+ var context = request.context;
31
30
32
31
ioRequest
33
- ..followRedirects = request .followRedirects
34
- ..maxRedirects = request .maxRedirects
32
+ ..followRedirects = context[ 'io .followRedirects' ] ?? true
33
+ ..maxRedirects = context[ 'io .maxRedirects' ] ?? 5
35
34
..contentLength = request.contentLength == null
36
35
? - 1
37
36
: request.contentLength
38
- ..persistentConnection = request .persistentConnection;
37
+ ..persistentConnection = context[ 'io .persistentConnection' ] ?? true ;
39
38
request.headers.forEach ((name, value) {
40
39
ioRequest.headers.set (name, value);
41
40
});
42
41
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
+
45
45
var headers = < String , String > {};
46
46
response.headers.forEach ((key, values) {
47
47
headers[key] = values.join (',' );
48
48
});
49
49
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),
54
52
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);
63
58
} on HttpException catch (error) {
64
59
throw new ClientException (error.message, error.uri);
60
+ } on SocketException catch (error) {
61
+ throw new ClientException (error.message, request.url);
65
62
}
66
63
}
67
64
@@ -71,4 +68,19 @@ class IOClient extends BaseClient {
71
68
if (_inner != null ) _inner.close (force: true );
72
69
_inner = null ;
73
70
}
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
+ }
74
86
}
0 commit comments