2013-06-23 60 views
1

我希望能夠通過立即返回消息,然後啓動一個進程在後臺運行並完成任務來響應GET。這適用於BaseHTTPServer.HTTPServer和擴展BaseHTTPRequestHandler。但是,當我按照here的說明將SSL添加到服務器時,直到子進程完成後纔會發送響應。假設Firefox在收到它時顯示它收到的內容,並用Firebug進行雙重檢查,看起來好像什麼也沒有發送,直到子進程完成。我在Chrome中測試過,看到了相同的結果。下面的代碼;我不知道如何繼續調試。pyOpenSSL + HTTPServer:請求不會完成,直到所有進程完成

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() 

回答

0

顯然我只需要放棄,重新啓動,並嘗試再次使用谷歌搜索的東西。我發現this solution

import BaseHTTPServer, SimpleHTTPServer 
import ssl 

httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler) 
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='path/to/localhost.pem', server_side=True) 
httpd.serve_forever() 

我仍然不知道什麼是錯與以前的設置,但是這工作得很好。