| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  | # lint: pylint | 
					
						
							| 
									
										
										
										
											2021-09-07 13:34:35 +02:00
										 |  |  | # pylint: disable=missing-module-docstring, global-statement | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import asyncio | 
					
						
							|  |  |  | import logging | 
					
						
							|  |  |  | import threading | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 15:26:34 +02:00
										 |  |  | import anyio | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | import httpcore | 
					
						
							|  |  |  | import httpx | 
					
						
							|  |  |  | from httpx_socks import AsyncProxyTransport | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  | from python_socks import ( | 
					
						
							|  |  |  |     parse_proxy_url, | 
					
						
							|  |  |  |     ProxyConnectionError, | 
					
						
							|  |  |  |     ProxyTimeoutError, | 
					
						
							|  |  |  |     ProxyError | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from searx import logger | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Optional uvloop (support Python 3.6) | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import uvloop | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     uvloop.install() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  | logger = logger.getChild('searx.network.client') | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | LOOP = None | 
					
						
							| 
									
										
										
										
											2021-05-05 20:06:40 +02:00
										 |  |  | SSLCONTEXTS = {} | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | TRANSPORT_KWARGS = { | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     # use anyio : | 
					
						
							|  |  |  |     # * https://github.com/encode/httpcore/issues/344 | 
					
						
							|  |  |  |     # * https://github.com/encode/httpx/discussions/1511 | 
					
						
							|  |  |  |     'backend': 'anyio', | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |     'trust_env': False, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  | # pylint: disable=protected-access | 
					
						
							|  |  |  | async def close_connections_for_url( | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     connection_pool: httpcore.AsyncConnectionPool, url: httpcore._utils.URL | 
					
						
							|  |  |  | ): | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |     origin = httpcore._utils.url_to_origin(url) | 
					
						
							|  |  |  |     logger.debug('Drop connections for %r', origin) | 
					
						
							|  |  |  |     connections_to_close = connection_pool._connections_for_origin(origin) | 
					
						
							|  |  |  |     for connection in connections_to_close: | 
					
						
							|  |  |  |         await connection_pool._remove_from_pool(connection) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             await connection.aclose() | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |         except httpx.NetworkError as e: | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |             logger.warning('Error closing an existing connection', exc_info=e) | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  | # pylint: enable=protected-access | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 20:06:40 +02:00
										 |  |  | def get_sslcontexts(proxy_url=None, cert=None, verify=True, trust_env=True, http2=False): | 
					
						
							|  |  |  |     key = (proxy_url, cert, verify, trust_env, http2) | 
					
						
							|  |  |  |     if key not in SSLCONTEXTS: | 
					
						
							|  |  |  |         SSLCONTEXTS[key] = httpx.create_ssl_context(cert, verify, trust_env, http2) | 
					
						
							|  |  |  |     return SSLCONTEXTS[key] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  | class AsyncHTTPTransportNoHttp(httpx.AsyncHTTPTransport): | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |     """Block HTTP request""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     async def handle_async_request( | 
					
						
							|  |  |  |         self, method, url, headers=None, stream=None, extensions=None | 
					
						
							|  |  |  |     ): | 
					
						
							|  |  |  |         raise httpx.UnsupportedProtocol('HTTP protocol is disabled') | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AsyncProxyTransportFixed(AsyncProxyTransport): | 
					
						
							|  |  |  |     """Fix httpx_socks.AsyncProxyTransport
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     Map python_socks exceptions to httpx.ProxyError / httpx.ConnectError | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     Map socket.gaierror to httpx.ConnectError | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Note: AsyncProxyTransport inherit from AsyncConnectionPool | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     async def handle_async_request( | 
					
						
							|  |  |  |         self, method, url, headers=None, stream=None, extensions=None | 
					
						
							|  |  |  |     ): | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |         retry = 2 | 
					
						
							|  |  |  |         while retry > 0: | 
					
						
							|  |  |  |             retry -= 1 | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 return await super().handle_async_request( | 
					
						
							|  |  |  |                     method, url, headers=headers, stream=stream, extensions=extensions | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  |             except (ProxyConnectionError, ProxyTimeoutError, ProxyError) as e: | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 raise httpx.ProxyError from e | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |             except OSError as e: | 
					
						
							|  |  |  |                 # socket.gaierror when DNS resolution fails | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 raise httpx.ConnectError from e | 
					
						
							|  |  |  |             except httpx.NetworkError as e: | 
					
						
							|  |  |  |                 # httpx.WriteError on HTTP/2 connection leaves a new opened stream | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |                 # then each new request creates a new stream and raise the same WriteError | 
					
						
							|  |  |  |                 await close_connections_for_url(self, url) | 
					
						
							|  |  |  |                 raise e | 
					
						
							| 
									
										
										
										
											2021-09-28 15:26:34 +02:00
										 |  |  |             except anyio.ClosedResourceError as e: | 
					
						
							|  |  |  |                 await close_connections_for_url(self, url) | 
					
						
							|  |  |  |                 raise httpx.CloseError from e | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |             except httpx.RemoteProtocolError as e: | 
					
						
							|  |  |  |                 # in case of httpx.RemoteProtocolError: Server disconnected | 
					
						
							|  |  |  |                 await close_connections_for_url(self, url) | 
					
						
							|  |  |  |                 logger.warning('httpx.RemoteProtocolError: retry', exc_info=e) | 
					
						
							|  |  |  |                 # retry | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AsyncHTTPTransportFixed(httpx.AsyncHTTPTransport): | 
					
						
							|  |  |  |     """Fix httpx.AsyncHTTPTransport""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |     async def handle_async_request( | 
					
						
							|  |  |  |         self, method, url, headers=None, stream=None, extensions=None | 
					
						
							|  |  |  |     ): | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |         retry = 2 | 
					
						
							|  |  |  |         while retry > 0: | 
					
						
							|  |  |  |             retry -= 1 | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 return await super().handle_async_request( | 
					
						
							|  |  |  |                     method, url, headers=headers, stream=stream, extensions=extensions | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |             except OSError as e: | 
					
						
							|  |  |  |                 # socket.gaierror when DNS resolution fails | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 raise httpx.ConnectError from e | 
					
						
							|  |  |  |             except httpx.NetworkError as e: | 
					
						
							|  |  |  |                 # httpx.WriteError on HTTP/2 connection leaves a new opened stream | 
					
						
							|  |  |  |                 # then each new request creates a new stream and raise the same WriteError | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |                 await close_connections_for_url(self._pool, url) | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 raise e | 
					
						
							| 
									
										
										
										
											2021-09-28 15:26:34 +02:00
										 |  |  |             except anyio.ClosedResourceError as e: | 
					
						
							|  |  |  |                 await close_connections_for_url(self._pool, url) | 
					
						
							|  |  |  |                 raise httpx.CloseError from e | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |             except httpx.RemoteProtocolError as e: | 
					
						
							|  |  |  |                 # in case of httpx.RemoteProtocolError: Server disconnected | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |                 await close_connections_for_url(self._pool, url) | 
					
						
							| 
									
										
										
										
											2021-08-07 18:48:01 +02:00
										 |  |  |                 logger.warning('httpx.RemoteProtocolError: retry', exc_info=e) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |                 # retry | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_transport_for_socks_proxy(verify, http2, local_address, proxy_url, limit, retries): | 
					
						
							|  |  |  |     # support socks5h (requests compatibility): | 
					
						
							|  |  |  |     # https://requests.readthedocs.io/en/master/user/advanced/#socks | 
					
						
							|  |  |  |     # socks5://   hostname is resolved on client side | 
					
						
							|  |  |  |     # socks5h://  hostname is resolved on proxy side | 
					
						
							|  |  |  |     rdns = False | 
					
						
							|  |  |  |     socks5h = 'socks5h://' | 
					
						
							|  |  |  |     if proxy_url.startswith(socks5h): | 
					
						
							|  |  |  |         proxy_url = 'socks5://' + proxy_url[len(socks5h):] | 
					
						
							|  |  |  |         rdns = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     proxy_type, proxy_host, proxy_port, proxy_username, proxy_password = parse_proxy_url(proxy_url) | 
					
						
							| 
									
										
										
										
											2021-05-05 20:06:40 +02:00
										 |  |  |     verify = get_sslcontexts(proxy_url, None, True, False, http2) if verify is True else verify | 
					
						
							| 
									
										
										
										
											2021-05-24 17:44:43 +02:00
										 |  |  |     return AsyncProxyTransportFixed( | 
					
						
							|  |  |  |         proxy_type=proxy_type, proxy_host=proxy_host, proxy_port=proxy_port, | 
					
						
							|  |  |  |         username=proxy_username, password=proxy_password, | 
					
						
							|  |  |  |         rdns=rdns, | 
					
						
							|  |  |  |         loop=get_loop(), | 
					
						
							|  |  |  |         verify=verify, | 
					
						
							|  |  |  |         http2=http2, | 
					
						
							|  |  |  |         local_address=local_address, | 
					
						
							|  |  |  |         max_connections=limit.max_connections, | 
					
						
							|  |  |  |         max_keepalive_connections=limit.max_keepalive_connections, | 
					
						
							|  |  |  |         keepalive_expiry=limit.keepalive_expiry, | 
					
						
							|  |  |  |         retries=retries, | 
					
						
							|  |  |  |         **TRANSPORT_KWARGS | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_transport(verify, http2, local_address, proxy_url, limit, retries): | 
					
						
							| 
									
										
										
										
											2021-05-05 20:06:40 +02:00
										 |  |  |     verify = get_sslcontexts(None, None, True, False, http2) if verify is True else verify | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  |     return AsyncHTTPTransportFixed( | 
					
						
							|  |  |  |         # pylint: disable=protected-access | 
					
						
							|  |  |  |         verify=verify, | 
					
						
							|  |  |  |         http2=http2, | 
					
						
							|  |  |  |         local_address=local_address, | 
					
						
							|  |  |  |         proxy=httpx._config.Proxy(proxy_url) if proxy_url else None, | 
					
						
							|  |  |  |         limits=limit, | 
					
						
							|  |  |  |         retries=retries, | 
					
						
							|  |  |  |         **TRANSPORT_KWARGS | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  | def new_client( | 
					
						
							|  |  |  |         # pylint: disable=too-many-arguments | 
					
						
							|  |  |  |         enable_http, verify, enable_http2, | 
					
						
							|  |  |  |         max_connections, max_keepalive_connections, keepalive_expiry, | 
					
						
							| 
									
										
										
										
											2021-09-06 21:42:30 +02:00
										 |  |  |         proxies, local_address, retries, max_redirects, hook_log_response  ): | 
					
						
							| 
									
										
										
										
											2021-05-24 17:44:43 +02:00
										 |  |  |     limit = httpx.Limits( | 
					
						
							|  |  |  |         max_connections=max_connections, | 
					
						
							|  |  |  |         max_keepalive_connections=max_keepalive_connections, | 
					
						
							|  |  |  |         keepalive_expiry=keepalive_expiry | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |     # See https://www.python-httpx.org/advanced/#routing | 
					
						
							|  |  |  |     mounts = {} | 
					
						
							| 
									
										
										
										
											2021-08-18 08:39:13 +02:00
										 |  |  |     for pattern, proxy_url in proxies.items(): | 
					
						
							|  |  |  |         if not enable_http and pattern.startswith('http://'): | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2021-05-24 17:44:43 +02:00
										 |  |  |         if (proxy_url.startswith('socks4://') | 
					
						
							|  |  |  |            or proxy_url.startswith('socks5://') | 
					
						
							|  |  |  |             or proxy_url.startswith('socks5h://') | 
					
						
							|  |  |  |         ): | 
					
						
							|  |  |  |             mounts[pattern] = get_transport_for_socks_proxy( | 
					
						
							|  |  |  |                 verify, enable_http2, local_address, proxy_url, limit, retries | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2021-05-24 17:44:43 +02:00
										 |  |  |             mounts[pattern] = get_transport( | 
					
						
							|  |  |  |                 verify, enable_http2, local_address, proxy_url, limit, retries | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not enable_http: | 
					
						
							|  |  |  |         mounts['http://'] = AsyncHTTPTransportNoHttp() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     transport = get_transport(verify, enable_http2, local_address, None, limit, retries) | 
					
						
							| 
									
										
										
										
											2021-09-06 21:42:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     event_hooks = None | 
					
						
							|  |  |  |     if hook_log_response: | 
					
						
							|  |  |  |         event_hooks = {'response': [ hook_log_response ]} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return httpx.AsyncClient( | 
					
						
							|  |  |  |         transport=transport, | 
					
						
							|  |  |  |         mounts=mounts, | 
					
						
							|  |  |  |         max_redirects=max_redirects, | 
					
						
							|  |  |  |         event_hooks=event_hooks, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-27 10:03:19 +02:00
										 |  |  | def get_loop(): | 
					
						
							|  |  |  |     return LOOP | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | def init(): | 
					
						
							|  |  |  |     # log | 
					
						
							| 
									
										
										
										
											2021-09-06 21:42:30 +02:00
										 |  |  |     for logger_name in ('hpack.hpack', 'hpack.table', 'httpx._client'): | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |         logging.getLogger(logger_name).setLevel(logging.WARNING) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # loop | 
					
						
							|  |  |  |     def loop_thread(): | 
					
						
							|  |  |  |         global LOOP | 
					
						
							|  |  |  |         LOOP = asyncio.new_event_loop() | 
					
						
							|  |  |  |         LOOP.run_forever() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  |     thread = threading.Thread( | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  |         target=loop_thread, | 
					
						
							|  |  |  |         name='asyncio_loop', | 
					
						
							|  |  |  |         daemon=True, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-05-24 17:16:51 +02:00
										 |  |  |     thread.start() | 
					
						
							| 
									
										
										
											
												[httpx] replace searx.poolrequests by searx.network
settings.yml:
* outgoing.networks:
   * can contains network definition
   * propertiers: enable_http, verify, http2, max_connections, max_keepalive_connections,
     keepalive_expiry, local_addresses, support_ipv4, support_ipv6, proxies, max_redirects, retries
   * retries: 0 by default, number of times searx retries to send the HTTP request (using different IP & proxy each time)
   * local_addresses can be "192.168.0.1/24" (it supports IPv6)
   * support_ipv4 & support_ipv6: both True by default
     see https://github.com/searx/searx/pull/1034
* each engine can define a "network" section:
   * either a full network description
   * either reference an existing network
* all HTTP requests of engine use the same HTTP configuration (it was not the case before, see proxy configuration in master)
											
										 
											2021-04-05 10:43:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | init() |