Merge pull request #2266 from ImranR98/dev

Bugfix
This commit is contained in:
Imran
2025-04-27 04:57:22 +00:00
committed by GitHub

View File

@ -511,73 +511,70 @@ HttpClient createHttpClient(bool insecure) {
}
Future<MapEntry<HttpClient, HttpClientResponse>> sourceRequestStreamResponse(
String method,
String url,
Map<String, String>? requestHeaders,
Map<String, dynamic> additionalSettings,
{bool followRedirects = true,
Object? postBody}) async {
var currentUrl = Uri.parse(url);
var redirectCount = 0;
const maxRedirects = 10;
List<Cookie> cookies = [];
while (redirectCount < maxRedirects) {
var httpClient =
createHttpClient(additionalSettings['allowInsecure'] == true);
var request = await httpClient.openUrl(method, currentUrl);
if (requestHeaders != null) {
requestHeaders.forEach((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);
String method,
String url,
Map<String, String>? requestHeaders,
Map<String, dynamic> additionalSettings,
{bool followRedirects = true,
Object? postBody}) async {
var currentUrl = Uri.parse(url);
var redirectCount = 0;
const maxRedirects = 10;
List<Cookie> cookies = [];
while (redirectCount < maxRedirects) {
var httpClient =
createHttpClient(additionalSettings['allowInsecure'] == true);
var request = await httpClient.openUrl(method, currentUrl);
if (requestHeaders != null) {
requestHeaders.forEach((key, value) {
request.headers.set(key, value);
});
}
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(
HttpClient httpClient,
String method,
String url,
HttpClientResponse response) async {
final bytes =
(await response.fold<BytesBuilder>(BytesBuilder(), (b, d) => b..add(d)))
.toBytes();
Future<Response> httpClientResponseStreamToFinalResponse(HttpClient httpClient,
String method, String url, HttpClientResponse response) async {
final bytes =
(await response.fold<BytesBuilder>(BytesBuilder(), (b, d) => b..add(d)))
.toBytes();
final headers = <String, String>{};
response.headers.forEach((name, values) {
headers[name] = values.join(', ');
});
final headers = <String, String>{};
response.headers.forEach((name, values) {
headers[name] = values.join(', ');
});
httpClient.close();
httpClient.close();
return http.Response.bytes(
bytes,
response.statusCode,
headers: headers,
request: http.Request(method, Uri.parse(url)),
);
}
return http.Response.bytes(
bytes,
response.statusCode,
headers: headers,
request: http.Request(method, Uri.parse(url)),
);
}
abstract class AppSource {
List<String> hosts = [];
@ -639,7 +636,8 @@ abstract class AppSource {
var method = postBody == null ? 'GET' : 'POST';
var requestHeaders = await getRequestHeaders(additionalSettings);
var streamedResponseAndClient = await sourceRequestStreamResponse(
method, url, requestHeaders, additionalSettings);
method, url, requestHeaders, additionalSettings,
followRedirects: followRedirects, postBody: postBody);
return await httpClientResponseStreamToFinalResponse(
streamedResponseAndClient.key,
method,