class HTTPClient::SSLSocket
Wraps up OpenSSL::SSL::SSLSocket and offers debugging features.
def self.create_socket(session)
def self.create_socket(session) opts = { :debug_dev => session.debug_dev } site = session.proxy || session.dest socket = session.create_socket(site.host, site.port) begin if session.proxy session.connect_ssl_proxy(socket, Util.urify(session.dest.to_s)) end new(socket, session.dest, session.ssl_config, opts) rescue socket.close raise end end
def <<(str)
def <<(str) rv = @ssl_socket.write(str) debug(str) rv end
def check_mask(value, mask)
def check_mask(value, mask) value & mask == mask end
def close
def close @ssl_socket.close @socket.close end
def closed?
def closed? @socket.closed? end
def create_openssl_socket(socket)
def create_openssl_socket(socket) ssl_socket = nil if OpenSSL::SSL.const_defined?("SSLContext") ctx = OpenSSL::SSL::SSLContext.new @config.set_context(ctx) ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ctx) else ssl_socket = OpenSSL::SSL::SSLSocket.new(socket) @config.set_context(ssl_socket) end ssl_socket end
def debug(str)
def debug(str) @debug_dev << str if @debug_dev && str end
def eof?
def eof? @ssl_socket.eof? end
def flush
def flush @ssl_socket.flush end
def gets(rs)
def gets(rs) str = @ssl_socket.gets(rs) debug(str) str end
def initialize(socket, dest, config, opts = {})
def initialize(socket, dest, config, opts = {}) unless SSLEnabled raise ConfigurationError.new('Ruby/OpenSSL module is required') end @socket = socket @config = config @ssl_socket = create_openssl_socket(@socket) @debug_dev = opts[:debug_dev] ssl_connect(dest.host) end
def peer_cert
def peer_cert @ssl_socket.peer_cert end
def post_connection_check(hostname)
def post_connection_check(hostname) verify_mode = @config.verify_mode || OpenSSL::SSL::VERIFY_NONE if verify_mode == OpenSSL::SSL::VERIFY_NONE return elsif @ssl_socket.peer_cert.nil? and check_mask(verify_mode, OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT) raise OpenSSL::SSL::SSLError.new('no peer cert') end if @ssl_socket.respond_to?(:post_connection_check) and RUBY_VERSION > "1.8.4" @ssl_socket.post_connection_check(hostname) else @config.post_connection_check(@ssl_socket.peer_cert, hostname) end end
def read(size, buf = nil)
def read(size, buf = nil) str = @ssl_socket.read(size, buf) debug(str) str end
def readpartial(size, buf = nil)
def readpartial(size, buf = nil) str = @ssl_socket.readpartial(size, buf) debug(str) str end
def ssl_connect(hostname = nil)
def ssl_connect(hostname = nil) if hostname && @ssl_socket.respond_to?(:hostname=) @ssl_socket.hostname = hostname end @ssl_socket.connect if $DEBUG if @ssl_socket.respond_to?(:ssl_version) warn("Protocol version: #{@ssl_socket.ssl_version}") end warn("Cipher: #{@ssl_socket.cipher.inspect}") end post_connection_check(hostname) end
def sync
def sync @ssl_socket.sync end
def sync=(sync)
def sync=(sync) @ssl_socket.sync = sync end