__init__.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env python3
  2. #
  3. # MMGen Wallet, a terminal-based cryptocurrency wallet
  4. # Copyright (C)2013-2025 The MMGen Project <mmgen@tuta.io>
  5. # Licensed under the GNU General Public License, Version 3:
  6. # https://www.gnu.org/licenses
  7. # Public project repositories:
  8. # https://github.com/mmgen/mmgen-wallet
  9. # https://gitlab.com/mmgen/mmgen-wallet
  10. """
  11. test.cmdtest_d.httpd: WSGI http server
  12. """
  13. from wsgiref.simple_server import make_server, WSGIRequestHandler
  14. from mmgen.util import msg
  15. from mmgen.util2 import port_in_use
  16. class SilentRequestHandler(WSGIRequestHandler):
  17. def log_request(self, code='-', size='-'):
  18. return None
  19. class HTTPD:
  20. def __init__(self, cfg):
  21. self.cfg = cfg
  22. def start(self):
  23. if port_in_use(self.port):
  24. msg(f'\nPort {self.port} in use. Assuming {self.name} is running')
  25. return True
  26. self.httpd = make_server(
  27. 'localhost',
  28. self.port,
  29. self.application,
  30. handler_class = SilentRequestHandler)
  31. import threading
  32. t = threading.Thread(target=self.httpd.serve_forever, name=f'{type(self).__name__} thread')
  33. t.daemon = True
  34. t.start()
  35. def stop(self):
  36. self.httpd.server_close()
  37. def application(self, environ, start_response):
  38. method = environ['REQUEST_METHOD']
  39. response_body = self.make_response_body(method, environ)
  40. status = '200 OK'
  41. response_headers = [
  42. ('Content-Type', self.content_type),
  43. ('Content-Length', str(len(response_body)))
  44. ]
  45. start_response(status, response_headers)
  46. return [response_body]