logstash/lib/pluginmanager/utils/http_client.rb
2021-02-01 10:24:12 +00:00

65 lines
2.1 KiB
Ruby

# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
module LogStash module PluginManager module Utils
class HttpClient
class RedirectionLimit < RuntimeError; end
HTTPS_SCHEME = "https"
REDIRECTION_LIMIT = 5
def self.start(uri)
uri = URI(uri)
proxy_url = ENV["https_proxy"] || ENV["HTTPS_PROXY"] || ""
proxy_uri = URI(proxy_url)
Net::HTTP.start(uri.host, uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password, http_options(uri)) { |http| yield http }
end
def self.http_options(uri)
ssl_enabled = uri.scheme == HTTPS_SCHEME
{
:use_ssl => ssl_enabled
}
end
# Do a HEAD request on the file to see if it exist before downloading it
def self.remote_file_exist?(uri, redirect_count = 0)
uri = URI(uri)
# This is defensive programming, but in the real world we do create redirects all the time
raise RedirectionLimit, "Too many redirection, tried #{REDIRECTION_LIMIT} times" if redirect_count >= REDIRECTION_LIMIT
start(uri) do |http|
return false if uri.path.empty?
request = Net::HTTP::Head.new(uri.path)
response = http.request(request)
if response.code == "302"
new_uri = response["location"]
remote_file_exist?(new_uri, redirect_count + 1)
elsif response.code == "200"
true
else
false
end
end
end
end
end end end