def get_bs_pair(): x, y = socket.socketpair() bx, by = BufferedSocket(x), BufferedSocket(y) # sanity check by.sendall(b'123') bx.recv_size(3) == b'123' return bx, by
def get_bs_pair(): x, y = socket.socketpair() bx, by = BufferedSocket(x), BufferedSocket(y) # sanity check by.sendall(b'123') bx.recv_size(3) == b'123' return bx, by
def call(self, *commands): ''' Helper function that implements a (subset of) the RESP protocol used by Redis >= 1.2 ''' cm = context.get_context().connection_mgr sock = BufferedSocket(cm.get_connection(self.address)) # ARRAY: first byte *, decimal length, \r\n, contents out = ['*' + str(len(commands))] + \ ["${0}\r\n{1}".format(len(e), e) for e in commands] out = "\r\n".join(out) + "\r\n" sock.send(out) fbyte = sock.peek(1) if fbyte == "-": # error string raise RedisError(sock.recv_until('\r\n')) elif fbyte == '+': # simple string resp = sock.recv_until('\r\n')[1:] elif fbyte == '$': # bulk string length = int(sock.recv_until('\r\n')[1:]) if length == -1: resp = None else: resp = sock.recv_size(length) cm.release_connection(sock) return resp
def test_short_lines(): for ms in (2, 4, 6, 1024, None): x, y = socket.socketpair() bs = BufferedSocket(x) y.sendall(b'1\n2\n3\n') assert bs.recv_until(b'\n', maxsize=ms) == b'1' assert bs.recv_until(b'\n', maxsize=ms) == b'2' y.close() assert bs.recv_close(maxsize=ms) == b'3\n' try: bs.recv_size(1) except ConnectionClosed: pass else: assert False, 'expected ConnectionClosed' bs.close() return
def test_short_lines(): for ms in (2, 4, 6, 1024, None): x, y = socket.socketpair() bs = BufferedSocket(x) y.sendall(b'1\n2\n3\n') assert bs.recv_until(b'\n', maxsize=ms) == b'1' assert bs.recv_until(b'\n', maxsize=ms) == b'2' y.close() assert bs.recv_close(maxsize=ms) == b'3\n' try: bs.recv_size(1) except ConnectionClosed: pass else: assert False, 'expected ConnectionClosed' bs.close() return
def test_buffers(): x, y = socket.socketpair() bx, by = BufferedSocket(x), BufferedSocket(y) assert by.getrecvbuffer() == b'' assert by.getsendbuffer() == b'' assert bx.getrecvbuffer() == b'' by.buffer(b'12') by.sendall(b'3') assert bx.recv_size(1) == b'1' assert bx.getrecvbuffer() == b'23' return
def test_buffers(): x, y = socket.socketpair() bx, by = BufferedSocket(x), BufferedSocket(y) assert by.getrecvbuffer() == b'' assert by.getsendbuffer() == b'' assert bx.getrecvbuffer() == b'' by.buffer(b'12') by.sendall(b'3') assert bx.recv_size(1) == b'1' assert bx.getrecvbuffer() == b'23' return
def handle_client(self, sock, addr): 'Make sockets available to next process.' bsock = BufferedSocket(sock) secret = bsock.recv_size(len(self.secret)) if secret != self.secret: bsock.send('BAD SECRET.') sock.close() return send_socks = [] for server_sock in self.sockets.values(): if sock.getsockname() == server_sock.getsockname(): continue # exclude the socket-passing-socket send_socks.append(server_sock) sock.send(str(len(send_socks)) + '.') for server_sock in send_socks: sendfileobj.sendfileobj(sock, server_sock) sock.close()
def test_split_delim(): delim = b'\r\n' first = b'1234\r' second = b'\n5' x, y = socket.socketpair() bs = BufferedSocket(x) y.sendall(first) try: bs.recv_until(delim, timeout=0.0001) except Timeout: pass y.sendall(second) assert bs.recv_until(delim, with_delimiter=True) == b'1234\r\n' assert bs.recv_size(1) == b'5' return
def test_split_delim(): delim = b'\r\n' first = b'1234\r' second = b'\n5' x, y = socket.socketpair() bs = BufferedSocket(x) y.sendall(first) try: bs.recv_until(delim, timeout=0.0001) except Timeout: pass y.sendall(second) assert bs.recv_until(delim, with_delimiter=True) == b'1234\r\n' assert bs.recv_size(1) == b'5' return