Handle IPv6 scenario in custom Request::Socket (#38866)

This commit is contained in:
Matt Jankowski 2026-04-30 12:03:55 -04:00 committed by GitHub
parent c270634565
commit 59f3d8a993
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 27 additions and 1 deletions

View File

@ -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)

View 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