进一步研究了这个问题,似乎在这个文件中:
platform / google_appengine / google / appengine / api / remote_socket /
_remote_socket_stub.py ,它在常量
_MOCK_SOCKET_OPTIONS中找到了一些 模拟
的(级别,选项)套接字对,它们缺少(1、3)对,因此,我的意思是下面的级别和选项(我猜星号是所需的值):
级别(值:1):
- SOCKET_TCP_NODELAY
- SOCKET_IP_TOS
- SOCKET_SOL_SOCKET *
- SOCKET_SO_DEBUG
选项(值:3):
- SOCKET_IP_HDRINCL
- SOCKET_SO_TYPE *
- SOCKET_TCP_CORK
因此,通过设置代理,我想我要的是 SOL_SOCKET:SO_TYPE 组,但是 模拟 值又如何呢? 模拟
值是与十六进制二进制相关的字符串,如“ 00000000”(用于keepalive)和“ 01000000”(reuseaddr):https
://github.com/GoogleCloudPlatform/python-compat-runtime/blob/master/appengine-
compat/exported_appengine_sdk/google/appengine/api/remote_socket/_remote_socket_stub.py#L97
在哪里可以找到(1,3)缺失对的类似值?
以后编辑:
我添加了“ SOL_SOCKET:SO_TYPE =
80000000”组,现在它在ssl模块上中断(为了支持https而必须启用该模块;无需修补,只需在app.yaml中启用它):https:/
/pastebin.com/9KQjdEgL 通过识别套接字类型为 128
,我猜这可能是以下常量之一:
- socket.MSG_EOR
- SOMAXCONN套接字
- socket.TIPC_SRC_DROPPABLE
后来…
因此我意识到128值是上面我的小端模拟的实际值,因此我将组更改为:“ SOL_SOCKET:SO_TYPE =
01000000”,这可以识别
socket.SOCK_STREAM套接字类型,该套接字类型实际上仅用于此检查,但随后又,它会崩溃,因为
ssl无法理解GAE的自定义套接字对象:https://pastebin.com/t2pUuW2V(
<google.appengine.api.remote_socket._remote_socket.socketobject at 0x7f0cd037f690>)。在有和没有
requests猴子修补的情况下尝试了此操作。
我的结论
关于dev_appserver沙箱,GAE自定义
socket不能完全与SSL(在隧道上)一起使用,Python标准
socket不能与GAE(我想是不可补丁的)
select模块一起使用。
解决方案:将远程部署的相同行为引入本地开发环境。



