mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 05:25:40 +09:00
fix(app): tag only desktop proxy uploads with a local upload id (#3262)
This commit is contained in:
1 parent
2e3e3a1536
commit
8b312c610e
2 files changed
+54
-3
No files matched your search
@@ -8,6 +8,17 @@ import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest';
|
|||||||
|
|
||||||
vi.mock('@lingui/core/macro', () => ({msg: (descriptor: MessageDescriptor) => descriptor}));
|
vi.mock('@lingui/core/macro', () => ({msg: (descriptor: MessageDescriptor) => descriptor}));
|
||||||
|
|
||||||
|
const desktopDocument = vi.hoisted(() => ({active: false}));
|
||||||
|
|
||||||
|
vi.mock('@app/features/platform/DesktopLocalAppRuntime', async (importOriginal) => {
|
||||||
|
const actual = await importOriginal<typeof import('@app/features/platform/DesktopLocalAppRuntime')>();
|
||||||
|
return {...actual, isDesktopLocalAppDocument: () => desktopDocument.active};
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mock('@app/features/ui/utils/NativeUtils', () => ({
|
||||||
|
getElectronAPI: () => (desktopDocument.active ? {localAppUpload: {subscribe: () => () => {}}} : undefined),
|
||||||
|
}));
|
||||||
|
|
||||||
interface SentRequest {
|
interface SentRequest {
|
||||||
method: string;
|
method: string;
|
||||||
url: string;
|
url: string;
|
||||||
@@ -95,6 +106,31 @@ beforeEach(() => {
|
|||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
vi.unstubAllGlobals();
|
vi.unstubAllGlobals();
|
||||||
|
desktopDocument.active = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('RestClient desktop local upload tagging', () => {
|
||||||
|
const uploadIdHeader = 'x-fluxer-local-upload-id';
|
||||||
|
|
||||||
|
test('a remote upload from the desktop app never carries the local upload id', async () => {
|
||||||
|
desktopDocument.active = true;
|
||||||
|
await createClient().put('https://uploads.fluxer.app/v1/relay/abc?t=token', {
|
||||||
|
body: new Blob(['x']),
|
||||||
|
auth: 'none',
|
||||||
|
onProgress: () => {},
|
||||||
|
});
|
||||||
|
expect(sent[0].headers[uploadIdHeader]).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('an upload through the desktop local proxy is tagged for progress', async () => {
|
||||||
|
desktopDocument.active = true;
|
||||||
|
await createClient().put('fluxer-app://app/_remote/key?url=https%3A%2F%2Fuploads.test%2Fv1%2Frelay%2Fabc', {
|
||||||
|
body: new Blob(['x']),
|
||||||
|
auth: 'none',
|
||||||
|
onProgress: () => {},
|
||||||
|
});
|
||||||
|
expect(sent[0].headers[uploadIdHeader]).toMatch(/^[0-9a-f]{32}$/u);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('RestClient interceptor selection', () => {
|
describe('RestClient interceptor selection', () => {
|
||||||
|
|||||||
@@ -715,8 +715,23 @@ function newLocalUploadId(): string {
|
|||||||
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');
|
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
function attachLocalUploadProgress(xhr: XMLHttpRequest, onProgress: (event: ProgressEvent) => void): boolean {
|
function isDesktopLocalAppRequest(url: string): boolean {
|
||||||
if (!isDesktopLocalAppDocument()) {
|
if (!isDesktopLocalAppDocument()) return false;
|
||||||
|
let parsedUrl: URL;
|
||||||
|
try {
|
||||||
|
parsedUrl = resolveDocumentURLFromRoot(url);
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return isDesktopLocalAppOrigin(parsedUrl.protocol, parsedUrl.hostname);
|
||||||
|
}
|
||||||
|
|
||||||
|
function attachLocalUploadProgress(
|
||||||
|
xhr: XMLHttpRequest,
|
||||||
|
url: string,
|
||||||
|
onProgress: (event: ProgressEvent) => void,
|
||||||
|
): boolean {
|
||||||
|
if (!isDesktopLocalAppRequest(url)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const subscribe = getElectronAPI()?.localAppUpload?.subscribe;
|
const subscribe = getElectronAPI()?.localAppUpload?.subscribe;
|
||||||
@@ -768,7 +783,7 @@ function performTransport(plan: Plan, handle: RestRequestHandle): Promise<Transp
|
|||||||
externalSignal.removeEventListener('abort', onExternalAbort);
|
externalSignal.removeEventListener('abort', onExternalAbort);
|
||||||
});
|
});
|
||||||
if (plan.onProgress) {
|
if (plan.onProgress) {
|
||||||
if (!attachLocalUploadProgress(xhr, plan.onProgress)) {
|
if (!attachLocalUploadProgress(xhr, plan.url, plan.onProgress)) {
|
||||||
xhr.upload.addEventListener('progress', plan.onProgress);
|
xhr.upload.addEventListener('progress', plan.onProgress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user