2016-08-02 30 views
0

Ich habe einen Tornado-Server, der sowohl auf eine Adresse/einen Port als auch auf einen Socket hört. Ich schaffe den Server grob wie so (abgespeckte stark):Ermitteln, ob eine Anfrage über Socket oder URL mit Tornado kam

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) 

Ich mag würde der Lage sein, zu unterscheiden, wenn eine Anfrage über die Buchse empfangen wird, also so etwas wie:

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

Wie im Gegensatz zu:

curl http://some_address:1234/ping 

ich am HTTPServerRequest sah, dass Tornado verwendet, wenn eine Anfrage empfangen wird, aber ich bin mir nicht sicher, was der beste Weg, um den Unterschied zwischen den beiden zu sagen ist. Ich kann remote_ip betrachten, um zu sehen, ob es von localhost kommt, aber ich denke nicht, dass das ideal ist.

Antwort

1

localhost ist eine Internet-Domain-Schnittstelle mit einer bekannten IP-Adresse. Es ist nicht dasselbe wie ein Unix-Domain-Socket, der keine IP-Adresse hat.

Ein kurzer Blick auf die Quelle schlägt vor, dass das remote_ip Attribut '0.0.0.0' für eine Verbindung enthält, die auf dem Unix-Socket empfangen wird.

(Die remote_ip wäre vermutlich '127.0.0.1' für eine Verbindung über eine lokale Host-Verbindung empfangen.)

+0

Sieht aus wie 'remote_ip' wird' 0.0.0.0' für einen Unix-Socket als pro 'tornado.httpserver.py' in die Quelle (https://github.com/tornadoweb/tornado/blob/81ee310adcd905fbdf7c98d9fb6ef0c5a46026c2/tornado/httpserver.py#L203). Außerdem glaube ich, dass die 'address_family' im' request.context' 'AF_UNIX' ist. – thomascirca