Я пытаюсь переписать запрос SOAP POST body и header , чтобы Apache или Nginx могли его проксировать в приложение, которое находится на другом сервере.

Запрос составлен следующим образом, этот, в частности, относится к функции «UploadDocument_v4»:

POST / HTTP/1.1
Accept-Encoding: gzip, deflate
Content-Type: application/soap+xml;charset=UTF-8;action="http://server.workstepController.Process/UploadDocument_v4"
Host: 192.168.1.2
Content-Length: 245508
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: close

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:com="http://server.workstepController.Process/">
   <soap:Header/>
   <soap:Body>
      <com:UploadDocument_v4>
         <!--Optional:-->
         <com:workstepId></com:workstepId>
         <!--Optional:-->
         <com:customizationId></com:customizationId>
         <!--Optional:-->
         <com:document>OMISSIS</com:document>
         <!--Optional:-->
         <com:fileName>contract.pdf</com:fileName>
         <com:timeToLive>100</com:timeToLive>
         <!--Optional:-->
         <com:transactionInformation><![CDATA[
         <!--Further information for this transaction.-->
                              <TransactionInformation>
                                <!--The client id.-->
                                <ClientId>myClientId</ClientId>
                                <!--The transaction id.-->
                                <TransactionId>1234567890</TransactionId>
                                <!--Specifies if the currentWorkstepInformation should be returned by the method.-->
                                <ReturnWorkstepInfo>1</ReturnWorkstepInfo>
                                <!--The product name.-->
                                <ProductName />
                                <!--The product version.-->
                                <ProductVersion />
                                <!--The product release date in format YYYY-MM-DD.-->
                                <ProductReleaseDate />
                                <!--The email of the user.-->
                                <UserId />
                                <!--The ip address of the user.-->
                                <IpAddress />
                              </TransactionInformation>
         ]]></com:transactionInformation>
      </com:UploadDocument_v4>
   </soap:Body>
</soap:Envelope>

Что мне нужно сделать, так это переписать этот запрос так, чтобы он вызывал ту же функцию, но с версией _v2. Таким образом, все ссылки на _v4 должны быть заменены на _v2 как внутри тела И заголовка .

Возможно ли это каким-либо образом? До сих пор я использовал Nginx и Apache, но с соответствующими модулями я еще не смог найти способ сделать это, если это возможно.

Спасибо за любую информацию, которую вы могли бы предоставить.

ОБНОВЛЕНИЕ: Как предложил Иван в комментариях, я попытался установить Openresty и, используя базовую конфигурацию, могу убедиться, что он работает. Однако я не могу понять, как заменить тело и заголовок. Файл nginx.conf находится ниже:

worker_processes 1;
error_log logs/error.log
events{
   worker_connections 1024;
}

http{
     server{
        listen 8080;
        location / {
            --default_type text/html;
                rewrite_by_lua_block{
                --This is not being substituted
                ngx.req.set_header("Content-Type", "[...]/UploadDocument_v2")
                };
            a = ngx.req.read_body();
            a = string.gsub(a,"_v4","_v2");

            return 302 http://192.168.1.3:1234;
         }
    }
}
1
Alessandro 4 Дек 2018 в 11:36

1 ответ

Лучший ответ

Хорошо, прошло около двух лет с тех пор, как я что-то написал на Lua, но я попробую :)

    location / {
        access_by_lua '
            ngx.req.read_body()
            local body = ngx.req.get_body_data()
            body = string.gsub(body, "_v4", "_v2")
            ngx.req.set_body_data(body)
            local header = ngx.req.get_headers()["Content-Type"]
            header = string.gsub(header, "_v4", "_v2")
            ngx.req.set_header("Content-Type", header)
        ';
        proxy_pass http://192.168.1.3:1234;
    }

Я тестировал эту конфигурацию с помощью curl и сценария PHP, который печатает заголовки HTTP и тело запроса POST, и он работает. Вы не можете использовать return 302 ..., потому что ваши HTTP-заголовки будут повторно созданы для нового запроса, вместо этого вы должны использовать директиву proxy_pass. Обратите внимание: если вы укажете свой прокси-сервер по домену, а не по IP-адресу, вам придется использовать директиву proxy_set_header Host proxy-domain.com и, возможно, resolver директива.

0
Ivan Shatsky 6 Дек 2018 в 03:41