Как записать запрос и ответ через прокси в Mountebank?

Я создаю процесс самозванца с помощью Mountebank и хочу записать запрос и ответ. Чтобы создать http-импостер, я использовал следующую команду CURL, как описано в их документации.

curl -i -X POST -H 'Content-Type: application/json' http://127.0.0.1:2525/imposters --data '{
  "port": 6568,
  "protocol": "http",
  "name": "proxyAlways",
  "stubs": [
    {
      "responses": [
        {
          "proxy": {
            "to": "http://localhost:8000",
            "mode": "proxyAlways",
            "predicateGenerators": [
              {
                "matches": {
                  "method": true,
                  "path": true,
                  "query": true
                }
              }
            ]
          }
        }
      ]
    }
  ]
}'
 

У меня есть другой сервер, работающий на http://localhost:8000, который прослушивает все запросы, поступающие на порт 6568.

Вывод моего сервера сейчас:

mb
info: [mb:2525] mountebank v1.6.0-beta.1102 now taking orders - point your browser to http://localhost:2525 for help
info: [mb:2525] POST /imposters
info: [http:6568 proxyAlways] Open for business...
info: [http:6568 proxyAlways] ::ffff:127.0.0.1:55488 => GET /

Я хочу записать все запросы и ответы, которые происходят вокруг, и не могу сделать это прямо сейчас. Когда я ввожу curl -i -X GET -H 'Content-Type: application/json' http://127.0.0.1:6568/, он дает мне ответ, но как мне его сохранить?

Также может кто-нибудь объяснить мне значение

сохраните ответ в новой заглушке перед ответом прокси:

(из этой документации Mountebank)


person python    schedule 18.04.2016    source источник


Ответы (1)


Как сохранить результаты прокси

Короткий ответ: мошенник уже хранит его. Вы можете убедиться в этом, посмотрев на вывод curl http://localhost:2525/imposters/6568. Настоящий вопрос заключается в том, как воспроизвести сохраненный ответ?

Обычный сценарий использования прокси-серверов mountebank заключается в том, что вы записываете ответы прокси-сервера на одном работающем экземпляре mb, сохраняете результаты, а затем запускаете следующий экземпляр mb с этими сохраненными ответами. Способ, которым вы могли бы это сделать, состоит в том, чтобы тестируемая система общалась со службой, которую вы пытаетесь подключить через прокси-сервер mountebank при любых условиях, которые вам нужны, а затем сохраняла ответы (и их предикаты запроса), отправляя HTTP GET или DELETE на http://localhost:2525/imposters/6568?removeProxies=true&replayable=true. Вы передаете тело JSON этого ответа в следующий экземпляр mb либо через REST API, либо сохраняя его на диске и запуская mountebank с помощью команды что-то вроде mb --configfile savedProxyResults.json. В этот момент mountebank предоставляет точно такие же ответы на запросы без подключения к нижестоящей службе.

Прокси создают новые заглушки

Ваш последний вопрос связан с пониманием того, как работает режим proxyAlways. Режим proxyOnce по умолчанию означает, что в первый раз, когда прокси-сервер mountebank видит запрос, который однозначно удовлетворяет предикату, он запрашивает нижестоящую службу и сохраняет ответ. В следующий раз, когда окажется, что запрос удовлетворяет предикатам точно такие же, он избегает нисходящего вызова и просто возвращает сохраненный результат. Он только однажды проксирует вниз по течению для одного и того же запроса. С другой стороны, режим proxyAlways всегда отправляет запросы вниз по течению и сохраняет список ответов для одного и того же запроса.

Чтобы было понятно, в скопированном вами примере нас интересуют поля method, path и query в запросе, поэтому, если мы видим два запроса с точно такой же комбинацией этих трех полей, нам нужно знать, следует ли отправлять сохраненный ответ обратно или продолжить прокси. Представьте, что мы сначала отправили:

GET /test?q=elephants

method — это GET, path — это /test, а query — это q=elephants. Поскольку это первый запрос, мы отправляем его нижестоящему серверу, который возвращает тело:

No results

Это будет верно независимо от того, какой режим прокси вы установили для mountebank, так как он должен запросить вниз по течению хотя бы один раз. Теперь предположим, что пока мы об этом думаем, нижестоящий сервис добавил слона, а затем наша тестируемая система делает тот же вызов:

GET /test?q=elephants

Если мы находимся в режиме proxyOnce, тот факт, что слона добавили в реальный сервис, просто не будет иметь значения, мы продолжим возвращать наш сохраненный ответ:

No results

Вы увидите такое же поведение, если остановите процесс mountebank и перезапустите его, как описано выше. В сохраненном файле конфигурации вы увидите что-то вроде этого (немного упрощая):

"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      }
    ]
  }
]

Там только одна заглушка. Если, с другой стороны, мы используем proxyAlways, то второй вызов GET /test?q=elephants даст нового слона:

1. Jumbo reporting for duty!

Это важно, потому что если мы остановим процесс mountebank и перезапустим его, теперь наши тесты могут полагаться на тот факт, что мы будем циклически проходить через оба ответа:

"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      },
      {
        "is": {
          "body": "1. Jumbo reporting for duty!"
        }
      }
    ]
  }
]
person bbyars    schedule 18.04.2016