diff --git a/pkgs/http/CHANGELOG.md b/pkgs/http/CHANGELOG.md index 7b8dec4fdd..a6edd66e3b 100644 --- a/pkgs/http/CHANGELOG.md +++ b/pkgs/http/CHANGELOG.md @@ -1,6 +1,7 @@ ## 1.1.3-wip * Add `MockClient.pngResponse`, which makes it easier to fake image responses. +* Add `redirects` in `IOStreamedResponse`. ## 1.1.2 diff --git a/pkgs/http/lib/src/io_client.dart b/pkgs/http/lib/src/io_client.dart index db66b028c4..ca0213290b 100644 --- a/pkgs/http/lib/src/io_client.dart +++ b/pkgs/http/lib/src/io_client.dart @@ -127,6 +127,7 @@ class IOClient extends BaseClient { request: request, headers: headers, isRedirect: response.isRedirect, + redirects: response.redirects, persistentConnection: response.persistentConnection, reasonPhrase: response.reasonPhrase, inner: response); diff --git a/pkgs/http/lib/src/io_streamed_response.dart b/pkgs/http/lib/src/io_streamed_response.dart index 95b818c2b3..b74a9232f1 100644 --- a/pkgs/http/lib/src/io_streamed_response.dart +++ b/pkgs/http/lib/src/io_streamed_response.dart @@ -23,9 +23,16 @@ class IOStreamedResponse extends StreamedResponse { super.isRedirect, super.persistentConnection, super.reasonPhrase, + this.redirects = const [], HttpClientResponse? inner}) : _inner = inner; + /// Returns the series of redirects this connection has been through. + /// The list will be empty if no redirects were followed. + /// [redirects] will be updated both in the case of + /// an automatic and a manual redirect. + final List redirects; + /// Detaches the underlying socket from the HTTP server. /// /// Will throw if `inner` was not set or `null` when `this` was created. diff --git a/pkgs/http/test/io/request_test.dart b/pkgs/http/test/io/request_test.dart index ac6b44c3fd..65503ae1f0 100644 --- a/pkgs/http/test/io/request_test.dart +++ b/pkgs/http/test/io/request_test.dart @@ -5,7 +5,10 @@ @TestOn('vm') library; +import 'dart:io'; + import 'package:http/http.dart' as http; +import 'package:http/io_client.dart' as http_io; import 'package:test/test.dart'; import '../utils.dart'; @@ -65,4 +68,14 @@ void main() { throwsA(isA() .having((e) => e.message, 'message', 'Redirect limit exceeded'))); }); + + test('contains redirects', () async { + var ioClient = HttpClient(); + var client = http_io.IOClient(ioClient); + var request = http.Request('GET', serverUrl.resolve('/redirect')); + var response = await client.send(request); + expect(response.statusCode, equals(200)); + expect(response.redirects.length, equals(1)); + expect(response.redirects.first.location, serverUrl.resolve('/')); + }); }