2013-06-23 2 views
1

메시지를 즉시 반환 한 다음 백그라운드에서 실행하고 작업을 완료하기 위해 GET에 응답하고 싶습니다. 이것은 BaseHTTPServer.HTTPServer와 BaseHTTPRequestHandler를 확장하여 잘 작동합니다. 그러나 서버에 SSL을 추가하기 위해 지침 here을 수행하면 하위 프로세스가 완료 될 때까지 응답이 전송되지 않습니다. 파이어 폭스가 수신 할 때 수신 한 내용을 표시하고 파이어 버그를 사용하여 이중 검사한다고 가정하면 서브 프로세스가 완료 될 때까지 아무 것도 전송되지 않는 것처럼 보입니다. 크롬에서 테스트 한 결과 동일한 결과가 나타났습니다. 아래 코드; 디버깅을 계속하는 방법에 대한 손실이 있습니다.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() 

나는 여전히 이전 설치 문제 무엇인지 전혀 모른다, 그러나 이것은 잘 작동합니다.

관련 문제