Dam*_*IEU 5 ruby proxy rack http
我正在构建某种代理.
当我在机架应用程序中调用某个URL时,我会将该请求转发给其他URL.
我转发的请求是带有文件和一些参数的POST.
我想添加更多参数.
但文件可能很大.所以我发送它Net::HTTP#body_stream代替Net::HTTP#body.
我得到了我的请求作为Rack::Request对象,我用它创建我的Net :: 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)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种方法来添加代理的参数.但似乎Net :: HTTP中的任何内容都不允许向body_stream请求添加参数,只允许向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--
Run Code Online (Sandbox Code Playgroud)
您尝试对 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 对象上创建包装器,并在流末尾添加您自己的参数。然而,这并非微不足道,也不可取。