code: def timer_expired(self):
          
          if self._http_conn.sock is not None:
              self._shutdown = True
              self._http_conn.sock.shutdown(socket.SHUT_RDWR)
          else:
              # Retry after the retry duration
              self._timer.cancel()
              self._timer = threading.Timer(self._retrytime,
                                            HTTPTimeout.timer_expired, [self])
              self._timer.start()
docs: This method is invoked in context of the timer thread, so we cannot
          directly throw exceptions (we can, but they would be in the wrong
          thread), so instead we shut down the socket of the connection.
          When the timeout happens in early phases of the connection setup,
          there is no socket object on the HTTP connection yet, in that case
          we retry after the retry duration, indefinitely.
          So we do not guarantee in all cases that the overall operation times
          out after the specified timeout.