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

Classes

class  Network

Functions

"Network" get_network (str|None name=None)
 check_network_configuration ()
None initialize (list[dict[str, t.Any]] settings_engines=None, dict[str, t.Any] settings_outgoing=None)
 done ()

Variables

list __all__ = ["get_network"]
 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 318 of file network.py.

318def check_network_configuration():
319 async def check():
320 exception_count = 0
321 for network in NETWORKS.values():
322 if network.using_tor_proxy:
323 try:
324 await network.get_client()
325 except Exception: # pylint: disable=broad-except
326 network._logger.exception('Error') # pylint: disable=protected-access
327 exception_count += 1
328 return exception_count
329
330 future = asyncio.run_coroutine_threadsafe(check(), get_loop())
331 exception_count = future.result()
332 if exception_count > 0:
333 raise RuntimeError("Invalid network configuration")
334
335

◆ 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 424 of file network.py.

424def done():
425 """Close all HTTP client
426
427 Avoid a warning at exit
428 See https://github.com/encode/httpx/pull/2026
429
430 Note: since Network.aclose has to be async, it is not possible to call this method on Network.__del__
431 So Network.aclose is called here using atexit.register
432 """
433 try:
434 loop = get_loop()
435 if loop:
436 future = asyncio.run_coroutine_threadsafe(Network.aclose_all(), loop)
437 # wait 3 seconds to close the HTTP clients
438 future.result(3)
439 finally:
440 NETWORKS.clear()
441
442

Referenced by initialize().

Here is the caller graph for this function:

◆ get_network()

"Network" searx.network.network.get_network ( str | None name = None)

Definition at line 314 of file network.py.

314def get_network(name: str | None = None) -> "Network":
315 return NETWORKS.get(name or DEFAULT_NAME) # pyright: ignore[reportReturnType]
316
317

◆ initialize()

None searx.network.network.initialize ( list[dict[str, t.Any]] settings_engines = None,
dict[str, t.Any] settings_outgoing = None )

Definition at line 336 of file network.py.

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

References done().

Here is the call graph for this function:

Variable Documentation

◆ __all__

list searx.network.network.__all__ = ["get_network"]
private

Definition at line 5 of file network.py.

◆ ADDRESS_MAPPING

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

Definition at line 41 of file network.py.

◆ DEFAULT_NAME

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

Definition at line 25 of file network.py.

◆ logger

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

Definition at line 24 of file network.py.

◆ NETWORKS

dict searx.network.network.NETWORKS = {}

Definition at line 26 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 28 of file network.py.