class HTTP::Timeout::Null

def close

def close
  @socket&.close
end

def closed?

def closed?
  @socket&.closed?
end

def connect(socket_class, host, port, nodelay = false)

Connects to a socket
def connect(socket_class, host, port, nodelay = false)
  @socket = socket_class.open(host, port)
  @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay
end

def connect_ssl

Starts a SSL connection on a socket
def connect_ssl
  @socket.connect
end

def initialize(options = {})

def initialize(options = {})
  @options = options
end

def readpartial(size, buffer = nil)

Read from the socket
def readpartial(size, buffer = nil)
  @socket.readpartial(size, buffer)
rescue EOFError
  :eof
end

def rescue_readable(timeout = read_timeout)

Retry reading
def rescue_readable(timeout = read_timeout)
  yield
rescue IO::WaitReadable
  retry if @socket.to_io.wait_readable(timeout)
  raise TimeoutError, "Read timed out after #{timeout} seconds"
end

def rescue_writable(timeout = write_timeout)

Retry writing
def rescue_writable(timeout = write_timeout)
  yield
rescue IO::WaitWritable
  retry if @socket.to_io.wait_writable(timeout)
  raise TimeoutError, "Write timed out after #{timeout} seconds"
end

def start_tls(host, ssl_socket_class, ssl_context)

Configures the SSL connection and starts the connection
def start_tls(host, ssl_socket_class, ssl_context)
  @socket = ssl_socket_class.new(socket, ssl_context)
  @socket.hostname = host if @socket.respond_to? :hostname=
  @socket.sync_close = true if @socket.respond_to? :sync_close=
  connect_ssl
  return unless ssl_context.verify_mode == OpenSSL::SSL::VERIFY_PEER
  return if ssl_context.respond_to?(:verify_hostname) && !ssl_context.verify_hostname
  @socket.post_connection_check(host)
end

def write(data)

Write to the socket
def write(data)
  @socket.write(data)
end