首页 > 解决方案 > 带有 Fortinet-Proxy 的 Python 请求最终会违反协议

问题描述

使用代理时出现此错误。它可以在没有代理的情况下工作。代理是 Fortinet-Proxy/1.0

我这样做是错误的还是请求库中存在错误?

不幸的是,版本取决于使用的 Splunk 版本 (7.3.3),无法更改。

非常感谢!

Traceback (most recent call last):
  File "./tst_REST.py", line 69, in <module>
    resp = req.post_request(tgt, json.dumps(bdy))
  File "./tst_REST.py", line 42, in post_request
    result = self.session.post(url=self.base_url + url, data=body)
  File "/opt/splunk/etc/apps/TA-IX-c-alert/bin/requests/sessions.py", line 590, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/opt/splunk/etc/apps/TA-IX-c-alert/bin/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/splunk/etc/apps/TA-IX-c-alert/bin/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/opt/splunk/etc/apps/TA-IX-c-alert/bin/requests/adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='some.url.io', port=443): Max retries exceeded with url: /endpoint/v1/check 
(Caused by SSLError(SSLEOFError(8, u'EOF occurred in violation of protocol (_ssl.c:741)'),))

使用的版本是:

>>> print(requests.__version__)
2.25.0

[splunk@xxpu074 bin]$ /opt/splunk/bin/splunk cmd python -m requests.help
{
  "chardet": {
    "version": "3.0.4"
  },
  "cryptography": {
    "version": ""
  },
  "idna": {
    "version": "2.10"
  },
  "implementation": {
    "name": "CPython",
    "version": "2.7.15"
  },
  "platform": {
    "release": "3.10.0-1160.25.1.el7.x86_64",
    "system": "Linux"
  },
  "pyOpenSSL": {
    "openssl_version": "",
    "version": null
  },
  "requests": {
    "version": "2.25.0"
  },
  "system_ssl": {
    "version": "1000210f"
  },
  "urllib3": {
    "version": "1.26.2"
  },
  "using_pyopenssl": false
}

这里是代码:

import json
import requests


class ApiError(Exception):
    """ API Exception """

    def __init__(self, status):
        self.status = status

    def __str__(self):
        return "ApiError: status={}".format(self.status)


class RestClient:
    def __init__(self, proxy, base_url, header):
        self.proxy = proxy
        self.base_url = base_url
        self.session = requests.Session()
        self.session.headers = header
        self.session.verify = False
        if proxy and proxy != "":
            self.session.proxies = {
                "http": proxy,
                "https": proxy,
            }

    def authenticate(self, url, username, password):
        body = json.dumps({
            "username": username,
            "password": password,
        })
        result = self.session.post(url=self.base_url + url, data=body)
        if result.status_code >= 300 or not result.ok:
            raise ApiError("Error sending authentication", self.base_url + url, result.status_code, result.text)
        data = json.loads(result.text)
        self.session.headers["Authorization"] = "Bearer " + data['access_token']

    def post_request(self, url, body):
        result = self.session.post(url=self.base_url + url, data=body)

        if result.status_code >= 300 or not result.ok:
            raise ApiError("Error sending post report", self.base_url + url, result.status_code, result.text)

        return result.json()

    def get_request(self, url):
        result = self.session.get(url=self.base_url + url)

        if result.status_code >= 300 or not result.ok:
            raise ApiError("Error sending get report", self.base_url + url, result.status_code, result.text)

        return result.json()


if __name__ == "__main__":
    prx = 'https://proxy.ch:8080'
    my_url = 'https://some.url.io'
    tgt = '/endpoint/v1/check'
    bdy = {'accountIdentifier': 'NL10ABNA8674111641', 'bankIdentifier': ''}
    hdr = {'User-Agent': 'python/2.7',
               'Content-Type': 'application/json',
               'Accept': '*/*',
               'ocp-apim-subscription-key': 'xxx'}
    req = RestClient(prx, my_url, hdr)
    resp = req.post_request(tgt, json.dumps(bdy))
    print(resp)

标签: proxypython-requestsprotocols

解决方案


推荐阅读