Nano Hash - криптовалюты, майнинг, программирование

Поиск/замена NGINX Lua в теле запроса

Из-за некоторого устаревшего программного обеспечения мне нужно изменить тело запроса SOAP. Он использует SOAP-ENV для пространства имен, в то время как он должен стать просто «мылом»:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>

Должно стать:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>

Хотя это не должно иметь значения, для устаревшего программного обеспечения имеет значение. Чтобы хотя бы быстро исправить, я подумал о поиске/замене в теле запроса. Nginx работает как веб-сервер перед системой, поэтому я погуглил и выяснил, что это может быть сделано только с помощью Lua. Я установил nginx-extras и теперь использую следующий скрипт:

        location ~ '\.php$' {
             location ~ ^/webservice/ {
               access_by_lua_block
               {
                   ngx.req.read_body()
                   local body = ngx.req.get_body_data()
                   if body
                      body = string.gsub(body, "SOAP-ENV", "soap")
                   end
                   ngx.req.set_body_data(body)
               }
             }
             fastcgi_split_path_info ^(.+?\.php)(|/.*)$;

             include fastcgi_params;
             fastcgi_param HTTP_PROXY "";
             fastcgi_param SCRIPT_FILENAME 
             $document_root$fastcgi_script_name;
             fastcgi_param PATH_INFO $fastcgi_path_info;
             fastcgi_param QUERY_STRING $query_string;
             fastcgi_intercept_errors on;
             fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        }

Кажется, тело всегда равно нулю. Я использую интерфейс SOAP для размещения запроса SOAP. Что я здесь делаю неправильно?

10.09.2019

  • Почему вы используете access_by_lua? Это для фазы доступа обработки запроса, иначе. он определяет, разрешено ли клиенту делать этот запрос. Вам нужно body_filter_by_lua (см. readme) 10.09.2019
  • На самом деле, не обращайте внимания на последний комментарий; похоже, openresty уже делает тело доступным на этапе доступа. 10.09.2019

Ответы:


1

[примечание для себя: больше не нужно быстро читать во время обеда]

После if body отсутствует then, и вы хотите использовать ngx.re.gsub (я действительно не знаю, почему). После этих двух изменений я заработал в своей лаборатории:

                   ngx.req.read_body()
                   local body = ngx.req.get_body_data()
                   if body then
                      body = ngx.re.gsub(body, "SOAP-ENV", "soap")
                   end
                   ngx.req.set_body_data(body)

10.09.2019
  • Спасибо, но, к сожалению, sub_filter заменяет ответ, в этом случае я хочу заменить тело запроса. 10.09.2019
  • Спасибо, к сожалению, дело было не в этом. Я уже пробовал без оператора if. Насколько я знаю, вызов SOAP - это просто отправка XML с использованием POST в теле запроса, но почему-то он не возвращается при использовании ngx.req.get_body_data(). 11.09.2019
  • Возможно, размер тела запроса превышает объем, который nginx может хранить в памяти (client_body_buffer_size). См. документ ngx.req.get_body_data. Есть также несколько советов, как это обойти... PS: код определенно работает с небольшим телом сообщения... 11.09.2019
  • Я забыл упомянуть об этом в своем вступительном посте, но я уже нашел это и попытался добавить ` client_body_buffer_size 50M;` (что намного больше, чем фактический запрос), так что это тоже не сработало. Теперь мы нашли обходной путь (полностью вне nginx). Так что у нас пока все хорошо. В очередной раз благодарим за помощь! 11.09.2019

  • 2

    lua_need_request_body on; сделал свое дело. См. официальную документацию.

    13.09.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..