2012-03-07 2 views
0

루비 (신트라) 앱에서 컬을 사용하여 간편하게 링크 확장기를 만들었습니다.루비/컬 링크 확장 메소드가 전체 대상 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 축약 서비스를 사용하고 있는지이지만, 전체 응답이 반환 될 때까지 기다리고 위 내 컬 스크립트처럼 보인다 (즉, 1GB 파일이 될 수 있습니다!) URL을 반환하기 전에. 확장 할 링크가 상당하므로 제 3 자 링크 확장 API를 사용하고 싶지 않습니다.

누구나 전체 응답을 기다리는 대신 URL을 찾기 위해 연석을 조정할 수 있습니다.

+1

'Curl :: Easy.http_head (link)'가 작동 할 수도 있습니다. – cmason

+0

응원가 cmason - 이것과 Net :: HTTP도 실험 해보고 어떤 것이 더 빠른 지 확인하십시오. –

답변

0

나는 "HEAD"요청을 처리하기 위해 Net::HTTP을 사용하여 원하는 것을 완료했으며 그런 식으로 리디렉션을 찾습니다. 이점은 HEAD가 내용 만 반환하고 헤더 만 반환한다는 것입니다. 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

그것은 더 낮은 레벨이므로, 당신은 약간의 추가 작업을해야 할 것이지만,이 목적을 위해 그것은 아주 잘 맞습니다. 또한 문서에는 필요한 것이 있으므로 작업하기가 쉽습니다. –