76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "hbc/checkable"
 | |
| 
 | |
| class Hbc::UrlChecker
 | |
|   attr_accessor :cask, :response_status, :headers
 | |
| 
 | |
|   include Hbc::Checkable
 | |
| 
 | |
|   def initialize(cask, fetcher = Hbc::Fetcher)
 | |
|     @cask = cask
 | |
|     @fetcher = fetcher
 | |
|     @headers = {}
 | |
|   end
 | |
| 
 | |
|   def summary_header
 | |
|     "url check result for #{cask}"
 | |
|   end
 | |
| 
 | |
|   def run
 | |
|     _get_data_from_request
 | |
|     return if errors?
 | |
|     _check_response_status
 | |
|   end
 | |
| 
 | |
|   HTTP_RESPONSES = [
 | |
|                      "HTTP/1.0 200 OK",
 | |
|                      "HTTP/1.1 200 OK",
 | |
|                      "HTTP/1.1 302 Found",
 | |
|                    ].freeze
 | |
| 
 | |
|   OK_RESPONSES = {
 | |
|                    "http"  => HTTP_RESPONSES,
 | |
|                    "https" => HTTP_RESPONSES,
 | |
|                    "ftp"   => ["OK"],
 | |
|                  }.freeze
 | |
| 
 | |
|   def _check_response_status
 | |
|     ok = OK_RESPONSES[cask.url.scheme]
 | |
|     return if ok.include?(@response_status)
 | |
|     add_error "unexpected http response, expecting #{ok.map(&:utf8_inspect).join(" or ")}, got #{@response_status.utf8_inspect}"
 | |
|   end
 | |
| 
 | |
|   def _get_data_from_request
 | |
|     response = @fetcher.head(cask.url)
 | |
| 
 | |
|     if response.empty?
 | |
|       add_error "timeout while requesting #{cask.url}"
 | |
|       return
 | |
|     end
 | |
| 
 | |
|     response_lines = response.split("\n").map(&:chomp)
 | |
| 
 | |
|     case cask.url.scheme
 | |
|     when "http", "https" then
 | |
|       @response_status = response_lines.grep(%r{^HTTP}).last
 | |
|       if @response_status.respond_to?(:strip)
 | |
|         @response_status.strip!
 | |
|         unless response_lines.index(@response_status).nil?
 | |
|           http_headers = response_lines[(response_lines.index(@response_status) + 1)..-1]
 | |
|           http_headers.each do |line|
 | |
|             header_name, header_value = line.split(": ")
 | |
|             @headers[header_name] = header_value
 | |
|           end
 | |
|         end
 | |
|       end
 | |
|     when "ftp" then
 | |
|       @response_status = "OK"
 | |
|       response_lines.each do |line|
 | |
|         header_name, header_value = line.split(": ")
 | |
|         @headers[header_name] = header_value
 | |
|       end
 | |
|     else
 | |
|       add_error "unknown scheme for #{cask.url}"
 | |
|     end
 | |
|   end
 | |
| end
 | 
