Skip to content

Commit

Permalink
create test only utility class and implement redirect reception callback
Browse files Browse the repository at this point in the history
  • Loading branch information
Anikate-De committed Jun 24, 2024
1 parent c95c2ca commit 5ce8d60
Showing 1 changed file with 45 additions and 16 deletions.
61 changes: 45 additions & 16 deletions pkgs/ok_http/lib/src/ok_http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class OkHttpClient extends BaseClient {
requestMethod: request.method,
requestUri: request.url.toString());

void addProfileError(HttpClientRequestProfile? profile, String error) {
void addProfileError(HttpClientRequestProfile? profile, Exception error) {
if (profile != null) {
if (profile.requestData.endTime == null) {
profile.requestData.closeWithError(error.toString());
Expand Down Expand Up @@ -129,6 +129,7 @@ class OkHttpClient extends BaseClient {
var followRedirects = request.followRedirects;

profile?.requestData.bodySink.add(requestBody);
var profileRespClosed = false;

final responseCompleter = Completer<StreamedResponse>();

Expand Down Expand Up @@ -161,9 +162,20 @@ class OkHttpClient extends BaseClient {
// (Since OkHttp sets a hard limit of 20 redirects.)
// https://github.com/square/okhttp/blob/54238b4c713080c3fd32fb1a070fb5d6814c9a09/okhttp/src/main/kotlin/okhttp3/internal/http/RetryAndFollowUpInterceptor.kt#L350
final reqConfiguredClient = bindings.RedirectInterceptor.Companion
.addRedirectInterceptor(_client.newBuilder().followRedirects(false),
maxRedirects, followRedirects)
.build();
.addRedirectInterceptor(
_client.newBuilder().followRedirects(false),
maxRedirects,
followRedirects, bindings.RedirectReceivedCallback.implement(
bindings.$RedirectReceivedCallbackImpl(
onRedirectReceived: (response, newLocation) {
profile?.responseData.addRedirect(HttpProfileRedirectData(
statusCode: response.code(),
method:
response.request().method().toDartString(releaseOriginal: true),
location: newLocation.toDartString(releaseOriginal: true),
));
},
))).build();

// `enqueue()` schedules the request to be executed in the future.
// https://square.github.io/okhttp/5.x/okhttp/okhttp3/-call/enqueue.html
Expand Down Expand Up @@ -205,19 +217,24 @@ class OkHttpClient extends BaseClient {
respBodyStreamController.sink.add(data);
profile?.responseData.bodySink.add(data);
},
onFinished: () async {
onFinished: () {
reader.shutdown();
await respBodyStreamController.sink.close();
await profile?.responseData.close();
respBodyStreamController.sink.close();
if (!profileRespClosed) {
profile?.responseData.close();
profileRespClosed = true;
}
},
onError: (iOException) async {
respBodyStreamController.sink.addError(
ClientException(iOException.toString(), request.url));
onError: (iOException) {
var exception =
ClientException(iOException.toString(), request.url);

addProfileError(profile, iOException.toString());
respBodyStreamController.sink.addError(exception);
addProfileError(profile, exception);
profileRespClosed = true;

reader.shutdown();
await respBodyStreamController.sink.close();
respBodyStreamController.sink.close();
},
),
));
Expand All @@ -237,7 +254,7 @@ class OkHttpClient extends BaseClient {
profile?.responseData
?..contentLength = contentLength
..headersCommaValues = responseHeaders
..isRedirect = false
..isRedirect = response.isRedirect()
..reasonPhrase =
response.message().toDartString(releaseOriginal: true)
..startTime = DateTime.now()
Expand All @@ -248,16 +265,28 @@ class OkHttpClient extends BaseClient {
if (msg.contains('Redirect limit exceeded')) {
msg = 'Redirect limit exceeded';
}

responseCompleter.completeError(ClientException(msg, request.url));
addProfileError(profile, msg);
var exception = ClientException(msg, request.url);
responseCompleter.completeError(exception);
addProfileError(profile, exception);
profileRespClosed = true;
},
)));

return responseCompleter.future;
}
}

/// A test-only class that makes the [HttpClientRequestProfile] data available.
class OkHttpClientWithProfile extends OkHttpClient {
HttpClientRequestProfile? profile;

@override
HttpClientRequestProfile? _createProfile(BaseRequest request) =>
profile = super._createProfile(request);

OkHttpClientWithProfile() : super();
}

extension on Uint8List {
JArray<jbyte> toJArray() =>
JArray(jbyte.type, length)..setRange(0, length, this);
Expand Down

0 comments on commit 5ce8d60

Please sign in to comment.