Start processing of incoming requests. It reads request line, request headers and request payload, then calls handle_request() method. Subclass has to override handle_request(). start() handles various exceptions in request or response handling. Connection is being c
(self)
| 211 | |
| 212 | @asyncio.coroutine |
| 213 | def start(self): |
| 214 | """Start processing of incoming requests. |
| 215 | |
| 216 | It reads request line, request headers and request payload, then |
| 217 | calls handle_request() method. Subclass has to override |
| 218 | handle_request(). start() handles various exceptions in request |
| 219 | or response handling. Connection is being closed always unless |
| 220 | keep_alive(True) specified. |
| 221 | """ |
| 222 | reader = self.reader |
| 223 | |
| 224 | while True: |
| 225 | message = None |
| 226 | self._keep_alive = False |
| 227 | self._request_count += 1 |
| 228 | self._reading_request = False |
| 229 | |
| 230 | payload = None |
| 231 | try: |
| 232 | # read HTTP request method |
| 233 | prefix = reader.set_parser(self._request_prefix) |
| 234 | yield from prefix.read() |
| 235 | |
| 236 | # start reading request |
| 237 | self._reading_request = True |
| 238 | |
| 239 | # start slow request timer |
| 240 | if self._timeout and self._timeout_handle is None: |
| 241 | now = self._loop.time() |
| 242 | self._timeout_handle = self._loop.call_at( |
| 243 | ceil(now+self._timeout), self.cancel_slow_request) |
| 244 | |
| 245 | # read request headers |
| 246 | httpstream = reader.set_parser(self._request_parser) |
| 247 | message = yield from httpstream.read() |
| 248 | |
| 249 | # cancel slow request timer |
| 250 | if self._timeout_handle is not None: |
| 251 | self._timeout_handle.cancel() |
| 252 | self._timeout_handle = None |
| 253 | |
| 254 | # request may not have payload |
| 255 | if (message.headers.get(hdrs.CONTENT_LENGTH, 0) or |
| 256 | hdrs.SEC_WEBSOCKET_KEY1 in message.headers or |
| 257 | 'chunked' in message.headers.get( |
| 258 | hdrs.TRANSFER_ENCODING, '')): |
| 259 | payload = streams.FlowControlStreamReader( |
| 260 | reader, loop=self._loop) |
| 261 | reader.set_parser( |
| 262 | aiohttp.HttpPayloadParser(message), payload) |
| 263 | else: |
| 264 | payload = EMPTY_PAYLOAD |
| 265 | |
| 266 | yield from self.handle_request(message, payload) |
| 267 | |
| 268 | except asyncio.CancelledError: |
| 269 | return |
| 270 | except errors.ClientDisconnectedError: |
no test coverage detected