Несовместимая исключительная ситуация IOError при запросах HTTPS POST с использованием библиотеки Python 'orders' - PullRequest
0 голосов
/ 26 сентября 2018

Я получаю следующее исключение при попытке выполнить HTTPS POST, используя requests

Эта проблема возникает спорадически, и тот же запрос при повторной попытке (с использованием модуля backoff) проходит успешно.Я не знаю, как воспроизвести это, но я вижу эту проблему, когда я запускаю загрузку запросов HTTPS POST.

Traceback (most recent call last):
 File \"/usr/local/lib/python2.7/dist-packages/shared/util/http_util.py\", line 71, in send_https_post_request
 response = session.post(url, cert=cert, data=data)
 File \"/usr/local/lib/python2.7/dist-packages/requests/sessions.py\", line 522, in post
 return self.request('POST', url, data=data, json=json, **kwargs)
 File \"/usr/local/lib/python2.7/dist-packages/requests/sessions.py\", line 475, in request
 resp = self.send(prep, **send_kwargs)
 File \"/usr/local/lib/python2.7/dist-packages/requests/sessions.py\", line 596, in send
 r = adapter.send(request, **kwargs)
 File \"/usr/local/lib/python2.7/dist-packages/requests/adapters.py\", line 423, in send
 timeout=timeout
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py\", line 595, in urlopen
 chunked=chunked)
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py\", line 352, in _make_request
 self._validate_conn(conn)
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py\", line 831, in _validate_conn
 conn.connect()
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connection.py\", line 289, in connect
 ssl_version=resolved_ssl_version)
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py\", line 306, in ssl_wrap_socket
 context.load_cert_chain(certfile, keyfile)
IOError: [Errno 2] No such file or directory

Соответствующий код:

@contextlib.contextmanager
def pem_bytes_as_cert_file(pem_cert_bytes):
    '''
     Given bytes, return a temporary file which can be used as the cert
    '''
    with tempfile.NamedTemporaryFile(delete=True, suffix='.pem') as t_pem:
        f_pem = open(t_pem.name, 'wb')
        f_pem.write(pem_cert_bytes)
        f_pem.close()
        yield t_pem.name

def send_https_post_request(session, url, data, pem_cert_in_bytes):
    with pem_bytes_as_cert_file(pem_cert_in_bytes) as cert:
        response = session.post(url, cert=cert, data=data)
        response.raise_for_status()
        response.close()

Не могли бы вы помочь мне понять больше об этой проблеме?

1 Ответ

0 голосов
/ 26 сентября 2018
... context.load_cert_chain(certfile, keyfile)
IOError: [Errno 2] No such file or directory

Очевидно, что контекст заключается в загрузке сертификата и ключа.

with pem_bytes_as_cert_file(pem_cert_in_bytes) as cert:
    response = session.post(url, cert=cert, data=data)

. Кажется, у вас есть сертификат и ключ в виде строки, и вы пытаетесьсоздайте временный файл, чтобы указать его как cert аргумент

with tempfile.NamedTemporaryFile(delete=True, suffix='.pem') as t_pem:
    f_pem = open(t_pem.name, 'wb')
    f_pem.write(pem_cert_bytes)
    f_pem.close()
    yield t_pem.name

Вы создаете временный файл с помощью tempfile.NamedTemporaryFile и записываете в него строку cert + key.Затем вы закрываете временный файл.Документация для NamedTeoraryFile гласит:

Если delete имеет значение true (по умолчанию), файл удаляется сразу после его закрытия.

Таким образом, файл будет удален, как только вы закроете его.Только если вам повезло (условия гонки), файл все еще доступен в системе, когда вы пытаетесь использовать его изнутри session.post.

...