2014-11-17 27 views
13

Thông thường, thực hiện một yêu cầu bài đăng bằng requests khuôn khổ được thực hiện bởi:Cách chính xác để sử dụng ổ cắm miền unix trong khung yêu cầu là gì?

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

Nhưng: Làm thế nào để kết nối với một ổ cắm unix thay vì làm một kết nối TCP?

Trên ghi chú có liên quan, cách mã hóa đường dẫn miền trong URL?

  • libcurl cho phép ứng dụng để cung cấp ổ cắm riêng mà trên đó để thực hiện yêu cầu
  • LDAP phát minh ra chương trình riêng ldapi nơi tên ổ cắm là% -encoded trong lĩnh vực máy chủ
  • httpie sử dụng http+unix chương trình và% path -encoded trong máy chủ lĩnh vực

Đây là một số ví dụ, nhưng là có một RFC hoặc thành lập thực hành tốt nhất?

+0

Một socket là một bộ mô tả tập tin. Bạn đọc/ghi bộ mô tả. Tôi không nghĩ rằng tôi có được những gì bạn muốn. –

+0

Có, cũng không phải unix ổ cắm được mô tả. Nhưng đây không phải là một triển khai cấp thấp nhưng là một máy khách HTTP. Yêu cầu –

+1

là thư viện HTTP. Nếu bạn viết một bộ điều hợp, bạn có thể kiểm soát cách tạo kết nối. Điều đó nói rằng, nó không xuất hiện như là nếu cURL hỗ trợ này, do đó, không mong đợi yêu cầu để đi ra khỏi con đường của họ để thêm cách để hỗ trợ này cho bạn –

Trả lời

3

Bạn có thể sử dụng để tạo ra một socat TCP để ổ cắm Proxy UNIX, một cái gì đó như:

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

Và sau đó gửi yêu cầu http của bạn để proxy đó. Máy chủ đang nghe trên ổ cắm UNIX /tmp/foo.sock vẫn phải hiểu HTTP vì socat không thực hiện bất kỳ chuyển đổi thư nào.

2

yêu cầu không có triển khai để làm việc với các khe cắm unix ngoài hộp.

Nhưng bạn có thể tạo tùy chỉnh adapter sẽ kết nối với ổ cắm unix, gửi yêu cầu và đọc câu trả lời.

Tất cả các phương pháp bạn cần triển khai là .send().close(), thật dễ dàng và đơn giản.

Sau khi đăng ký bộ điều hợp trong đối tượng phiên, bạn có thể sử dụng yêu cầu máy móc có vận chuyển UNIX.

+1

Đã tồn tại, https://github.com/msabramo/ request-unixsocket –

+0

Ngoài ra, trong trường hợp DIY, tôi nghĩ rằng dễ dàng hơn để phân lớp và thêm nhóm kết nối riêng. Chỉ nhận được một kết nối mới cần phải được thay đổi sau này. –

14

Không cần phải phát minh lại bánh xe:

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

thức truy cập URL là http+unix và đường dẫn ổ cắm là trăm mã hóa vào lĩnh vực máy chủ:

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 
+0

Hoặc để tương tác với ổ cắm Docker ('/ var/run/docker.sock'), hãy sử dụng một URL như' http + unix: //% 2Fvar% 2Frun% 2Fdocker.sock/info' –

+1

Bằng cách này, cũng có một plugin cho [HTTPie] (https://httpie.org/) để tương tác với các ổ cắm miền unix: https://github.com/msabramo/httpie-unixsocket –

Các vấn đề liên quan