2017-06-20 2 views
0

Ich versuche, einen Python-Server zu implementieren, der sowohl HTTP als auch HTTPS in BaseHTTPServer unterstützt. Dies ist mein Code:Dual HTTP und HTTPS Python-Server basierend auf BaseHTTPServer funktioniert nicht wie erwartet

server_class = BaseHTTPServer.HTTPServer 

# Configure servers 
httpd = server_class(("0.0.0.0", 1044), MyHandler) 
httpsd = server_class(("0.0.0.0", 11044), MyHandler) 
httpsd.socket = ssl.wrap_socket(httpsd.socket, keyfile="/tmp/localhost.key", certfile="/tmp/localhost.crt", server_side=True) 

# Run the servers 
try: 
    httpd.serve_forever() 
    httpsd.serve_forever() 
except KeyboardInterrupt: 
    print("Closing the server...") 

httpd.server_close() 
httpsd.server_close() 

So, HTTP läuft in Port 1044 und HTTPS läuft in 11044. Die MyHandler Klasse wird aus Gründen der Kürze weggelassen.

Mit diesem Code, wenn ich Anfragen an HTTP-Port (z. B. curl http://localhost:1044/path) senden, funktioniert es. Wenn ich jedoch Anforderungen an den HTTPS-Port (z. B. curl -k https://localhost:11104/path) sende, antwortet der Server niemals, d. H. Das Rollo-Terminal wird gehängt.

Ich habe beobachtet, dass, wenn ich die Zeile den HTTP-Server (d. H. httpd.server_forever()) beginnend kommentieren, dann funktioniert der HTTPS-Server, .i.e. curl -k https://localhost:11104/path funktioniert. Ich schätze also, dass ich etwas falsch mache, was verhindert, dass ich beide Server gleichzeitig einstellen kann.

Jede Hilfe wird geschätzt!

+0

vielleicht wegen eines Tippfehlers für https? localhsot – micebrain

+0

Es gab einen Tippfehler in meiner Frage Post (jetzt behoben), aber im eigentlichen Test habe ich richtig "localhost". Danke für die Rückmeldung! – fgalan

+2

Um ... Serve_forever behandelt jeweils eine Anforderung bis zum Herunterfahren, also wenn Sie http und https einmal zu einem Zeitpunkt bereitstellen möchten. Versuche sie in einem anderen Thread zu tun. –

Antwort

0

Nach Rückmeldung Kommentare, habe ich den Code in einer Multithread-Weise überarbeitet und jetzt funktioniert es wie erwartet.

def init_server(http): 
    server_class = BaseHTTPServer.HTTPServer 

    if http: 
     httpd = server_class(("0.0.0.0", 1044), MyHandler) 
    else: # https 
     httpd = server_class(("0.0.0.0", 11044), MyHandler) 
     httpd.socket = ssl.wrap_socket(httpd.socket, keyfile="/tmp/localhost.key", certfile="/tmp/localhost.crt", server_side=True) 

    httpd.serve_forever() 
    httpd.server_close() 


VERBOSE = "True" 
thread.start_new_thread(init_server, (True,)) 
thread.start_new_thread(init_server, (False,)) 

while 1: 
    time.sleep(10) 
Verwandte Themen