proxy - 带有 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)