3

GAE fetch documentationに従って、Cookie はリダイレクトでは処理されません。

Cookie はリダイレクト時に処理されません。Cookie の処理が必要な場合は、follow_redirects を False に設定し、Cookie とリダイレクトの両方を手動で処理します。

だから、私は手動の解決策を実装しようとしています:

page = urlfetch.Fetch(
    url = url,
    payload = form_data,
    method = urlfetch.POST,
    headers = headers,
    follow_redirects = False,
    deadline = 60)
cookies = ''
while page.status_code == 302:
    url = page.headers.get('location')
    if page.headers.get('set-cookie'):
        cookies = page.headers.get('set-cookie')
        headers['cookie'] = cookies
    page = urlfetch.Fetch(
        url = url,
        method = urlfetch.GET,
        headers = headers,
        follow_redirects = False,
        deadline = 60)
if page.status_code == 200 and page.content:
    self.response.out.write(page.content)

しかし、期待どおりには機能しません。私はいくつかのクッキーが欠けているように見えます:

header_msg 応答ヘッダーを含む httplib.HTTPMessage のインスタンス。同じ名前のヘッダーが複数ある可能性がある場合 (Set-Cookie ヘッダーなど)、header_msg.get_headers(header_name) を呼び出して、値をリストとして取得します。

しかし、そのheader_msgをどのように使用すればよいですか?

4

1 に答える 1

6

私が問題を理解している場合は、各応答から Cookie を収集 (および累積的に渡し) たいと考えていますが、follow_redirects=True を指定した URLFetch は最後の応答からの Cookie のみを返します。さらに、デフォルトの動作では Cookie jar が実装されていないため、後のリクエストは前のレスポンスの s にCookie対応する正しいヘッダーとともに送信されます。Set-Cookieおそらく、最初の POST は、Cookie を期待するページにリダイレクトするログイン フォームであり、これらの制限では機能しないスキームです。

そのために、コードは近いですが、cookies = page.headers.get('set-cookie')リクエストごとに以前に収集された Cookie を一掃しています。これはうまくいくはずです:

page = urlfetch.Fetch(
  url = url,
  headers = headers,
  follow_redirects = False)
cookies = []
while page.status_code == 302:
  url = page.headers.get('location')
  if page.headers.get('set-cookie'):
    cookies.extend(page.header_msg.getheaders('set-cookie'))
  headers['cookie'] = '; '.join(cookies)
  page = urlfetch.Fetch(
    url = url,
    method = urlfetch.GET,
    headers = headers,
    follow_redirects = False)
if page.status_code == 200 and page.content:
  self.response.out.write(page.content)

いくつかの注意事項:

  • が相対パスの場合Locationは、修正する必要がありますurl
  • ヘッダーが key=value だけではない場合Set-Cookie(たとえば、有効期限がある場合)、キーと値のペアだけを送信できるように、ヘッダー値を解析する必要があります。解析の支援については、 Cookieライブラリを参照してください。
  • このコードは、特定のキーに対して複数の Cookie が見つかった場合、喜んで重複した Cookie を送信Set-Cookieします。
  • リダイレクトが別のドメインに到達すると、元のドメインから Cookie が誤って送信されます。これは、セキュリティ上の問題である可能性があります。Cookie jar を適切に実装すると、ドメインとパスの制限を考慮して、いつ Cookie を受け入れて発行するかを決定できます。cookielib.CookieJarライブラリを組み込むことができます。リクエスト シーケンスが同じドメイン上にあると予想される場合は、スイッチを検出した場合に中止するだけで十分な場合があります。
于 2012-10-18T00:06:17.770 に答える