(self, handler: WebSocketHandler)
| 899 | ) |
| 900 | |
| 901 | async def _accept_connection(self, handler: WebSocketHandler) -> None: |
| 902 | subprotocol_header = handler.request.headers.get("Sec-WebSocket-Protocol") |
| 903 | if subprotocol_header: |
| 904 | subprotocols = [s.strip() for s in subprotocol_header.split(",")] |
| 905 | else: |
| 906 | subprotocols = [] |
| 907 | self.selected_subprotocol = handler.select_subprotocol(subprotocols) |
| 908 | if self.selected_subprotocol: |
| 909 | assert self.selected_subprotocol in subprotocols |
| 910 | handler.set_header("Sec-WebSocket-Protocol", self.selected_subprotocol) |
| 911 | |
| 912 | extensions = self._parse_extensions_header(handler.request.headers) |
| 913 | for ext in extensions: |
| 914 | if ext[0] == "permessage-deflate" and self._compression_options is not None: |
| 915 | # TODO: negotiate parameters if compression_options |
| 916 | # specifies limits. |
| 917 | self._create_compressors("server", ext[1], self._compression_options) |
| 918 | if ( |
| 919 | "client_max_window_bits" in ext[1] |
| 920 | and ext[1]["client_max_window_bits"] is None |
| 921 | ): |
| 922 | # Don't echo an offered client_max_window_bits |
| 923 | # parameter with no value. |
| 924 | del ext[1]["client_max_window_bits"] |
| 925 | handler.set_header( |
| 926 | "Sec-WebSocket-Extensions", |
| 927 | httputil._encode_header("permessage-deflate", ext[1]), |
| 928 | ) |
| 929 | break |
| 930 | |
| 931 | handler.clear_header("Content-Type") |
| 932 | handler.set_status(101) |
| 933 | handler.set_header("Upgrade", "websocket") |
| 934 | handler.set_header("Connection", "Upgrade") |
| 935 | handler.set_header("Sec-WebSocket-Accept", self._challenge_response(handler)) |
| 936 | handler.finish() |
| 937 | |
| 938 | self.stream = handler._detach_stream() |
| 939 | |
| 940 | self.start_pinging() |
| 941 | try: |
| 942 | open_result = handler.open(*handler.open_args, **handler.open_kwargs) |
| 943 | if open_result is not None: |
| 944 | await open_result |
| 945 | except Exception: |
| 946 | handler.log_exception(*sys.exc_info()) |
| 947 | self._abort() |
| 948 | return |
| 949 | |
| 950 | await self._receive_frame_loop() |
| 951 | |
| 952 | def _parse_extensions_header( |
| 953 | self, headers: httputil.HTTPHeaders |
no test coverage detected