为了测试我的客户端,我想让我的客户发送的一些HTTP请求没有得到任何响应。
例如,我希望每个请求都应该有cookie topsession
,如果没有,则没有响应。
class EchoHandler(tornado.web.RequestHandler):
def get(self):
if not self.get_cookie("topsession"):
###TODO
else:
self.write("0")
答案 0 :(得分:4)
使用asynchronous
装饰您的方法,永远不要致电finish
:
class EchoHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
if not self.get_cookie("topsession"):
pass
else:
self.finish("0")
如果给出了这个装饰器,则方法返回时响应未完成。由请求处理程序调用self.finish()来完成HTTP请求。
因此,如果您只是在不调用finish
的情况下返回,则客户端会在没有收到响应的情况下永远等待响应(或直到其客户端套接字超时)。但是,如果这样做,则必须在if语句的另一个分支中调用finish
。
另一方面,如果没有回复"你的意思是错误,你可以改为:
class EchoHandler(tornado.web.RequestHandler):
def get(self):
if not self.get_cookie("topsession"):
raise tornado.web.HTTPError(401) # Unauthorized.
else:
self.write("0")
答案 1 :(得分:1)
可以明确关闭请求的基础连接
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine
class MainHandler(tornado.web.RequestHandler):
@coroutine
def get(self):
self.request.connection.close()
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
卷曲测试:
curl http://localhost:8888/ -v
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8888 (#0)
> GET / HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.47.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
上面的代码关闭了与FIN
- flow的连接,并将响应留空。如果您需要通过重置 - RST
来断开连接,则可以强制它。只需为连接的套接字设置SO_LINGER
即可。你可以认为api是公开的,因为没有_
,但是......它类似于Tornado的内部内容(依赖于实现)。
import socket
import struct
import tornado.ioloop
import tornado.web
from tornado.gen import coroutine
class MainHandler(tornado.web.RequestHandler):
@coroutine
def get(self):
s = self.request.connection.stream.socket
l_onoff = 1
l_linger = 0
s.setsockopt(
socket.SOL_SOCKET, socket.SO_LINGER,
struct.pack('ii', l_onoff, l_linger)
)
self.request.connection.close()
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
application.listen(8888)
tornado.ioloop.IOLoop.current().start()