如何放弃龙卷风的请求?

时间:2017-07-24 13:30:07

标签: python tornado

为了测试我的客户端,我想让我的客户发送的一些HTTP请求没有得到任何响应。

例如,我希望每个请求都应该有cookie topsession,如果没有,则没有响应。

class EchoHandler(tornado.web.RequestHandler):
    def get(self):
        if not self.get_cookie("topsession"):
            ###TODO
        else:
            self.write("0")

2 个答案:

答案 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")

作为docs for asynchronous say

  

如果给出了这个装饰器,则方法返回时响应未完成。由请求处理程序调用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()