Я создаю некоторый прокси.
Когда я называю некоторый URL в приложении стойки, я передаю тот запрос к другому URL.
Запросом, который я передаю, является POST с файлом и некоторыми параметрами.
Я хочу добавить больше параметров.
Но файл может быть довольно большим. Таким образом, я отправляю его с Net::HTTP#body_stream
вместо Net::HTTP#body
.
Я получаю свой запрос как a Rack::Request
возразите и я создаю свою Сеть:: объект HTTP с этим.
req = Net::HTTP::Post.new(request.path_info)
req.body_stream = request.body
req.content_type = request.content_type
req.content_length = request.content_length
http = Net::HTTP.new(@host, @port)
res = http.request(req)
Я попробовал несколько способов добавить параметры прокси. Но это ничем не кажется в Сети:: HTTP позволяет добавлять параметры к запросу body_stream, только к телу один.
Существует ли более простой способ проксировать запрос стойки как этот? Или очевидный способ для добавления моих параметров к моему запросу?
Ну ... как мне кажется, это нормальное поведение. Я объясню почему. Если у вас есть доступ только к Rack :: Request, (я предполагаю, что) ваше промежуточное ПО не анализирует ответ (вы не включаете что-то вроде ActionController :: ParamsParser ), поэтому у вас нет доступа в хэш параметров, но в StringIo. Этот StringIO соответствует потоку , например :
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="param1"
value1
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
Что вы пытаетесь сделать с классом Net :: HTTP: (1). разобрать запрос на хэш параметров; (2). объедините хэш параметров с вашими собственными параметрами; (3). воссоздайте запрос. Проблема в том, что библиотека Net :: HTTP не может выполнять (1), поскольку это клиентская библиотека, а не серверная.
Таким образом, вы не можете избежать синтаксического анализа вашего запроса перед добавлением новых параметров.
Возможные решения:
Вставьте ActionController :: ParamsParser перед промежуточным программным обеспечением. После этого вы можете использовать отличную библиотеку rest-client lib, чтобы сделать что-то вроде:
RestClient.post (' http: // your_server ' + request.path_info),: params => params.merge (your_params)
Вы можете попытаться создать оболочку для объекта StringIO и добавить в конце потока свои собственные параметры. Однако это нетривиально и не рекомендуется.