すぐにメッセージを返し、バックグラウンドで実行するプロセスを開始してタスクを終了することで、GET に応答できるようにしたいと考えています。これは、BaseHTTPServer.HTTPServer および BaseHTTPRequestHandler の拡張で正常に機能します。ただし、こちらの手順に従ってサーバーに SSL を追加すると、サブプロセスが完了するまで応答が送信されません。Firefox が受信したものをそのまま表示していると仮定し、Firebug で再確認すると、サブプロセスが完了するまで何も送信されないように見えます。Chrome でテストしたところ、同じ結果が得られました。以下のコード。デバッグを続行する方法がわかりません。
class SecureHTTPServer(HTTPServer):
def __init__(self, server_address, HandlerClass):
BaseServer.__init__(self, server_address, HandlerClass)
ctx = SSL.Context(SSL.SSLv3_METHOD)
ctx.use_privatekey_file(SSL_CERT)
ctx.use_certificate_file(SSL_CERT)
self.socket = SSL.Connection(ctx, socket.socket(self.address_family, self.socket_type))
self.server_bind()
self.server_activate()
def shutdown_request(self, request):
request.shutdown()
class RecordingHandler(BaseHTTPRequestHandler):
def setup(self):
self.connection = self.request
self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
def do_GET(self):
key = 'abc'
p = Process(target = some_func, args = (key,))
# Some_func takes ~15 seconds to complete, and it logs its progress so that it's clear that the response is only sent after some_func is complete.
p.daemon = True
p.start()
self.send_response(200)
self.end_headers()
self.wfile.write('recording key ' + key)
def run():
try:
server = SecureHTTPServer(('', 8080), RecordingHandler)
print 'Waiting for input on port 8080.'
server.serve_forever()
except KeyboardInterrupt:
print 'Received keyboard interrupt, exiting.'
server.shutdown()