我正在使用谷歌应用引擎的 urlfetch 功能远程登录另一个网络服务。在开发中一切正常,但是当我转向生产时,登录过程失败。您对如何调试生产 URL 获取有任何建议吗?
我在我的 URL 获取中使用了 cookie 和其他标题(我在标题中手动设置了 cookie)。其中一个 cookie 是会话 cookie。
没有错误或异常。在生产中,向 URL 命令发布登录会返回会话 cookie,但是当您使用会话 cookie 请求页面时,它们会被忽略,并且会再次提示您输入登录信息。在开发中,一旦您获得会话 cookie,您就可以正常访问内部页面。我认为问题与保存 cookie 有关,但它们看起来是正确的,因为请求几乎相同。
这就是我所说的:
fetchresp = urlfetch.fetch(url=req.get_full_url(),
payload=req.get_data(),
method=method,
headers=all_headers,
allow_truncated=False,
follow_redirects=False,
deadline=10
)
以下是对问题的一些猜测:
- google 的 url fetch 实现的分布式特性把事情搞砸了。
- 在生产中,标头的发送顺序与开发中不同,这可能会使服务器感到困惑。
- 谷歌的一些服务器被目标服务器列入黑名单。
以下是我排除的一些假设:
- 谷歌缓存太激进了。但是在使用标头 Cache-Control: no-store 关闭缓存后我仍然遇到问题。
- Google 的 urlfetch 对目标服务器来说太快了。但是在通话之间插入延迟后我仍然遇到问题。
- Google 将一些数据附加到 User-Agent 标头。但是我已将该标题添加到开发中,但我没有遇到问题。
生产 URL 获取和开发 URL 获取之间还有哪些其他区别?你有什么调试这个的想法吗?
更新 2
(第一次更新包含在上面)我不知道这是否是我做的事情(可能会添加延迟或禁用上面提到的缓存),但现在生产环境大约有 50% 的时间工作。这绝对看起来像一个竞争条件。不幸的是,我不知道问题出在我的代码、google 的代码还是目标服务器的代码中。