3from __future__
import annotations
6__all__ = [
"log_error_only_once",
"dump_request",
"get_network",
"logger",
"too_many_requests"]
18from searx
import logger
23logger = logger.getChild(
'botdetection')
29 +
" || X-Forwarded-For: %s" % request.headers.get(
'X-Forwarded-For')
30 +
" || X-Real-IP: %s" % request.headers.get(
'X-Real-IP')
31 +
" || form: %s" % request.form
32 +
" || Accept: %s" % request.headers.get(
'Accept')
33 +
" || Accept-Language: %s" % request.headers.get(
'Accept-Language')
34 +
" || Accept-Encoding: %s" % request.headers.get(
'Accept-Encoding')
35 +
" || Content-Type: %s" % request.headers.get(
'Content-Type')
36 +
" || Content-Length: %s" % request.headers.get(
'Content-Length')
37 +
" || Connection: %s" % request.headers.get(
'Connection')
38 +
" || User-Agent: %s" % request.headers.get(
'User-Agent')
39 +
" || Sec-Fetch-Site: %s" % request.headers.get(
'Sec-Fetch-Site')
40 +
" || Sec-Fetch-Mode: %s" % request.headers.get(
'Sec-Fetch-Mode')
41 +
" || Sec-Fetch-Dest: %s" % request.headers.get(
'Sec-Fetch-Dest')
45def too_many_requests(network: IPv4Network | IPv6Network, log_msg: str) -> werkzeug.Response |
None:
46 """Returns a HTTP 429 response object and writes a ERROR message to the
47 'botdetection' logger. This function is used in part by the filter methods
48 to return the default ``Too Many Requests`` response.
52 logger.debug(
"BLOCK %s: %s", network.compressed, log_msg)
53 return flask.make_response((
'Too Many Requests', 429))
57 """Returns the (client) network of whether the ``real_ip`` is part of.
59 The ``ipv4_prefix`` and ``ipv6_prefix`` define the number of leading bits in
60 an address that are compared to determine whether or not an address is part
61 of a (client) network.
72 prefix: int = cfg[
"botdetection.ipv4_prefix"]
73 if real_ip.version == 6:
74 prefix: int = cfg[
"botdetection.ipv6_prefix"]
75 network = ip_network(f
"{real_ip}/{prefix}", strict=
False)
80_logged_errors: list[str] = []
84 if err_msg
not in _logged_errors:
86 _logged_errors.append(err_msg)
IPv4Network|IPv6Network get_network(IPv4Address|IPv6Address real_ip, config.Config cfg)
werkzeug.Response|None too_many_requests(IPv4Network|IPv6Network network, str log_msg)
dump_request(flask.Request request)
log_error_only_once(str err_msg)