如何将原始二进制数据传递给rack/test的put()方法?

问题描述 投票:0回答:1

我正在做这个:

require 'rack/test'
data = # some binary data, for example, ZIP archive
put('/foo', data, 'content_type' => 'application/octet-stream')

工作得很好,直到我将

%
符号放入
data
中。在这种情况下,我得到这个:

Invalid query parameters: invalid %-encoding ... (long exception text)

我不想对我的

data
进行Base64编码或CGI编码,因为服务器端代码无需测试就可以正常工作。问题是我使用 Rack 的方式。我必须以某种方式通知它不要触摸我的数据并将其“按原样”发送给 Sinatra。怎么办?

此代码重现了问题(只需按原样运行,您就会看到打印的内容):

require 'sinatra'
require 'minitest/autorun'
require 'rack/test'

put '/foo' do
  'OK'
end

class FooTest < Minitest::Test
  include Rack::Test::Methods

  def app
    Sinatra::Application
  end

  def test_me
    put('/foo', 'hello % world')
    assert_equal(200, last_response.status, last_response.body)
  end
end

我明白了:

  1) Failure:
FooTest#test_me [a.rb:18]:
Invalid query parameters: invalid %-encoding (hello % world).
Expected: 200
  Actual: 400

但是,如果我删除

%
符号,测试就会通过。

ruby sinatra rack
1个回答
0
投票

您可以通过指定 Content-Type 标头来让测试通过:

def test_me
  put('/foo', 'hello % world', 'CONTENT_TYPE' => 'application/octet-stream')
  assert_equal(200, last_response.status, last_response.body)
end

但是,与您的第一个示例不同,该键必须是 大写,如 Rack::Test 示例 中所示。

© www.soinside.com 2019 - 2024. All rights reserved.