|
@@ -18,6 +18,7 @@
|
|
from enum import Enum
|
|
from enum import Enum
|
|
from functools import wraps
|
|
from functools import wraps
|
|
import logging
|
|
import logging
|
|
|
|
+import socket
|
|
from ssl import SSLContext
|
|
from ssl import SSLContext
|
|
from typing import (
|
|
from typing import (
|
|
Any,
|
|
Any,
|
|
@@ -296,6 +297,19 @@ async def start_server_and_accept(
|
|
await self.accept()
|
|
await self.accept()
|
|
assert self.runstate == Runstate.RUNNING
|
|
assert self.runstate == Runstate.RUNNING
|
|
|
|
|
|
|
|
+ @upper_half
|
|
|
|
+ @require(Runstate.IDLE)
|
|
|
|
+ async def open_with_socket(self, sock: socket.socket) -> None:
|
|
|
|
+ """
|
|
|
|
+ Start connection with given socket.
|
|
|
|
+
|
|
|
|
+ :param sock: A socket.
|
|
|
|
+
|
|
|
|
+ :raise StateError: When the `Runstate` is not `IDLE`.
|
|
|
|
+ """
|
|
|
|
+ self._reader, self._writer = await asyncio.open_connection(sock=sock)
|
|
|
|
+ self._set_state(Runstate.CONNECTING)
|
|
|
|
+
|
|
@upper_half
|
|
@upper_half
|
|
@require(Runstate.IDLE)
|
|
@require(Runstate.IDLE)
|
|
async def start_server(self, address: SocketAddrT,
|
|
async def start_server(self, address: SocketAddrT,
|
|
@@ -343,11 +357,12 @@ async def accept(self) -> None:
|
|
protocol-level failure occurs while establishing a new
|
|
protocol-level failure occurs while establishing a new
|
|
session, the wrapped error may also be an `QMPError`.
|
|
session, the wrapped error may also be an `QMPError`.
|
|
"""
|
|
"""
|
|
- if self._accepted is None:
|
|
|
|
- raise QMPError("Cannot call accept() before start_server().")
|
|
|
|
- await self._session_guard(
|
|
|
|
- self._do_accept(),
|
|
|
|
- 'Failed to establish connection')
|
|
|
|
|
|
+ if not self._reader:
|
|
|
|
+ if self._accepted is None:
|
|
|
|
+ raise QMPError("Cannot call accept() before start_server().")
|
|
|
|
+ await self._session_guard(
|
|
|
|
+ self._do_accept(),
|
|
|
|
+ 'Failed to establish connection')
|
|
await self._session_guard(
|
|
await self._session_guard(
|
|
self._establish_session(),
|
|
self._establish_session(),
|
|
'Failed to establish session')
|
|
'Failed to establish session')
|