|
|
- """Low level HTTP server."""
- import asyncio
-
- from .web_protocol import RequestHandler
- from .web_request import BaseRequest
-
-
- __all__ = ('Server',)
-
-
- class Server:
-
- def __init__(self, handler, *, request_factory=None, loop=None, **kwargs):
- if loop is None:
- loop = asyncio.get_event_loop()
- self._loop = loop
- self._connections = {}
- self._kwargs = kwargs
- self.requests_count = 0
- self.request_handler = handler
- self.request_factory = request_factory or self._make_request
-
- @property
- def connections(self):
- return list(self._connections.keys())
-
- def connection_made(self, handler, transport):
- self._connections[handler] = transport
-
- def connection_lost(self, handler, exc=None):
- if handler in self._connections:
- del self._connections[handler]
-
- def _make_request(self, message, payload, protocol, writer, task):
- return BaseRequest(
- message, payload, protocol, writer, task, self._loop)
-
- async def shutdown(self, timeout=None):
- coros = [conn.shutdown(timeout) for conn in self._connections]
- await asyncio.gather(*coros, loop=self._loop)
- self._connections.clear()
-
- def __call__(self):
- return RequestHandler(self, loop=self._loop, **self._kwargs)
|