on master help sign in
fix proxy requests issues with httpx >= 0.18.x (#2969)
commit79eb2ac69e77a49e8e058eb144d6b2dd90e62507 authorMarc Abonce Seguin <marc-abonce@mailbox.org> dateThu 9 Sep 2021, 19:25 (5 years ago) parent1ea573d
2 files changed+33−33
requirements.txt+1−1 searx/network/client.py+32−32
requirements.txt+1−1
@@ -11,6 +11,6 @@ httpx[http2]==0.19.0
1111Brotli==1.0.9
1212uvloop==0.16.0; python_version >= '3.7'
1313uvloop==0.14.0; python_version < '3.7'
14−httpx-socks[asyncio]==0.3.1
14+httpx-socks[asyncio]==0.4.1
1515langdetect==1.0.9
1616setproctitle==1.2.2
searx/network/client.py+32−32
@@ -7,7 +7,12 @@ import threading
77import httpcore
88import httpx
99from httpx_socks import AsyncProxyTransport
10−from python_socks import parse_proxy_url
10+from python_socks import (
11+ parse_proxy_url,
12+ ProxyConnectionError,
13+ ProxyTimeoutError,
14+ ProxyError
15+)
1116import python_socks._errors
1217
1318from searx import logger
@@ -38,7 +43,7 @@ async def close_connections_for_url(connection_pool: httpcore.AsyncConnectionPoo
3843 await connection_pool._remove_from_pool(connection)
3944 try:
4045 await connection.aclose()
41− except httpcore.NetworkError as e:
46+ except httpx.NetworkError as e:
4247 logger.warning('Error closing an existing connection', exc_info=e)
4348
4449
@@ -50,50 +55,45 @@ def get_sslcontexts(proxy_url=None, cert=None, verify=True, trust_env=True, http
5055 return SSLCONTEXTS[key]
5156
5257
53−class AsyncHTTPTransportNoHttp(httpcore.AsyncHTTPTransport):
58+class AsyncHTTPTransportNoHttp(httpx.AsyncHTTPTransport):
5459 """Block HTTP request"""
5560
56− async def arequest(self, method, url, headers=None, stream=None, ext=None):
57− raise httpcore.UnsupportedProtocol("HTTP protocol is disabled")
61+ async def handle_async_request(self, method, url, headers=None, stream=None, extensions=None):
62+ raise httpx.UnsupportedProtocol("HTTP protocol is disabled")
5863
5964
6065class AsyncProxyTransportFixed(AsyncProxyTransport):
6166 """Fix httpx_socks.AsyncProxyTransport
6267
63− Map python_socks exceptions to httpcore.ProxyError
68+ Map python_socks exceptions to httpx.ProxyError
6469
65− Map socket.gaierror to httpcore.ConnectError
70+ Map socket.gaierror to httpx.ConnectError
6671
6772 Note: keepalive_expiry is ignored, AsyncProxyTransport should call:
6873 * self._keepalive_sweep()
6974 * self._response_closed(self, connection)
7075
7176 Note: AsyncProxyTransport inherit from AsyncConnectionPool
72−
73− Note: the API is going to change on httpx 0.18.0
74− see https://github.com/encode/httpx/pull/1522
7577 """
7678
77− async def arequest(self, method, url, headers=None, stream=None, ext=None):
79+ async def handle_async_request(self, method, url, headers=None, stream=None, extensions=None):
7880 retry = 2
7981 while retry > 0:
8082 retry -= 1
8183 try:
82− return await super().arequest(method, url, headers, stream, ext)
83− except (python_socks._errors.ProxyConnectionError,
84− python_socks._errors.ProxyTimeoutError,
85− python_socks._errors.ProxyError) as e:
86− raise httpcore.ProxyError(e)
84+ return await super().handle_async_request(method, url, headers, stream, extensions)
85+ except (ProxyConnectionError, ProxyTimeoutError, ProxyError) as e:
86+ raise httpx.ProxyError(e)
8787 except OSError as e:
8888 # socket.gaierror when DNS resolution fails
89− raise httpcore.NetworkError(e)
90− except httpcore.RemoteProtocolError as e:
91− # in case of httpcore.RemoteProtocolError: Server disconnected
89+ raise httpx.NetworkError(e)
90+ except httpx.RemoteProtocolError as e:
91+ # in case of httpx.RemoteProtocolError: Server disconnected
9292 await close_connections_for_url(self, url)
93− logger.warning('httpcore.RemoteProtocolError: retry', exc_info=e)
93+ logger.warning('httpx.RemoteProtocolError: retry', exc_info=e)
9494 # retry
95− except (httpcore.NetworkError, httpcore.ProtocolError) as e:
96− # httpcore.WriteError on HTTP/2 connection leaves a new opened stream
95+ except (httpx.NetworkError, httpx.ProtocolError) as e:
96+ # httpx.WriteError on HTTP/2 connection leaves a new opened stream
9797 # then each new request creates a new stream and raise the same WriteError
9898 await close_connections_for_url(self, url)
9999 raise e
@@ -102,28 +102,28 @@ class AsyncProxyTransportFixed(AsyncProxyTransport):
102102class AsyncHTTPTransportFixed(httpx.AsyncHTTPTransport):
103103 """Fix httpx.AsyncHTTPTransport"""
104104
105− async def arequest(self, method, url, headers=None, stream=None, ext=None):
105+ async def handle_async_request(self, method, url, headers=None, stream=None, extensions=None):
106106 retry = 2
107107 while retry > 0:
108108 retry -= 1
109109 try:
110− return await super().arequest(method, url, headers, stream, ext)
110+ return await super().handle_async_request(method, url, headers, stream, extensions)
111111 except OSError as e:
112112 # socket.gaierror when DNS resolution fails
113− raise httpcore.ConnectError(e)
114− except httpcore.CloseError as e:
115− # httpcore.CloseError: [Errno 104] Connection reset by peer
113+ raise httpx.ConnectError(e)
114+ except httpx.CloseError as e:
115+ # httpx.CloseError: [Errno 104] Connection reset by peer
116116 # raised by _keepalive_sweep()
117117 # from https://github.com/encode/httpcore/blob/4b662b5c42378a61e54d673b4c949420102379f5/httpcore/_backends/asyncio.py#L198 # noqa
118118 await close_connections_for_url(self._pool, url)
119− logger.warning('httpcore.CloseError: retry', exc_info=e)
119+ logger.warning('httpx.CloseError: retry', exc_info=e)
120120 # retry
121− except httpcore.RemoteProtocolError as e:
122− # in case of httpcore.RemoteProtocolError: Server disconnected
121+ except httpx.RemoteProtocolError as e:
122+ # in case of httpx.RemoteProtocolError: Server disconnected
123123 await close_connections_for_url(self._pool, url)
124− logger.warning('httpcore.RemoteProtocolError: retry', exc_info=e)
124+ logger.warning('httpx.RemoteProtocolError: retry', exc_info=e)
125125 # retry
126− except (httpcore.ProtocolError, httpcore.NetworkError) as e:
126+ except (httpx.ProtocolError, httpx.NetworkError) as e:
127127 await close_connections_for_url(self._pool, url)
128128 raise e
129129