Handle IPv6 scenario in custom Request::Socket (#38866)
This commit is contained in:
parent
c270634565
commit
59f3d8a993
@ -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)
|
||||
|
||||
26
spec/lib/request/socket_spec.rb
Normal file
26
spec/lib/request/socket_spec.rb
Normal file
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user