def wrapped_recv(s: ssl.SSLSocket, sf: BinaryIO) -> bytes: if timeout is None: return s.recv(1024) else: s.setblocking(False) s.settimeout(timeout) try: return s.recv(1024) except (socket.timeout, ssl.SSLError, ssl.SSLWantReadError): return None finally: s.setblocking(True)
def perform_handshake(accepted_socket: ssl.SSLSocket) -> None: """ Tries to perform a TLS handshake, if handshake don't succeed in 10 seconds, it closes the connection :param accepted_socket: SSLSocket object wrapping an accepted client socket :return: None """ accepted_socket.settimeout(src.Constants.HANDSHAKE_TIMEOUT_SECONDS) try: accepted_socket.do_handshake() accepted_socket.settimeout(None) except (socket.timeout, ssl.SSLError, OSError): accepted_socket.close() exit(0)
def recv_ssl_msg_timeout(sock: ssl.SSLSocket, delimiter=b'\n', timeout=2): if sock not in socket_buffer_dict.keys(): socket_buffer_dict[sock] = bytearray() buff = socket_buffer_dict[sock] last = time.time() received = False sock.setblocking(False) sock.settimeout(timeout) while True: available = select.select([sock], [], [], timeout / 25) data = None if available[0]: data = bytearray() subdata = sock.recv() while subdata: data.extend(subdata) try: subdata = sock.recv() except socket.timeout: subdata = None if not data: if (time.time() - last > timeout): break continue last = time.time() buff.extend(data) if delimiter in buff: received = True break sock.setblocking(True) if not received: raise TimeoutError pos = buff.index(delimiter) res = buff[0:pos] del buff[0:pos + 1] return base64.standard_b64decode(res)