Можно ли переписать тела запросов SOAP POST с помощью Apache или Nginx? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь переписать запрос SOAP POST тело и заголовок , чтобы 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 как внутри body AND header .

Возможно ли это каким-либо образом?Я использовал 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 Ответ

0 голосов
/ 06 декабря 2018

Хорошо, прошло около двух лет с тех пор, как я написал что-то на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...