- #!/usr/bin/env python3
-
- import http.server
- import os
- import socket
- import socketserver
- import sys
- import time
-
- import dummy_killer
-
- PORT = 18080
- HOST_NAME = '0.0.0.0'
-
- PID = "/tmp/dummy_http.pid"
-
-
- class MyHandler(http.server.BaseHTTPRequestHandler):
-
- def setup(self):
- http.server.BaseHTTPRequestHandler.setup(self)
- self.protocol_version = "HTTP/1.1" # allow connection: keep-alive
-
- def do_HEAD(self):
- if self.path == "/redirect1":
- self.send_response(301)
- self.send_header("Location", "http://127.0.0.1:"+str(PORT)+"/hello")
- elif self.path == "/redirect2":
- self.send_response(301)
- self.send_header("Location", "http://127.0.0.1:"+str(PORT)+"/redirect1")
- elif self.path == "/redirect3":
- self.send_response(301)
- self.send_header("Location", "http://127.0.0.1:"+str(PORT)+"/redirect4")
- elif self.path == "/redirect4":
- self.send_response(301)
- self.send_header("Location", "http://127.0.0.1:"+str(PORT)+"/redirect3")
- else:
- self.send_response(200)
- self.send_header("Content-type", "text/html")
- self.end_headers()
- self.log_message("to be closed: " + repr(self.close_connection))
-
- def do_GET(self):
- response = b"hello world"
-
- """Respond to a GET request."""
- if self.path == "/empty":
- self.finish()
- return
-
- if self.path == "/timeout":
- time.sleep(2)
-
- if self.path == "/error_403":
- self.send_response(403)
- else:
- self.send_response(200)
-
- if self.path == "/content-length":
- self.send_header("Content-Length", str(len(response)))
-
- self.send_header("Content-type", "text/plain")
- self.end_headers()
- self.wfile.write(response)
- self.log_message("to be closed: %d, headers: %s, conn:'%s'" % (self.close_connection, str(self.headers), self.headers.get('Connection', "").lower()))
-
- conntype = self.headers.get('Connection', "").lower()
- if conntype != 'keep-alive':
- self.close_connection = True
-
- self.log_message("ka:'%s', pv:%s[%s]" % (str(conntype == 'keep-alive'), str(self.protocol_version >= "HTTP/1.1"), self.protocol_version))
-
-
- def do_POST(self):
- response = b"hello post"
- """Respond to a GET request."""
- if self.path == "/empty":
- self.finish()
- return
-
- if self.path == "/timeout":
- time.sleep(2)
-
- if self.path == "/error_403":
- self.send_response(403)
- else:
- self.send_response(200)
-
- if self.path == "/content-length":
- self.send_header("Content-Length", str(len(response)))
-
- self.send_header("Content-type", "text/plain")
- self.end_headers()
- self.wfile.write(response)
-
-
- class ThreadingSimpleServer(socketserver.ThreadingMixIn,
- http.server.HTTPServer):
- def __init__(self):
- self.allow_reuse_address = True
- self.timeout = 1
- http.server.HTTPServer.__init__(self, (HOST_NAME, PORT), MyHandler)
-
- def run(self):
- dummy_killer.write_pid(PID)
- try:
- while 1:
- sys.stdout.flush()
- server.handle_request()
- except KeyboardInterrupt:
- print("Interrupt")
- except socket.error:
- print("Socket closed")
-
- def stop(self):
- self.keep_running = False
- self.server_close()
-
-
- if __name__ == '__main__':
- server = ThreadingSimpleServer()
-
- dummy_killer.setup_killer(server, server.stop)
-
- server.run()
|