class Net::SSH::Proxy::HTTP

An implementation of an HTTP proxy. To use it, instantiate it, then pass the instantiated object via the :proxy key to Net::SSH.start:

require 'net/ssh/proxy/http'

proxy ='proxy_host', proxy_port)
Net::SSH.start('host', 'user', :proxy => proxy) do |ssh|

If the proxy requires authentication, you can pass :user and :password to the proxy's constructor:

proxy ='proxy_host', proxy_port,
   :user => "user", :password => "password")

Note that HTTP digest authentication is not supported; Basic only at this point.



The map of additional options that were given to the object at initialization.


The hostname or IP address of the HTTP proxy.


The port number of the proxy.

Public Class Methods

new(proxy_host, proxy_port=80, options={}) click to toggle source

Create a new socket factory that tunnels via the given host and port. The options parameter is a hash of additional settings that can be used to tweak this proxy connection. Specifically, the following options are supported:

  • :user => the user name to use when authenticating to the proxy

  • :password => the password to use when authenticating

# File lib/net/ssh/proxy/http.rb, line 44
def initialize(proxy_host, proxy_port=80, options={})
  @proxy_host = proxy_host
  @proxy_port = proxy_port
  @options = options

Public Instance Methods

open(host, port, connection_options) click to toggle source

Return a new socket connected to the given host and port via the proxy that was requested when the socket factory was instantiated.

# File lib/net/ssh/proxy/http.rb, line 52
def open(host, port, connection_options)
  socket = establish_connection(connection_options[:timeout])
  socket.write "CONNECT #{host}:#{port} HTTP/1.1\r\n"
  socket.write "Host: #{host}:#{port}\r\n"
  if options[:user]
    credentials = ["#{options[:user]}:#{options[:password]}"].pack("m*").gsub(/\s/, "")
    socket.write "Proxy-Authorization: Basic #{credentials}\r\n"
  socket.write "\r\n"
  resp = parse_response(socket)
  return socket if resp[:code] == 200
  raise ConnectError, resp.inspect

Protected Instance Methods

establish_connection(connect_timeout) click to toggle source
# File lib/net/ssh/proxy/http.rb, line 74
def establish_connection(connect_timeout)
  Socket.tcp(proxy_host, proxy_port, nil, nil,
             connect_timeout: connect_timeout)
parse_response(socket) click to toggle source
# File lib/net/ssh/proxy/http.rb, line 79
def parse_response(socket)
  version, code, reason = socket.gets.chomp.split(/ /, 3)
  headers = {}
  while (line = socket.gets) && (line.chomp! != "")
    name, value = line.split(/:/, 2)
    headers[name.strip] = value.strip
  body =["Content-Length"].to_i) if headers["Content-Length"]
  return { version: version,
           code: code.to_i,
           reason: reason,
           headers: headers,
           body: body }