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.

44 lines
1.3 KiB

4 years ago
  1. """Low level HTTP server."""
  2. import asyncio
  3. from .web_protocol import RequestHandler
  4. from .web_request import BaseRequest
  5. __all__ = ('Server',)
  6. class Server:
  7. def __init__(self, handler, *, request_factory=None, loop=None, **kwargs):
  8. if loop is None:
  9. loop = asyncio.get_event_loop()
  10. self._loop = loop
  11. self._connections = {}
  12. self._kwargs = kwargs
  13. self.requests_count = 0
  14. self.request_handler = handler
  15. self.request_factory = request_factory or self._make_request
  16. @property
  17. def connections(self):
  18. return list(self._connections.keys())
  19. def connection_made(self, handler, transport):
  20. self._connections[handler] = transport
  21. def connection_lost(self, handler, exc=None):
  22. if handler in self._connections:
  23. del self._connections[handler]
  24. def _make_request(self, message, payload, protocol, writer, task):
  25. return BaseRequest(
  26. message, payload, protocol, writer, task, self._loop)
  27. async def shutdown(self, timeout=None):
  28. coros = [conn.shutdown(timeout) for conn in self._connections]
  29. await asyncio.gather(*coros, loop=self._loop)
  30. self._connections.clear()
  31. def __call__(self):
  32. return RequestHandler(self, loop=self._loop, **self._kwargs)