2012-01-07 68 views
1

問題是,當我在開發環境(谷歌應用程序引擎的本地服務器)中執行urlfetch.fetch(...)的POST請求時,我得到HTTP 302狀態,正如我所期望的我可以做一個重定向)。但是當我上傳應用程序並嘗試從.appspot.com運行它時,則使用403獲取響應,即「禁止」。gae urlfetch本地vs上傳

詳情:

  • URL爲https(我的銀行網站)
  • 有在請求頭餅乾
  • ..還有什麼?

看起來,遠程站點(銀行)以不同的方式看到2個請求:本地可以,「from goole」不可以。

我的Python代碼:

url1 = "https://www.ebgz.pl/detal-web/jbank/unlogged/choose/method.do?rid="+str(random.random())+"&srvc="  
    response = urlfetch.fetch(url1) 

    lparser = Link_HTMLParser() 
    lparser.feed(response.content) 
    url2 = "https://www.ebgz.pl" + lparser.frameSrc 

    hdrs = {}  
    hdrs['Referer'] = url1 

    cookie = response.headers.get('Set-Cookie') 
    if cookie: 
     hdrs['Cookie'] = cookie 

    response = urlfetch.fetch(url2, headers = hdrs) 

哪裏Link_HTMLParser是獲得幀的源鏈接(如果你看一下URL1的第一響應內容也變得清晰)簡單解析:

class Link_HTMLParser(HTMLParser): 
     def handle_starttag(self, tag, attrs): 
      if tag == "iframe": 
       for n,v in attrs: 
        if n == 'src': 
         self.frameSrc = v 

問題與第二個響應:從谷歌403和200本地gae serwer。 我在我的問題開始時提到了有關POST的問題,但無論使用哪種方法(GET或POST),都會出現問題。這是一些會議管理問題,我猜..

回答

0

當然,理論上可能銀行不允許來自某些地點(通過IP地址)的請求。顯然你可以問銀行,是否有任何限制。

注意RFC 2616說,大約403響應:

如果請求方法不是頭部和服務器希望爲什麼要求沒有得到滿足,使公衆,它應該描述的原因在拒絕實體。

因此,銀行的迴應可能還有一些細節。

您也可以設置自己的服務,使用它代替銀行的URL並記錄所有HTTP標頭。發佈到這個URL就像你發佈到銀行並進行比較,除了請求地址之外,本地計算機和「來自谷歌」的請求還有其他差異嗎?

+0

非常感謝。 403的補充是「會話關閉」,就像我沒有發送cookie或類似的東西。你對另一項服務的建議很好,我認爲這將是一個殺手級測試。但結果並沒有指出我的解決方案:1.谷歌有一個gae-special頭文件(我不相信這很重要)。 2.谷歌的請求IP是Interresting:0.1.0.40。其餘的都是一樣的(會話cookie本質上是不同的)。我會盡量在這裏發佈一小段代碼,這樣你或任何有興趣的人都可以檢查出來。 – sanchesor 2012-01-08 14:33:33

+0

這很奇怪。你確定IP地址真的是0.1.0.40嗎?這是無效的。此外,我剛剛使用'URLFetchService.fetch()'做了一個簡單的測試,並從209.85.224.95獲得了傳入連接,即從http://stackoverflow.com/questions/5591384/ip中給出的一個範圍-address-block-of-appengine-servers – 2012-01-09 02:04:28

+0

這對我來說也很奇怪。我用http://2.live-html.appspot.com/req檢查它 - 它打印請求詳細信息。 – sanchesor 2012-01-09 10:40:08