Метод расширения ссылок Ruby / Curl загружает полный целевой URL - PullRequest
0 голосов
/ 08 марта 2012

Я сделал удобный маленький экспандер ссылок, используя curl в своем приложении ruby ​​(Sintra).

  def curbexpand(link) 
    result = Curl::Easy.new(link)
    begin 
      result.headers["User-Agent"] = "..."
      result.verbose = true
      result.follow_location = true
      result.max_redirects = 3
      result.connect_timeout = 5
      result.perform
      return result.last_effective_url # Returns the final destination URL after x redirects...
    rescue
      return link
      puts "XXXXXXXXXXXXXXXXXXX Error parsing link XXXXXXXXXXXXXXXXXXXXXXXXXXX"
    end
  end

Проблема, с которой я столкнулся, заключается в том, что некоторые гении используют укороченные URL-адреса для ссылки на файлы .exe и .dmg, что было бы хорошо, но похоже, что мой скрипт curl выше ожидает полного ответа (то есть 1 ГБ!) Перед возвратом URL. Я не хочу использовать сторонние API для расширения ссылок, поскольку у меня есть значительный объем ссылок для расширения.

Кто-нибудь знает, как я могу настроить ограничение, чтобы просто найти URL, а не ждать полного ответа?

1 Ответ

0 голосов
/ 08 марта 2012

Я сделал то, что вы хотите, используя Net::HTTP для обработки запросов "HEAD" и поиска перенаправлений таким образом.Преимущество состоит в том, что HEAD не возвращает содержимое, только заголовки.

Из документов :

head(path, initheader = nil) 

Gets only the header from path on the connected-to host. header is a Hash like { ‘Accept’ => ‘/’, … }.

This method returns a Net::HTTPResponse object.

This method never raises an exception.

response = nil
Net::HTTP.start('some.www.server', 80) {|http|
  response = http.head('/index.html')
}
p response['content-type']

Объедините это с примером в документах Net :: HTTPдля последующего перенаправления, и вы сможете найти свой целевой URL.

Вероятно, вы можете использовать Curl::http_head, чтобы выполнить почти то же самое.

...