Подтвердить что ты не робот

Каков правильный способ использования сокета домена 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 или установленная передовая практика?

4b9b3361

Ответ 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.