【问题标题】:Determining whether a request came via socket or URL with Tornado使用 Tornado 确定请求是通过套接字还是 URL 来的
【发布时间】:2016-08-02 16:40:28
【问题描述】:

我有一个 Tornado 服务器,它同时监听地址/端口和套接字。我大致这样创建服务器(大量精简):

from tornado import httpserver
from tornado.netutil import bind_unix_socket

server = httpserver.HTTPserver(
    request_callback=some_callback,
    io_loop=some_loop,
)
unix_socket = bind_unix_socket("mysock.sock")
server.add_socket(unix_socket)
server.listen(address="some_host", port=1234)

我希望能够区分何时通过套接字接收到请求,例如:

curl -XGET --unix-socket mysock.sock http:/ping

相对于:

curl http://some_address:1234/ping

我查看了 Tornado 在收到请求时使用的 HTTPServerRequest,但我不确定区分两者的最佳方法是什么。我可以查看remote_ip 看看它是否来自本地主机,但我认为这并不理想。

【问题讨论】:

    标签: python sockets tornado


    【解决方案1】:

    localhost 是一个具有已知 IP 地址的互联网域接口。它与没有 IP 地址的 unix 域套接字不同。

    简要查看源代码表明,remote_ip 属性将包含 '0.0.0.0',用于在 unix 套接字上接收到的连接。

    (对于通过 localhost 连接接收的连接,remote_ip 可能是 '127.0.0.1'。)

    【讨论】:

    • 根据源 (github.com/tornadoweb/tornado/blob/…) 中的 tornado.httpserver.py,对于 unix 套接字,remote_ip 看起来将是 0.0.0.0。此外,我相信request.context 中的address_family 将是AF_UNIX
    猜你喜欢
    • 2019-01-20
    • 2017-10-30
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多