diff --git a/lib/geocoder/request.rb b/lib/geocoder/request.rb index 5e2eb6c99db3f79bbcc47e0fed9128e97293f910..0180cf9580cb61d8c9239e85cc934ccdf7120e80 100644 --- a/lib/geocoder/request.rb +++ b/lib/geocoder/request.rb @@ -81,7 +81,18 @@ module Geocoder end def geocoder_remove_port_from_addresses(ip_addresses) - ip_addresses.map { |ip| ip.split(':').first } + ip_addresses.map do |ip| + # IPv4 + if ip.count('.') > 0 + ip.split(':').first + # IPv6 bracket notation + elsif match = ip.match(/\[(\S+)\]/) + match.captures.first + # IPv6 bare notation + else + ip + end + end end def geocoder_reject_non_ipv4_addresses(ip_addresses) diff --git a/test/unit/request_test.rb b/test/unit/request_test.rb index 127f5f4f36c508f08229cc897e7f9ea707d008db..09e8ac9acd5365eebdbe98b83545650b13101402 100644 --- a/test/unit/request_test.rb +++ b/test/unit/request_test.rb @@ -72,6 +72,12 @@ class RequestTest < GeocoderTestCase req = MockRequest.new() assert_equal expected_ips, req.send(:geocoder_remove_port_from_addresses, ips) end + def test_geocoder_remove_port_from_ipv6_addresses_with_port + expected_ips = ['2600:1008:b16e:26da:ecb3:22f7:6be4:2137', '2600:1901:0:2df5::', '2001:db8:1f70::999:de8:7648:6e8', '10.128.0.2'] + ips = ['2600:1008:b16e:26da:ecb3:22f7:6be4:2137', '2600:1901:0:2df5::', '[2001:db8:1f70::999:de8:7648:6e8]:100', '10.128.0.2'] + req = MockRequest.new() + assert_equal expected_ips, req.send(:geocoder_remove_port_from_addresses, ips) + end def test_geocoder_remove_port_from_addresses_without_port expected_ips = ['127.0.0.1', '127.0.0.2', '127.0.0.3'] ips = ['127.0.0.1', '127.0.0.2', '127.0.0.3']