diff options
author | Florian Dold <florian.dold@gmail.com> | 2019-12-15 17:48:22 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2019-12-15 17:48:22 +0100 |
commit | 7cc3b10824683c601a9051ef98e7c1478a801db8 (patch) | |
tree | f40f55160acf64d958aff638c13735487fbd5937 /src/headless/NodeHttpLib.ts | |
parent | 985c90e0adc80301ee842bc290041b6a7d59d51e (diff) | |
download | wallet-core-7cc3b10824683c601a9051ef98e7c1478a801db8.tar.xz |
don't throttle the integration test
Diffstat (limited to 'src/headless/NodeHttpLib.ts')
-rw-r--r-- | src/headless/NodeHttpLib.ts | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/headless/NodeHttpLib.ts b/src/headless/NodeHttpLib.ts new file mode 100644 index 000000000..5cbb40ccf --- /dev/null +++ b/src/headless/NodeHttpLib.ts @@ -0,0 +1,102 @@ +/* + This file is part of GNU Taler + (C) 2019 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + + SPDX-License-Identifier: AGPL3.0-or-later +*/ + +import { Headers, HttpRequestLibrary, HttpRequestOptions, HttpResponse } from "../util/http"; +import { RequestThrottler } from "../util/RequestThrottler"; +import Axios, { AxiosResponse } from "axios"; + +/** + * Implementation of the HTTP request library interface for node. + */ +export class NodeHttpLib implements HttpRequestLibrary { + private throttle = new RequestThrottler(); + private throttlingEnabled = true; + + /** + * Set whether requests should be throttled. + */ + setThrottling(enabled: boolean) { + this.throttlingEnabled = enabled; + } + + private async req( + method: "post" | "get", + url: string, + body: any, + opt?: HttpRequestOptions, + ): Promise<HttpResponse> { + if (this.throttlingEnabled && this.throttle.applyThrottle(url)) { + throw Error("request throttled"); + } + let resp: AxiosResponse; + try { + resp = await Axios({ + method, + url: url, + responseType: "text", + headers: opt?.headers, + validateStatus: () => true, + transformResponse: (x) => x, + data: body, + }); + } catch (e) { + throw e; + } + const respText = resp.data; + if (typeof respText !== "string") { + throw Error("unexpected response type"); + } + const makeJson = async () => { + let responseJson; + try { + responseJson = JSON.parse(respText); + } catch (e) { + throw Error("Invalid JSON from HTTP response"); + } + if (responseJson === null || typeof responseJson !== "object") { + throw Error("Invalid JSON from HTTP response"); + } + return responseJson; + }; + const headers = new Headers(); + for (const hn of Object.keys(resp.headers)) { + headers.set(hn, resp.headers[hn]); + } + return { + headers, + status: resp.status, + text: async () => resp.data, + json: makeJson, + }; + } + + async get( + url: string, + opt?: HttpRequestOptions, + ): Promise<HttpResponse> { + return this.req("get", url, undefined, opt); + } + + async postJson( + url: string, + body: any, + opt?: HttpRequestOptions, + ): Promise<HttpResponse> { + return this.req("post", url, body, opt); + } +}
\ No newline at end of file |