在请求框架中使用unix域套接字的正确方法是什么?

时间:2014-11-17 02:27:22

标签: python python-requests

通常,使用requests框架进行发布请求是通过以下方式完成的:

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)

但是:如何连接到unix套接字而不是进行TCP连接?

在相关的说明中,如何在URL中编码域路径?

  • libcurl允许应用程序提供自己的套接字以执行请求
  • LDAP发明了自己的方案ldapi,其中套接字名称在主机字段中是%编码的
  • httpie在主机字段
  • 中使用http+unix方案和%-encoded路径

这些是一些示例,但是有RFC还是已建立的最佳实践?

4 个答案:

答案 0 :(得分:17)

没有必要重新发明轮子:

https://github.com/msabramo/requests-unixsocket

URL方案为http+unix,套接字路径按百分比编码到主机字段中:

import requests_unixsocket

session = requests_unixsocket.Session()

# Access /path/to/page from /tmp/profilesvc.sock
r = session.get('http+unix://%2Ftmp%2Fprofilesvc.sock/path/to/page')
assert r.status_code == 200

答案 1 :(得分:3)

您可以使用socat创建TCP到UNIX套接字代理,例如:

socat TCP-LISTEN:80,reuseaddr,fork UNIX-CLIENT:/tmp/foo.sock

然后将您的http请求发送到该代理。侦听UNIX套接字/tmp/foo.sock的服务器仍然必须了解HTTP,因为socat不进行任何消息转换。

答案 2 :(得分:3)

如果您正在Python 3中寻求一种简洁,简洁的方法,这是一个有效的示例,将与Ubuntu在unix域套接字上的对齐方式进行讨论。

import requests
import socket
import pprint

from urllib3.connection import HTTPConnection
from urllib3.connectionpool import HTTPConnectionPool
from requests.adapters import HTTPAdapter


class SnapdConnection(HTTPConnection):
    def __init__(self):
        super().__init__("localhost")

    def connect(self):
        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.sock.connect("/run/snapd.socket")


class SnapdConnectionPool(HTTPConnectionPool):
    def __init__(self):
        super().__init__("localhost")

    def _new_conn(self):
        return SnapdConnection()


class SnapdAdapter(HTTPAdapter):
    def get_connection(self, url, proxies=None):
        return SnapdConnectionPool()


session = requests.Session()
session.mount("http://snapd/", SnapdAdapter())
response = session.get("http://snapd/v2/system-info")
pprint.pprint(response.json())

答案 3 :(得分:2)

requests 没有实现与开箱即用的unix套接字一起使用。

但您可以创建自定义adapter,它将连接到unix套接字,发送请求和读取答案。

您需要实施的所有方法都是.send().close(),这非常简单明了。

在会话对象中注册适配器后,您可以将请求机器与UNIX传输一起使用。