From cec27fa16841097688365458d8536ce6988707ce Mon Sep 17 00:00:00 2001 From: Abdelaziz Mahdy Date: Sat, 28 Sep 2024 07:48:31 -0300 Subject: [PATCH] fixing io client (#25) --- rhttp/lib/src/client/io/io_client.dart | 20 ++++++++++-------- rhttp/lib/src/client/io/io_headers.dart | 3 ++- rhttp/lib/src/client/io/io_request.dart | 2 +- rhttp/lib/src/client/io/io_response.dart | 26 ++++++++++++++++++------ rhttp/lib/src/model/settings.dart | 15 ++++++++++++++ 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/rhttp/lib/src/client/io/io_client.dart b/rhttp/lib/src/client/io/io_client.dart index cf0a6f0..c32278a 100644 --- a/rhttp/lib/src/client/io/io_client.dart +++ b/rhttp/lib/src/client/io/io_client.dart @@ -118,7 +118,7 @@ class IoCompatibleClient implements HttpClient { @override set idleTimeout(Duration _) => - throw UnsupportedError('Setting idleTimeout is not supported'); + client.settings.timeoutSettings?.copyWith(connectTimeout: _); @override int? maxConnectionsPerHost; @@ -129,30 +129,30 @@ class IoCompatibleClient implements HttpClient { @override void addCredentials( Uri url, String realm, HttpClientCredentials credentials) => - throw UnimplementedError(); + throw UnimplementedError("addCredentials is not supported"); @override void addProxyCredentials(String host, int port, String realm, HttpClientCredentials credentials) => - throw UnimplementedError(); + throw UnimplementedError("addProxyCredentials is not supported"); @override set authenticate( Future Function(Uri url, String scheme, String? realm)? f) => - throw UnimplementedError(); + throw UnimplementedError("authenticate is not supported"); @override set authenticateProxy( Future Function( String host, int port, String scheme, String? realm)? f) => - throw UnimplementedError(); + throw UnimplementedError("authenticateProxy is not supported"); @override set badCertificateCallback( bool Function(X509Certificate cert, String host, int port)? callback) => - UnimplementedError(); + UnimplementedError("badCertificateCallback is not supported"); @override void close({bool force = false}) { @@ -166,12 +166,14 @@ class IoCompatibleClient implements HttpClient { String? proxyHost, int? proxyPort, )? f) { - UnimplementedError(); + UnimplementedError("connectionFactory is not supported"); } @override - set findProxy(String Function(Uri url)? f) => UnimplementedError(); + set findProxy(String Function(Uri url)? f) => + UnimplementedError("findProxy is not supported"); @override - set keyLog(Function(String line)? callback) => throw UnimplementedError(); + set keyLog(Function(String line)? callback) => + throw UnimplementedError("keyLog is not supported"); } diff --git a/rhttp/lib/src/client/io/io_headers.dart b/rhttp/lib/src/client/io/io_headers.dart index 2b778f1..7d2ada7 100644 --- a/rhttp/lib/src/client/io/io_headers.dart +++ b/rhttp/lib/src/client/io/io_headers.dart @@ -56,7 +56,8 @@ class RhttpIoHeaders implements HttpHeaders { } @override - void noFolding(String name) => throw UnimplementedError(); + void noFolding(String name) => + throw UnimplementedError("noFolding is not supported"); @override void remove(String name, Object value) { diff --git a/rhttp/lib/src/client/io/io_request.dart b/rhttp/lib/src/client/io/io_request.dart index cbfa62f..874ee49 100644 --- a/rhttp/lib/src/client/io/io_request.dart +++ b/rhttp/lib/src/client/io/io_request.dart @@ -149,7 +149,7 @@ class RhttpIoRequest implements HttpClientRequest { _controller.close(); startRequest(); final response = await _responseCompleter.future; - return RhttpIoResponse(response); + return RhttpIoResponse(response, headers); } @override diff --git a/rhttp/lib/src/client/io/io_response.dart b/rhttp/lib/src/client/io/io_response.dart index 0798fe5..b381064 100644 --- a/rhttp/lib/src/client/io/io_response.dart +++ b/rhttp/lib/src/client/io/io_response.dart @@ -2,13 +2,14 @@ import 'dart:async'; import 'dart:io'; import 'package:meta/meta.dart'; +import 'package:rhttp/rhttp.dart' as rhttp; import 'package:rhttp/src/model/response.dart'; @internal class RhttpIoResponse with Stream> implements HttpClientResponse { final HttpStreamResponse _response; - - RhttpIoResponse(this._response); + final HttpHeaders _headers; + RhttpIoResponse(this._response, this._headers); @override int get statusCode => _response.statusCode; @@ -18,7 +19,7 @@ class RhttpIoResponse with Stream> implements HttpClientResponse { int.tryParse(_response.headerMap['content-length'] ?? '-1') ?? -1; @override - HttpHeaders get headers => throw UnimplementedError(); + HttpHeaders get headers => _headers; @override X509Certificate? get certificate => throw UnimplementedError(); @@ -37,7 +38,19 @@ class RhttpIoResponse with Stream> implements HttpClientResponse { Future detachSocket() => throw UnimplementedError(); @override - bool get isRedirect => throw UnimplementedError(); + bool get isRedirect { + if (_response.request.method == rhttp.HttpMethod.get || + _response.request.method == rhttp.HttpMethod.head) { + return statusCode == HttpStatus.movedPermanently || + statusCode == HttpStatus.permanentRedirect || + statusCode == HttpStatus.found || + statusCode == HttpStatus.seeOther || + statusCode == HttpStatus.temporaryRedirect; + } else if (_response.request.method == rhttp.HttpMethod.post) { + return statusCode == HttpStatus.seeOther; + } + return false; + } @override StreamSubscription> listen( @@ -58,7 +71,7 @@ class RhttpIoResponse with Stream> implements HttpClientResponse { bool get persistentConnection => throw UnimplementedError(); @override - String get reasonPhrase => throw UnimplementedError(); + String get reasonPhrase => ""; @override Future redirect( @@ -67,5 +80,6 @@ class RhttpIoResponse with Stream> implements HttpClientResponse { } @override - List get redirects => throw UnimplementedError(); + List get redirects => + []; // leaving this empty since we cant extract the redirect from rust side } diff --git a/rhttp/lib/src/model/settings.dart b/rhttp/lib/src/model/settings.dart index d64e00f..5f47464 100644 --- a/rhttp/lib/src/model/settings.dart +++ b/rhttp/lib/src/model/settings.dart @@ -1,6 +1,7 @@ import 'dart:typed_data'; import 'package:meta/meta.dart'; + import 'package:rhttp/src/model/request.dart'; import 'package:rhttp/src/rust/api/client.dart' as rust_client; import 'package:rhttp/src/rust/api/http.dart' as rust; @@ -192,6 +193,20 @@ class TimeoutSettings { this.keepAliveTimeout, this.keepAlivePing = const Duration(seconds: 30), }); + + TimeoutSettings copyWith({ + Duration? timeout, + Duration? connectTimeout, + Duration? keepAliveTimeout, + Duration? keepAlivePing, + }) { + return TimeoutSettings( + timeout: timeout ?? this.timeout, + connectTimeout: connectTimeout ?? this.connectTimeout, + keepAliveTimeout: keepAliveTimeout ?? this.keepAliveTimeout, + keepAlivePing: keepAlivePing ?? this.keepAlivePing, + ); + } } sealed class DnsSettings {