URI: 
       tnetwork: reintroduce network.debug (#5093) - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit c8562f53622309a736c0be51449db13b3a403d3e
   DIR parent 086372f68aaa56bc426eba0b9087b3f4e2e1a8c2
  HTML Author: ghost43 <somber.night@protonmail.com>
       Date:   Tue, 12 Feb 2019 20:23:43 +0100
       
       network: reintroduce network.debug (#5093)
       
       network.debug and interface.debug were removed during the asyncio-aiorpcx
       network-rewrite.
       Diffstat:
         M electrum/interface.py               |      26 ++++++++++++++++++++++++--
         M electrum/network.py                 |       3 +++
       
       2 files changed, 27 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/electrum/interface.py b/electrum/interface.py
       t@@ -71,8 +71,16 @@ class NotificationSession(RPCSession):
                self.cache = {}
                self.in_flight_requests_semaphore = asyncio.Semaphore(100)
                self.default_timeout = NetworkTimeout.Generic.NORMAL
       +        self._msg_counter = 0
       +        self.interface = None  # type: Optional[Interface]
       +
       +    def _get_and_inc_msg_counter(self):
       +        # runs in event loop thread, no need for lock
       +        self._msg_counter += 1
       +        return self._msg_counter
        
            async def handle_request(self, request):
       +        self.maybe_log(f"--> {request}")
                # note: if server sends malformed request and we raise, the superclass
                # will catch the exception, count errors, and at some point disconnect
                if isinstance(request, Notification):
       t@@ -91,12 +99,17 @@ class NotificationSession(RPCSession):
                    timeout = self.default_timeout
                # note: the semaphore implementation guarantees no starvation
                async with self.in_flight_requests_semaphore:
       +            msg_id = self._get_and_inc_msg_counter()
       +            self.maybe_log(f"<-- {args} {kwargs} (id: {msg_id})")
                    try:
       -                return await asyncio.wait_for(
       +                response = await asyncio.wait_for(
                            super().send_request(*args, **kwargs),
                            timeout)
                    except asyncio.TimeoutError as e:
       -                raise RequestTimedOut('request timed out: {}'.format(args)) from e
       +                raise RequestTimedOut(f'request timed out: {args} (id: {msg_id})') from e
       +            else:
       +                self.maybe_log(f"--> {response} (id: {msg_id})")
       +                return response
        
            async def subscribe(self, method: str, params: List, queue: asyncio.Queue):
                # note: until the cache is written for the first time,
       t@@ -123,6 +136,11 @@ class NotificationSession(RPCSession):
                """Hashable index for subscriptions and cache"""
                return str(method) + repr(params)
        
       +    def maybe_log(self, msg: str) -> None:
       +        if not self.interface: return
       +        if self.interface.debug or self.interface.network.debug:
       +            self.interface.print_error(msg)
       +
        
        class GracefulDisconnect(Exception): pass
        
       t@@ -173,6 +191,9 @@ class Interface(PrintError):
                self.tip_header = None
                self.tip = 0
        
       +        # Dump network messages (only for this interface).  Set at runtime from the console.
       +        self.debug = False
       +
                asyncio.run_coroutine_threadsafe(
                    self.network.main_taskgroup.spawn(self.run()), self.network.asyncio_loop)
                self.group = SilentTaskGroup()
       t@@ -370,6 +391,7 @@ class Interface(PrintError):
                                             host=self.host, port=self.port,
                                             ssl=sslc, proxy=self.proxy) as session:
                    self.session = session  # type: NotificationSession
       +            self.session.interface = self
                    self.session.default_timeout = self.network.get_network_timeout_seconds(NetworkTimeout.Generic)
                    try:
                        ver = await session.send_request('server.version', [version.ELECTRUM_VERSION, version.PROTOCOL_VERSION])
   DIR diff --git a/electrum/network.py b/electrum/network.py
       t@@ -276,6 +276,9 @@ class Network(PrintError):
                self.server_queue = None
                self.proxy = None
        
       +        # Dump network messages (all interfaces).  Set at runtime from the console.
       +        self.debug = False
       +
                self._set_status('disconnected')
        
            def run_from_another_thread(self, coro):