2014-01-10 77 views
1

我試圖抓取一個在auth牆後按需生成的PDF文件。基於我的測試,流程如下:通過302重定向維護會話和cookie

我做了一個GET請求與幾個參數(包括身份驗證憑據)到適當的頁面。該頁面驗證我的憑據,然後處理我的請求。當請求完成處理(幾乎是即時)時,我發送一個302響應,將我重定向到生成的PDF的位置。此PDF只能通過該會話訪問。

使用瀏覽器,確實沒有什麼奇怪的事情發生。我試圖通過curlwget來做同樣的事情,沒有任何可選參數,但都失敗了。雖然(按照重定向和存儲Cookie),但我可以通過添加-L -b /tmp/cookie.txt作爲選項來獲得curl

According to the ruby-doc,使用Net::HTTP.start應該讓我接近我想要的。在玩過之後,我確實相當接近。然而,我認爲唯一的問題是我的Set-Cookie值在請求之間是不同的,即使它們在相同的start塊中使用相同的http對象。

我試圖保持它儘可能簡單,然後不斷擴大,一旦我得到了我想要的結果:

url = URI.parse("http://dev.example.com:8888/path/to/page.jsp?option1=test1&option2=test2&username=user1&password=password1") 

Net::HTTP.start(url.host, url.port) do |http| 
    # Request the first URL 
    first_req = Net::HTTP::Get.new url 
    first_res = http.request first_req 

    # Grab the 302 redirect location (it will always be relative like "../servlet/sendfile/result/543675843657843965743895642865273847328.pdf") 
    redirect_loc = URI.parse(first_res['Location'] 

    # Request the PDF 
    second_req = Net::HTTP::Get.new redirect_loc 
    second_res = http.request first_req 
end 

我也嘗試使用http.get,而不是每次都創建一個新的請求,但仍然沒有運氣。

+0

'second_req = Net :: HTTP :: Get.new(uri.path,{'Cookie'=> first_req ['Set-Cookie']})'應該有幫助。 – mudasobwa

+0

這使我找到了解決方案 - 如果您想將上述內容作爲答案發布,我會很樂意將其標記爲正確。 –

回答

1

問題出在cookie上:應該在第二個請求中傳遞。如下所示:

second_req = Net::HTTP::Get.new(uri.path, {'Cookie' => first_req['Set-Cookie']}) 
+0

謝謝。我假設在單個「會話」下執行請求會以瀏覽器的方式維護該cookie(顯然不正確)。設置cookie我自己的伎倆。 –