diff --git a/lib/src/base_request.dart b/lib/src/base_request.dart index fd18bad332..7f73c58d49 100644 --- a/lib/src/base_request.dart +++ b/lib/src/base_request.dart @@ -136,6 +136,7 @@ abstract class BaseRequest { contentLength: response.contentLength, request: response.request, headers: response.headers, + url: response.url, isRedirect: response.isRedirect, persistentConnection: response.persistentConnection, reasonPhrase: response.reasonPhrase); diff --git a/lib/src/base_response.dart b/lib/src/base_response.dart index a09dcea4ed..1496b0ca6c 100644 --- a/lib/src/base_response.dart +++ b/lib/src/base_response.dart @@ -30,6 +30,7 @@ abstract class BaseResponse { final Map headers; final bool isRedirect; + final String? url; /// Whether the server requested that a persistent connection be maintained. final bool persistentConnection; @@ -39,6 +40,7 @@ abstract class BaseResponse { this.request, this.headers = const {}, this.isRedirect = false, + this.url, this.persistentConnection = true, this.reasonPhrase}) { if (statusCode < 100) { diff --git a/lib/src/browser_client.dart b/lib/src/browser_client.dart index f41d0ba15b..1baf3da097 100644 --- a/lib/src/browser_client.dart +++ b/lib/src/browser_client.dart @@ -59,6 +59,7 @@ class BrowserClient extends BaseClient { contentLength: body.length, request: request, headers: xhr.responseHeaders, + url: xhr.responseUrl, reasonPhrase: xhr.statusText)); })); diff --git a/lib/src/io_client.dart b/lib/src/io_client.dart index 85d3681861..1657a72723 100644 --- a/lib/src/io_client.dart +++ b/lib/src/io_client.dart @@ -58,6 +58,9 @@ class IOClient extends BaseClient { response.contentLength == -1 ? null : response.contentLength, request: request, headers: headers, + url: response.redirects.isEmpty + ? request.url.toString() + : response.redirects.last.location.toString(), isRedirect: response.isRedirect, persistentConnection: response.persistentConnection, reasonPhrase: response.reasonPhrase, diff --git a/lib/src/io_streamed_response.dart b/lib/src/io_streamed_response.dart index 21744858b3..63abfd7e56 100644 --- a/lib/src/io_streamed_response.dart +++ b/lib/src/io_streamed_response.dart @@ -24,12 +24,14 @@ class IOStreamedResponse extends StreamedResponse { bool isRedirect = false, bool persistentConnection = true, String? reasonPhrase, + String? url, HttpClientResponse? inner}) : _inner = inner, super(stream, statusCode, contentLength: contentLength, request: request, headers: headers, + url: url, isRedirect: isRedirect, persistentConnection: persistentConnection, reasonPhrase: reasonPhrase); diff --git a/lib/src/response.dart b/lib/src/response.dart index 01899887a7..51df19199e 100644 --- a/lib/src/response.dart +++ b/lib/src/response.dart @@ -32,11 +32,13 @@ class Response extends BaseResponse { {BaseRequest? request, Map headers = const {}, bool isRedirect = false, + String? url, bool persistentConnection = true, String? reasonPhrase}) : this.bytes(_encodingForHeaders(headers).encode(body), statusCode, request: request, headers: headers, + url: url, isRedirect: isRedirect, persistentConnection: persistentConnection, reasonPhrase: reasonPhrase); @@ -46,6 +48,7 @@ class Response extends BaseResponse { {BaseRequest? request, Map headers = const {}, bool isRedirect = false, + String? url, bool persistentConnection = true, String? reasonPhrase}) : bodyBytes = toUint8List(bodyBytes), @@ -53,6 +56,7 @@ class Response extends BaseResponse { contentLength: bodyBytes.length, request: request, headers: headers, + url: url, isRedirect: isRedirect, persistentConnection: persistentConnection, reasonPhrase: reasonPhrase); @@ -64,6 +68,7 @@ class Response extends BaseResponse { return Response.bytes(body, response.statusCode, request: response.request, headers: response.headers, + url: response.url, isRedirect: response.isRedirect, persistentConnection: response.persistentConnection, reasonPhrase: response.reasonPhrase); diff --git a/lib/src/streamed_response.dart b/lib/src/streamed_response.dart index e082dced0e..4f31c74c93 100644 --- a/lib/src/streamed_response.dart +++ b/lib/src/streamed_response.dart @@ -23,6 +23,7 @@ class StreamedResponse extends BaseResponse { BaseRequest? request, Map headers = const {}, bool isRedirect = false, + String? url, bool persistentConnection = true, String? reasonPhrase}) : stream = toByteStream(stream), @@ -30,6 +31,7 @@ class StreamedResponse extends BaseResponse { contentLength: contentLength, request: request, headers: headers, + url: url, isRedirect: isRedirect, persistentConnection: persistentConnection, reasonPhrase: reasonPhrase); diff --git a/pubspec.yaml b/pubspec.yaml index 1340d51ac1..055f5e8d60 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: http -version: 0.13.4-dev +version: 0.13.4 homepage: https://github.com/dart-lang/http description: A composable, multi-platform, Future-based API for HTTP requests. diff --git a/test/io/request_test.dart b/test/io/request_test.dart index 97555f9782..63da1f562b 100644 --- a/test/io/request_test.dart +++ b/test/io/request_test.dart @@ -22,6 +22,7 @@ void main() { final response = await request.send(); expect(response.statusCode, equals(200)); + expect(response.url, equals(serverUrl.toString())); final bytesString = await response.stream.bytesToString(); expect( bytesString, @@ -44,6 +45,7 @@ void main() { final response = await request.send(); expect(response.statusCode, equals(302)); + expect(response.url, equals(serverUrl.resolve('/redirect').toString())); }); test('with redirects', () async { @@ -51,6 +53,7 @@ void main() { final response = await request.send(); expect(response.statusCode, equals(200)); + expect(response.url, equals(serverUrl.resolve('/').toString())); final bytesString = await response.stream.bytesToString(); expect(bytesString, parse(containsPair('path', '/'))); });