Ruby Sinatra有多部分邮寄请求

时间:2014-03-30 22:34:31

标签: ruby node.js http sinatra

不确定这是否是由多部件发布请求引起的问题。 从客户端,我使用node.js发送了一个发布请求。帖子正文是一个JSON数组

var post_req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('Response: ' + chunk);
    });
  }).on('error',function(){});
post_req.write(data.toString().split("\0").join(""));
post_req.end();

在服务器端(ruby sinatra),我有一个post处理程序,它只打印出JSON数组

post '/prediction'  do
puts request.body.read
end

它打印出一个奇怪的不完整的json数组,在数组之前有一个奇怪的字符串“13b2b”。 收到的数据可在此处找到:https://gist.github.com/wenchaojiang/9880181

我确信我发送的数据是一个有效的JSON数组,为什么sinatra无法完全接收它,奇怪的“13b2b”来自哪里?任何想法?

-----------编辑-------------

样本数据巨大。在这里能找到它: https://gist.github.com/wenchaojiang/9881235

另一个奇怪的事情是,当我使用下面的node.js服务器时,可以正确接收json

http.createServer(function (req, res) {
if (req.method == "POST") {
    var queryData = "";
    req.on('data', function(data) {
        queryData += data;
    });

    req.on('end', function() {
       var obj = JSON.parse(queryData);

       console.log(JSON.parse(queryData).payload);

       res.writeHead(200, "OK", {'Content-Type': 'text/plain'});
       res.end();
    });
}   
}).listen(3001, '0.0.0.0');

-----------------编辑---------------------------- < / p>

即使我只从node.js端发送过一次,Sinatra似乎也会收到2个帖子请求。从第一个请求和第二个发布请求收到的上述不完整json的服务器导致以下错误

!! Invalid request
Invalid HTTP format, parsing fails.
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/request.rb:82:in `execute'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/request.rb:82:in `parse'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/connection.rb:39:in `receive_data'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run_machine'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/eventmachine-1.0.0/lib/eventmachine.rb:187:in `run'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/backends/base.rb:63:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/thin-1.5.0/lib/thin/server.rb:159:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/handler/thin.rb:13:in `run'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/server.rb:265:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/lib/rack/server.rb:137:in `start'
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/rack-1.4.1/bin/rackup:4:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rackup:19:in `load'
/usr/local/rvm/gems/ruby-1.9.3-p194/bin/rackup:19:in `<main>'

1 个答案:

答案 0 :(得分:1)

我认为(虽然我无法准确再现您所看到的内容),这是由于瘦服务器未处理chunked transfer encoded请求。 Node将文件分成几个部分,并尝试分别发送每个块。奇怪的字符串(13b2b)是第一个块的大小的十六进制值(虽然它实际上与Gist中的数据不匹配)并且它被切断,因为客户端期望稍后发送其余的

节点服务器正常工作,因为它正确处理了分块请求,而Sinatra看到的其他(格式错误的)请求是以下块。

您可以尝试在Sinatra应用中使用其他服务器来查看它是否有效。 Webrick似乎没问题:

set :server, 'webrick'