Ruby - удаленная загрузка файла ... тайм-аут? - PullRequest
1 голос
/ 03 августа 2011

Извините за вкладки.Я пытаюсь загрузить файл из удаленного в локальный, и я получаю обратно тот, который составляет ровно 310 байт (независимо от того, какой файл я выберу для загрузки).Я пытался установить время ожидания на 0, но это не работает.Что я делаю неправильно?Спасибо!

        @downloadUrl = 'https://username:password@api.net'
        Net::HTTP.start(@downloadUrl) do |http|
            response = http.get('/file.ext')
            open('/Users/me/file.ext', "wb", :read_timeout=>0) do |file|
                file.write(response.body)
            end
        end

РЕДАКТИРОВАТЬ: я не хочу использовать httpclient, я хочу использовать стандартный net / http.Я почти на месте, но я продолжаю получать initialize': getaddrinfo: nodename nor servname provided, or not known (SocketError) в Net::HTTP.start(url.path).Но когда я удаленный "https", я получаю ECONNREFUSED.... ближе?

    url = URI.parse('https://api.net/file.ext') 
    @request = Net::HTTP.start(url.path)
    @request.basic_auth 'username', 'password'
    sock = Net::HTTP.new(url.host, 443)
    sock.use_ssl = true
    sock.ssl_version='SSLv3'
    sock.start do |http|
        response = http.get(@request)
            open('/Users/me/file.ext', "wb", :read_timeout=>0) do |file|
                file.write(response.body)
            end
    end

1 Ответ

0 голосов
/ 04 августа 2011

Использование httpclient намного проще при доступе через SSL.

gem install httpclient

Я не пробовал это, но это должно работать для вас.Вот rdoc .

require 'httpclient'

domain    = "https://api.net/file.ext"
username  = "username"
password  = "password"

clnt = HTTPClient.new
clnt.set_auth(domain, username, password)

res = clnt.get_content(https_url)

Вы можете обратиться к вопросу «запись двоичного файла в ruby» , чтобы сохранить свой ответ в файл.*

Обновлено Использование net / http

Вы должны сделать Net::HTTP.start(url.host, url.port) вместо Net:HTTP.start(url.path). См. RDoc для Net :: HTTP.start .

url = URI.parse("https://api.net/file.ext")
download_file = opne("/Users/me/file.ext", "wb")
request = Net::HTTP.start(url.host, url.port)

# .. set basic auth, verify peer etc

begin
  request.request_get(url.path) do |resp|
    resp.read_body { |segment| download_file.write(segment) }
  end
ensure
  download_file.close
end
...