Предикатный прокси-сервер mountebank с CORS

Я установил предикат mountebank для проксирования подчиненного сервера. В ответе сервера Access-Control-Allow-Origin не имеет значения *. Я определенно могу записать ответы от нижестоящего сервера, а затем запустить новый экземпляр mountebank с параметром allowCORS, который позволяет моему браузеру использовать этот тестовый дубль без проблем с CORS.

Мне было интересно, можно ли напрямую использовать предикат прокси для изменения заголовков ответов от нижестоящих серверов, чтобы добавить "Access-Control-Allow-Origin": "*",. Таким образом, я могу использовать только один экземпляр mountebank с опцией proxyOnce и разрешить моему браузеру взаимодействовать с этим тестовым двойником. В моем случае это помогает мне перейти от record and replay к простому использованию proxy в нисходящем направлении.

Я также пытался заглушить метод OPTIONS, но он не работает.

curl --location --request POST 'http://localhost:2525/imposters' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{
    "port": 4500,
    "protocol": "http",
    "name": "Proxy Request",  
    "allowCORS": true,
    "stubs": [
        {
            "predicates": [
                {
                    "equals": {
                        "method": "OPTIONS"
                    }
                }
            ],
            "responses": [
                {
                    "is": {
                        "headers": {
                            "Access-Control-Allow-Origin": "*",
                            "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE",
                            "Access-Control-Allow-Headers": "${ALLOW-HEADERS}"
                        }
                    },
                    "_behaviors": {
                        "copy": [
                            {
                                "from": {
                                    "headers": "Access-Control-Request-Headers"
                                },
                                "into": "${ALLOW-HEADERS}",
                                "using": {
                                    "method": "regex",
                                    "selector": ".+"
                                }
                            }
                        ]
                    }
                }
            ]
        },        
        {
            "responses": [
                {
                    "proxy": {
                        "to": "https://downstream.api.com",
                        "mode": "proxyOnce",
                        "predicateGenerators": [
                            {
                                "matches": {
                                    "method": true,
                                    "path": true,
                                    "query": true
                                }
                            }
                        ]
                    }
                }
            ]
        }
    ]
}'

Какие-либо предложения?


person Ali Bhagat    schedule 02.12.2020    source источник
comment
В качестве продолжения я даже добавил это в responses, и это тоже не сработало "addDecorateBehavior": "config => { config.response.headers = {...config.response.headers, 'Access-Control-Allow-Origin': '*'} }",. Не уверен, что я пытаюсь сделать что-то невозможное.   -  person Ali Bhagat    schedule 03.12.2020


Ответы (1)


Для тех, кто изучает это для справки, я смог добиться этого, используя поведение decorate.

Моя заглушка была настроена как:

{
  "responses": [
    {
      "proxy": {
        "to": "https://downstream.api.com",
        "mode": "proxyOnce",
        "predicateGenerators": [
          {
            "matches": {
              "method": true,
              "path": true,
              "query": true
            }
          }
        ]
      },
      "behaviors": [
        {
          "decorate": "<%- stringify('../templates/add_access_control_allow_origin_header.ejs') %>"
        }
      ]
    }
  ]
}

И поведение decorate было таким простым:

config => {
  config.response.headers['Access-Control-Allow-Origin'] = '*';
}
person Ali Bhagat    schedule 30.12.2020