Search code examples
rubyhttpnet-httpdmg

Download a dmg file by http link


I am trying to download a .dmg file over the http link using ruby script. I have tried NET::HTTP and HTTParty methods described at http://www.ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTP.html These methods work well with images and other web content but doesnt work for a dmg file.

#!/usr/bin/env ruby

require 'fileutils'
require 'pathname'
require "open-uri"
require 'net/http'
include FileUtils

#download Software

#Method1
open("VirtualBox-4.2.18-88780-OSX.dmg") do |file|
 file.write('http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg').read
end

#Method2
Net::HTTP.start("download.virtualbox.org") do |http|
resp = http.get("/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg")
open("VirtualBox-4.2.18-88780-OSX.dmg","wb") do |file|
file.write(resp)
end
end

#Method3
uri = URI('http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-    OSX.dmg')
Net::HTTP.get(uri)

#Method4
Net::HTTP.start(uri.host) do |http|
request = Net::HTTP::Get.new uri
response = http.request request # Net::HTTPResponse object
end

#Method5
File.open("~/Desktop/", "wb") do |f| 
f.write HTTParty.get("http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18- 88780-OSX.dmg").parsed_response
end

#Method6
File.write('VirtualBox-4.2.18-88780-OSX.dmg',         open('http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg').read,  {mode: 'wb'})

#Methos7
puts "#{uri}"
res = Net::HTTP.get_response(uri)
puts res.body if res.is_a?(Net::HTTPSuccess)

How to get dmg file through http link.


Solution

  • i assume that this is due to a redirect:

    → curl -I http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg
    HTTP/1.1 302 Moved Temporarily
    Location: http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg
    
    → curl -I http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg
    HTTP/1.1 200 OK
    Content-Length: 110667450
    

    downloading the real url works like this:

    require 'net/http'
    url = "http://dlc.sun.com.edgesuite.net/virtualbox/4.2.18/VirtualBox-4.2.18-88780-OSX.dmg"
    File.open('tmp.dmg', 'w') { |f| f.write Net::HTTP.get_response(URI.parse(url)).body }