docs: def read_exactly(socket, n):
      """
      Reads exactly n bytes from socket
      Raises SocketError if there isn't enough data
      """
      data = six.binary_type()
      while len(data) < n:
          next_data = read(socket, n - len(data))
          if not next_data:
              raise SocketError("Unexpected EOF")
          data += next_data
      return data