hookmock 을 이용한 Hooking 함수 개발

hookmockhooking 함수 개발 이전 프로토타이핑을 제공되는 간단한 API 서버이다.

../_images/hm1.png

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" }
      ]
  }
  }
}

예를 들어 위와 같이 설정한다면 요청 재정의cacheKeyoriginRequest.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;" }
      ]
  }
}