2012-03-07 4 views
0

私はRuby(Sintra)アプリケーション内でカールを使用して便利な小さなリンクエクスパンダーを作った。ルビー/カールリンクエキスパンダーメソッドが完全なターゲットURLをダウンロード中

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 

私が持っている問題は、いくつかの天才がいいと思い.exeファイルのとした.dmgのにリンクするURL短縮サービスを使用していることですが、それは完全な応答が返されるのを待っている以上、私のカールのスクリプトのように見えます(つまり、 URLを返す前に1GBのファイルにすることができます)。私は、膨大な量のリンクを展開しているので、サードパーティのリンクエキスパンダーAPIを使用したくありません。

誰もが、私はちょうどURLを見つけるのではなく、完全な応答を待っているために縁石を微調整することができます方法を知っていますか?

+1

'Curl :: Easy.http_head(link)'が動作するかもしれない – cmason

+0

歓声cmason - これとNet :: HTTPも試してみて、どちらが速いのかを確認してください –

答えて

0

私はあなたが「HEAD」要求を処理するためにNet::HTTPを使用して使用して何をしたい行われ、そのようにリダイレクトを探してきました。利点は、ヘッダーはコンテンツのみを返し、ヘッダーは返さないことです。 the docsから

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'] 

ネット:: HTTPリダイレクトを以下のためのドキュメントの例でこれを組み合わせると、リンク先のURLを見つけることができるはずです。

あなたは、おそらく多くの同じことを達成するためにCurl::http_headを使用することができます。

+0

すてきなTin Man - Net :: HTTPを見ましたしかしスピンのためにそれを取ったことはありませんでした - それを試してみてください –

+0

それは低レベルなので、あなたはいくつかの追加作業を行う必要がありますが、この目的のためにはうってつけです。そして、ドキュメントには必要なものがあるので、作業が簡単にできるはずです。 –

関連する問題