.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
searx.network.network Namespace Reference

Classes

class  Network
 

Functions

 get_network (name=None)
 
 check_network_configuration ()
 
 initialize (settings_engines=None, settings_outgoing=None)
 
 done ()
 

Variables

 logger = logger.getChild('network')
 
str DEFAULT_NAME = '__DEFAULT__'
 
dict NETWORKS = {}
 
dict PROXY_PATTERN_MAPPING
 
dict ADDRESS_MAPPING = {'ipv4': '0.0.0.0', 'ipv6': '::'}
 

Function Documentation

◆ check_network_configuration()

searx.network.network.check_network_configuration ( )

Definition at line 305 of file network.py.

305def check_network_configuration():
306 async def check():
307 exception_count = 0
308 for network in NETWORKS.values():
309 if network.using_tor_proxy:
310 try:
311 await network.get_client()
312 except Exception: # pylint: disable=broad-except
313 network._logger.exception('Error') # pylint: disable=protected-access
314 exception_count += 1
315 return exception_count
316
317 future = asyncio.run_coroutine_threadsafe(check(), get_loop())
318 exception_count = future.result()
319 if exception_count > 0:
320 raise RuntimeError("Invalid network configuration")
321
322

◆ done()

searx.network.network.done ( )
Close all HTTP client

Avoid a warning at exit
See https://github.com/encode/httpx/pull/2026

Note: since Network.aclose has to be async, it is not possible to call this method on Network.__del__
So Network.aclose is called here using atexit.register

Definition at line 408 of file network.py.

408def done():
409 """Close all HTTP client
410
411 Avoid a warning at exit
412 See https://github.com/encode/httpx/pull/2026
413
414 Note: since Network.aclose has to be async, it is not possible to call this method on Network.__del__
415 So Network.aclose is called here using atexit.register
416 """
417 try:
418 loop = get_loop()
419 if loop:
420 future = asyncio.run_coroutine_threadsafe(Network.aclose_all(), loop)
421 # wait 3 seconds to close the HTTP clients
422 future.result(3)
423 finally:
424 NETWORKS.clear()
425
426

Referenced by searx.network.network.initialize().

+ Here is the caller graph for this function:

◆ get_network()

searx.network.network.get_network ( name = None)

Definition at line 301 of file network.py.

301def get_network(name=None):
302 return NETWORKS.get(name or DEFAULT_NAME)
303
304

◆ initialize()

searx.network.network.initialize ( settings_engines = None,
settings_outgoing = None )

Definition at line 323 of file network.py.

323def initialize(settings_engines=None, settings_outgoing=None):
324 # pylint: disable=import-outside-toplevel)
325 from searx.engines import engines
326 from searx import settings
327
328 # pylint: enable=import-outside-toplevel)
329
330 settings_engines = settings_engines or settings['engines']
331 settings_outgoing = settings_outgoing or settings['outgoing']
332
333 # default parameters for AsyncHTTPTransport
334 # see https://github.com/encode/httpx/blob/e05a5372eb6172287458b37447c30f650047e1b8/httpx/_transports/default.py#L108-L121 # pylint: disable=line-too-long
335 default_params = {
336 'enable_http': False,
337 'verify': settings_outgoing['verify'],
338 'enable_http2': settings_outgoing['enable_http2'],
339 'max_connections': settings_outgoing['pool_connections'],
340 'max_keepalive_connections': settings_outgoing['pool_maxsize'],
341 'keepalive_expiry': settings_outgoing['keepalive_expiry'],
342 'local_addresses': settings_outgoing['source_ips'],
343 'using_tor_proxy': settings_outgoing['using_tor_proxy'],
344 'proxies': settings_outgoing['proxies'],
345 'max_redirects': settings_outgoing['max_redirects'],
346 'retries': settings_outgoing['retries'],
347 'retry_on_http_error': None,
348 }
349
350 def new_network(params, logger_name=None):
351 nonlocal default_params
352 result = {}
353 result.update(default_params)
354 result.update(params)
355 if logger_name:
356 result['logger_name'] = logger_name
357 return Network(**result)
358
359 def iter_networks():
360 nonlocal settings_engines
361 for engine_spec in settings_engines:
362 engine_name = engine_spec['name']
363 engine = engines.get(engine_name)
364 if engine is None:
365 continue
366 network = getattr(engine, 'network', None)
367 yield engine_name, engine, network
368
369 if NETWORKS:
370 done()
371 NETWORKS.clear()
372 NETWORKS[DEFAULT_NAME] = new_network({}, logger_name='default')
373 NETWORKS['ipv4'] = new_network({'local_addresses': '0.0.0.0'}, logger_name='ipv4')
374 NETWORKS['ipv6'] = new_network({'local_addresses': '::'}, logger_name='ipv6')
375
376 # define networks from outgoing.networks
377 for network_name, network in settings_outgoing['networks'].items():
378 NETWORKS[network_name] = new_network(network, logger_name=network_name)
379
380 # define networks from engines.[i].network (except references)
381 for engine_name, engine, network in iter_networks():
382 if network is None:
383 network = {}
384 for attribute_name, attribute_value in default_params.items():
385 if hasattr(engine, attribute_name):
386 network[attribute_name] = getattr(engine, attribute_name)
387 else:
388 network[attribute_name] = attribute_value
389 NETWORKS[engine_name] = new_network(network, logger_name=engine_name)
390 elif isinstance(network, dict):
391 NETWORKS[engine_name] = new_network(network, logger_name=engine_name)
392
393 # define networks from engines.[i].network (references)
394 for engine_name, engine, network in iter_networks():
395 if isinstance(network, str):
396 NETWORKS[engine_name] = NETWORKS[network]
397
398 # the /image_proxy endpoint has a dedicated network.
399 # same parameters than the default network, but HTTP/2 is disabled.
400 # It decreases the CPU load average, and the total time is more or less the same
401 if 'image_proxy' not in NETWORKS:
402 image_proxy_params = default_params.copy()
403 image_proxy_params['enable_http2'] = False
404 NETWORKS['image_proxy'] = new_network(image_proxy_params, logger_name='image_proxy')
405
406
407@atexit.register
::1337x
Definition 1337x.py:1

References searx.network.network.done().

+ Here is the call graph for this function:

Variable Documentation

◆ ADDRESS_MAPPING

dict searx.network.network.ADDRESS_MAPPING = {'ipv4': '0.0.0.0', 'ipv6': '::'}

Definition at line 35 of file network.py.

◆ DEFAULT_NAME

str searx.network.network.DEFAULT_NAME = '__DEFAULT__'

Definition at line 19 of file network.py.

◆ logger

searx.network.network.logger = logger.getChild('network')

Definition at line 18 of file network.py.

◆ NETWORKS

dict searx.network.network.NETWORKS = {}

Definition at line 20 of file network.py.

◆ PROXY_PATTERN_MAPPING

dict searx.network.network.PROXY_PATTERN_MAPPING
Initial value:
1= {
2 'http': 'http://',
3 'https': 'https://',
4 'socks4': 'socks4://',
5 'socks5': 'socks5://',
6 'socks5h': 'socks5h://',
7 'http:': 'http://',
8 'https:': 'https://',
9 'socks4:': 'socks4://',
10 'socks5:': 'socks5://',
11 'socks5h:': 'socks5h://',
12}

Definition at line 22 of file network.py.