diff --git a/lib/picopackage.rb b/lib/picopackage.rb index 295d58e..e0cf1e0 100644 --- a/lib/picopackage.rb +++ b/lib/picopackage.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative "picopackage/version" -require_relative "picopackage/http_fetcher" +# require_relative "picopackage/http_fetcher" require_relative "picopackage/provider" require_relative "picopackage/source_file" require_relative "picopackage/scanner" diff --git a/lib/picopackage/http_fetcher.rb b/lib/picopackage/http_fetcher.rb new file mode 100644 index 0000000..6b16f28 --- /dev/null +++ b/lib/picopackage/http_fetcher.rb @@ -0,0 +1,36 @@ +# Currently unused. If we get to the point where a provider needs to make a http request, we'll +# swappout DefaultProvider#fetch and include this module. + +module Picopackage + module HttpFetcher + MAX_SIZE = 1024 * 1024 + TIMEOUT = 10 + + # This seemed to cause loops - constanting making requests to the same URL + + def fetch_url(url, max_size: MAX_SIZE, timeout: TIMEOUT) + raise ArgumentError, "This method shouldn't be called" + uri = URI(url) + + Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', read_timeout: timeout, open_timeout: timeout) do |http| + request = Net::HTTP::Get.new(uri.path) + + http.request_get(uri.path) do |response| + unless response.is_a?(Net::HTTPSuccess) + raise FetchError, "HTTP #{response.code} #{response.message}" + end + + data = String.new(capacity: max_size) + response.read_body do |chunk| + # Stream chunks with size checking + if data.bytesize + chunk.bytesize > max_size + raise FileTooLargeError + end + data << chunk + end + end + data + end + end + end +end