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