Exemple #1
0
    def connect(self):
        """
        Create a TCP socket connection.

        Returns True if the socket needed connecting, False if not
        """
        if self._sock is not None:
            self.logger.debug("connect() called, but already connected")
            return False
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            if self.settings.ssl:
                sock = ssl.wrap_socket(sock, **self.settings.ssl_kwargs)
            if self.settings.socket_timeout is not None:
                sock.settimeout(self.settings.socket_timeout)
            self.logger.info("connecting with new socket to %s:%s",
                             self.settings.host, self.settings.port)
            sock.connect((self.settings.host, self.settings.port))
            if self.settings.tcp_nodelay:
                sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        except socket.error as exc:
            reraise(ConnectionError(self._error_message(exc)))

        self._sock = sock
        return True
Exemple #2
0
    def connect(self):
        """
        Create a TCP socket connection.

        Returns True if the socket needed connecting, False if not
        """
        if self._sock is not None:
            self.logger.debug("connect() called, but already connected")
            return False
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            if self.settings.ssl:
                sock = ssl.wrap_socket(sock, **self.settings.ssl_kwargs)
            if self.settings.socket_timeout is not None:
                sock.settimeout(self.settings.socket_timeout)
            self.logger.info(
                "connecting with new socket to %s:%s",
                self.settings.host, self.settings.port)
            sock.connect((self.settings.host, self.settings.port))
            if self.settings.tcp_nodelay:
                sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        except socket.error as exc:
            reraise(ConnectionError(self._error_message(exc)))

        self._sock = sock
        return True
Exemple #3
0
 def send(self, byte_array):
     """
     :type byte_array: bytearray
     :return: Number of sent bytes
     :rtype: int
     """
     if self._sock is None:
         raise SocketDisconnected('Trying to write to socket when disconnected')
     try:
         self.wire_logger.debug("sending %d bytes: %r", len(byte_array), byte_array)
         sent = self._sock.send(byte_array)
         if sent == 0:
             raise SocketDisconnected('Socket disconnected when writing to it, 0 bytes written')
         return sent
     except socket.error as e:
         reraise(ConnectionError("Error while writing to socket", e))
Exemple #4
0
 def send(self, msg_bytes):
     "Send a payload"
     if self._sock is None:
         raise SocketDisconnected('Trying to write to socket when disconnected')
     byte_count = len(msg_bytes)
     # Pad to 4 bytes
     padding = '\x00' * max(0, 3 - byte_count)
     self.logger.debug(
         "payload has %d bytes and needs %d padding",
         byte_count, len(padding))
     frame = _encode_varint(byte_count) + msg_bytes + padding
     try:
         self.wire_logger.debug("sending frame bytes %r", frame)
         self._sock.sendall(frame)
     except socket.error as e:
         reraise(ConnectionError("Error while writing to socket", e))
Exemple #5
0
 def send(self, data):
     """
     :type data: byte string
     :return: Number of sent bytes
     :rtype: int
     """
     if self._sock is None:
         raise SocketDisconnected(
             'Trying to write to socket when disconnected')
     try:
         self.wire_logger.debug("sending %d bytes: %r", len(data), data)
         sent = self._sock.send(data)
         if sent == 0:
             raise SocketDisconnected(
                 'Socket disconnected when writing to it, 0 bytes written')
         return sent
     except socket.error as e:
         reraise(ConnectionError("Error while writing to socket", e))
Exemple #6
0
    def recv(self):
        """Read stuff from underlying socket.

        :rtype: byte string
        """
        if self._sock is None:
            raise SocketDisconnected("Trying to read from a socket when disconnected")

        try:
            inbytes = self._sock.recv(self.settings.read_chunksize)
            if not inbytes:
                message = "Socket disconnected while receiving, got %r" % (inbytes,)
                self.logger.info(message)
                raise SocketDisconnected(message)
            self.wire_logger.debug("Received %d bytes: %r", len(inbytes), inbytes)
            return inbytes
        except socket.error as e:
            reraise(ConnectionError("Error while reading from socket", e))
Exemple #7
0
    def _fill_buffer(self, min_size=4, empty=False):
        "Ensure the buffer has at least 4 bytes"
        if self._sock is None:
            raise SocketDisconnected(
                'Trying to read from a socket when disconnected')

        if empty:
            self._buffer = ''
        while len(self._buffer) < min_size:
            bytes_needed = min_size - len(self._buffer)
            self.logger.debug("receiving %d bytes", bytes_needed)
            try:
                if self.settings.ssl:
                    inbytes = self._recv_msg_ssl(bytes_needed)
                else:
                    inbytes = self._recv_msg_sock(bytes_needed)
            except socket.error as e:
                reraise(ConnectionError('Error while reading from socket', e))

            self._buffer += inbytes
Exemple #8
0
    def recv(self):
        """Read stuff from underlying socket.

        :rtype: byte string
        """
        if self._sock is None:
            raise SocketDisconnected(
                'Trying to read from a socket when disconnected')

        try:
            inbytes = self._sock.recv(self.settings.read_chunksize)
            if not inbytes:
                message = "Socket disconnected while receiving, got %r" % (
                    inbytes, )
                self.logger.info(message)
                raise SocketDisconnected(message)
            self.wire_logger.debug('Received %d bytes: %r', len(inbytes),
                                   inbytes)
            return inbytes
        except socket.error as e:
            reraise(ConnectionError('Error while reading from socket', e))