Запрос сообщения с body_stream и параметрами

Я создаю некоторый прокси.
Когда я называю некоторый 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, только к телу один.

Существует ли более простой способ проксировать запрос стойки как этот? Или очевидный способ для добавления моих параметров к моему запросу?

5
задан Zombies 14 April 2010 в 20:53
поделиться

1 ответ

Ну ... как мне кажется, это нормальное поведение. Я объясню почему. Если у вас есть доступ только к 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), поскольку это клиентская библиотека, а не серверная.

Таким образом, вы не можете избежать синтаксического анализа вашего запроса перед добавлением новых параметров.

Возможные решения:

  1. Вставьте ActionController :: ParamsParser перед промежуточным программным обеспечением. После этого вы можете использовать отличную библиотеку rest-client lib, чтобы сделать что-то вроде:

    RestClient.post (' http: // your_server ' + request.path_info),: params => params.merge (your_params)

  2. Вы можете попытаться создать оболочку для объекта StringIO и добавить в конце потока свои собственные параметры. Однако это нетривиально и не рекомендуется.

3
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: