mirror of
https://github.com/searxng/searxng.git
synced 2026-09-23 06:36:12 +00:00
[fix] network: stop http redirects (#6740)
Stop curl from following from a HTTPS origin to a HTTP page See: https://curl.se/libcurl/c/CURLOPT_REDIR_PROTOCOLS_STR.html Reported-by: Rohit Dixit <00.00.xit@gmail.com>
This commit is contained in:
@@ -9,7 +9,7 @@ import os
|
|||||||
import threading
|
import threading
|
||||||
|
|
||||||
from curl_cffi import AsyncSession, CurlHttpVersion, CurlOpt
|
from curl_cffi import AsyncSession, CurlHttpVersion, CurlOpt
|
||||||
from curl_cffi.requests.exceptions import InvalidSchema, RequestException
|
from curl_cffi.requests.exceptions import RequestException
|
||||||
|
|
||||||
from searx.extended_types import SXNG_Response
|
from searx.extended_types import SXNG_Response
|
||||||
|
|
||||||
@@ -23,8 +23,7 @@ NO_IMPERSONATE = "none"
|
|||||||
class AsyncClient(AsyncSession):
|
class AsyncClient(AsyncSession):
|
||||||
""":class:`curl_cffi.AsyncSession` with ``aclose`` / ``is_closed``."""
|
""":class:`curl_cffi.AsyncSession` with ``aclose`` / ``is_closed``."""
|
||||||
|
|
||||||
def __init__(self, enable_http: bool, **kwargs: t.Any):
|
def __init__(self, **kwargs: t.Any):
|
||||||
self.enable_http = enable_http
|
|
||||||
self._closed = False
|
self._closed = False
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
@@ -32,10 +31,6 @@ class AsyncClient(AsyncSession):
|
|||||||
def is_closed(self) -> bool:
|
def is_closed(self) -> bool:
|
||||||
return self._closed
|
return self._closed
|
||||||
|
|
||||||
def check_url(self, url: str) -> None:
|
|
||||||
if not self.enable_http and str(url).startswith("http://"):
|
|
||||||
raise InvalidSchema("HTTP protocol is disabled")
|
|
||||||
|
|
||||||
async def aclose(self) -> None:
|
async def aclose(self) -> None:
|
||||||
if self._closed:
|
if self._closed:
|
||||||
return
|
return
|
||||||
@@ -80,6 +75,9 @@ def new_client(
|
|||||||
curl_options: dict[int, t.Any] | None = None,
|
curl_options: dict[int, t.Any] | None = None,
|
||||||
) -> AsyncClient:
|
) -> AsyncClient:
|
||||||
extra_curl = dict(curl_options or {})
|
extra_curl = dict(curl_options or {})
|
||||||
|
if not enable_http:
|
||||||
|
extra_curl.setdefault(CurlOpt.PROTOCOLS_STR, "https")
|
||||||
|
extra_curl.setdefault(CurlOpt.REDIR_PROTOCOLS_STR, "https")
|
||||||
cert_file = os.environ.get("SSL_CERT_FILE")
|
cert_file = os.environ.get("SSL_CERT_FILE")
|
||||||
if cert_file:
|
if cert_file:
|
||||||
extra_curl.setdefault(CurlOpt.CAINFO, cert_file)
|
extra_curl.setdefault(CurlOpt.CAINFO, cert_file)
|
||||||
@@ -88,7 +86,6 @@ def new_client(
|
|||||||
extra_curl.setdefault(CurlOpt.CAPATH, cert_dir)
|
extra_curl.setdefault(CurlOpt.CAPATH, cert_dir)
|
||||||
use_impersonate = impersonate not in ("", NO_IMPERSONATE)
|
use_impersonate = impersonate not in ("", NO_IMPERSONATE)
|
||||||
kwargs: dict[str, t.Any] = {
|
kwargs: dict[str, t.Any] = {
|
||||||
"enable_http": enable_http,
|
|
||||||
"verify": verify,
|
"verify": verify,
|
||||||
"max_redirects": max_redirects,
|
"max_redirects": max_redirects,
|
||||||
"max_clients": max_connections or 10,
|
"max_clients": max_connections or 10,
|
||||||
|
|||||||
@@ -277,7 +277,6 @@ class Network:
|
|||||||
client = await self.get_client(**kwargs_clients)
|
client = await self.get_client(**kwargs_clients)
|
||||||
try:
|
try:
|
||||||
method = method.upper()
|
method = method.upper()
|
||||||
client.check_url(url)
|
|
||||||
if stream:
|
if stream:
|
||||||
return client.stream(method, url, **kwargs)
|
return client.stream(method, url, **kwargs)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user