对Heroku的POST请求导致Python IncompleteRead错误

时间:2013-06-06 20:47:59

标签: python heroku http-post python-requests

我的Python脚本,包含以下行:

from requests import post

...
while(1):

   result = readSensors().result

   payload["z"] = (result['zforce'])
   payload["x"] = (result['xforce'])
   payload["y"] = (result['yforce'])
   payload["light"] = (result['light'] )
   payload["pitch"] = ( result["pitch"] )
   payload["azimuth"] = ( result["azimuth"] )
   payload["roll"] = ( result["roll"] )

   post(SERVER, data = payload )
   sleep(0.02)

到我的Heroku webapp服务器会导致Python错误httplib.IncompleteRead: IncompleteRead(0 bytes read)错误。


web.js文件如下所示:

var server = http.createServer(function(request, response){     
  if (request.method == 'POST'){
            var body = '';
            request.on('data', function (data) {
                body += data;
            });
            request.on('end', function () {
                //send data to clients.
                io.sockets.emit( 'data', parse(body) );

            });
    response.end()

}
server.listen(process.env.PORT || 5000);


var io = io.listen(server);

io.set('log level', 1);
io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10);  
});

1 个答案:

答案 0 :(得分:1)

这更可能是您的“webapp服务器”而不是客户端代码的问题,因此您必须包含有关服务器的更多信息。

这样做的一个常见原因是,您发回了Transfer-Encoding: chunked的回复,但未正确提供chunk-encoded的回复正文。

例如,以下服务器代码......

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

class MyRequestHander(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_bogus_response()

    def do_POST(self):
        self.send_bogus_response()

    def send_bogus_response(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.send_header('Connection', 'close')
        self.send_header('Transfer-Encoding', 'chunked')
        self.end_headers()

server = HTTPServer(('', 8000), MyRequestHander)
server.serve_forever()

...使用requests库调用时会导致相同的错误...

>>> import requests
>>> requests.post('http://localhost:8000', data={'foo':'bar'})
...
httplib.IncompleteRead: IncompleteRead(0 bytes read)

Apparently,如果服务器没有读取整个请求体,也会发生这个问题,并且可能还有其他一些原因可能会发生这种情况,但我无法确定哪个是很可能在不了解服务器设置的情况下。


<强>更新

web.js代码存在很多问题,但主要问题是您在读取POST数据之前发回了响应。 response.end()需要进入request.on('end', ...)函数,否则您的request.on(...)函数都不会被调用。

以下代码应该消除这个问题...

var server = http.createServer(function(request, response)
{
    if (request.method == 'POST')
    {
        var body = '';

        request.on('data', function(data)
        {
            body += data;
        });

        request.on('end', function()
        {
            //send data to clients.
            io.sockets.emit('data', parse(body));
            response.end();
        });
    }
});

......虽然我不确定parse(...)函数应该是什么。