|
@@ -1,5 +1,8 @@
|
|
# frozen_string_literal: true
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
+require 'ipaddr'
|
|
|
|
+require 'socket'
|
|
|
|
+
|
|
class Request
|
|
class Request
|
|
REQUEST_TARGET = '(request-target)'
|
|
REQUEST_TARGET = '(request-target)'
|
|
|
|
|
|
@@ -8,7 +11,7 @@ class Request
|
|
def initialize(verb, url, **options)
|
|
def initialize(verb, url, **options)
|
|
@verb = verb
|
|
@verb = verb
|
|
@url = Addressable::URI.parse(url).normalize
|
|
@url = Addressable::URI.parse(url).normalize
|
|
- @options = options
|
|
|
|
|
|
+ @options = options.merge(socket_class: Socket)
|
|
@headers = {}
|
|
@headers = {}
|
|
|
|
|
|
set_common_headers!
|
|
set_common_headers!
|
|
@@ -87,4 +90,18 @@ class Request
|
|
def http_client
|
|
def http_client
|
|
HTTP.timeout(:per_operation, timeout).follow(max_hops: 2)
|
|
HTTP.timeout(:per_operation, timeout).follow(max_hops: 2)
|
|
end
|
|
end
|
|
|
|
+
|
|
|
|
+ class Socket < TCPSocket
|
|
|
|
+ class << self
|
|
|
|
+ def open(host, *args)
|
|
|
|
+ address = IPSocket.getaddress(host)
|
|
|
|
+ raise Mastodon::HostValidationError if PrivateAddressCheck.private_address? IPAddr.new(address)
|
|
|
|
+ super address, *args
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ alias new open
|
|
|
|
+ end
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ private_constant :Socket
|
|
end
|
|
end
|