Merge pull request #4228 from albertgasset/MOBILE-4024
MOBILE-4024 ws: Follow redirects not handled by Androidmain
commit
9a970da466
|
@ -16,6 +16,7 @@ import { Injectable } from '@angular/core';
|
||||||
import { HttpResponse, HttpParams, HttpErrorResponse } from '@angular/common/http';
|
import { HttpResponse, HttpParams, HttpErrorResponse } from '@angular/common/http';
|
||||||
|
|
||||||
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
|
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
|
||||||
|
import { HTTPResponse as NativeHttpResponse } from '@awesome-cordova-plugins/http';
|
||||||
import { Md5 } from 'ts-md5/dist/md5';
|
import { Md5 } from 'ts-md5/dist/md5';
|
||||||
import { Observable, firstValueFrom } from 'rxjs';
|
import { Observable, firstValueFrom } from 'rxjs';
|
||||||
import { timeout } from 'rxjs/operators';
|
import { timeout } from 'rxjs/operators';
|
||||||
|
@ -255,26 +256,33 @@ export class CoreWSProvider {
|
||||||
// Create the tmp file as an empty file.
|
// Create the tmp file as an empty file.
|
||||||
const fileEntry = await CoreFile.createFile(tmpPath);
|
const fileEntry = await CoreFile.createFile(tmpPath);
|
||||||
|
|
||||||
const transfer = new window.FileTransfer();
|
let fileDownloaded: { entry: globalThis.FileEntry; headers: Record<string, string> | undefined};
|
||||||
|
let redirectUrl: string | undefined;
|
||||||
|
let maxRedirects = 5;
|
||||||
|
do {
|
||||||
|
const transfer = new window.FileTransfer();
|
||||||
|
if (onProgress) {
|
||||||
|
transfer.onprogress = onProgress;
|
||||||
|
}
|
||||||
|
|
||||||
if (onProgress) {
|
// Download the file in the tmp file.
|
||||||
transfer.onprogress = onProgress;
|
fileDownloaded = await new Promise((resolve, reject) => {
|
||||||
}
|
transfer.download(
|
||||||
|
redirectUrl ?? url,
|
||||||
|
CoreFile.getFileEntryURL(fileEntry),
|
||||||
|
(result) => resolve(result),
|
||||||
|
(error: FileTransferError) => reject(error),
|
||||||
|
true,
|
||||||
|
{ headers: { 'User-Agent': navigator.userAgent } },
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// Download the file in the tmp file.
|
// Redirections should have been handled by the platform,
|
||||||
const fileDownloaded = await new Promise<{
|
// but Android does not follow redirections between HTTP and HTTPS.
|
||||||
entry: globalThis.FileEntry;
|
// See: https://developer.android.com/reference/java/net/HttpURLConnection#response-handling
|
||||||
headers: Record<string, string> | undefined;
|
redirectUrl = fileDownloaded.headers?.['location'];
|
||||||
}>((resolve, reject) => {
|
maxRedirects--;
|
||||||
transfer.download(
|
} while (redirectUrl && maxRedirects >= 0);
|
||||||
url,
|
|
||||||
CoreFile.getFileEntryURL(fileEntry),
|
|
||||||
(result) => resolve(result),
|
|
||||||
(error: FileTransferError) => reject(error),
|
|
||||||
true,
|
|
||||||
{ headers: { 'User-Agent': navigator.userAgent } },
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
let extension = '';
|
let extension = '';
|
||||||
|
|
||||||
|
@ -1185,7 +1193,29 @@ export class CoreWSProvider {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return NativeHttp.sendRequest(url, options).then((response) => new CoreNativeToAngularHttpResponse(response));
|
let response: NativeHttpResponse;
|
||||||
|
let redirectUrl: string | undefined;
|
||||||
|
let maxRedirects = 5;
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
response = await NativeHttp.sendRequest(redirectUrl ?? url, options);
|
||||||
|
redirectUrl = undefined;
|
||||||
|
} catch (error) {
|
||||||
|
// Error is a response object.
|
||||||
|
response = error as NativeHttpResponse;
|
||||||
|
|
||||||
|
// Redirections should have been handled by the platform,
|
||||||
|
// but Android does not follow redirections between HTTP and HTTPS.
|
||||||
|
// See: https://developer.android.com/reference/java/net/HttpURLConnection#response-handling
|
||||||
|
redirectUrl = response.headers['location'];
|
||||||
|
maxRedirects--;
|
||||||
|
if (!redirectUrl || maxRedirects < 0) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (redirectUrl);
|
||||||
|
|
||||||
|
return new CoreNativeToAngularHttpResponse(response);
|
||||||
} else {
|
} else {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
let observable: Observable<HttpResponse<any>>;
|
let observable: Observable<HttpResponse<any>>;
|
||||||
|
|
Loading…
Reference in New Issue