mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-13 13:26:43 +02:00
Fix bug from previous commit
This commit is contained in:
@ -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,
|
||||||
|
Reference in New Issue
Block a user