From 56aac36b3f72c71e50f752795aa58e90bbd57f49 Mon Sep 17 00:00:00 2001 From: Sebastian Stallenberger <595706+illaz@users.noreply.github.com> Date: Thu, 8 May 2025 11:25:44 +0200 Subject: [PATCH] [oauth2] Add isClosed and exception handling for closed state to oauth2.Client --- pkgs/oauth2/lib/src/client.dart | 10 +++++++++- pkgs/oauth2/test/client_test.dart | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/pkgs/oauth2/lib/src/client.dart b/pkgs/oauth2/lib/src/client.dart index 1dd2282fb4..cad76711a2 100644 --- a/pkgs/oauth2/lib/src/client.dart +++ b/pkgs/oauth2/lib/src/client.dart @@ -66,6 +66,9 @@ class Client extends http.BaseClient { Credentials get credentials => _credentials; Credentials _credentials; + /// Indicates whether the client is closed or not. + bool get isClosed => _httpClient == null; + /// Callback to be invoked whenever the credentials refreshed. final CredentialsRefreshedCallback? _onCredentialsRefreshed; @@ -110,8 +113,13 @@ class Client extends http.BaseClient { await refreshCredentials(); } + final httpClient = _httpClient; + if (httpClient == null) { + throw http.ClientException('Client is already closed.'); + } + request.headers['authorization'] = 'Bearer ${credentials.accessToken}'; - var response = await _httpClient!.send(request); + var response = await httpClient.send(request); if (response.statusCode != 401) return response; if (!response.headers.containsKey('www-authenticate')) return response; diff --git a/pkgs/oauth2/test/client_test.dart b/pkgs/oauth2/test/client_test.dart index 3c30d36c85..fc8deb5e74 100644 --- a/pkgs/oauth2/test/client_test.dart +++ b/pkgs/oauth2/test/client_test.dart @@ -189,6 +189,26 @@ void main() { expect(client.refreshCredentials(), throwsA(isStateError)); }); + + test("won't send a request with closed client", () { + var credentials = oauth2.Credentials('access token'); + + var client = oauth2.Client( + credentials, + identifier: 'identifier', + secret: 'secret', + httpClient: httpClient, + ); + + expect(client.isClosed, equals(false)); + client.close(); + expect(client.isClosed, equals(true)); + + expect( + client.read(requestUri), + throwsA(const TypeMatcher()), + ); + }); }); group('with invalid credentials', () {