Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | 6x 6x 6x 6x 6x 6x 31x 57x 57x 57x 57x 57x 57x 10x 10x 47x 10x 9x 1x 57x 57x 57x 57x 1x 57x | import { OptionsWrapperWithSetter } from "@apis/options-wrapper";
import { collect } from "@shared/collect";
import {
HttpClient,
HttpClientOptions,
HttpError,
HttpRequestOptions,
HttpResponse
} from "@shared/http.types";
import { _ } from "@shared/pass";
import axios, { AxiosResponse, Method } from "axios";
/**
*
*
* @export
* @class AxiosHttpClient
* @extends {OptionsWrapperWithSetter<HttpClientOptions>}
* @implements {HttpClient}
*/
export class AxiosHttpClient
extends OptionsWrapperWithSetter<HttpClientOptions>
implements HttpClient
{
/**
*
*
* @protected
* @memberof AxiosHttpClient
*/
protected readonly _axios = axios.create();
/**
*
*
* @param {HttpRequestOptions} options
* @return {Promise<HttpResponse>}
* @memberof AxiosHttpClient
*/
async request(options: HttpRequestOptions): Promise<HttpResponse> {
const request = {
...this.options,
...options,
headers: { ...this.options.headers, ...options.headers }
};
const okStatusCodes = new Set(
request.okStatusCodes ? collect(request.okStatusCodes) : []
);
const validateStatus = (status: number) =>
okStatusCodes.size === 0 ? true : okStatusCodes.has(status);
try {
const axiosResponse = await this._axios
.request({
httpAgent: request.agent,
httpsAgent: request.agent,
baseURL: request.baseURL,
timeout: request.timeout,
url: request.url,
method: request.method as Method,
headers: { ...request.headers },
responseType: "arraybuffer",
data: request.body
? (request.stringifyBody ?? _)(request.body)
: undefined,
validateStatus
})
.catch((error) => {
if (axios.isAxiosError(error) && error.response) {
throw new HttpError(
error.message,
this._mapResponse(error.response, request)
);
}
// Выбрасывается если есть ошибки сети
/* istanbul ignore next */
throw error;
});
return this._mapResponse(axiosResponse, request);
} catch (error: unknown) {
if (
typeof request.mapHttpErrors === "function" &&
error instanceof HttpError
) {
throw request.mapHttpErrors(error);
}
throw error;
}
}
/**
*
*
* @protected
* @param {AxiosResponse} axiosResponse
* @param {HttpRequestOptions} request
* @return {HttpResponse} {HttpResponse}
* @memberof AxiosHttpClient
*/
protected _mapResponse(
axiosResponse: AxiosResponse,
request: HttpRequestOptions
): HttpResponse {
const { headers, status: statusCode } = axiosResponse;
const data =
/* istanbul ignore next */
axiosResponse.data instanceof ArrayBuffer ||
axiosResponse.data instanceof Uint8Array
? new Uint8Array(axiosResponse.data)
: new Uint8Array();
let body: any;
try {
body = (request.parseResponse ?? _)(data);
} catch {
body = data;
}
return { headers, statusCode, body, request };
}
}
|