Google app engine AppEngine dev_appserver-urllib2.urlopen问题与本地主机url 更新
是在2015年7月20日发布的,所以如果您仍然遇到这种情况,您应该能够通过更新来修复它。有关确切问题和解决方案的解释,请参见下面的+jpatokal答案 原始问题 我有一个正在使用的应用程序,在本地开发时遇到了麻烦 我们有一些共享代码,可以使用Google app engine AppEngine dev_appserver-urllib2.urlopen问题与本地主机url 更新,google-app-engine,urllib2,google-app-engine-python,Google App Engine,Urllib2,Google App Engine Python,是在2015年7月20日发布的,所以如果您仍然遇到这种情况,您应该能够通过更新来修复它。有关确切问题和解决方案的解释,请参见下面的+jpatokal答案 原始问题 我有一个正在使用的应用程序,在本地开发时遇到了麻烦 我们有一些共享代码,可以使用urllib2.urlopen检查验证服务器上的应用程序。当我在本地开发时,我的应用程序上的404会被拒绝,它会从AppEngine发出请求,但请求在终端上成功了 我在端口localhost:8000上运行appengine,在localhost:8001
urllib2.urlopen
检查验证服务器上的应用程序。当我在本地开发时,我的应用程序上的404会被拒绝,它会从AppEngine发出请求,但请求在终端上成功了
我在端口localhost:8000上运行appengine,在localhost:8001上运行auth服务器
import urllib2
url = "http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE="
try:
r = urllib2.urlopen(url)
print(r.geturl())
print(r.read())
except urllib2.HTTPError as e:
print("got error: {} - {}".format(e.code, e.reason))
这导致AppEngine中出现get错误:404-未找到
似乎AppEngine正在将架构、主机和端口添加到我试图点击的url的路径部分,因为我在auth服务器上看到的是:
[02/Jul/2015 16:54:16] "GET http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE= HTTP/1.1" 404 10146
从请求头中,我们可以看到整个方案以及主机和端口作为路径的一部分传递(下面的头部分):
有没有办法不让AppEngine开发服务器在其他端口上劫持对本地主机的请求?还是我没有误解正在发生的事情?在我们的领域不同的生产环境中,一切都很好
提前感谢您的帮助,为我指明了正确的方向。这是urlfetch\u stub
实现带来的一个恼人的问题。我不确定是什么gcloudsdk版本引入了它
我已经通过修补gcloudsdk解决了这个问题——直到谷歌这么做。
这意味着这个答案很快就不重要了
查找并打开urlfetch\u stub.py
,通常可以在~/google cloud sdk/platform/google\u appengine/google/appengine/api/urlfetch\u stub.py上找到
在第380行(取决于版本)附近,查找:
full_path=urlparse.urlusplit((协议、主机、路径、查询“”)
并将其替换为:
full_path = urlparse.urlunsplit(('', '', path, query, ''))
更多信息
您正确地假设问题是路径信息头损坏。连接完成后,将传递此处的完整路径
免责声明
我可能很容易用这个补丁破坏代理请求。因为我希望谷歌能修复它,所以我不会对它太疯狂
非常清楚地说,此漏洞仅与本地应用程序开发相关-您在生产中不会看到此问题。于2015年7月20日发布,因此如果您仍然遇到此问题,您应该可以通过更新来解决此问题
下面是发生的事情的简要说明。在1.9.21之前,SDK一直使用相对路径格式化URL获取请求,如下所示:
GET /test/ HTTP/1.1
Host: 127.0.0.1:5000
在1.9.22中,为了更好地支持代理,将其更改为绝对路径:
GET http://127.0.0.1:5000/test/ HTTP/1.1
Host: 127.0.0.1:5000
根据HTTP/1.1规范,这两种格式都是完全合法的,请参阅。然而,尽管该规范可以追溯到1999年,但显然有相当多的HTTP请求处理程序没有正确解析绝对形式,而只是简单地将路径和主机连接在一起
因此,为了兼容性,以前的行为已经恢复。(除非您使用的是代理,在这种情况下RFC需要绝对路径。)AppEngine在哪里加上“/”?我不确定,我可能会误解正在发生的事情。。。在AppEngine上使用urllib2.urlopen时,上述请求上的路径\u INFO
包含“”。在标准pythonshell中使用urllib2的同一调用只会产生我所期望的/api/CheckAuthentication/
的PATH\u INFO
。我将重新措辞这个问题,我也有同样的问题。似乎只发生在url包含端口的情况下谢谢Josh。。。你知道应用程序引擎团队是否已经提交了一个bug吗?如果没有,我可以继续归档one@Aaron我想卡尔抓到了,我把它贴在谷歌集团。报告两次也无妨?;)谢谢@josh。这是bug链接,希望其他人也能启动它。所以您知道,该错误被标记为WorksAsIntented。事实证明,这与许多服务器错误处理HTTP规范的方式有关。如果您使用UWSGI HTTP,将其放在像NGINX这样的真正HTTP服务器后面将解决问题。我在UWSGI中也有一个打开的bug,@KevinDolan Jani来自谷歌这里:问题#12123已经重新打开,我们计划返回到以前在SDK 1.9.24中使用相对路径的行为。完美,感谢您的解释!我已经更新了上面的问题,指向你的链接和这个答案。哎哟,Stackoverflow-从我身上减去15分,就在Feeeels;)
GET http://127.0.0.1:5000/test/ HTTP/1.1
Host: 127.0.0.1:5000