commit 1516e6ea13de77263243e21c65a0c92b9211708e
parent a109981752e5fe9e9862cf3d21169c350e264a78
Author: Florian Dold <florian@dold.me>
Date: Tue, 25 Feb 2025 13:17:26 +0100
factor out Headers into interface to avoid class import issues
Diffstat:
6 files changed, 35 insertions(+), 28 deletions(-)
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx
@@ -42,6 +42,7 @@ import { useSessionContext } from "../../../../context/session.js";
import { Notification } from "../../../../utils/types.js";
import { CreatePage } from "./CreatePage.js";
import { BasicOrTokenAuth } from "@gnu-taler/taler-util";
+import type { HttpRequestLibrary, HeadersImpl } from "@gnu-taler/taler-util/http";
export type Entity = TalerMerchantApi.AccountAddDetails;
interface Props {
@@ -104,9 +105,10 @@ export async function testRevenueAPI(
| OperationFail<HttpStatusCode.BadRequest>
| TalerError
> {
+ const httpLib: HttpRequestLibrary = new BrowserFetchHttpLib();
const api = new TalerRevenueHttpClient(
revenueAPI.href,
- new BrowserFetchHttpLib(),
+ httpLib,
);
const auth: BasicOrTokenAuth | undefined =
creds === undefined
diff --git a/packages/taler-util/src/http-common.ts b/packages/taler-util/src/http-common.ts
@@ -16,7 +16,7 @@
SPDX-License-Identifier: AGPL3.0-or-later
*/
-import type { CancellationToken } from "./CancellationToken.js";
+import { CancellationToken } from "@gnu-taler/taler-util";
import { Codec } from "./codec.js";
import { j2s } from "./helpers.js";
import {
@@ -76,7 +76,13 @@ export interface HttpRequestOptions {
/**
* Headers, roughly modeled after the fetch API's headers object.
*/
-export class Headers {
+export interface Headers {
+ get(name: string): string | null;
+ set(name: string, value: string): void;
+ toJSON(): any;
+}
+
+export class HeadersImpl {
private headerMap = new Map<string, string>();
get(name: string): string | null {
diff --git a/packages/taler-util/src/http-impl.node.ts b/packages/taler-util/src/http-impl.node.ts
@@ -28,7 +28,7 @@ import { TalerError } from "./errors.js";
import { HttpLibArgs, encodeBody, getDefaultHeaders } from "./http-common.js";
import {
DEFAULT_REQUEST_TIMEOUT_MS,
- Headers,
+ HeadersImpl,
HttpRequestLibrary,
HttpRequestOptions,
HttpResponse,
@@ -210,7 +210,7 @@ export class HttpLibImpl implements HttpRequestLibrary {
chunks.push(d);
});
res.on("end", () => {
- const headers: Headers = new Headers();
+ const headers: HeadersImpl = new HeadersImpl();
for (const [k, v] of Object.entries(res.headers)) {
if (!v) {
continue;
diff --git a/packages/taler-util/src/http-impl.qtart.ts b/packages/taler-util/src/http-impl.qtart.ts
@@ -23,7 +23,7 @@ import { j2s, Logger, openPromise } from "@gnu-taler/taler-util";
import { TalerError } from "./errors.js";
import { encodeBody, getDefaultHeaders, HttpLibArgs } from "./http-common.js";
import {
- Headers,
+ HeadersImpl,
HttpRequestLibrary,
HttpRequestOptions,
HttpResponse,
@@ -186,7 +186,7 @@ export class HttpLibImpl implements HttpRequestLibrary {
cancelCancelledHandler();
}
- const headers: Headers = new Headers();
+ const headers: HeadersImpl = new HeadersImpl();
if (res.headers) {
for (const headerStr of res.headers) {
diff --git a/packages/web-util/src/utils/http-impl.browser.ts b/packages/web-util/src/utils/http-impl.browser.ts
@@ -18,22 +18,22 @@
* Imports.
*/
import {
+ Duration,
Logger,
RequestThrottler,
- TalerErrorCode,
TalerError,
- Duration,
+ TalerErrorCode,
} from "@gnu-taler/taler-util";
import {
+ DEFAULT_REQUEST_TIMEOUT_MS,
+ HeadersImpl,
+ HttpLibArgs,
HttpRequestLibrary,
HttpRequestOptions,
HttpResponse,
- Headers,
- getDefaultHeaders,
encodeBody,
- DEFAULT_REQUEST_TIMEOUT_MS,
- HttpLibArgs,
+ getDefaultHeaders,
} from "@gnu-taler/taler-util/http";
const logger = new Logger("browserHttpLib");
@@ -41,7 +41,7 @@ const logger = new Logger("browserHttpLib");
/**
* An implementation of the [[HttpRequestLibrary]] using the
* browser's XMLHttpRequest.
- *
+ *
* @deprecated use BrowserFetchHttpLib
*/
export class BrowserHttpLibDepreacted implements HttpRequestLibrary {
@@ -88,7 +88,9 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary {
}
let myBody: ArrayBuffer | undefined =
- requestMethod === "POST" || requestMethod === "PUT" || requestMethod === "PATCH"
+ requestMethod === "POST" ||
+ requestMethod === "PUT" ||
+ requestMethod === "PATCH"
? encodeBody(requestBody)
: undefined;
@@ -96,8 +98,8 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary {
if (requestHeader) {
Object.entries(requestHeader).forEach(([key, value]) => {
if (value === undefined) return;
- requestHeadersMap[key] = value
- })
+ requestHeadersMap[key] = value;
+ });
}
return new Promise<HttpResponse>((resolve, reject) => {
@@ -129,7 +131,8 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary {
{
requestUrl,
requestMethod,
- timeoutMs: requestTimeout.d_ms === "forever" ? 0 : requestTimeout.d_ms
+ timeoutMs:
+ requestTimeout.d_ms === "forever" ? 0 : requestTimeout.d_ms,
},
`request to ${requestUrl} timed out`,
),
@@ -199,7 +202,7 @@ export class BrowserHttpLibDepreacted implements HttpRequestLibrary {
const arr = headers.trim().split(/[\r\n]+/);
// Create a map of header names to values
- const headerMap: Headers = new Headers();
+ const headerMap: HeadersImpl = new HeadersImpl();
arr.forEach(function (line) {
const parts = line.split(": ");
const headerName = parts.shift();
diff --git a/packages/web-util/src/utils/http-impl.sw.ts b/packages/web-util/src/utils/http-impl.sw.ts
@@ -26,11 +26,10 @@ import {
import {
DEFAULT_REQUEST_TIMEOUT_MS,
- Headers,
+ HeadersImpl,
HttpLibArgs,
HttpRequestLibrary,
HttpRequestOptions,
- HttpResponse,
encodeBody,
getDefaultHeaders,
} from "@gnu-taler/taler-util/http";
@@ -49,10 +48,7 @@ export class BrowserFetchHttpLib implements HttpRequestLibrary {
this.requireTls = args?.requireTls ?? false;
}
- async fetch(
- requestUrl: string,
- options?: HttpRequestOptions,
- ): Promise<HttpResponse> {
+ async fetch(requestUrl: string, options?: HttpRequestOptions) {
const requestMethod = options?.method ?? "GET";
const requestBody = options?.body;
const requestHeader = options?.headers;
@@ -105,9 +101,9 @@ export class BrowserFetchHttpLib implements HttpRequestLibrary {
* auto generated
*/
if (requestBody instanceof FormData) {
- delete requestHeadersMap["Content-Type"]
+ delete requestHeadersMap["Content-Type"];
} else if (requestBody instanceof URLSearchParams) {
- requestHeadersMap["Content-Type"] = "application/x-www-form-urlencoded"
+ requestHeadersMap["Content-Type"] = "application/x-www-form-urlencoded";
}
const controller = new AbortController();
@@ -136,7 +132,7 @@ export class BrowserFetchHttpLib implements HttpRequestLibrary {
clearTimeout(timeoutId);
}
- const headerMap = new Headers();
+ const headerMap = new HeadersImpl();
response.headers.forEach((value, key) => {
headerMap.set(key, value);
});