Perform the opening handshake.
(
self,
process_request: (
Callable[
[ServerConnection, Request],
Awaitable[Response | None] | Response | None,
]
| None
) = None,
process_response: (
Callable[
[ServerConnection, Request, Response],
Awaitable[Response | None] | Response | None,
]
| None
) = None,
server_header: str | None = SERVER,
)
| 112 | return self.protocol.reject(status, text) |
| 113 | |
| 114 | async def handshake( |
| 115 | self, |
| 116 | process_request: ( |
| 117 | Callable[ |
| 118 | [ServerConnection, Request], |
| 119 | Awaitable[Response | None] | Response | None, |
| 120 | ] |
| 121 | | None |
| 122 | ) = None, |
| 123 | process_response: ( |
| 124 | Callable[ |
| 125 | [ServerConnection, Request, Response], |
| 126 | Awaitable[Response | None] | Response | None, |
| 127 | ] |
| 128 | | None |
| 129 | ) = None, |
| 130 | server_header: str | None = SERVER, |
| 131 | ) -> None: |
| 132 | """ |
| 133 | Perform the opening handshake. |
| 134 | |
| 135 | """ |
| 136 | await asyncio.wait( |
| 137 | [self.request_rcvd, self.connection_lost_waiter], |
| 138 | return_when=asyncio.FIRST_COMPLETED, |
| 139 | ) |
| 140 | |
| 141 | if self.request is not None: |
| 142 | async with self.send_context(expected_state=CONNECTING): |
| 143 | response = None |
| 144 | |
| 145 | if process_request is not None: |
| 146 | try: |
| 147 | response = process_request(self, self.request) |
| 148 | if isinstance(response, Awaitable): |
| 149 | response = await response |
| 150 | except Exception as exc: |
| 151 | self.protocol.handshake_exc = exc |
| 152 | response = self.protocol.reject( |
| 153 | http.HTTPStatus.INTERNAL_SERVER_ERROR, |
| 154 | ( |
| 155 | "Failed to open a WebSocket connection.\n" |
| 156 | "See server log for more information.\n" |
| 157 | ), |
| 158 | ) |
| 159 | |
| 160 | if response is None: |
| 161 | if self.server.is_serving(): |
| 162 | self.response = self.protocol.accept(self.request) |
| 163 | else: |
| 164 | self.response = self.protocol.reject( |
| 165 | http.HTTPStatus.SERVICE_UNAVAILABLE, |
| 166 | "Server is shutting down.\n", |
| 167 | ) |
| 168 | else: |
| 169 | assert isinstance(response, Response) # help mypy |
| 170 | self.response = response |
| 171 |
no test coverage detected