got-send-url
Version:
got-send-url is a GOT based HTTP request library for Node.js
116 lines (104 loc) • 3.21 kB
text/typescript
import got, { Options } from "got";
import { IGotInput } from "./interface/send-url.interface";
import { HttpsProxyAgent } from "https-proxy-agent";
/**
* @alias got 모듈 사용한 통신 함수
* @description https://github.com/sindresorhus/got/blob/HEAD/documentation/7-retry.md#retry
* @returns
*/
const sendURL = async ({
url,
method,
body,
headers,
retryLimit,
retryDelay,
responseType = "json",
useProxyYn = false,
useThrowYn = true,
getAllResponseYn = false,
}: IGotInput): Promise<any> => {
try {
// 프록시 사용이면서 https 인지 확인
const notUseTLS =
url.startsWith("https") && useProxyYn && process.env.NODE_ENV === "dev";
// got 통신 모듈 옵션들
const options: Options = {
responseType,
method,
};
// 재시도 사용 시
if (retryLimit) {
options.retry = {
// 재시도 횟수
limit: retryLimit,
// 재시도 사용 method
methods: ["GET", "POST", "PUT", "HEAD", "DELETE", "OPTIONS", "TRACE"],
};
// 재시도 텀
// 미설정 시 횟수마다 1초 2초 4초 8초 ..... ~ 배로 늘어남
retryDelay
? (options.retry.calculateDelay = ({ attemptCount }) => {
if (attemptCount > retryLimit) {
return 0;
}
return retryDelay;
})
: null;
}
// 헤더 정보
if (headers) {
options.headers = headers;
}
// 프록시 설정 여부 (피들러 캡처 용)
if (useProxyYn) {
options.agent = {
http: new HttpsProxyAgent("http://127.0.0.1:8888"),
https: new HttpsProxyAgent("http://127.0.0.1:8888"),
// http2: new HttpsProxyAgent('http://127.0.0.1:8888'),
};
}
// 피들러 캡처 시 unable to verify the first certificate 에러가 발생하여 tls 인증 미사용
if (notUseTLS) {
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
}
// 반환 객체
let response;
if (headers && headers["Content-Type"]?.includes("urlencoded")) {
options.responseType = "text";
// get 일 경우
if (method === "GET") {
options.searchParams = body;
response = await got(url, options);
} else {
// 이 외 모든 메서드
options.body = body;
response = await got(url, options);
}
} else {
// get 일 경우
if (method === "GET") {
options.searchParams = body;
response = await got(url, options);
} else {
// 이 외 모든 메서드
options.json = body;
response = await got(url, options);
}
}
// tls 인증 여부 되돌리기
if (notUseTLS) {
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "1";
}
return getAllResponseYn ? response : response.body;
// 응답 객체의 body만 반환
} catch (error) {
// throw 여부에 따라 throw 날려줌
if (useThrowYn) {
throw error;
}
// throw 미사용 시 error 객체 그대로 반환
return error;
}
};
export default sendURL;