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|
|
addresses.each do |address|
|
||||||
check_private_address(address, host)
|
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)
|
sockaddr = ::Socket.pack_sockaddr_in(port, address.to_s)
|
||||||
|
|
||||||
sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1)
|
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