设置侦听文件套接字的HTTP服务器

时间:2014-02-08 18:53:40

标签: python httpserver

如何使用HTTPServer(或其他类)来设置侦听文件系统套接字而不是实际网络套接字的HTTP服务器? “filesystem socket”是指AF_UNIX类型的套接字。

2 个答案:

答案 0 :(得分:2)

HTTPServer继承自SocketServer.TCPServer,因此我认为可以说它不适用于该用例,即使您尝试解决此问题,也可能遇到问题因为你有点“滥用”它。

然而,话虽如此,本身可能会定义一个HTTPServer的子类,它可以非常简单地创建和绑定Unix套接字:

class UnixHTTPServer(HTTPServer):
    address_family = socket.AF_UNIX

    def server_bind(self):
        SocketServer.TCPServer.server_bind(self)
        self.server_name = "foo"
        self.server_port = 0

然后,只需将server_address参数绑定到的路径传递给构造函数:

server = UnixHTTPServer("/tmp/http.socket", ...)

但是,我不能保证它实际上会运作良好。您可能必须实现自己的HTTP服务器。

答案 1 :(得分:0)

我沿用了Python 3.5中@ Dolda2000的示例,遇到了一个问题,HTTP处理程序因无效的客户端地址而崩溃。您没有使用与TCP相同的方式使用Unix套接字的客户端地址,因此下面的代码会伪造它。

import socketserver

...

class UnixSocketHttpServer(socketserver.UnixStreamServer):
    def get_request(self):
        request, client_address = super(UnixSocketHttpServer, self).get_request()
        return (request, ["local", 0])

...

server = UnixSocketHttpServer((sock_file), YourHttpHandler)
server.serve_forever()

通过这些更改,您可以使用cURL之类的工具针对Unix套接字执行HTTP请求。

curl --unix-socket /run/test.sock http:/test