Sha256: 02972eef2f58130ca0f1c33e82a87c9d0c2e73ae70f20815d7856c4b14852082

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

require 'uri'
require 'net/http'

module Dimscan
  # A utility class for enumerating over the bytes of a http response body
  class HTTPByteEnumerator
    @connections = {}
    class << self
      def open_connection(host, port, ssl)
        @connections[host] ||= {}
        @connections[host][port] ||= {}
        @connections[host][port][ssl] ||= Net::HTTP.start(
          host, port, use_ssl: ssl
        )
      end

      def close_connections
        @connections.values.each do |ports|
          ports.values.each do |connections|
            connections.values.each(&:finish)
          end
        end
      end
    end

    def initialize(url)
      @uri = URI(url)
      fail ArgumentError, 'invalid scheme' unless @uri.scheme =~ /^https?$/
    end

    def each(&block)
      return to_enum(__callee__) unless block_given?
      request = Net::HTTP::Get.new(@uri)
      http = self.class.open_connection(
        @uri.host, @uri.port, @uri.scheme == 'https'
      )
      http.request(request) do |response|
        fail response.body if error?(response)
        enumerate_response(response, &block)
      end
    end

    protected

    def error?(response)
      [Net::HTTPError, Net::HTTPClientError].any? do |error|
        response.is_a?(error)
      end
    end

    def enumerate_response(response, &block)
      response.read_body do |chunk|
        chunk.each_byte(&block)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dimscan-0.2.0 lib/dimscan/http_byte_enumerator.rb