Каков правильный способ использования сокета домена unix в структуре запросов?
Обычно выполнение почтового запроса с использованием requests основывается на:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
Но: Как подключиться к сокету unix вместо выполнения TCP-соединения?
В соответствующей заметке, как кодировать путь домена в URL?
- libcurl позволяет приложению поставлять собственный сокет для выполнения запроса
- LDAP придумал собственную схему
ldapi
, где имя сокета% -encoded в поле хоста
-
httpie
использует схему http+unix
и% -кодированный путь в поле хоста
Вот некоторые примеры, но есть ли RFC или установленная передовая практика?
Ответы
Ответ 1
Нет необходимости изобретать велосипед:
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
Ответ 2
Вы можете использовать socat
для создания прокси-сервера сокета TCP в UNIX, например:
socat TCP-LISTEN:80,reuseaddr,fork UNIX-CLIENT:/tmp/foo.sock
И затем отправьте свои HTTP-запросы этому прокси. Сервер, прослушивающий UNIX-сокет /tmp/foo.sock
, все еще должен понимать HTTP, потому что socat
не выполняет никаких преобразований сообщений.
Ответ 3
В запросах нет реализации для работы с unix-сокетами из коробки.
Но вы можете создать пользовательский adapter, который будет подключаться к сокету unix, отправлять запрос и читать ответ.
Все методы, которые вам нужно реализовать, это .send()
и .close()
, что легко и просто.
После регистрации адаптера в объекте сеанса вы можете использовать механизмы запросов с транспортом UNIX.