From bb6e3caa55e4ab4ef48e2bfe2168f20c4bbf55e3 Mon Sep 17 00:00:00 2001 From: Yizhe Sun Date: Sun, 15 Sep 2019 17:46:33 +0800 Subject: [PATCH] Fixes #293, added property `url` to BaseResponse. The final url is extract from XMLHttpRequest.responseURL(on browsers) or HttpClientResponse.redirects.last.location(on vm). Also added tests for vm. No tests were written for browser, since server tests for brower is broken and needs to be fixed. --- lib/src/base_request.dart | 1 + lib/src/base_response.dart | 4 ++++ lib/src/browser_client.dart | 1 + lib/src/io_client.dart | 3 +++ lib/src/response.dart | 5 +++++ lib/src/streamed_response.dart | 2 ++ test/io/request_test.dart | 3 +++ 7 files changed, 19 insertions(+) diff --git a/lib/src/base_request.dart b/lib/src/base_request.dart index 544e436d4b..68caaa8c0f 100644 --- a/lib/src/base_request.dart +++ b/lib/src/base_request.dart @@ -122,6 +122,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 6e2fc13bff..daba1f7d63 100644 --- a/lib/src/base_response.dart +++ b/lib/src/base_response.dart @@ -28,6 +28,9 @@ abstract class BaseResponse { // TODO(nweiz): make this a HttpHeaders object. final Map headers; + /// The url of the final response(possibly after redirections). + final String url; + final bool isRedirect; /// Whether the server requested that a persistent connection be maintained. @@ -37,6 +40,7 @@ abstract class BaseResponse { {this.contentLength, this.request, this.headers = const {}, + this.url, this.isRedirect = false, this.persistentConnection = true, this.reasonPhrase}) { diff --git a/lib/src/browser_client.dart b/lib/src/browser_client.dart index 76c613df09..8498eb26cb 100644 --- a/lib/src/browser_client.dart +++ b/lib/src/browser_client.dart @@ -65,6 +65,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 f19594f475..c05b6d547b 100644 --- a/lib/src/io_client.dart +++ b/lib/src/io_client.dart @@ -55,6 +55,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/response.dart b/lib/src/response.dart index 1e4e4cdcdb..435aed819b 100644 --- a/lib/src/response.dart +++ b/lib/src/response.dart @@ -32,12 +32,14 @@ class Response extends BaseResponse { Response(String body, int statusCode, {BaseRequest request, Map headers = const {}, + String url, bool isRedirect = false, 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 { Response.bytes(List bodyBytes, int statusCode, {BaseRequest request, Map headers = const {}, + String url, bool isRedirect = false, bool persistentConnection = true, String reasonPhrase}) @@ -54,6 +57,7 @@ class Response extends BaseResponse { contentLength: bodyBytes.length, request: request, headers: headers, + url: url, isRedirect: isRedirect, persistentConnection: persistentConnection, reasonPhrase: reasonPhrase); @@ -65,6 +69,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 b5b073f118..fd8ac36883 100644 --- a/lib/src/streamed_response.dart +++ b/lib/src/streamed_response.dart @@ -24,6 +24,7 @@ class StreamedResponse extends BaseResponse { {int contentLength, BaseRequest request, Map headers = const {}, + String url, bool isRedirect = false, bool persistentConnection = true, String reasonPhrase}) @@ -32,6 +33,7 @@ class StreamedResponse extends BaseResponse { contentLength: contentLength, request: request, headers: headers, + url: url, isRedirect: isRedirect, persistentConnection: persistentConnection, reasonPhrase: reasonPhrase); 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', '/'))); });