From 1e7baff6bd9726c0cf323581a204eaeeb54e40a9 Mon Sep 17 00:00:00 2001 From: Alexandr Stelnykovych Date: Thu, 17 Apr 2025 16:58:44 +0300 Subject: [PATCH] [desktop] Tauri HTTP interceptor: content-type support --- .../safing/portmaster-api/src/lib/module.ts | 8 ++----- .../tauri}/tauri-http-interceptor.ts | 23 +++++++++++++++---- .../src/lib/platform-specific/utils.ts | 4 ++++ 3 files changed, 24 insertions(+), 11 deletions(-) rename desktop/angular/projects/safing/portmaster-api/src/lib/{ => platform-specific/tauri}/tauri-http-interceptor.ts (85%) create mode 100644 desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/utils.ts diff --git a/desktop/angular/projects/safing/portmaster-api/src/lib/module.ts b/desktop/angular/projects/safing/portmaster-api/src/lib/module.ts index 895f76da..467117ec 100644 --- a/desktop/angular/projects/safing/portmaster-api/src/lib/module.ts +++ b/desktop/angular/projects/safing/portmaster-api/src/lib/module.ts @@ -8,18 +8,14 @@ import { PortapiService, PORTMASTER_HTTP_API_ENDPOINT, PORTMASTER_WS_API_ENDPOIN import { SPNService } from "./spn.service"; import { WebsocketService } from "./websocket.service"; import { provideHttpClient, withInterceptors } from '@angular/common/http'; -import { TauriHttpInterceptor } from "./tauri-http-interceptor"; +import { TauriHttpInterceptor } from "./platform-specific/tauri/tauri-http-interceptor"; +import { IsTauriEnvironment } from "./platform-specific/utils"; export interface ModuleConfig { httpAPI?: string; websocketAPI?: string; } -// Simple function to detect if the app is running in a Tauri environment -export function IsTauriEnvironment(): boolean { - return '__TAURI__' in window; -} - // Factory function to provide the appropriate HTTP client configuration // // This function determines the appropriate HTTP client configuration based on the runtime environment. diff --git a/desktop/angular/projects/safing/portmaster-api/src/lib/tauri-http-interceptor.ts b/desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/tauri/tauri-http-interceptor.ts similarity index 85% rename from desktop/angular/projects/safing/portmaster-api/src/lib/tauri-http-interceptor.ts rename to desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/tauri/tauri-http-interceptor.ts index 81d8a18e..52b60381 100644 --- a/desktop/angular/projects/safing/portmaster-api/src/lib/tauri-http-interceptor.ts +++ b/desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/tauri/tauri-http-interceptor.ts @@ -64,12 +64,25 @@ export function TauriHttpInterceptor(req: HttpRequest, next: HttpHandle }; switch (responseType) { - case 'arraybuffer': - return from(response.arrayBuffer()).pipe(map(createResponse)); - case 'blob': - return from(response.blob()).pipe(map(createResponse)); case 'text': - return from(response.text()).pipe(map(createResponse)); + return from(response.text()).pipe(map(createResponse)); + case 'arraybuffer': + return from(response.arrayBuffer()).pipe(map(createResponse)); + case 'blob': + return from(response.blob()).pipe( + map(blob => { + // Get content-type from response headers + const contentType = response.headers.get('content-type') || ''; + // Create a new blob with the proper MIME type + if (contentType && (!blob.type || blob.type === 'application/octet-stream')) { + // Create new blob with the correct MIME type + const typedBlob = new Blob([blob], { type: contentType }); + return createResponse(typedBlob); + } + + return createResponse(blob); + }) + ); case 'json': default: return from(response.text()).pipe( diff --git a/desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/utils.ts b/desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/utils.ts new file mode 100644 index 00000000..e5eeb88c --- /dev/null +++ b/desktop/angular/projects/safing/portmaster-api/src/lib/platform-specific/utils.ts @@ -0,0 +1,4 @@ +// Simple function to detect if the app is running in a Tauri environment +export function IsTauriEnvironment(): boolean { + return '__TAURI__' in window; +}