Search code examples
rubyhttp-headersopen-uri

How to get HTTP headers before downloading with Ruby's OpenUri


I am currently using OpenURI to download a file in Ruby. Unfortunately, it seems impossible to get the HTTP headers without downloading the full file:

open(base_url,
  :content_length_proc => lambda {|t|
    if t && 0 < t
      pbar = ProgressBar.create(:total => t)
  end
  },
  :progress_proc => lambda {|s|
    pbar.progress = s if pbar
  }) {|io|
    puts io.size
    puts io.meta['content-disposition']
  }

Running the code above shows that it first downloads the full file and only then prints the header I need.

Is there a way to get the headers before the full file is downloaded, so I can cancel the download if the headers are not what I expect them to be?


Solution

  • It seems what I wanted is not possible to archieve using OpenURI, at least not, as I said, without loading the whole file first.

    I was able to do what I wanted using Net::HTTP's request_get

    Here an example:

    http.request_get('/largefile.jpg') {|response|
      if (response['content-length'] < max_length)
        response.read_body do |str|   # read body now
          # save to file
        end
      end
    }
    

    Note that this only works when using a block, doing it like:

    response = http.request_get('/largefile.jpg')
    

    the body will already be read.