hookmock
을 이용한 Hooking 함수 개발¶
hookmock
은 hooking 함수 개발 이전 프로토타이핑을 제공되는 간단한 API 서버이다.
NodeJS 환경을 구성해야 한다.
이후 설명은 hookmock 소스 압축을 해제한 디렉토리 기준으로 설명한다.
hookmock
설정¶
hookmock은 실행파일과 같은 경로의 hookmock.json
을 기반해 로딩된다.
{
"ip": "127.0.0.1",
"port": 8585,
"override": { },
"append": { }
}
ip (기본: 127.0.0.1)
오픈할 IP
port (기본: 8585)
오픈할 Port
override
요청 재정의 내용 중 덮어쓰기 할 내용을 열거한다.
append
요청 재정의 내용 중 추가할 할 내용을 열거한다.
hookmock
의 기본동작은 클라이언트 요청후킹 을 분석하여 요청 재정의 형태로 응답하는 것이다.
이 과정에서 override
, append
설정으로 임의의 값을 넣을 수 있다.
{
"port": 8585,
"override": {
"cacheKey": "/helloworld"
},
"append": {
"originRequest": {
"headers": [
{ "key": "myheader", "value": "myvalue" }
]
}
}
}
예를 들어 위와 같이 설정한다면 요청 재정의 의 cacheKey
와 originRequest.headers
값이 다음과 같이 변경된다.
{
"sessionId": 2,
... (생략) ...
"cacheKey": "/helloworld", # 값이 변경됨
... (생략) ...
"originRequest": {
... (생략) ...
"headers": [
... (생략)...
{ "key": "myheader", "value": "myvalue" } # 값이 추가됨
]
}
}
setting.json
변경¶
블라 블라 여기 setting.json의 hook이 hookmock
을 바라보도록 변경해야 한다.
hookmock
실행/종료¶
실행¶
Note
최초 실행인 경우 의존성 패키지를 설치해야 한다.
$ npm i
npm start
명령어로 실행한다.
$ npm start
Debugger attached.
> hookmock@1.0.0 start
> node index.js
Debugger attached.
Hookmock started.
테스트¶
포스트맨을 이용해 POST
메소드의 raw
타입으로 아래와 같이 요청한다.
{
"host": "foo.com",
"clientIp": "1.1.1.1",
"sessionId": 2,
"protocol": "http",
"message": "POST /itemimage/LO/12/37/50/02/80/vdo/LO1237500280_1.mpx3123 HTTP/1.1\r\nHost: foo.com\r\nContent-Type: text/plain\r\nUser-Agent: PostmanRuntime/7.26.8\r\nAccept: */*\r\nPostman-Token: 0bce4527-7d8b-4974-9c2c-742efb8a549c\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nContent-Length: 519\r\nX-Forwarded-For: 181.43.1.33\r\n\r\n",
"body": "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n <s:Body>\r\n <serviceCall xmlns=\"http://webservice.B2BOnline.com\">\r\n <AvailRQ>\r\n <AgencyId>JJSEL13157</AgencyId>\r\n <CarrierCode>7C</CarrierCode>\r\n <DepApoCode>CJU</DepApoCode>\r\n <DepApoName></DepApoName>\r\n <ArrApoCode>PUS</ArrApoCode>\r\n <ArrApoName></ArrApoName>\r\n <FlightDate>20171228</FlightDate>\r\n <PaxCount>1</PaxCount>\r\n </AvailRQ>\r\n </serviceCall>\r\n </s:Body>\r\n</s:Envelope>"
}
다음과 같이 정상적으로 응답한다면 성공이다.
{
"sessionId": 2,
"response": {
"code": 100,
"body": "blah blah",
"headers": [
{ "key": "my-powered-by", "value": "winesoft" },
{ "key": "cookie", "value": "NNB=LS3KUV63E5RV6; NRTK=ag#all_gr#1_ma#-2_si#0_en#0_sp#0;" }
]
},
"cacheKey": "/availity?key={a,b,1}",
"vhost": "bar.com",
"originRequest": {
"method": "POST",
"url": "/itemimage/LO/12/37/50/02/80/vdo/LO1237500280_1.mpx3123",
"body": "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n <s:Body>\r\n <serviceCall xmlns=\"http://webservice.B2BOnline.com\">\r\n <AvailRQ>\r\n <AgencyId>JJSEL13157</AgencyId>\r\n <CarrierCode>7C</CarrierCode>\r\n <DepApoCode>CJU</DepApoCode>\r\n <DepApoName></DepApoName>\r\n <ArrApoCode>PUS</ArrApoCode>\r\n <ArrApoName></ArrApoName>\r\n <FlightDate>20171228</FlightDate>\r\n <PaxCount>1</PaxCount>\r\n </AvailRQ>\r\n </serviceCall>\r\n </s:Body>\r\n</s:Envelope>",
"headers": [
{ "key": "host", "value": "baq.com" },
{ "key": "x-custom-header", "value": "abcdefg" },
{ "key": "x-custom-header2", "value": "baq.com" },
{ "key": "cookie", "value": "NNB=LS3KUV63E5RV6; NRTK=ag#all_gr#1_ma#-2_si#0_en#0_sp#0;" }
]
}
}