Skip to content

Commit

Permalink
fixing io client (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
abdelaziz-mahdy authored Sep 28, 2024
1 parent 79e9145 commit cec27fa
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 17 deletions.
20 changes: 11 additions & 9 deletions rhttp/lib/src/client/io/io_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<bool> Function(Uri url, String scheme, String? realm)? f) =>
throw UnimplementedError();
throw UnimplementedError("authenticate is not supported");

@override
set authenticateProxy(
Future<bool> 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}) {
Expand All @@ -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");
}
3 changes: 2 additions & 1 deletion rhttp/lib/src/client/io/io_headers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion rhttp/lib/src/client/io/io_request.dart
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ class RhttpIoRequest implements HttpClientRequest {
_controller.close();
startRequest();
final response = await _responseCompleter.future;
return RhttpIoResponse(response);
return RhttpIoResponse(response, headers);
}

@override
Expand Down
26 changes: 20 additions & 6 deletions rhttp/lib/src/client/io/io_response.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<List<int>> implements HttpClientResponse {
final HttpStreamResponse _response;

RhttpIoResponse(this._response);
final HttpHeaders _headers;
RhttpIoResponse(this._response, this._headers);

@override
int get statusCode => _response.statusCode;
Expand All @@ -18,7 +19,7 @@ class RhttpIoResponse with Stream<List<int>> 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();
Expand All @@ -37,7 +38,19 @@ class RhttpIoResponse with Stream<List<int>> implements HttpClientResponse {
Future<Socket> 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<List<int>> listen(
Expand All @@ -58,7 +71,7 @@ class RhttpIoResponse with Stream<List<int>> implements HttpClientResponse {
bool get persistentConnection => throw UnimplementedError();

@override
String get reasonPhrase => throw UnimplementedError();
String get reasonPhrase => "";

@override
Future<HttpClientResponse> redirect(
Expand All @@ -67,5 +80,6 @@ class RhttpIoResponse with Stream<List<int>> implements HttpClientResponse {
}

@override
List<RedirectInfo> get redirects => throw UnimplementedError();
List<RedirectInfo> get redirects =>
[]; // leaving this empty since we cant extract the redirect from rust side
}
15 changes: 15 additions & 0 deletions rhttp/lib/src/model/settings.dart
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit cec27fa

Please sign in to comment.