Sha256: 662b0c49ba215b74e62a0da8c38a07e193811027504b5552e33bcc28b78c82e0

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

module Downer
  
  class FailedDownload < StandardError
    attr_accessor :http_code, :url
  end
  
  class DownloadItem
    attr_reader :url
    attr_reader :content
    
    def initialize(url, destination)
      @url, @destination = sanitize_url(url), destination
      @uri = URI.parse(@url)      
    end
    
    # Returns the name which this file will be saved as
    def get_save_filename
      file_name = CGI.unescape(@uri.to_s)
      file_name = file_name.gsub(/https?:\/\//,'').split('/').last
      #file_name = file_name.gsub('%5B', '[')
      #file_name = file_name.gsub('%5D', ']')
      file_name
      # TODO : refine to auto append file extentions based on content type
    end
    
    def download
      @http = Net::HTTP.new(@uri.host, @uri.port)
      if @uri.respond_to? :request_uri
        req = Net::HTTP::Get.new(@uri.request_uri)
        response = @http.request(req)

        if response.code != '200'
          fd = FailedDownload.new
          fd.http_code = response.code
          fd.url = @url
          raise fd
        else
          @content = response.body
          write_to_file
        end
      else
        puts "WARNING: Ignored download for #{@uri.inspect}"
      end

    end
    
    private
    
      def write_to_file
        file_out_path = @destination + "/#{get_save_filename}"
        fout = File.new(file_out_path, 'w')
        fout.puts @content
      end
      
      def sanitize_url(url)
        unsafe_url = String.new(url)
        scheme = unsafe_url.slice!(/(https?|ftp|smb):\/\//)
        parts = unsafe_url.split('/')
        parts.map! { |part| CGI::escape(part).gsub('+', '%20') }
        scheme + parts.join('/')
      end
    end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
downer-0.3.2 lib/downer/download_item.rb