diff --git a/app/lib/request.rb b/app/lib/request.rb index 376a37638c..d405fb5009 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -303,7 +303,7 @@ class Request addresses.each do |address| check_private_address(address, host) - sock = ::Socket.new(address.is_a?(Resolv::IPv6) ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0) + sock = ::Socket.new(address.match?(Resolv::IPv6::Regex) ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0) sockaddr = ::Socket.pack_sockaddr_in(port, address.to_s) sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1) diff --git a/spec/lib/request/socket_spec.rb b/spec/lib/request/socket_spec.rb new file mode 100644 index 0000000000..2c6a12a304 --- /dev/null +++ b/spec/lib/request/socket_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Request::Socket do + describe '.open' do + context 'when an IPv6 only host lookup' do + let(:resolv_service) { instance_double(Resolv) } + let(:socket_service) { instance_double(Socket).as_null_object } + + before do + allow(Resolv).to receive(:new).and_return(resolv_service) + allow(Socket).to receive(:new).and_return(socket_service) + allow(resolv_service).to receive(:getaddresses).with('example.com').and_return(%w(2001:4860:4860::8844)) + end + + it 'returns a valid socket' do + described_class.open('example.com') + + expect(Socket) + .to have_received(:new) + .with(Socket::AF_INET6, Socket::SOCK_STREAM, 0) + end + end + end +end