| 18 | |
| 19 | |
| 20 | class WebSocketResponse(StreamResponse): |
| 21 | |
| 22 | def __init__(self, *, |
| 23 | timeout=10.0, autoclose=True, autoping=True, protocols=()): |
| 24 | super().__init__(status=101) |
| 25 | self._protocols = protocols |
| 26 | self._protocol = None |
| 27 | self._writer = None |
| 28 | self._reader = None |
| 29 | self._closed = False |
| 30 | self._closing = False |
| 31 | self._conn_lost = 0 |
| 32 | self._close_code = None |
| 33 | self._loop = None |
| 34 | self._waiting = False |
| 35 | self._exception = None |
| 36 | self._timeout = timeout |
| 37 | self._autoclose = autoclose |
| 38 | self._autoping = autoping |
| 39 | |
| 40 | @asyncio.coroutine |
| 41 | def prepare(self, request): |
| 42 | # make pre-check to don't hide it by do_handshake() exceptions |
| 43 | resp_impl = self._start_pre_check(request) |
| 44 | if resp_impl is not None: |
| 45 | return resp_impl |
| 46 | |
| 47 | parser, protocol, writer = self._pre_start(request) |
| 48 | resp_impl = yield from super().prepare(request) |
| 49 | self._post_start(request, parser, protocol, writer) |
| 50 | return resp_impl |
| 51 | |
| 52 | def _pre_start(self, request): |
| 53 | try: |
| 54 | status, headers, parser, writer, protocol = do_handshake( |
| 55 | request.method, request.headers, request.transport, |
| 56 | self._protocols) |
| 57 | except HttpProcessingError as err: |
| 58 | if err.code == 405: |
| 59 | raise HTTPMethodNotAllowed( |
| 60 | request.method, [hdrs.METH_GET], body=b'') |
| 61 | elif err.code == 400: |
| 62 | raise HTTPBadRequest(text=err.message, headers=err.headers) |
| 63 | else: # pragma: no cover |
| 64 | raise HTTPInternalServerError() from err |
| 65 | |
| 66 | if self.status != status: |
| 67 | self.set_status(status) |
| 68 | for k, v in headers: |
| 69 | self.headers[k] = v |
| 70 | self.force_close() |
| 71 | return parser, protocol, writer |
| 72 | |
| 73 | def _post_start(self, request, parser, protocol, writer): |
| 74 | self._reader = request._reader.set_parser(parser) |
| 75 | self._writer = writer |
| 76 | self._protocol = protocol |
| 77 | self._loop = request.app.loop |
no outgoing calls