on master help sign in
[fix] searx.network: fix rare cases where LOOP is None
8d2ea79Alexandre Flament
searx/network/__init__.py+3−3
@@ -9,7 +9,7 @@ import httpx
9import h2.exceptions
9import h2.exceptions
10
10
11from .network import get_network, initialize
11from .network import get_network, initialize
12−from .client import LOOP
12+from .client import get_loop
13from .raise_for_httperror import raise_for_httperror
13from .raise_for_httperror import raise_for_httperror
14
14
15# queue.SimpleQueue: Support Python 3.6
15# queue.SimpleQueue: Support Python 3.6
@@ -98,7 +98,7 @@ def request(method, url, **kwargs):
98 network = get_context_network()
98 network = get_context_network()
99
99
100 # do request
100 # do request
101− future = asyncio.run_coroutine_threadsafe(network.request(method, url, **kwargs), LOOP)
101+ future = asyncio.run_coroutine_threadsafe(network.request(method, url, **kwargs), get_loop())
102 try:
102 try:
103 response = future.result(timeout)
103 response = future.result(timeout)
104 except concurrent.futures.TimeoutError as e:
104 except concurrent.futures.TimeoutError as e:
@@ -179,7 +179,7 @@ def stream(method, url, **kwargs):
179 """
179 """
180 q = SimpleQueue()
180 q = SimpleQueue()
181 future = asyncio.run_coroutine_threadsafe(stream_chunk_to_queue(get_network(), q, method, url, **kwargs),
181 future = asyncio.run_coroutine_threadsafe(stream_chunk_to_queue(get_network(), q, method, url, **kwargs),
182− LOOP)
182+ get_loop())
183 chunk_or_exception = q.get()
183 chunk_or_exception = q.get()
184 while chunk_or_exception is not None:
184 while chunk_or_exception is not None:
185 if isinstance(chunk_or_exception, Exception):
185 if isinstance(chunk_or_exception, Exception):
searx/network/client.py+6−2
@@ -120,7 +120,6 @@ class AsyncHTTPTransportFixed(httpx.AsyncHTTPTransport):
120
120
121
121
122def get_transport_for_socks_proxy(verify, http2, local_address, proxy_url, limit, retries):
122def get_transport_for_socks_proxy(verify, http2, local_address, proxy_url, limit, retries):
123− global LOOP, TRANSPORT_KWARGS
124 # support socks5h (requests compatibility):
123 # support socks5h (requests compatibility):
125 # https://requests.readthedocs.io/en/master/user/advanced/#socks
124 # https://requests.readthedocs.io/en/master/user/advanced/#socks
126 # socks5:// hostname is resolved on client side
125 # socks5:// hostname is resolved on client side
@@ -136,7 +135,7 @@ def get_transport_for_socks_proxy(verify, http2, local_address, proxy_url, limit
136 return AsyncProxyTransportFixed(proxy_type=proxy_type, proxy_host=proxy_host, proxy_port=proxy_port,
135 return AsyncProxyTransportFixed(proxy_type=proxy_type, proxy_host=proxy_host, proxy_port=proxy_port,
137 username=proxy_username, password=proxy_password,
136 username=proxy_username, password=proxy_password,
138 rdns=rdns,
137 rdns=rdns,
139− loop=LOOP,
138+ loop=get_loop(),
140 verify=verify,
139 verify=verify,
141 http2=http2,
140 http2=http2,
142 local_address=local_address,
141 local_address=local_address,
@@ -192,6 +191,11 @@ def new_client(enable_http, verify, enable_http2,
192 return httpx.AsyncClient(transport=transport, mounts=mounts, max_redirects=max_redirects)
191 return httpx.AsyncClient(transport=transport, mounts=mounts, max_redirects=max_redirects)
193
192
194
193
194+def get_loop():
195+ global LOOP
196+ return LOOP
197+
198+
195def init():
199def init():
196 # log
200 # log
197 for logger_name in ('hpack.hpack', 'hpack.table'):
201 for logger_name in ('hpack.hpack', 'hpack.table'):
searx/network/network.py+4−3
@@ -7,7 +7,7 @@ from itertools import cycle
7
7
8import httpx
8import httpx
9
9
10−from .client import new_client, LOOP
10+from .client import new_client, get_loop
11
11
12
12
13DEFAULT_NAME = '__DEFAULT__'
13DEFAULT_NAME = '__DEFAULT__'
@@ -291,8 +291,9 @@ def done():
291 So Network.aclose is called here using atexit.register
291 So Network.aclose is called here using atexit.register
292 """
292 """
293 try:
293 try:
294− if LOOP:
294+ loop = get_loop()
295+ if loop:
295− future = asyncio.run_coroutine_threadsafe(Network.aclose_all(), LOOP)
296+ future = asyncio.run_coroutine_threadsafe(Network.aclose_all(), loop)
296 # wait 3 seconds to close the HTTP clients
297 # wait 3 seconds to close the HTTP clients
297 future.result(3)
298 future.result(3)
298 finally:
299 finally: