This code seems much more complicated than needed. Since this is a private constructor and the only callers it has are providing the option names as symbols, I don't see why this should try to handle strings. I think a straightforward implementation of this would be a lot better. I'm thinking something like:

````
unknown_options = options.keys - OPTION_DEFAULTS.keys
if unknown_options.empty?
  full_options = options.merge(OPTION_DEFAULTS)
  @use_ssl = full_options[:use_ssl]
  @redirect_limit = full_options[:redirect_limit]
  @verify_peer = full_options[:verify_peer]
else
  raise "...." 
end
````