GAE 的 Braintree 错误 - 连接错误 - 5 尝试获取阻塞套接字选项

Braintree errors with GAE - Connection Errors - 5 Attempt to get blocked socket option

INFO     2015-10-09 11:07:31,718 connectionpool.py:695] Starting new HTTPS connection (1): api.sandbox.braintreegateway.com
DEBUG    2015-10-09 11:07:31,724 api_server.py:277] Handled remote_socket.Resolve in 0.0028
DEBUG    2015-10-09 11:07:31,728 api_server.py:277] Handled remote_socket.CreateSocket in 0.0009
DEBUG    2015-10-09 11:07:32,049 api_server.py:277] Handled remote_socket.Connect in 0.3168
DEBUG    2015-10-09 11:07:32,055 api_server.py:272] Exception while handling service_name: "remote_socket"
method: "GetSocketOptions"
request: "\n$d15a35d7-d299-43c1-ba76-8bf4107f88502[=10=]60[=10=]10[=10=]32[=10=]0"
request_id: "aiUMNcTaLS"

Traceback (most recent call last):
  File "/home/abc/Downloads/google-appengine/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 247, in _handle_POST
    api_response = _execute_request(request).Encode()
  File "/home/abc/Downloads/google-appengine/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 186, in _execute_request
    make_request()
  File "/home/abc/Downloads/google-appengine/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 181, in make_request
    request_id)
  File "/home/abc/Downloads/google-appengine/google_appengine/google/appengine/api/apiproxy_stub.py", line 131, in MakeSyncCall
    method(request, response)
  File "/home/abc/Downloads/google-appengine/google_appengine/google/appengine/api/remote_socket/_remote_socket_stub.py", line 56, in WrappedMethod
    return method(self, *args, **kwargs)
  File "/home/abc/Downloads/google-appengine/google_appengine/google/appengine/api/remote_socket/_remote_socket_stub.py", line 265, in _Dynamic_GetSocketOptions
    'Attempt to get blocked socket option.')
ApplicationError: ApplicationError: 5 Attempt to get blocked socket option.


DEBUG    2015-10-09 11:07:32,056 api_server.py:277] Handled remote_socket.GetSocketOptions in 0.0014
INFO     2015-10-09 11:07:32,058 views.py:570] handle_exception
INFO     2015-10-09 21:28:17,317 views.py:559] Traceback (most recent call last):

  File "/home/abc/Downloads/google-appengine/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)

  File "/home/abc/projects/src/views.py", line 806, in get
    self._callHandlingMethod(url, self.getRegexps)

  File "/home/abc/projects/src/views.py", line 883, in _callHandlingMethod
    function(*matched.groups())

  File "/home/abc/projects/src/views.py", line 2992, in buy_get
    "client_token": braintree.ClientToken.generate(),

  File "/home/abc/projects/src/lib/braintree/client_token.py", line 25, in generate
    return gateway.generate(params)

  File "/home/abc/projects/src/lib/braintree/client_token_gateway.py", line 17, in generate
    response = self.config.http().post("/client_token", params)

  File "/home/abc/projects/src/lib/braintree/util/http.py", line 49, in post
    return self.__http_do("POST", path, params)

  File "/home/abc/projects/src/lib/braintree/util/http.py", line 66, in __http_do
    status, response_body = http_strategy.http_do(http_verb, full_path, self.__headers(), request_body)

  File "/home/abc/projects/src/lib/braintree/util/http.py", line 87, in http_do
    timeout=self.config.timeout

  File "/home/abc/projects/src/lib/requests/api.py", line 92, in post
    return request('post', url, data=data, **kwargs)

  File "/home/abc/projects/src/lib/requests/api.py", line 48, in request
    return session.request(method=method, url=url, **kwargs)

  File "/home/abc/projects/src/lib/requests/sessions.py", line 451, in request
    resp = self.send(prep, **send_kwargs)

  File "/home/abc/projects/src/lib/requests/sessions.py", line 557, in send
    r = adapter.send(request, **kwargs)

  File "/home/abc/projects/src/lib/requests/adapters.py", line 407, in send
    raise ConnectionError(err, request=request)

ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

这似乎是一个 https 问题。我尝试过不同的方法

a) https://github.com/agfor/braintree-python-appengine。给我同样的错误

b) 我认为这可能是这个问题的错误 - https://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl 但是在更新所需的库时,我陷入 OpenSSL.crypto 导入失败。

帮助任何人!

看起来 braintree 正在尝试使用 GAE 不支持的套接字选项,您可以在此处查看支持的选项列表 https://cloud.google.com/appengine/docs/python/sockets/,其中还声明尝试获取不受支持的选项将引发错误

Braintree 版本 - 3.20.0 请求版本 - 2.7.0

在我朋友的帮助下,我使用了以下 hack - 在 braintree/util/http.py 方法中 - __http_do

    from google.appengine.api import urlfetch
    .....
    .....
    try:
        if http_verb in ["POST", "PUT"]:
            result = urlfetch.fetch(url=full_path,
                    payload=request_body,
                    method=urlfetch.POST,
                    headers=self.__headers())
            logging.debug('result: %r' % result)
            status = result.status_code
            response_body = result.content
            logging.debug(result.content)
        else:
            status, response_body = http_strategy.http_do(http_verb, full_path, self.__headers(), request_body)
    except Exception as e:
       .....
       .....

使用这个 hack,我能够让事情正常进行。希望这可以帮助遇到同样问题的任何人。