\n",
13 | "status" : "broken",
14 | "statusMessage" : "requests.exceptions.SSLError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))",
15 | "statusTrace" : "self = \nsock = \nserver_side = False, do_handshake_on_connect = True, suppress_ragged_eofs = True\nserver_hostname = b'service.papaya.fm'\n\n def wrap_socket(self, sock, server_side=False,\n do_handshake_on_connect=True, suppress_ragged_eofs=True,\n server_hostname=None):\n cnx = OpenSSL.SSL.Connection(self._ctx, sock)\n \n if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3\n server_hostname = server_hostname.encode('utf-8')\n \n if server_hostname is not None:\n cnx.set_tlsext_host_name(server_hostname)\n \n cnx.set_connect_state()\n \n while True:\n try:\n> cnx.do_handshake()\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py:441: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \n\n def do_handshake(self):\n \"\"\"\n Perform an SSL handshake (usually called after renegotiate() or one of\n set_*_state()). This can raise the same exceptions as send and recv.\n \n :return: None.\n \"\"\"\n result = _lib.SSL_do_handshake(self._ssl)\n> self._raise_ssl_error(self._ssl, result)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/OpenSSL/SSL.py:1806: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nssl = , result = -1\n\n def _raise_ssl_error(self, ssl, result):\n if self._context._verify_helper is not None:\n self._context._verify_helper.raise_if_problem()\n if self._context._npn_advertise_helper is not None:\n self._context._npn_advertise_helper.raise_if_problem()\n if self._context._npn_select_helper is not None:\n self._context._npn_select_helper.raise_if_problem()\n if self._context._alpn_select_helper is not None:\n self._context._alpn_select_helper.raise_if_problem()\n if self._context._ocsp_helper is not None:\n self._context._ocsp_helper.raise_if_problem()\n \n error = _lib.SSL_get_error(ssl, result)\n if error == _lib.SSL_ERROR_WANT_READ:\n raise WantReadError()\n elif error == _lib.SSL_ERROR_WANT_WRITE:\n raise WantWriteError()\n elif error == _lib.SSL_ERROR_ZERO_RETURN:\n raise ZeroReturnError()\n elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP:\n # TODO: This is untested.\n raise WantX509LookupError()\n elif error == _lib.SSL_ERROR_SYSCALL:\n if _lib.ERR_peek_error() == 0:\n if result < 0:\n if platform == \"win32\":\n errno = _ffi.getwinerror()[0]\n else:\n errno = _ffi.errno\n \n if errno != 0:\n raise SysCallError(errno, errorcode.get(errno))\n raise SysCallError(-1, \"Unexpected EOF\")\n else:\n # TODO: This is untested.\n _raise_current_error()\n elif error == _lib.SSL_ERROR_NONE:\n pass\n else:\n> _raise_current_error()\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/OpenSSL/SSL.py:1546: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nexception_type = \n\n def exception_from_error_queue(exception_type):\n \"\"\"\n Convert an OpenSSL library failure into a Python exception.\n \n When a call to the native OpenSSL library fails, this is usually signalled\n by the return value, and an error code is stored in an error queue\n associated with the current thread. The err library provides functions to\n obtain these error codes and textual error messages.\n \"\"\"\n errors = []\n \n while True:\n error = lib.ERR_get_error()\n if error == 0:\n break\n errors.append((\n text(lib.ERR_lib_error_string(error)),\n text(lib.ERR_func_error_string(error)),\n text(lib.ERR_reason_error_string(error))))\n \n> raise exception_type(errors)\nE OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/OpenSSL/_util.py:54: Error\n\nDuring handling of the above exception, another exception occurred:\n\nself = \nmethod = 'POST', url = '/api/registerFromThirdPart'\nbody = '{\"loginOptions\": \"device_login\", \"timeZone\": \"Asia/Shanghai\", \"deviceInfoList\": [\"019F9E50-9561-4FFB-87F9-5FDD8A579B67\", \"3145728000\", \"414\", \"736\"], \"deviceId\": \"bf38b545-b766-8c2a-8ec7-e80ccf22a3b4\"}'\nheaders = {'Connection': 'keep-alive', 'Accept': '*/*', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0', 'Accept-...': 'gzip, deflate', 'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'Content-Length': '201'}\nretries = Retry(total=0, connect=None, read=False, redirect=None, status=None)\nredirect = False, assert_same_host = False\ntimeout = \npool_timeout = None, release_conn = False, chunked = False, body_pos = None\nresponse_kw = {'decode_content': False, 'preload_content': False}, conn = None\nrelease_this_conn = True, err = None, clean_exit = False\ntimeout_obj = \nis_new_proxy_conn = True\n\n def urlopen(self, method, url, body=None, headers=None, retries=None,\n redirect=True, assert_same_host=True, timeout=_Default,\n pool_timeout=None, release_conn=None, chunked=False,\n body_pos=None, **response_kw):\n \"\"\"\n Get a connection from the pool and perform an HTTP request. This is the\n lowest level call for making a request, so you'll need to specify all\n the raw details.\n \n .. note::\n \n More commonly, it's appropriate to use a convenience method provided\n by :class:`.RequestMethods`, such as :meth:`request`.\n \n .. note::\n \n `release_conn` will only behave as expected if\n `preload_content=False` because we want to make\n `preload_content=False` the default behaviour someday soon without\n breaking backwards compatibility.\n \n :param method:\n HTTP request method (such as GET, POST, PUT, etc.)\n \n :param body:\n Data to send in the request body (useful for creating\n POST requests, see HTTPConnectionPool.post_url for\n more convenience).\n \n :param headers:\n Dictionary of custom headers to send, such as User-Agent,\n If-None-Match, etc. If None, pool headers are used. If provided,\n these headers completely replace any pool-specific headers.\n \n :param retries:\n Configure the number of retries to allow before raising a\n :class:`~urllib3.exceptions.MaxRetryError` exception.\n \n Pass ``None`` to retry until you receive a response. Pass a\n :class:`~urllib3.util.retry.Retry` object for fine-grained control\n over different types of retries.\n Pass an integer number to retry connection errors that many times,\n but no other types of errors. Pass zero to never retry.\n \n If ``False``, then retries are disabled and any exception is raised\n immediately. Also, instead of raising a MaxRetryError on redirects,\n the redirect response will be returned.\n \n :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.\n \n :param redirect:\n If True, automatically handle redirects (status codes 301, 302,\n 303, 307, 308). Each redirect counts as a retry. Disabling retries\n will disable redirect, too.\n \n :param assert_same_host:\n If ``True``, will make sure that the host of the pool requests is\n consistent else will raise HostChangedError. When False, you can\n use the pool on an HTTP proxy and request foreign hosts.\n \n :param timeout:\n If specified, overrides the default timeout for this one\n request. It may be a float (in seconds) or an instance of\n :class:`urllib3.util.Timeout`.\n \n :param pool_timeout:\n If set and the pool is set to block=True, then this method will\n block for ``pool_timeout`` seconds and raise EmptyPoolError if no\n connection is available within the time period.\n \n :param release_conn:\n If False, then the urlopen call will not release the connection\n back into the pool once a response is received (but will release if\n you read the entire contents of the response such as when\n `preload_content=True`). This is useful if you're not preloading\n the response's content immediately. You will need to call\n ``r.release_conn()`` on the response ``r`` to return the connection\n back into the pool. If None, it takes the value of\n ``response_kw.get('preload_content', True)``.\n \n :param chunked:\n If True, urllib3 will send the body using chunked transfer\n encoding. Otherwise, urllib3 will send the body using the standard\n content-length form. Defaults to False.\n \n :param int body_pos:\n Position to seek to in file-like body in the event of a retry or\n redirect. Typically this won't need to be set because urllib3 will\n auto-populate the value when needed.\n \n :param \\\\**response_kw:\n Additional parameters are passed to\n :meth:`urllib3.response.HTTPResponse.from_httplib`\n \"\"\"\n if headers is None:\n headers = self.headers\n \n if not isinstance(retries, Retry):\n retries = Retry.from_int(retries, redirect=redirect, default=self.retries)\n \n if release_conn is None:\n release_conn = response_kw.get('preload_content', True)\n \n # Check host\n if assert_same_host and not self.is_same_host(url):\n raise HostChangedError(self, url, retries)\n \n conn = None\n \n # Track whether `conn` needs to be released before\n # returning/raising/recursing. Update this variable if necessary, and\n # leave `release_conn` constant throughout the function. That way, if\n # the function recurses, the original value of `release_conn` will be\n # passed down into the recursive call, and its value will be respected.\n #\n # See issue #651 [1] for details.\n #\n # [1] \n release_this_conn = release_conn\n \n # Merge the proxy headers. Only do this in HTTP. We have to copy the\n # headers dict so we can safely change it without those changes being\n # reflected in anyone else's copy.\n if self.scheme == 'http':\n headers = headers.copy()\n headers.update(self.proxy_headers)\n \n # Must keep the exception bound to a separate variable or else Python 3\n # complains about UnboundLocalError.\n err = None\n \n # Keep track of whether we cleanly exited the except block. This\n # ensures we do proper cleanup in finally.\n clean_exit = False\n \n # Rewind body position, if needed. Record current position\n # for future rewinds in the event of a redirect/retry.\n body_pos = set_file_position(body, body_pos)\n \n try:\n # Request a connection from the queue.\n timeout_obj = self._get_timeout(timeout)\n conn = self._get_conn(timeout=pool_timeout)\n \n conn.timeout = timeout_obj.connect_timeout\n \n is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)\n if is_new_proxy_conn:\n> self._prepare_proxy(conn)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connectionpool.py:595: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nconn = \n\n def _prepare_proxy(self, conn):\n \"\"\"\n Establish tunnel connection early, because otherwise httplib\n would improperly set Host: header to proxy's IP:port.\n \"\"\"\n # Python 2.7+\n try:\n set_tunnel = conn.set_tunnel\n except AttributeError: # Platform-specific: Python 2.6\n set_tunnel = conn._set_tunnel\n \n if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older\n set_tunnel(self._proxy_host, self.port)\n else:\n set_tunnel(self._proxy_host, self.port, self.proxy_headers)\n \n> conn.connect()\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connectionpool.py:816: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \n\n def connect(self):\n # Add certificate verification\n conn = self._new_conn()\n \n hostname = self.host\n if getattr(self, '_tunnel_host', None):\n # _tunnel_host was added in Python 2.6.3\n # (See: http://hg.python.org/cpython/rev/0f57b30a152f)\n \n self.sock = conn\n # Calls self._set_hostport(), so self.host is\n # self._tunnel_host below.\n self._tunnel()\n # Mark this connection as not reusable\n self.auto_open = 0\n \n # Override the host with the one we're requesting data from.\n hostname = self._tunnel_host\n \n is_time_off = datetime.date.today() < RECENT_DATE\n if is_time_off:\n warnings.warn((\n 'System time is way off (before {0}). This will probably '\n 'lead to SSL verification errors').format(RECENT_DATE),\n SystemTimeWarning\n )\n \n # Wrap socket using verification with the root certs in\n # trusted_root_certs\n if self.ssl_context is None:\n self.ssl_context = create_urllib3_context(\n ssl_version=resolve_ssl_version(self.ssl_version),\n cert_reqs=resolve_cert_reqs(self.cert_reqs),\n )\n \n context = self.ssl_context\n context.verify_mode = resolve_cert_reqs(self.cert_reqs)\n self.sock = ssl_wrap_socket(\n sock=conn,\n keyfile=self.key_file,\n certfile=self.cert_file,\n ca_certs=self.ca_certs,\n ca_cert_dir=self.ca_cert_dir,\n server_hostname=hostname,\n> ssl_context=context)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connection.py:326: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsock = \nkeyfile = None, certfile = None, cert_reqs = None\nca_certs = '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/certifi/cacert.pem'\nserver_hostname = 'service.papaya.fm', ssl_version = None, ciphers = None\nssl_context = \nca_cert_dir = None\n\n def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,\n ca_certs=None, server_hostname=None,\n ssl_version=None, ciphers=None, ssl_context=None,\n ca_cert_dir=None):\n \"\"\"\n All arguments except for server_hostname, ssl_context, and ca_cert_dir have\n the same meaning as they do when using :func:`ssl.wrap_socket`.\n \n :param server_hostname:\n When SNI is supported, the expected hostname of the certificate\n :param ssl_context:\n A pre-made :class:`SSLContext` object. If none is provided, one will\n be created using :func:`create_urllib3_context`.\n :param ciphers:\n A string of ciphers we wish the client to support. This is not\n supported on Python 2.6 as the ssl module does not support it.\n :param ca_cert_dir:\n A directory containing CA certificates in multiple separate files, as\n supported by OpenSSL's -CApath flag or the capath argument to\n SSLContext.load_verify_locations().\n \"\"\"\n context = ssl_context\n if context is None:\n # Note: This branch of code and all the variables in it are no longer\n # used by urllib3 itself. We should consider deprecating and removing\n # this code.\n context = create_urllib3_context(ssl_version, cert_reqs,\n ciphers=ciphers)\n \n if ca_certs or ca_cert_dir:\n try:\n context.load_verify_locations(ca_certs, ca_cert_dir)\n except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2\n raise SSLError(e)\n # Py33 raises FileNotFoundError which subclasses OSError\n # These are not equivalent unless we check the errno attribute\n except OSError as e: # Platform-specific: Python 3.3 and beyond\n if e.errno == errno.ENOENT:\n raise SSLError(e)\n raise\n elif getattr(context, 'load_default_certs', None) is not None:\n # try to load OS default certs; works well on Windows (require Python3.4+)\n context.load_default_certs()\n \n if certfile:\n context.load_cert_chain(certfile, keyfile)\n if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI\n> return context.wrap_socket(sock, server_hostname=server_hostname)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/util/ssl_.py:329: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nsock = \nserver_side = False, do_handshake_on_connect = True, suppress_ragged_eofs = True\nserver_hostname = b'service.papaya.fm'\n\n def wrap_socket(self, sock, server_side=False,\n do_handshake_on_connect=True, suppress_ragged_eofs=True,\n server_hostname=None):\n cnx = OpenSSL.SSL.Connection(self._ctx, sock)\n \n if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3\n server_hostname = server_hostname.encode('utf-8')\n \n if server_hostname is not None:\n cnx.set_tlsext_host_name(server_hostname)\n \n cnx.set_connect_state()\n \n while True:\n try:\n cnx.do_handshake()\n except OpenSSL.SSL.WantReadError:\n rd = util.wait_for_read(sock, sock.gettimeout())\n if not rd:\n raise timeout('select timed out')\n continue\n except OpenSSL.SSL.Error as e:\n> raise ssl.SSLError('bad handshake: %r' % e)\nE ssl.SSLError: (\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py:448: SSLError\n\nDuring handling of the above exception, another exception occurred:\n\nself = \nrequest = , stream = False\ntimeout = , verify = True\ncert = None\nproxies = OrderedDict([('http', 'http://127.0.0.1:8888'), ('https', 'http://127.0.0.1:8888')])\n\n def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):\n \"\"\"Sends PreparedRequest object. Returns Response object.\n \n :param request: The :class:`PreparedRequest ` being sent.\n :param stream: (optional) Whether to stream the request content.\n :param timeout: (optional) How long to wait for the server to send\n data before giving up, as a float, or a :ref:`(connect timeout,\n read timeout) ` tuple.\n :type timeout: float or tuple or urllib3 Timeout object\n :param verify: (optional) Either a boolean, in which case it controls whether\n we verify the server's TLS certificate, or a string, in which case it\n must be a path to a CA bundle to use\n :param cert: (optional) Any user-provided SSL certificate to be trusted.\n :param proxies: (optional) The proxies dictionary to apply to the request.\n :rtype: requests.Response\n \"\"\"\n \n conn = self.get_connection(request.url, proxies)\n \n self.cert_verify(conn, request.url, verify, cert)\n url = self.request_url(request, proxies)\n self.add_headers(request)\n \n chunked = not (request.body is None or 'Content-Length' in request.headers)\n \n if isinstance(timeout, tuple):\n try:\n connect, read = timeout\n timeout = TimeoutSauce(connect=connect, read=read)\n except ValueError as e:\n # this may raise a string formatting error.\n err = (\"Invalid timeout {0}. Pass a (connect, read) \"\n \"timeout tuple, or a single float to set \"\n \"both timeouts to the same value\".format(timeout))\n raise ValueError(err)\n elif isinstance(timeout, TimeoutSauce):\n pass\n else:\n timeout = TimeoutSauce(connect=timeout, read=timeout)\n \n try:\n if not chunked:\n resp = conn.urlopen(\n method=request.method,\n url=url,\n body=request.body,\n headers=request.headers,\n redirect=False,\n assert_same_host=False,\n preload_content=False,\n decode_content=False,\n retries=self.max_retries,\n> timeout=timeout\n )\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/adapters.py:440: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nmethod = 'POST', url = '/api/registerFromThirdPart'\nbody = '{\"loginOptions\": \"device_login\", \"timeZone\": \"Asia/Shanghai\", \"deviceInfoList\": [\"019F9E50-9561-4FFB-87F9-5FDD8A579B67\", \"3145728000\", \"414\", \"736\"], \"deviceId\": \"bf38b545-b766-8c2a-8ec7-e80ccf22a3b4\"}'\nheaders = {'Connection': 'keep-alive', 'Accept': '*/*', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0', 'Accept-...': 'gzip, deflate', 'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'Content-Length': '201'}\nretries = Retry(total=0, connect=None, read=False, redirect=None, status=None)\nredirect = False, assert_same_host = False\ntimeout = \npool_timeout = None, release_conn = False, chunked = False, body_pos = None\nresponse_kw = {'decode_content': False, 'preload_content': False}, conn = None\nrelease_this_conn = True, err = None, clean_exit = False\ntimeout_obj = \nis_new_proxy_conn = True\n\n def urlopen(self, method, url, body=None, headers=None, retries=None,\n redirect=True, assert_same_host=True, timeout=_Default,\n pool_timeout=None, release_conn=None, chunked=False,\n body_pos=None, **response_kw):\n \"\"\"\n Get a connection from the pool and perform an HTTP request. This is the\n lowest level call for making a request, so you'll need to specify all\n the raw details.\n \n .. note::\n \n More commonly, it's appropriate to use a convenience method provided\n by :class:`.RequestMethods`, such as :meth:`request`.\n \n .. note::\n \n `release_conn` will only behave as expected if\n `preload_content=False` because we want to make\n `preload_content=False` the default behaviour someday soon without\n breaking backwards compatibility.\n \n :param method:\n HTTP request method (such as GET, POST, PUT, etc.)\n \n :param body:\n Data to send in the request body (useful for creating\n POST requests, see HTTPConnectionPool.post_url for\n more convenience).\n \n :param headers:\n Dictionary of custom headers to send, such as User-Agent,\n If-None-Match, etc. If None, pool headers are used. If provided,\n these headers completely replace any pool-specific headers.\n \n :param retries:\n Configure the number of retries to allow before raising a\n :class:`~urllib3.exceptions.MaxRetryError` exception.\n \n Pass ``None`` to retry until you receive a response. Pass a\n :class:`~urllib3.util.retry.Retry` object for fine-grained control\n over different types of retries.\n Pass an integer number to retry connection errors that many times,\n but no other types of errors. Pass zero to never retry.\n \n If ``False``, then retries are disabled and any exception is raised\n immediately. Also, instead of raising a MaxRetryError on redirects,\n the redirect response will be returned.\n \n :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.\n \n :param redirect:\n If True, automatically handle redirects (status codes 301, 302,\n 303, 307, 308). Each redirect counts as a retry. Disabling retries\n will disable redirect, too.\n \n :param assert_same_host:\n If ``True``, will make sure that the host of the pool requests is\n consistent else will raise HostChangedError. When False, you can\n use the pool on an HTTP proxy and request foreign hosts.\n \n :param timeout:\n If specified, overrides the default timeout for this one\n request. It may be a float (in seconds) or an instance of\n :class:`urllib3.util.Timeout`.\n \n :param pool_timeout:\n If set and the pool is set to block=True, then this method will\n block for ``pool_timeout`` seconds and raise EmptyPoolError if no\n connection is available within the time period.\n \n :param release_conn:\n If False, then the urlopen call will not release the connection\n back into the pool once a response is received (but will release if\n you read the entire contents of the response such as when\n `preload_content=True`). This is useful if you're not preloading\n the response's content immediately. You will need to call\n ``r.release_conn()`` on the response ``r`` to return the connection\n back into the pool. If None, it takes the value of\n ``response_kw.get('preload_content', True)``.\n \n :param chunked:\n If True, urllib3 will send the body using chunked transfer\n encoding. Otherwise, urllib3 will send the body using the standard\n content-length form. Defaults to False.\n \n :param int body_pos:\n Position to seek to in file-like body in the event of a retry or\n redirect. Typically this won't need to be set because urllib3 will\n auto-populate the value when needed.\n \n :param \\\\**response_kw:\n Additional parameters are passed to\n :meth:`urllib3.response.HTTPResponse.from_httplib`\n \"\"\"\n if headers is None:\n headers = self.headers\n \n if not isinstance(retries, Retry):\n retries = Retry.from_int(retries, redirect=redirect, default=self.retries)\n \n if release_conn is None:\n release_conn = response_kw.get('preload_content', True)\n \n # Check host\n if assert_same_host and not self.is_same_host(url):\n raise HostChangedError(self, url, retries)\n \n conn = None\n \n # Track whether `conn` needs to be released before\n # returning/raising/recursing. Update this variable if necessary, and\n # leave `release_conn` constant throughout the function. That way, if\n # the function recurses, the original value of `release_conn` will be\n # passed down into the recursive call, and its value will be respected.\n #\n # See issue #651 [1] for details.\n #\n # [1] \n release_this_conn = release_conn\n \n # Merge the proxy headers. Only do this in HTTP. We have to copy the\n # headers dict so we can safely change it without those changes being\n # reflected in anyone else's copy.\n if self.scheme == 'http':\n headers = headers.copy()\n headers.update(self.proxy_headers)\n \n # Must keep the exception bound to a separate variable or else Python 3\n # complains about UnboundLocalError.\n err = None\n \n # Keep track of whether we cleanly exited the except block. This\n # ensures we do proper cleanup in finally.\n clean_exit = False\n \n # Rewind body position, if needed. Record current position\n # for future rewinds in the event of a redirect/retry.\n body_pos = set_file_position(body, body_pos)\n \n try:\n # Request a connection from the queue.\n timeout_obj = self._get_timeout(timeout)\n conn = self._get_conn(timeout=pool_timeout)\n \n conn.timeout = timeout_obj.connect_timeout\n \n is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)\n if is_new_proxy_conn:\n self._prepare_proxy(conn)\n \n # Make the request on the httplib connection object.\n httplib_response = self._make_request(conn, method, url,\n timeout=timeout_obj,\n body=body, headers=headers,\n chunked=chunked)\n \n # If we're going to release the connection in ``finally:``, then\n # the response doesn't need to know about the connection. Otherwise\n # it will also try to release it and we'll have a double-release\n # mess.\n response_conn = conn if not release_conn else None\n \n # Pass method to Response for length checking\n response_kw['request_method'] = method\n \n # Import httplib's response into our own wrapper object\n response = self.ResponseCls.from_httplib(httplib_response,\n pool=self,\n connection=response_conn,\n retries=retries,\n **response_kw)\n \n # Everything went great!\n clean_exit = True\n \n except queue.Empty:\n # Timed out by queue.\n raise EmptyPoolError(self, \"No pool connections are available.\")\n \n except (TimeoutError, HTTPException, SocketError, ProtocolError,\n BaseSSLError, SSLError, CertificateError) as e:\n # Discard the connection for these exceptions. It will be\n # replaced during the next _get_conn() call.\n clean_exit = False\n if isinstance(e, (BaseSSLError, CertificateError)):\n e = SSLError(e)\n elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy:\n e = ProxyError('Cannot connect to proxy.', e)\n elif isinstance(e, (SocketError, HTTPException)):\n e = ProtocolError('Connection aborted.', e)\n \n retries = retries.increment(method, url, error=e, _pool=self,\n> _stacktrace=sys.exc_info()[2])\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connectionpool.py:639: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = Retry(total=0, connect=None, read=False, redirect=None, status=None)\nmethod = 'POST', url = '/api/registerFromThirdPart', response = None\nerror = SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),)\n_pool = \n_stacktrace = \n\n def increment(self, method=None, url=None, response=None, error=None,\n _pool=None, _stacktrace=None):\n \"\"\" Return a new Retry object with incremented retry counters.\n \n :param response: A response object, or None, if the server did not\n return a response.\n :type response: :class:`~urllib3.response.HTTPResponse`\n :param Exception error: An error encountered during the request, or\n None if the response was received successfully.\n \n :return: A new ``Retry`` object.\n \"\"\"\n if self.total is False and error:\n # Disabled, indicate to re-raise the error.\n raise six.reraise(type(error), error, _stacktrace)\n \n total = self.total\n if total is not None:\n total -= 1\n \n connect = self.connect\n read = self.read\n redirect = self.redirect\n status_count = self.status\n cause = 'unknown'\n status = None\n redirect_location = None\n \n if error and self._is_connection_error(error):\n # Connect retry?\n if connect is False:\n raise six.reraise(type(error), error, _stacktrace)\n elif connect is not None:\n connect -= 1\n \n elif error and self._is_read_error(error):\n # Read retry?\n if read is False or not self._is_method_retryable(method):\n raise six.reraise(type(error), error, _stacktrace)\n elif read is not None:\n read -= 1\n \n elif response and response.get_redirect_location():\n # Redirect retry?\n if redirect is not None:\n redirect -= 1\n cause = 'too many redirects'\n redirect_location = response.get_redirect_location()\n status = response.status\n \n else:\n # Incrementing because of a server error like a 500 in\n # status_forcelist and a the given method is in the whitelist\n cause = ResponseError.GENERIC_ERROR\n if response and response.status:\n if status_count is not None:\n status_count -= 1\n cause = ResponseError.SPECIFIC_ERROR.format(\n status_code=response.status)\n status = response.status\n \n history = self.history + (RequestHistory(method, url, error, status, redirect_location),)\n \n new_retry = self.new(\n total=total,\n connect=connect, read=read, redirect=redirect, status=status_count,\n history=history)\n \n if new_retry.is_exhausted():\n> raise MaxRetryError(_pool, url, error or ResponseError(cause))\nE urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/util/retry.py:388: MaxRetryError\n\nDuring handling of the above exception, another exception occurred:\n\nself = \ncase_data = {'address': '/api/registerFromThirdPart', 'check': {'check_type': 'json', 'expected_code': 200, 'expected_request': 'result_registerFromThirdPart.json'}, 'cookies': False, 'file': False, ...}\n\n @pytest.mark.parametrize(\"case_data\", case_dict[\"test_case\"], ids=[])\n @allure.story(\"registerFromThirdPart\")\n # @pytest.mark.flaky(reruns=3, reruns_delay=3)\n def test_registerfromthirdpart(self, case_data):\n \"\"\"\n \n :param case_data: 测试用例\n :return:\n \"\"\"\n self.init_relevance = ini_request(case_dict, PATH)\n # 发送测试请求\n> api_send_check(case_data, case_dict, self.init_relevance, PATH)\n\ncrm/testcase/api/test_registerFromThirdPart.py:33: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nbin/unit/apiSendCheck.py:23: in api_send_check\n project_dict[\"test_info\"].get(\"address\"), _path, relevance)\nbin/unit/apiSend.py:81: in send_request\n timeout=data[\"timeout\"])\nbin/unit/apiMethod.py:49: in post\n response = requests.post(url=address, data=data, headers=header, timeout=timeout)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/api.py:112: in post\n return request('post', url, data=data, json=json, **kwargs)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/api.py:58: in request\n return session.request(method=method, url=url, **kwargs)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/sessions.py:508: in request\n resp = self.send(prep, **send_kwargs)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/sessions.py:618: in send\n r = adapter.send(request, **kwargs)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nrequest = , stream = False\ntimeout = , verify = True\ncert = None\nproxies = OrderedDict([('http', 'http://127.0.0.1:8888'), ('https', 'http://127.0.0.1:8888')])\n\n def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):\n \"\"\"Sends PreparedRequest object. Returns Response object.\n \n :param request: The :class:`PreparedRequest ` being sent.\n :param stream: (optional) Whether to stream the request content.\n :param timeout: (optional) How long to wait for the server to send\n data before giving up, as a float, or a :ref:`(connect timeout,\n read timeout) ` tuple.\n :type timeout: float or tuple or urllib3 Timeout object\n :param verify: (optional) Either a boolean, in which case it controls whether\n we verify the server's TLS certificate, or a string, in which case it\n must be a path to a CA bundle to use\n :param cert: (optional) Any user-provided SSL certificate to be trusted.\n :param proxies: (optional) The proxies dictionary to apply to the request.\n :rtype: requests.Response\n \"\"\"\n \n conn = self.get_connection(request.url, proxies)\n \n self.cert_verify(conn, request.url, verify, cert)\n url = self.request_url(request, proxies)\n self.add_headers(request)\n \n chunked = not (request.body is None or 'Content-Length' in request.headers)\n \n if isinstance(timeout, tuple):\n try:\n connect, read = timeout\n timeout = TimeoutSauce(connect=connect, read=read)\n except ValueError as e:\n # this may raise a string formatting error.\n err = (\"Invalid timeout {0}. Pass a (connect, read) \"\n \"timeout tuple, or a single float to set \"\n \"both timeouts to the same value\".format(timeout))\n raise ValueError(err)\n elif isinstance(timeout, TimeoutSauce):\n pass\n else:\n timeout = TimeoutSauce(connect=timeout, read=timeout)\n \n try:\n if not chunked:\n resp = conn.urlopen(\n method=request.method,\n url=url,\n body=request.body,\n headers=request.headers,\n redirect=False,\n assert_same_host=False,\n preload_content=False,\n decode_content=False,\n retries=self.max_retries,\n timeout=timeout\n )\n \n # Send the request.\n else:\n if hasattr(conn, 'proxy_pool'):\n conn = conn.proxy_pool\n \n low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)\n \n try:\n low_conn.putrequest(request.method,\n url,\n skip_accept_encoding=True)\n \n for header, value in request.headers.items():\n low_conn.putheader(header, value)\n \n low_conn.endheaders()\n \n for i in request.body:\n low_conn.send(hex(len(i))[2:].encode('utf-8'))\n low_conn.send(b'\\r\\n')\n low_conn.send(i)\n low_conn.send(b'\\r\\n')\n low_conn.send(b'0\\r\\n\\r\\n')\n \n # Receive the response from the server\n try:\n # For Python 2.7+ versions, use buffering of HTTP\n # responses\n r = low_conn.getresponse(buffering=True)\n except TypeError:\n # For compatibility with Python 2.6 versions and back\n r = low_conn.getresponse()\n \n resp = HTTPResponse.from_httplib(\n r,\n pool=conn,\n connection=low_conn,\n preload_content=False,\n decode_content=False\n )\n except:\n # If we hit any problems here, clean up the connection.\n # Then, reraise so that we can handle the actual exception.\n low_conn.close()\n raise\n \n except (ProtocolError, socket.error) as err:\n raise ConnectionError(err, request=request)\n \n except MaxRetryError as e:\n if isinstance(e.reason, ConnectTimeoutError):\n # TODO: Remove this in 3.0.0: see #2811\n if not isinstance(e.reason, NewConnectionError):\n raise ConnectTimeout(e, request=request)\n \n if isinstance(e.reason, ResponseError):\n raise RetryError(e, request=request)\n \n if isinstance(e.reason, _ProxyError):\n raise ProxyError(e, request=request)\n \n if isinstance(e.reason, _SSLError):\n # This branch is for urllib3 v1.22 and later.\n> raise SSLError(e, request=request)\nE requests.exceptions.SSLError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/adapters.py:506: SSLError",
16 | "flaky" : false,
17 | "newFailed" : false,
18 | "beforeStages" : [ ],
19 | "testStage" : {
20 | "description" : "\n\n :param case_data: 测试用例\n :return:\n ",
21 | "status" : "broken",
22 | "statusMessage" : "requests.exceptions.SSLError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))",
23 | "statusTrace" : "self = \nsock = \nserver_side = False, do_handshake_on_connect = True, suppress_ragged_eofs = True\nserver_hostname = b'service.papaya.fm'\n\n def wrap_socket(self, sock, server_side=False,\n do_handshake_on_connect=True, suppress_ragged_eofs=True,\n server_hostname=None):\n cnx = OpenSSL.SSL.Connection(self._ctx, sock)\n \n if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3\n server_hostname = server_hostname.encode('utf-8')\n \n if server_hostname is not None:\n cnx.set_tlsext_host_name(server_hostname)\n \n cnx.set_connect_state()\n \n while True:\n try:\n> cnx.do_handshake()\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py:441: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \n\n def do_handshake(self):\n \"\"\"\n Perform an SSL handshake (usually called after renegotiate() or one of\n set_*_state()). This can raise the same exceptions as send and recv.\n \n :return: None.\n \"\"\"\n result = _lib.SSL_do_handshake(self._ssl)\n> self._raise_ssl_error(self._ssl, result)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/OpenSSL/SSL.py:1806: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nssl = , result = -1\n\n def _raise_ssl_error(self, ssl, result):\n if self._context._verify_helper is not None:\n self._context._verify_helper.raise_if_problem()\n if self._context._npn_advertise_helper is not None:\n self._context._npn_advertise_helper.raise_if_problem()\n if self._context._npn_select_helper is not None:\n self._context._npn_select_helper.raise_if_problem()\n if self._context._alpn_select_helper is not None:\n self._context._alpn_select_helper.raise_if_problem()\n if self._context._ocsp_helper is not None:\n self._context._ocsp_helper.raise_if_problem()\n \n error = _lib.SSL_get_error(ssl, result)\n if error == _lib.SSL_ERROR_WANT_READ:\n raise WantReadError()\n elif error == _lib.SSL_ERROR_WANT_WRITE:\n raise WantWriteError()\n elif error == _lib.SSL_ERROR_ZERO_RETURN:\n raise ZeroReturnError()\n elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP:\n # TODO: This is untested.\n raise WantX509LookupError()\n elif error == _lib.SSL_ERROR_SYSCALL:\n if _lib.ERR_peek_error() == 0:\n if result < 0:\n if platform == \"win32\":\n errno = _ffi.getwinerror()[0]\n else:\n errno = _ffi.errno\n \n if errno != 0:\n raise SysCallError(errno, errorcode.get(errno))\n raise SysCallError(-1, \"Unexpected EOF\")\n else:\n # TODO: This is untested.\n _raise_current_error()\n elif error == _lib.SSL_ERROR_NONE:\n pass\n else:\n> _raise_current_error()\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/OpenSSL/SSL.py:1546: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nexception_type = \n\n def exception_from_error_queue(exception_type):\n \"\"\"\n Convert an OpenSSL library failure into a Python exception.\n \n When a call to the native OpenSSL library fails, this is usually signalled\n by the return value, and an error code is stored in an error queue\n associated with the current thread. The err library provides functions to\n obtain these error codes and textual error messages.\n \"\"\"\n errors = []\n \n while True:\n error = lib.ERR_get_error()\n if error == 0:\n break\n errors.append((\n text(lib.ERR_lib_error_string(error)),\n text(lib.ERR_func_error_string(error)),\n text(lib.ERR_reason_error_string(error))))\n \n> raise exception_type(errors)\nE OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/OpenSSL/_util.py:54: Error\n\nDuring handling of the above exception, another exception occurred:\n\nself = \nmethod = 'POST', url = '/api/registerFromThirdPart'\nbody = '{\"loginOptions\": \"device_login\", \"timeZone\": \"Asia/Shanghai\", \"deviceInfoList\": [\"019F9E50-9561-4FFB-87F9-5FDD8A579B67\", \"3145728000\", \"414\", \"736\"], \"deviceId\": \"bf38b545-b766-8c2a-8ec7-e80ccf22a3b4\"}'\nheaders = {'Connection': 'keep-alive', 'Accept': '*/*', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0', 'Accept-...': 'gzip, deflate', 'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'Content-Length': '201'}\nretries = Retry(total=0, connect=None, read=False, redirect=None, status=None)\nredirect = False, assert_same_host = False\ntimeout = \npool_timeout = None, release_conn = False, chunked = False, body_pos = None\nresponse_kw = {'decode_content': False, 'preload_content': False}, conn = None\nrelease_this_conn = True, err = None, clean_exit = False\ntimeout_obj = \nis_new_proxy_conn = True\n\n def urlopen(self, method, url, body=None, headers=None, retries=None,\n redirect=True, assert_same_host=True, timeout=_Default,\n pool_timeout=None, release_conn=None, chunked=False,\n body_pos=None, **response_kw):\n \"\"\"\n Get a connection from the pool and perform an HTTP request. This is the\n lowest level call for making a request, so you'll need to specify all\n the raw details.\n \n .. note::\n \n More commonly, it's appropriate to use a convenience method provided\n by :class:`.RequestMethods`, such as :meth:`request`.\n \n .. note::\n \n `release_conn` will only behave as expected if\n `preload_content=False` because we want to make\n `preload_content=False` the default behaviour someday soon without\n breaking backwards compatibility.\n \n :param method:\n HTTP request method (such as GET, POST, PUT, etc.)\n \n :param body:\n Data to send in the request body (useful for creating\n POST requests, see HTTPConnectionPool.post_url for\n more convenience).\n \n :param headers:\n Dictionary of custom headers to send, such as User-Agent,\n If-None-Match, etc. If None, pool headers are used. If provided,\n these headers completely replace any pool-specific headers.\n \n :param retries:\n Configure the number of retries to allow before raising a\n :class:`~urllib3.exceptions.MaxRetryError` exception.\n \n Pass ``None`` to retry until you receive a response. Pass a\n :class:`~urllib3.util.retry.Retry` object for fine-grained control\n over different types of retries.\n Pass an integer number to retry connection errors that many times,\n but no other types of errors. Pass zero to never retry.\n \n If ``False``, then retries are disabled and any exception is raised\n immediately. Also, instead of raising a MaxRetryError on redirects,\n the redirect response will be returned.\n \n :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.\n \n :param redirect:\n If True, automatically handle redirects (status codes 301, 302,\n 303, 307, 308). Each redirect counts as a retry. Disabling retries\n will disable redirect, too.\n \n :param assert_same_host:\n If ``True``, will make sure that the host of the pool requests is\n consistent else will raise HostChangedError. When False, you can\n use the pool on an HTTP proxy and request foreign hosts.\n \n :param timeout:\n If specified, overrides the default timeout for this one\n request. It may be a float (in seconds) or an instance of\n :class:`urllib3.util.Timeout`.\n \n :param pool_timeout:\n If set and the pool is set to block=True, then this method will\n block for ``pool_timeout`` seconds and raise EmptyPoolError if no\n connection is available within the time period.\n \n :param release_conn:\n If False, then the urlopen call will not release the connection\n back into the pool once a response is received (but will release if\n you read the entire contents of the response such as when\n `preload_content=True`). This is useful if you're not preloading\n the response's content immediately. You will need to call\n ``r.release_conn()`` on the response ``r`` to return the connection\n back into the pool. If None, it takes the value of\n ``response_kw.get('preload_content', True)``.\n \n :param chunked:\n If True, urllib3 will send the body using chunked transfer\n encoding. Otherwise, urllib3 will send the body using the standard\n content-length form. Defaults to False.\n \n :param int body_pos:\n Position to seek to in file-like body in the event of a retry or\n redirect. Typically this won't need to be set because urllib3 will\n auto-populate the value when needed.\n \n :param \\\\**response_kw:\n Additional parameters are passed to\n :meth:`urllib3.response.HTTPResponse.from_httplib`\n \"\"\"\n if headers is None:\n headers = self.headers\n \n if not isinstance(retries, Retry):\n retries = Retry.from_int(retries, redirect=redirect, default=self.retries)\n \n if release_conn is None:\n release_conn = response_kw.get('preload_content', True)\n \n # Check host\n if assert_same_host and not self.is_same_host(url):\n raise HostChangedError(self, url, retries)\n \n conn = None\n \n # Track whether `conn` needs to be released before\n # returning/raising/recursing. Update this variable if necessary, and\n # leave `release_conn` constant throughout the function. That way, if\n # the function recurses, the original value of `release_conn` will be\n # passed down into the recursive call, and its value will be respected.\n #\n # See issue #651 [1] for details.\n #\n # [1] \n release_this_conn = release_conn\n \n # Merge the proxy headers. Only do this in HTTP. We have to copy the\n # headers dict so we can safely change it without those changes being\n # reflected in anyone else's copy.\n if self.scheme == 'http':\n headers = headers.copy()\n headers.update(self.proxy_headers)\n \n # Must keep the exception bound to a separate variable or else Python 3\n # complains about UnboundLocalError.\n err = None\n \n # Keep track of whether we cleanly exited the except block. This\n # ensures we do proper cleanup in finally.\n clean_exit = False\n \n # Rewind body position, if needed. Record current position\n # for future rewinds in the event of a redirect/retry.\n body_pos = set_file_position(body, body_pos)\n \n try:\n # Request a connection from the queue.\n timeout_obj = self._get_timeout(timeout)\n conn = self._get_conn(timeout=pool_timeout)\n \n conn.timeout = timeout_obj.connect_timeout\n \n is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)\n if is_new_proxy_conn:\n> self._prepare_proxy(conn)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connectionpool.py:595: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nconn = \n\n def _prepare_proxy(self, conn):\n \"\"\"\n Establish tunnel connection early, because otherwise httplib\n would improperly set Host: header to proxy's IP:port.\n \"\"\"\n # Python 2.7+\n try:\n set_tunnel = conn.set_tunnel\n except AttributeError: # Platform-specific: Python 2.6\n set_tunnel = conn._set_tunnel\n \n if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older\n set_tunnel(self._proxy_host, self.port)\n else:\n set_tunnel(self._proxy_host, self.port, self.proxy_headers)\n \n> conn.connect()\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connectionpool.py:816: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \n\n def connect(self):\n # Add certificate verification\n conn = self._new_conn()\n \n hostname = self.host\n if getattr(self, '_tunnel_host', None):\n # _tunnel_host was added in Python 2.6.3\n # (See: http://hg.python.org/cpython/rev/0f57b30a152f)\n \n self.sock = conn\n # Calls self._set_hostport(), so self.host is\n # self._tunnel_host below.\n self._tunnel()\n # Mark this connection as not reusable\n self.auto_open = 0\n \n # Override the host with the one we're requesting data from.\n hostname = self._tunnel_host\n \n is_time_off = datetime.date.today() < RECENT_DATE\n if is_time_off:\n warnings.warn((\n 'System time is way off (before {0}). This will probably '\n 'lead to SSL verification errors').format(RECENT_DATE),\n SystemTimeWarning\n )\n \n # Wrap socket using verification with the root certs in\n # trusted_root_certs\n if self.ssl_context is None:\n self.ssl_context = create_urllib3_context(\n ssl_version=resolve_ssl_version(self.ssl_version),\n cert_reqs=resolve_cert_reqs(self.cert_reqs),\n )\n \n context = self.ssl_context\n context.verify_mode = resolve_cert_reqs(self.cert_reqs)\n self.sock = ssl_wrap_socket(\n sock=conn,\n keyfile=self.key_file,\n certfile=self.cert_file,\n ca_certs=self.ca_certs,\n ca_cert_dir=self.ca_cert_dir,\n server_hostname=hostname,\n> ssl_context=context)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connection.py:326: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsock = \nkeyfile = None, certfile = None, cert_reqs = None\nca_certs = '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/certifi/cacert.pem'\nserver_hostname = 'service.papaya.fm', ssl_version = None, ciphers = None\nssl_context = \nca_cert_dir = None\n\n def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,\n ca_certs=None, server_hostname=None,\n ssl_version=None, ciphers=None, ssl_context=None,\n ca_cert_dir=None):\n \"\"\"\n All arguments except for server_hostname, ssl_context, and ca_cert_dir have\n the same meaning as they do when using :func:`ssl.wrap_socket`.\n \n :param server_hostname:\n When SNI is supported, the expected hostname of the certificate\n :param ssl_context:\n A pre-made :class:`SSLContext` object. If none is provided, one will\n be created using :func:`create_urllib3_context`.\n :param ciphers:\n A string of ciphers we wish the client to support. This is not\n supported on Python 2.6 as the ssl module does not support it.\n :param ca_cert_dir:\n A directory containing CA certificates in multiple separate files, as\n supported by OpenSSL's -CApath flag or the capath argument to\n SSLContext.load_verify_locations().\n \"\"\"\n context = ssl_context\n if context is None:\n # Note: This branch of code and all the variables in it are no longer\n # used by urllib3 itself. We should consider deprecating and removing\n # this code.\n context = create_urllib3_context(ssl_version, cert_reqs,\n ciphers=ciphers)\n \n if ca_certs or ca_cert_dir:\n try:\n context.load_verify_locations(ca_certs, ca_cert_dir)\n except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2\n raise SSLError(e)\n # Py33 raises FileNotFoundError which subclasses OSError\n # These are not equivalent unless we check the errno attribute\n except OSError as e: # Platform-specific: Python 3.3 and beyond\n if e.errno == errno.ENOENT:\n raise SSLError(e)\n raise\n elif getattr(context, 'load_default_certs', None) is not None:\n # try to load OS default certs; works well on Windows (require Python3.4+)\n context.load_default_certs()\n \n if certfile:\n context.load_cert_chain(certfile, keyfile)\n if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI\n> return context.wrap_socket(sock, server_hostname=server_hostname)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/util/ssl_.py:329: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nsock = \nserver_side = False, do_handshake_on_connect = True, suppress_ragged_eofs = True\nserver_hostname = b'service.papaya.fm'\n\n def wrap_socket(self, sock, server_side=False,\n do_handshake_on_connect=True, suppress_ragged_eofs=True,\n server_hostname=None):\n cnx = OpenSSL.SSL.Connection(self._ctx, sock)\n \n if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3\n server_hostname = server_hostname.encode('utf-8')\n \n if server_hostname is not None:\n cnx.set_tlsext_host_name(server_hostname)\n \n cnx.set_connect_state()\n \n while True:\n try:\n cnx.do_handshake()\n except OpenSSL.SSL.WantReadError:\n rd = util.wait_for_read(sock, sock.gettimeout())\n if not rd:\n raise timeout('select timed out')\n continue\n except OpenSSL.SSL.Error as e:\n> raise ssl.SSLError('bad handshake: %r' % e)\nE ssl.SSLError: (\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",)\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/contrib/pyopenssl.py:448: SSLError\n\nDuring handling of the above exception, another exception occurred:\n\nself = \nrequest = , stream = False\ntimeout = , verify = True\ncert = None\nproxies = OrderedDict([('http', 'http://127.0.0.1:8888'), ('https', 'http://127.0.0.1:8888')])\n\n def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):\n \"\"\"Sends PreparedRequest object. Returns Response object.\n \n :param request: The :class:`PreparedRequest ` being sent.\n :param stream: (optional) Whether to stream the request content.\n :param timeout: (optional) How long to wait for the server to send\n data before giving up, as a float, or a :ref:`(connect timeout,\n read timeout) ` tuple.\n :type timeout: float or tuple or urllib3 Timeout object\n :param verify: (optional) Either a boolean, in which case it controls whether\n we verify the server's TLS certificate, or a string, in which case it\n must be a path to a CA bundle to use\n :param cert: (optional) Any user-provided SSL certificate to be trusted.\n :param proxies: (optional) The proxies dictionary to apply to the request.\n :rtype: requests.Response\n \"\"\"\n \n conn = self.get_connection(request.url, proxies)\n \n self.cert_verify(conn, request.url, verify, cert)\n url = self.request_url(request, proxies)\n self.add_headers(request)\n \n chunked = not (request.body is None or 'Content-Length' in request.headers)\n \n if isinstance(timeout, tuple):\n try:\n connect, read = timeout\n timeout = TimeoutSauce(connect=connect, read=read)\n except ValueError as e:\n # this may raise a string formatting error.\n err = (\"Invalid timeout {0}. Pass a (connect, read) \"\n \"timeout tuple, or a single float to set \"\n \"both timeouts to the same value\".format(timeout))\n raise ValueError(err)\n elif isinstance(timeout, TimeoutSauce):\n pass\n else:\n timeout = TimeoutSauce(connect=timeout, read=timeout)\n \n try:\n if not chunked:\n resp = conn.urlopen(\n method=request.method,\n url=url,\n body=request.body,\n headers=request.headers,\n redirect=False,\n assert_same_host=False,\n preload_content=False,\n decode_content=False,\n retries=self.max_retries,\n> timeout=timeout\n )\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/adapters.py:440: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nmethod = 'POST', url = '/api/registerFromThirdPart'\nbody = '{\"loginOptions\": \"device_login\", \"timeZone\": \"Asia/Shanghai\", \"deviceInfoList\": [\"019F9E50-9561-4FFB-87F9-5FDD8A579B67\", \"3145728000\", \"414\", \"736\"], \"deviceId\": \"bf38b545-b766-8c2a-8ec7-e80ccf22a3b4\"}'\nheaders = {'Connection': 'keep-alive', 'Accept': '*/*', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0', 'Accept-...': 'gzip, deflate', 'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'Content-Length': '201'}\nretries = Retry(total=0, connect=None, read=False, redirect=None, status=None)\nredirect = False, assert_same_host = False\ntimeout = \npool_timeout = None, release_conn = False, chunked = False, body_pos = None\nresponse_kw = {'decode_content': False, 'preload_content': False}, conn = None\nrelease_this_conn = True, err = None, clean_exit = False\ntimeout_obj = \nis_new_proxy_conn = True\n\n def urlopen(self, method, url, body=None, headers=None, retries=None,\n redirect=True, assert_same_host=True, timeout=_Default,\n pool_timeout=None, release_conn=None, chunked=False,\n body_pos=None, **response_kw):\n \"\"\"\n Get a connection from the pool and perform an HTTP request. This is the\n lowest level call for making a request, so you'll need to specify all\n the raw details.\n \n .. note::\n \n More commonly, it's appropriate to use a convenience method provided\n by :class:`.RequestMethods`, such as :meth:`request`.\n \n .. note::\n \n `release_conn` will only behave as expected if\n `preload_content=False` because we want to make\n `preload_content=False` the default behaviour someday soon without\n breaking backwards compatibility.\n \n :param method:\n HTTP request method (such as GET, POST, PUT, etc.)\n \n :param body:\n Data to send in the request body (useful for creating\n POST requests, see HTTPConnectionPool.post_url for\n more convenience).\n \n :param headers:\n Dictionary of custom headers to send, such as User-Agent,\n If-None-Match, etc. If None, pool headers are used. If provided,\n these headers completely replace any pool-specific headers.\n \n :param retries:\n Configure the number of retries to allow before raising a\n :class:`~urllib3.exceptions.MaxRetryError` exception.\n \n Pass ``None`` to retry until you receive a response. Pass a\n :class:`~urllib3.util.retry.Retry` object for fine-grained control\n over different types of retries.\n Pass an integer number to retry connection errors that many times,\n but no other types of errors. Pass zero to never retry.\n \n If ``False``, then retries are disabled and any exception is raised\n immediately. Also, instead of raising a MaxRetryError on redirects,\n the redirect response will be returned.\n \n :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.\n \n :param redirect:\n If True, automatically handle redirects (status codes 301, 302,\n 303, 307, 308). Each redirect counts as a retry. Disabling retries\n will disable redirect, too.\n \n :param assert_same_host:\n If ``True``, will make sure that the host of the pool requests is\n consistent else will raise HostChangedError. When False, you can\n use the pool on an HTTP proxy and request foreign hosts.\n \n :param timeout:\n If specified, overrides the default timeout for this one\n request. It may be a float (in seconds) or an instance of\n :class:`urllib3.util.Timeout`.\n \n :param pool_timeout:\n If set and the pool is set to block=True, then this method will\n block for ``pool_timeout`` seconds and raise EmptyPoolError if no\n connection is available within the time period.\n \n :param release_conn:\n If False, then the urlopen call will not release the connection\n back into the pool once a response is received (but will release if\n you read the entire contents of the response such as when\n `preload_content=True`). This is useful if you're not preloading\n the response's content immediately. You will need to call\n ``r.release_conn()`` on the response ``r`` to return the connection\n back into the pool. If None, it takes the value of\n ``response_kw.get('preload_content', True)``.\n \n :param chunked:\n If True, urllib3 will send the body using chunked transfer\n encoding. Otherwise, urllib3 will send the body using the standard\n content-length form. Defaults to False.\n \n :param int body_pos:\n Position to seek to in file-like body in the event of a retry or\n redirect. Typically this won't need to be set because urllib3 will\n auto-populate the value when needed.\n \n :param \\\\**response_kw:\n Additional parameters are passed to\n :meth:`urllib3.response.HTTPResponse.from_httplib`\n \"\"\"\n if headers is None:\n headers = self.headers\n \n if not isinstance(retries, Retry):\n retries = Retry.from_int(retries, redirect=redirect, default=self.retries)\n \n if release_conn is None:\n release_conn = response_kw.get('preload_content', True)\n \n # Check host\n if assert_same_host and not self.is_same_host(url):\n raise HostChangedError(self, url, retries)\n \n conn = None\n \n # Track whether `conn` needs to be released before\n # returning/raising/recursing. Update this variable if necessary, and\n # leave `release_conn` constant throughout the function. That way, if\n # the function recurses, the original value of `release_conn` will be\n # passed down into the recursive call, and its value will be respected.\n #\n # See issue #651 [1] for details.\n #\n # [1] \n release_this_conn = release_conn\n \n # Merge the proxy headers. Only do this in HTTP. We have to copy the\n # headers dict so we can safely change it without those changes being\n # reflected in anyone else's copy.\n if self.scheme == 'http':\n headers = headers.copy()\n headers.update(self.proxy_headers)\n \n # Must keep the exception bound to a separate variable or else Python 3\n # complains about UnboundLocalError.\n err = None\n \n # Keep track of whether we cleanly exited the except block. This\n # ensures we do proper cleanup in finally.\n clean_exit = False\n \n # Rewind body position, if needed. Record current position\n # for future rewinds in the event of a redirect/retry.\n body_pos = set_file_position(body, body_pos)\n \n try:\n # Request a connection from the queue.\n timeout_obj = self._get_timeout(timeout)\n conn = self._get_conn(timeout=pool_timeout)\n \n conn.timeout = timeout_obj.connect_timeout\n \n is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None)\n if is_new_proxy_conn:\n self._prepare_proxy(conn)\n \n # Make the request on the httplib connection object.\n httplib_response = self._make_request(conn, method, url,\n timeout=timeout_obj,\n body=body, headers=headers,\n chunked=chunked)\n \n # If we're going to release the connection in ``finally:``, then\n # the response doesn't need to know about the connection. Otherwise\n # it will also try to release it and we'll have a double-release\n # mess.\n response_conn = conn if not release_conn else None\n \n # Pass method to Response for length checking\n response_kw['request_method'] = method\n \n # Import httplib's response into our own wrapper object\n response = self.ResponseCls.from_httplib(httplib_response,\n pool=self,\n connection=response_conn,\n retries=retries,\n **response_kw)\n \n # Everything went great!\n clean_exit = True\n \n except queue.Empty:\n # Timed out by queue.\n raise EmptyPoolError(self, \"No pool connections are available.\")\n \n except (TimeoutError, HTTPException, SocketError, ProtocolError,\n BaseSSLError, SSLError, CertificateError) as e:\n # Discard the connection for these exceptions. It will be\n # replaced during the next _get_conn() call.\n clean_exit = False\n if isinstance(e, (BaseSSLError, CertificateError)):\n e = SSLError(e)\n elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy:\n e = ProxyError('Cannot connect to proxy.', e)\n elif isinstance(e, (SocketError, HTTPException)):\n e = ProtocolError('Connection aborted.', e)\n \n retries = retries.increment(method, url, error=e, _pool=self,\n> _stacktrace=sys.exc_info()[2])\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/connectionpool.py:639: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = Retry(total=0, connect=None, read=False, redirect=None, status=None)\nmethod = 'POST', url = '/api/registerFromThirdPart', response = None\nerror = SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),)\n_pool = \n_stacktrace = \n\n def increment(self, method=None, url=None, response=None, error=None,\n _pool=None, _stacktrace=None):\n \"\"\" Return a new Retry object with incremented retry counters.\n \n :param response: A response object, or None, if the server did not\n return a response.\n :type response: :class:`~urllib3.response.HTTPResponse`\n :param Exception error: An error encountered during the request, or\n None if the response was received successfully.\n \n :return: A new ``Retry`` object.\n \"\"\"\n if self.total is False and error:\n # Disabled, indicate to re-raise the error.\n raise six.reraise(type(error), error, _stacktrace)\n \n total = self.total\n if total is not None:\n total -= 1\n \n connect = self.connect\n read = self.read\n redirect = self.redirect\n status_count = self.status\n cause = 'unknown'\n status = None\n redirect_location = None\n \n if error and self._is_connection_error(error):\n # Connect retry?\n if connect is False:\n raise six.reraise(type(error), error, _stacktrace)\n elif connect is not None:\n connect -= 1\n \n elif error and self._is_read_error(error):\n # Read retry?\n if read is False or not self._is_method_retryable(method):\n raise six.reraise(type(error), error, _stacktrace)\n elif read is not None:\n read -= 1\n \n elif response and response.get_redirect_location():\n # Redirect retry?\n if redirect is not None:\n redirect -= 1\n cause = 'too many redirects'\n redirect_location = response.get_redirect_location()\n status = response.status\n \n else:\n # Incrementing because of a server error like a 500 in\n # status_forcelist and a the given method is in the whitelist\n cause = ResponseError.GENERIC_ERROR\n if response and response.status:\n if status_count is not None:\n status_count -= 1\n cause = ResponseError.SPECIFIC_ERROR.format(\n status_code=response.status)\n status = response.status\n \n history = self.history + (RequestHistory(method, url, error, status, redirect_location),)\n \n new_retry = self.new(\n total=total,\n connect=connect, read=read, redirect=redirect, status=status_count,\n history=history)\n \n if new_retry.is_exhausted():\n> raise MaxRetryError(_pool, url, error or ResponseError(cause))\nE urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/urllib3/util/retry.py:388: MaxRetryError\n\nDuring handling of the above exception, another exception occurred:\n\nself = \ncase_data = {'address': '/api/registerFromThirdPart', 'check': {'check_type': 'json', 'expected_code': 200, 'expected_request': 'result_registerFromThirdPart.json'}, 'cookies': False, 'file': False, ...}\n\n @pytest.mark.parametrize(\"case_data\", case_dict[\"test_case\"], ids=[])\n @allure.story(\"registerFromThirdPart\")\n # @pytest.mark.flaky(reruns=3, reruns_delay=3)\n def test_registerfromthirdpart(self, case_data):\n \"\"\"\n \n :param case_data: 测试用例\n :return:\n \"\"\"\n self.init_relevance = ini_request(case_dict, PATH)\n # 发送测试请求\n> api_send_check(case_data, case_dict, self.init_relevance, PATH)\n\ncrm/testcase/api/test_registerFromThirdPart.py:33: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nbin/unit/apiSendCheck.py:23: in api_send_check\n project_dict[\"test_info\"].get(\"address\"), _path, relevance)\nbin/unit/apiSend.py:81: in send_request\n timeout=data[\"timeout\"])\nbin/unit/apiMethod.py:49: in post\n response = requests.post(url=address, data=data, headers=header, timeout=timeout)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/api.py:112: in post\n return request('post', url, data=data, json=json, **kwargs)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/api.py:58: in request\n return session.request(method=method, url=url, **kwargs)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/sessions.py:508: in request\n resp = self.send(prep, **send_kwargs)\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/sessions.py:618: in send\n r = adapter.send(request, **kwargs)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nrequest = , stream = False\ntimeout = , verify = True\ncert = None\nproxies = OrderedDict([('http', 'http://127.0.0.1:8888'), ('https', 'http://127.0.0.1:8888')])\n\n def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):\n \"\"\"Sends PreparedRequest object. Returns Response object.\n \n :param request: The :class:`PreparedRequest ` being sent.\n :param stream: (optional) Whether to stream the request content.\n :param timeout: (optional) How long to wait for the server to send\n data before giving up, as a float, or a :ref:`(connect timeout,\n read timeout) ` tuple.\n :type timeout: float or tuple or urllib3 Timeout object\n :param verify: (optional) Either a boolean, in which case it controls whether\n we verify the server's TLS certificate, or a string, in which case it\n must be a path to a CA bundle to use\n :param cert: (optional) Any user-provided SSL certificate to be trusted.\n :param proxies: (optional) The proxies dictionary to apply to the request.\n :rtype: requests.Response\n \"\"\"\n \n conn = self.get_connection(request.url, proxies)\n \n self.cert_verify(conn, request.url, verify, cert)\n url = self.request_url(request, proxies)\n self.add_headers(request)\n \n chunked = not (request.body is None or 'Content-Length' in request.headers)\n \n if isinstance(timeout, tuple):\n try:\n connect, read = timeout\n timeout = TimeoutSauce(connect=connect, read=read)\n except ValueError as e:\n # this may raise a string formatting error.\n err = (\"Invalid timeout {0}. Pass a (connect, read) \"\n \"timeout tuple, or a single float to set \"\n \"both timeouts to the same value\".format(timeout))\n raise ValueError(err)\n elif isinstance(timeout, TimeoutSauce):\n pass\n else:\n timeout = TimeoutSauce(connect=timeout, read=timeout)\n \n try:\n if not chunked:\n resp = conn.urlopen(\n method=request.method,\n url=url,\n body=request.body,\n headers=request.headers,\n redirect=False,\n assert_same_host=False,\n preload_content=False,\n decode_content=False,\n retries=self.max_retries,\n timeout=timeout\n )\n \n # Send the request.\n else:\n if hasattr(conn, 'proxy_pool'):\n conn = conn.proxy_pool\n \n low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)\n \n try:\n low_conn.putrequest(request.method,\n url,\n skip_accept_encoding=True)\n \n for header, value in request.headers.items():\n low_conn.putheader(header, value)\n \n low_conn.endheaders()\n \n for i in request.body:\n low_conn.send(hex(len(i))[2:].encode('utf-8'))\n low_conn.send(b'\\r\\n')\n low_conn.send(i)\n low_conn.send(b'\\r\\n')\n low_conn.send(b'0\\r\\n\\r\\n')\n \n # Receive the response from the server\n try:\n # For Python 2.7+ versions, use buffering of HTTP\n # responses\n r = low_conn.getresponse(buffering=True)\n except TypeError:\n # For compatibility with Python 2.6 versions and back\n r = low_conn.getresponse()\n \n resp = HTTPResponse.from_httplib(\n r,\n pool=conn,\n connection=low_conn,\n preload_content=False,\n decode_content=False\n )\n except:\n # If we hit any problems here, clean up the connection.\n # Then, reraise so that we can handle the actual exception.\n low_conn.close()\n raise\n \n except (ProtocolError, socket.error) as err:\n raise ConnectionError(err, request=request)\n \n except MaxRetryError as e:\n if isinstance(e.reason, ConnectTimeoutError):\n # TODO: Remove this in 3.0.0: see #2811\n if not isinstance(e.reason, NewConnectionError):\n raise ConnectTimeout(e, request=request)\n \n if isinstance(e.reason, ResponseError):\n raise RetryError(e, request=request)\n \n if isinstance(e.reason, _ProxyError):\n raise ProxyError(e, request=request)\n \n if isinstance(e.reason, _SSLError):\n # This branch is for urllib3 v1.22 and later.\n> raise SSLError(e, request=request)\nE requests.exceptions.SSLError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))\n\n/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/adapters.py:506: SSLError",
24 | "steps" : [ {
25 | "name" : "POST请求接口",
26 | "time" : {
27 | "start" : 1590999247291,
28 | "stop" : 1590999247292,
29 | "duration" : 1
30 | },
31 | "status" : "passed",
32 | "steps" : [ ],
33 | "attachments" : [ {
34 | "uid" : "7be0ae4e1a985894",
35 | "name" : "请求接口",
36 | "source" : "7be0ae4e1a985894.attach",
37 | "type" : "text/plain",
38 | "size" : 21
39 | }, {
40 | "uid" : "ce8359096e29e5b7",
41 | "name" : "请求地址",
42 | "source" : "ce8359096e29e5b7.attach",
43 | "type" : "text/plain",
44 | "size" : 51
45 | }, {
46 | "uid" : "a42bc2ee2ac1e349",
47 | "name" : "请求头",
48 | "source" : "a42bc2ee2ac1e349.attach",
49 | "type" : "text/plain",
50 | "size" : 139
51 | }, {
52 | "uid" : "e4d2dd8b170229b0",
53 | "name" : "请求参数",
54 | "source" : "e4d2dd8b170229b0.attach",
55 | "type" : "text/plain",
56 | "size" : 201
57 | } ],
58 | "parameters" : [ ],
59 | "stepsCount" : 0,
60 | "attachmentsCount" : 4,
61 | "shouldDisplayMessage" : false,
62 | "hasContent" : true
63 | } ],
64 | "attachments" : [ {
65 | "uid" : "304af0ca57799642",
66 | "name" : "log",
67 | "source" : "304af0ca57799642.txt",
68 | "type" : "text/plain",
69 | "size" : 1380
70 | } ],
71 | "parameters" : [ ],
72 | "stepsCount" : 1,
73 | "attachmentsCount" : 5,
74 | "shouldDisplayMessage" : true,
75 | "hasContent" : true
76 | },
77 | "afterStages" : [ ],
78 | "labels" : [ {
79 | "name" : "feature",
80 | "value" : "api"
81 | }, {
82 | "name" : "story",
83 | "value" : "registerFromThirdPart"
84 | }, {
85 | "name" : "subSuite",
86 | "value" : "TestRegisterfromthirdpart"
87 | }, {
88 | "name" : "parentSuite",
89 | "value" : "crm.testcase.api"
90 | }, {
91 | "name" : "suite",
92 | "value" : "test_registerFromThirdPart"
93 | }, {
94 | "name" : "host",
95 | "value" : "xiaoxideMacBook.lan"
96 | }, {
97 | "name" : "thread",
98 | "value" : "6741-MainThread"
99 | }, {
100 | "name" : "framework",
101 | "value" : "pytest"
102 | }, {
103 | "name" : "language",
104 | "value" : "cpython3"
105 | }, {
106 | "name" : "package",
107 | "value" : "crm.testcase.api.test_registerFromThirdPart"
108 | }, {
109 | "name" : "resultFormat",
110 | "value" : "allure2"
111 | } ],
112 | "parameters" : [ {
113 | "name" : "case_data",
114 | "value" : "{'request_type': 'POST', 'parameter_type': 'application/x-www-form-urlencoded', 'info': 'registerFromThirdPart', 'timeout': 60, 'parameter': 'registerFromThirdPart.json', 'file': False, 'test_name': 'registerFromThirdPart', 'address': '/api/registerFromThirdPart', 'check': {'expected_code': 200, 'expected_request': 'result_registerFromThirdPart.json', 'check_type': 'json'}, 'headers': {'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0'}, 'relevance': None, 'cookies': False, 'http_type': 'https'}"
115 | } ],
116 | "links" : [ ],
117 | "hidden" : false,
118 | "retry" : false,
119 | "extra" : {
120 | "severity" : "normal",
121 | "retries" : [ ],
122 | "categories" : [ {
123 | "name" : "Test defects",
124 | "matchedStatuses" : [ ],
125 | "flaky" : false
126 | } ],
127 | "tags" : [ ]
128 | },
129 | "source" : "90e76208292b8b5b.json",
130 | "parameterValues" : [ "{'request_type': 'POST', 'parameter_type': 'application/x-www-form-urlencoded', 'info': 'registerFromThirdPart', 'timeout': 60, 'parameter': 'registerFromThirdPart.json', 'file': False, 'test_name': 'registerFromThirdPart', 'address': '/api/registerFromThirdPart', 'check': {'expected_code': 200, 'expected_request': 'result_registerFromThirdPart.json', 'check_type': 'json'}, 'headers': {'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0'}, 'relevance': None, 'cookies': False, 'http_type': 'https'}" ]
131 | }
--------------------------------------------------------------------------------
/content/report/html/data/timeline.json:
--------------------------------------------------------------------------------
1 | {
2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc",
3 | "name" : "timeline",
4 | "children" : [ {
5 | "name" : "xiaoxideMacBook.lan",
6 | "children" : [ {
7 | "name" : "6741-MainThread",
8 | "children" : [ {
9 | "name" : "test_registerfromthirdpart[case_data0]",
10 | "uid" : "90e76208292b8b5b",
11 | "parentUid" : "ea793beac19a09d4f0bb3c680637ad0f",
12 | "status" : "broken",
13 | "time" : {
14 | "start" : 1590999247287,
15 | "stop" : 1590999248398,
16 | "duration" : 1111
17 | },
18 | "flaky" : false,
19 | "newFailed" : false,
20 | "parameters" : [ "{'request_type': 'POST', 'parameter_type': 'application/x-www-form-urlencoded', 'info': 'registerFromThirdPart', 'timeout': 60, 'parameter': 'registerFromThirdPart.json', 'file': False, 'test_name': 'registerFromThirdPart', 'address': '/api/registerFromThirdPart', 'check': {'expected_code': 200, 'expected_request': 'result_registerFromThirdPart.json', 'check_type': 'json'}, 'headers': {'appversion': '3.4.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0'}, 'relevance': None, 'cookies': False, 'http_type': 'https'}" ]
21 | } ],
22 | "uid" : "ea793beac19a09d4f0bb3c680637ad0f"
23 | }, {
24 | "name" : "26484-MainThread",
25 | "children" : [ {
26 | "name" : "test_registerfromthirdpart[case_data0]",
27 | "uid" : "7a5644b324f85d27",
28 | "parentUid" : "55d23626a2c55ad149d15aec94a1afd3",
29 | "status" : "passed",
30 | "time" : {
31 | "start" : 1594014671665,
32 | "stop" : 1594014672562,
33 | "duration" : 897
34 | },
35 | "flaky" : false,
36 | "newFailed" : false,
37 | "parameters" : [ "{'file': False, 'check': {'check_type': 'json', 'expected_code': 200, 'expected_request': 'result_registerFromThirdPart.json'}, 'headers': {'user-agent': 'PapayaFM/1802 CFNetwork/1121.2.2 Darwin/19.3.0', 'deviceid': 'bf38b545-b766-8c2a-8ec7-e80ccf22a3b4', 'appversion': '3.4.0'}, 'cookies': False, 'timeout': 60, 'parameter': 'registerFromThirdPart.json', 'parameter_type': 'application/x-www-form-urlencoded', 'test_name': 'registerFromThirdPart', 'info': 'registerFromThirdPart', 'address': '/api/registerFromThirdPart', 'request_type': 'POST', 'relevance': None, 'http_type': 'https'}" ]
38 | } ],
39 | "uid" : "55d23626a2c55ad149d15aec94a1afd3"
40 | } ],
41 | "uid" : "60d6f9ee33f21695800f326c72fb0026"
42 | } ]
43 | }
--------------------------------------------------------------------------------
/content/report/html/export/influxDbData.txt:
--------------------------------------------------------------------------------
1 | launch_status failed=0 1594014674000000000
2 | launch_status broken=1 1594014674000000000
3 | launch_status passed=1 1594014674000000000
4 | launch_status skipped=0 1594014674000000000
5 | launch_status unknown=0 1594014674000000000
6 | launch_time duration=3015425275 1594014674000000000
7 | launch_time min_duration=897 1594014674000000000
8 | launch_time max_duration=1111 1594014674000000000
9 | launch_time sum_duration=2008 1594014674000000000
10 | launch_problems test_defects=1 1594014674000000000
11 | launch_retries retries=0 1594014674000000000
12 | launch_retries run=2 1594014674000000000
13 |
--------------------------------------------------------------------------------
/content/report/html/export/mail.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Allure Report summary mail
6 |
7 |
8 | Mail body
9 |
10 |
11 |
--------------------------------------------------------------------------------
/content/report/html/export/prometheusData.txt:
--------------------------------------------------------------------------------
1 | launch_status_failed 0
2 | launch_status_broken 1
3 | launch_status_passed 1
4 | launch_status_skipped 0
5 | launch_status_unknown 0
6 | launch_time_duration 3015425275
7 | launch_time_min_duration 897
8 | launch_time_max_duration 1111
9 | launch_time_sum_duration 2008
10 | launch_problems_test_defects 1
11 | launch_retries_retries 0
12 | launch_retries_run 2
13 |
--------------------------------------------------------------------------------
/content/report/html/favicon.ico:
--------------------------------------------------------------------------------
1 | module.exports = __webpack_public_path__ + "favicon.ico";
--------------------------------------------------------------------------------
/content/report/html/history/categories-trend.json:
--------------------------------------------------------------------------------
1 | [ {
2 | "data" : {
3 | "Test defects" : 1
4 | }
5 | } ]
--------------------------------------------------------------------------------
/content/report/html/history/duration-trend.json:
--------------------------------------------------------------------------------
1 | [ {
2 | "data" : {
3 | "duration" : 3015425275
4 | }
5 | } ]
--------------------------------------------------------------------------------
/content/report/html/history/history-trend.json:
--------------------------------------------------------------------------------
1 | [ {
2 | "data" : {
3 | "failed" : 0,
4 | "broken" : 1,
5 | "skipped" : 0,
6 | "passed" : 1,
7 | "unknown" : 0,
8 | "total" : 2
9 | }
10 | } ]
--------------------------------------------------------------------------------
/content/report/html/history/history.json:
--------------------------------------------------------------------------------
1 | {
2 | "5d7c8a95eea77353216e45474fe0ca72" : {
3 | "statistic" : {
4 | "failed" : 0,
5 | "broken" : 0,
6 | "skipped" : 0,
7 | "passed" : 1,
8 | "unknown" : 0,
9 | "total" : 1
10 | },
11 | "items" : [ {
12 | "uid" : "7a5644b324f85d27",
13 | "status" : "passed",
14 | "time" : {
15 | "start" : 1594014671665,
16 | "stop" : 1594014672562,
17 | "duration" : 897
18 | }
19 | } ]
20 | },
21 | "c726df5b4b0e58b446c43e76a1c2c73b" : {
22 | "statistic" : {
23 | "failed" : 0,
24 | "broken" : 1,
25 | "skipped" : 0,
26 | "passed" : 0,
27 | "unknown" : 0,
28 | "total" : 1
29 | },
30 | "items" : [ {
31 | "uid" : "90e76208292b8b5b",
32 | "status" : "broken",
33 | "statusDetails" : "requests.exceptions.SSLError: HTTPSConnectionPool(host='service.papaya.fm', port=443): Max retries exceeded with url: /api/registerFromThirdPart (Caused by SSLError(SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))",
34 | "time" : {
35 | "start" : 1590999247287,
36 | "stop" : 1590999248398,
37 | "duration" : 1111
38 | }
39 | } ]
40 | }
41 | }
--------------------------------------------------------------------------------
/content/report/html/history/retry-trend.json:
--------------------------------------------------------------------------------
1 | [ {
2 | "data" : {
3 | "run" : 2,
4 | "retry" : 0
5 | }
6 | } ]
--------------------------------------------------------------------------------
/content/report/html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Allure Report
6 |
7 |
8 |
9 |
10 |
11 |
12 |