You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dummy_https.py 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #!/usr/bin/env python3
  2. import http.server
  3. import http.server
  4. import os
  5. import socket
  6. import socketserver
  7. import ssl
  8. import sys
  9. import time
  10. import dummy_killer
  11. PORT = 18081
  12. HOST_NAME = '127.0.0.1'
  13. PID = "/tmp/dummy_https.pid"
  14. class MyHandler(http.server.BaseHTTPRequestHandler):
  15. def setup(self):
  16. http.server.BaseHTTPRequestHandler.setup(self)
  17. self.protocol_version = "HTTP/1.1" # allow connection: keep-alive
  18. def do_HEAD(self):
  19. self.send_response(200)
  20. self.send_header("Content-type", "text/html")
  21. self.end_headers()
  22. self.log_message("to be closed: " + self.close_connection)
  23. def do_GET(self):
  24. response = b"hello world"
  25. """Respond to a GET request."""
  26. if self.path == "/empty":
  27. self.finish()
  28. return
  29. if self.path == "/timeout":
  30. time.sleep(2)
  31. if self.path == "/error_403":
  32. self.send_response(403)
  33. else:
  34. self.send_response(200)
  35. if self.path == "/content-length":
  36. self.send_header("Content-Length", str(len(response)))
  37. self.send_header("Content-type", "text/plain")
  38. self.end_headers()
  39. self.wfile.write(response)
  40. self.log_message("to be closed: %d, headers: %s, conn:'%s'" % (self.close_connection, str(self.headers), self.headers.get('Connection', "").lower()))
  41. conntype = self.headers.get('Connection', "").lower()
  42. if conntype != 'keep-alive':
  43. self.close_connection = True
  44. self.log_message("ka:'%s', pv:%s[%s]" % (str(conntype == 'keep-alive'), str(self.protocol_version >= "HTTP/1.1"), self.protocol_version))
  45. def do_POST(self):
  46. """Respond to a POST request."""
  47. content_length = int(self.headers['Content-Length'])
  48. response = b'hello post'
  49. if content_length > 0:
  50. body = self.rfile.read(content_length)
  51. response = b"hello post: " + bytes(len(body))
  52. if self.path == "/empty":
  53. self.finish()
  54. return
  55. if self.path == "/timeout":
  56. time.sleep(2)
  57. if self.path == "/error_403":
  58. self.send_response(403)
  59. else:
  60. self.send_response(200)
  61. if self.path == "/content-length":
  62. self.send_header("Content-Length", str(len(response)))
  63. self.send_header("Content-type", "text/plain")
  64. self.end_headers()
  65. self.wfile.write(response)
  66. class ThreadingSimpleServer(socketserver.ThreadingMixIn,
  67. http.server.HTTPServer):
  68. def __init__(self, certfile,
  69. keyfile,):
  70. self.allow_reuse_address = True
  71. self.timeout = 10
  72. http.server.HTTPServer.__init__(self, (HOST_NAME, PORT), MyHandler)
  73. self.socket = ssl.wrap_socket (self.socket,
  74. keyfile=keyfile,
  75. certfile=certfile, server_side=True)
  76. def run(self):
  77. dummy_killer.write_pid(PID)
  78. try:
  79. while 1:
  80. sys.stdout.flush()
  81. server.handle_request()
  82. except KeyboardInterrupt:
  83. print("Interrupt")
  84. except socket.error:
  85. print("Socket closed")
  86. def stop(self):
  87. self.keep_running = False
  88. self.server_close()
  89. if __name__ == '__main__':
  90. server = ThreadingSimpleServer(sys.argv[1], sys.argv[1])
  91. dummy_killer.setup_killer(server, server.stop)
  92. server.run()