Fix bug from previous commit

This commit is contained in:
Imran Remtulla
2025-04-27 00:55:57 -04:00
parent 0b812b508a
commit a282080fea

View File

@ -511,73 +511,70 @@ HttpClient createHttpClient(bool insecure) {
} }
Future<MapEntry<HttpClient, HttpClientResponse>> sourceRequestStreamResponse( Future<MapEntry<HttpClient, HttpClientResponse>> sourceRequestStreamResponse(
String method, String method,
String url, String url,
Map<String, String>? requestHeaders, Map<String, String>? requestHeaders,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
{bool followRedirects = true, {bool followRedirects = true,
Object? postBody}) async { Object? postBody}) async {
var currentUrl = Uri.parse(url); var currentUrl = Uri.parse(url);
var redirectCount = 0; var redirectCount = 0;
const maxRedirects = 10; const maxRedirects = 10;
List<Cookie> cookies = []; List<Cookie> cookies = [];
while (redirectCount < maxRedirects) { while (redirectCount < maxRedirects) {
var httpClient = var httpClient =
createHttpClient(additionalSettings['allowInsecure'] == true); createHttpClient(additionalSettings['allowInsecure'] == true);
var request = await httpClient.openUrl(method, currentUrl); var request = await httpClient.openUrl(method, currentUrl);
if (requestHeaders != null) { if (requestHeaders != null) {
requestHeaders.forEach((key, value) { requestHeaders.forEach((key, value) {
request.headers.set(key, value); request.headers.set(key, value);
}); });
}
request.cookies.addAll(cookies);
request.followRedirects = false;
if (postBody != null) {
request.headers.contentType = ContentType.json;
request.write(jsonEncode(postBody));
}
final response = await request.close();
if (followRedirects &&
(response.statusCode >= 300 && response.statusCode <= 399)) {
final location = response.headers.value(HttpHeaders.locationHeader);
if (location != null) {
currentUrl = Uri.parse(ensureAbsoluteUrl(location, currentUrl));
redirectCount++;
cookies = response.cookies;
httpClient.close();
continue;
}
}
return MapEntry(httpClient, response);
} }
throw ObtainiumError('Too many redirects ($maxRedirects)'); request.cookies.addAll(cookies);
request.followRedirects = false;
if (postBody != null) {
request.headers.contentType = ContentType.json;
request.write(jsonEncode(postBody));
}
final response = await request.close();
if (followRedirects &&
(response.statusCode >= 300 && response.statusCode <= 399)) {
final location = response.headers.value(HttpHeaders.locationHeader);
if (location != null) {
currentUrl = Uri.parse(ensureAbsoluteUrl(location, currentUrl));
redirectCount++;
cookies = response.cookies;
httpClient.close();
continue;
}
}
return MapEntry(httpClient, response);
} }
throw ObtainiumError('Too many redirects ($maxRedirects)');
}
Future<Response> httpClientResponseStreamToFinalResponse( Future<Response> httpClientResponseStreamToFinalResponse(HttpClient httpClient,
HttpClient httpClient, String method, String url, HttpClientResponse response) async {
String method, final bytes =
String url, (await response.fold<BytesBuilder>(BytesBuilder(), (b, d) => b..add(d)))
HttpClientResponse response) async { .toBytes();
final bytes =
(await response.fold<BytesBuilder>(BytesBuilder(), (b, d) => b..add(d)))
.toBytes();
final headers = <String, String>{}; final headers = <String, String>{};
response.headers.forEach((name, values) { response.headers.forEach((name, values) {
headers[name] = values.join(', '); headers[name] = values.join(', ');
}); });
httpClient.close(); httpClient.close();
return http.Response.bytes( return http.Response.bytes(
bytes, bytes,
response.statusCode, response.statusCode,
headers: headers, headers: headers,
request: http.Request(method, Uri.parse(url)), request: http.Request(method, Uri.parse(url)),
); );
} }
abstract class AppSource { abstract class AppSource {
List<String> hosts = []; List<String> hosts = [];
@ -639,7 +636,8 @@ abstract class AppSource {
var method = postBody == null ? 'GET' : 'POST'; var method = postBody == null ? 'GET' : 'POST';
var requestHeaders = await getRequestHeaders(additionalSettings); var requestHeaders = await getRequestHeaders(additionalSettings);
var streamedResponseAndClient = await sourceRequestStreamResponse( var streamedResponseAndClient = await sourceRequestStreamResponse(
method, url, requestHeaders, additionalSettings, followRedirects: followRedirects); method, url, requestHeaders, additionalSettings,
followRedirects: followRedirects, postBody: postBody);
return await httpClientResponseStreamToFinalResponse( return await httpClientResponseStreamToFinalResponse(
streamedResponseAndClient.key, streamedResponseAndClient.key,
method, method,