1

Unixドメインソケットにバインドされた基本HTTPサーバーを作成しようとしていますが、UnixStreamServerでBaseHTTPRequestHandlerサブクラスを使用すると、Python - UnixStreamServerでBaseHTTPRequestHandlerを使用すると例外が発生する

玩具server.py:私は、その後curl --unix-socket ./mysocket.sock http:/helloでリクエストを送信

from SocketServer import UnixStreamServer 
from BaseHTTPServer import BaseHTTPRequestHandler 

class MyHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
    self.send_response(200) 
    self.send_header("Content-Type", "text/plain") 
    self.end_headers() 
    self.wfile.write("Hi!") 

server = UnixStreamServer('./mysocket.sock', MyHandler) 
server.serve_forever() 

、(Pythonの2.7.11を使用して)サーバーで、次の例外が発生:

Exception happened during processing of request from 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/lib/python2.7/SocketServer.py", line 652, in __init__ 
    self.handle() 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 340, in handle 
    self.handle_one_request() 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 328, in handle_one_request 
    method() 
    File "server.py", line 6, in do_GET 
    self.send_response(200) 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 385, in send_response 
    self.log_request(code) 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 422, in log_request 
    self.requestline, str(code), str(size)) 
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 456, in log_message 
    (self.client_address[0], 
IndexError: string index out of range 

私がしましたUDSの呼び出しにクライアントアドレスの概念がないため、sock.accept()が空の文字列をアドレスとして返すという事実に関連しています。しかし、BaseHTTPRequestHandlerはロギングに期待しています

MonkeypatchingやBaseHTTPServerにこのような小さな変更を加えないでこの問題を回避する方法はありますか? BaseHTTPRequestHandlerはUnixDataStreamでも動作するように設計されていますか?軽量UDS HTTPサーバーのPythonでのより良い提案ですか?

ありがとうございます!

答えて

1

私は(上書きされることを意図TCPServerの方法の一つである)UnixStreamServerをサブクラス化し、get_requestを上書きしてしまった:

class UnixHTTPServer(UnixStreamServer): 
    def get_request(self): 
    request, client_address = self.socket.accept() 
    # BaseHTTPRequestHandler expects a tuple with the client address at index 
    # 0, so we fake one 
    if len(client_address) == 0: 
     client_address = (self.server_address,) 
    return (request, client_address) 

(self.server_addressがために使用されているファイルディスクリプタへのパスを与えることに注意してくださいUDS)

これは最もクリーンな解決策ではありませんが、ハッキーではありません。

関連する問題