在 Tornado 中从服务器向客户端写入 Content-Length header
Writing the Content-Length header to the client from the server in Tornado
我有一个龙卷风服务器,它只打印客户端发送的 headers。
server.py :
import tornado.httpserver
import tornado.ioloop
import tornado.httputil as hutil
def handle_request(request):
message = ""
try :
message = request.headers['Content-Length']
except KeyError :
message = request.headers
request.connection.write_headers(
tornado.httputil.ResponseStartLine('HTTP/1.1', 200, 'OK'),
tornado.httputil.HTTPHeaders
({"Content-Length": str(len(message))}))
request.connection.finish()
print(request.headers)
http_server = tornado.httpserver.HTTPServer(handle_request)
http_server.listen(8888, address='127.0.0.1')
tornado.ioloop.IOLoop.instance().start()
当我使用 curl 向该服务器发送请求时,我得到以下回溯。
ERROR:tornado.application:Uncaught exception
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/http1connection.py", line 234, in _read_message
delegate.finish()
File "/usr/local/lib/python2.7/dist-packages/tornado/httpserver.py", line 280, in finish
self.server.request_callback(self.request)
File "Tests/tornado_server.py", line 17, in handle_request
request.connection.finish()
File "/usr/local/lib/python2.7/dist-packages/tornado/http1connection.py", line 430, in finish
self._expected_content_remaining)
HTTPOutputError: Tried to write 5 bytes less than Content-Length
我从 Curl 发送的 headers :
{'Host': '127.0.0.1:8888', 'Accept': '*/*', 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36'}
是否有必要回写与Content-Length相同数量的数据?如果是这样,为什么以及应该如何做?
提前致谢。
您需要写回与您所说的相同的字节数。您为 响应 返回了 Content-Length
header。这意味着您的响应 body 需要包含那么多字节。
从表面上看,您不会写 任何内容 以求回复 body;如果您声明要发送 len(str(message))
字节,您可能也想发送 str(message)
:
request.connection.write(str(message))
这个是separate和request中的Content-Length
,表示请求多少字节body 包含。
我有一个龙卷风服务器,它只打印客户端发送的 headers。 server.py :
import tornado.httpserver
import tornado.ioloop
import tornado.httputil as hutil
def handle_request(request):
message = ""
try :
message = request.headers['Content-Length']
except KeyError :
message = request.headers
request.connection.write_headers(
tornado.httputil.ResponseStartLine('HTTP/1.1', 200, 'OK'),
tornado.httputil.HTTPHeaders
({"Content-Length": str(len(message))}))
request.connection.finish()
print(request.headers)
http_server = tornado.httpserver.HTTPServer(handle_request)
http_server.listen(8888, address='127.0.0.1')
tornado.ioloop.IOLoop.instance().start()
当我使用 curl 向该服务器发送请求时,我得到以下回溯。
ERROR:tornado.application:Uncaught exception
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tornado/http1connection.py", line 234, in _read_message
delegate.finish()
File "/usr/local/lib/python2.7/dist-packages/tornado/httpserver.py", line 280, in finish
self.server.request_callback(self.request)
File "Tests/tornado_server.py", line 17, in handle_request
request.connection.finish()
File "/usr/local/lib/python2.7/dist-packages/tornado/http1connection.py", line 430, in finish
self._expected_content_remaining)
HTTPOutputError: Tried to write 5 bytes less than Content-Length
我从 Curl 发送的 headers :
{'Host': '127.0.0.1:8888', 'Accept': '*/*', 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36'}
是否有必要回写与Content-Length相同数量的数据?如果是这样,为什么以及应该如何做? 提前致谢。
您需要写回与您所说的相同的字节数。您为 响应 返回了 Content-Length
header。这意味着您的响应 body 需要包含那么多字节。
从表面上看,您不会写 任何内容 以求回复 body;如果您声明要发送 len(str(message))
字节,您可能也想发送 str(message)
:
request.connection.write(str(message))
这个是separate和request中的Content-Length
,表示请求多少字节body 包含。