This commit is contained in:
恍兮惚兮 2024-07-10 12:52:06 +08:00
parent 1e3769f2d8
commit 495623c397
4 changed files with 62 additions and 33 deletions

View File

@ -57,6 +57,16 @@ class Requester(Requester_common):
Accept_Encoding = "gzip, deflate, br, zstd" Accept_Encoding = "gzip, deflate, br, zstd"
def __init__(self) -> None:
self._tls = threading.local()
self._tls.curl = self.initcurl()
def initcurl(self):
curl = AutoCURLHandle(curl_easy_init())
curl_easy_setopt(curl, CURLoption.COOKIEJAR, "")
curl_easy_setopt(curl, CURLoption.USERAGENT, self.default_UA.encode("utf8"))
return curl
def raise_for_status(self): def raise_for_status(self):
if self.last_error: if self.last_error:
raise CURLException(self.last_error) raise CURLException(self.last_error)
@ -121,6 +131,25 @@ class Requester(Requester_common):
elif isinstance(headerqueue, list): elif isinstance(headerqueue, list):
return b"".join(headerqueue).decode("utf8") return b"".join(headerqueue).decode("utf8")
@property
def curl(self):
if not getattr(self._tls, "curl", None):
self._tls.curl = self.initcurl()
return self._tls.curl
def _setheaders(self, curl, headers, cookies):
lheaders = Autoslist()
for _ in self._parseheader(headers, None):
lheaders = curl_slist_append(
cast(lheaders, POINTER(curl_slist)), _.encode("utf8")
)
self.last_error = curl_easy_setopt(curl, CURLoption.HTTPHEADER, lheaders)
self.raise_for_status()
if cookies:
cookie = self._parsecookie(cookies)
curl_easy_setopt(curl, CURLoption.COOKIE, cookie.encode("utf8"))
@ExceptionFilter @ExceptionFilter
def request( def request(
self, self,
@ -140,15 +169,8 @@ class Requester(Requester_common):
timeout, timeout,
allow_redirects, allow_redirects,
): ):
curl = AutoCURLHandle(curl_easy_init()) curl = self.curl
curl_easy_setopt(curl, CURLoption.COOKIEJAR, "")
curl_easy_setopt(
curl, CURLoption.USERAGENT, headers["User-Agent"].encode("utf8")
)
if cookies:
cookie = self._parsecookie(cookies)
curl_easy_setopt(curl, CURLoption.COOKIE, cookie.encode("utf8"))
if timeout: if timeout:
curl_easy_setopt(curl, CURLoption.TIMEOUT_MS, timeout) curl_easy_setopt(curl, CURLoption.TIMEOUT_MS, timeout)
curl_easy_setopt(curl, CURLoption.CONNECTTIMEOUT_MS, timeout) curl_easy_setopt(curl, CURLoption.CONNECTTIMEOUT_MS, timeout)
@ -164,13 +186,7 @@ class Requester(Requester_common):
self.raise_for_status() self.raise_for_status()
curl_easy_setopt(curl, CURLoption.PORT, port) curl_easy_setopt(curl, CURLoption.PORT, port)
lheaders = Autoslist() self._setheaders(curl, headers, cookies)
for _ in self._parseheader(headers, None):
lheaders = curl_slist_append(
cast(lheaders, POINTER(curl_slist)), _.encode("utf8")
)
self.last_error = curl_easy_setopt(curl, CURLoption.HTTPHEADER, lheaders)
self.raise_for_status()
self._set_verify(curl, verify) self._set_verify(curl, verify)
self._set_proxy(curl, proxy) self._set_proxy(curl, proxy)

View File

@ -8,6 +8,7 @@ try:
from .brotli_dec import decompress from .brotli_dec import decompress
except: except:
from traceback import print_exc from traceback import print_exc
print_exc() print_exc()
@ -126,6 +127,19 @@ class Requester(Requester_common):
hRequest, WINHTTP_OPTION_REDIRECT_POLICY, pointer(dwFlags), sizeof(dwFlags) hRequest, WINHTTP_OPTION_REDIRECT_POLICY, pointer(dwFlags), sizeof(dwFlags)
) )
def __init__(self) -> None:
self.hSession = AutoWinHttpHandle(
WinHttpOpen(
self.default_UA,
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0,
)
)
if self.hSession == 0:
raise WinhttpException(GetLastError())
@ExceptionFilter @ExceptionFilter
def request( def request(
self, self,
@ -149,18 +163,8 @@ class Requester(Requester_common):
flag = WINHTTP_FLAG_SECURE if scheme == "https" else 0 flag = WINHTTP_FLAG_SECURE if scheme == "https" else 0
# print(server,port,param,dataptr) # print(server,port,param,dataptr)
headers = "\r\n".join(headers) headers = "\r\n".join(headers)
hSession = AutoWinHttpHandle(
WinHttpOpen( hConnect = AutoWinHttpHandle(WinHttpConnect(self.hSession, server, port, 0))
_headers["User-Agent"],
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0,
)
)
if hSession == 0:
raise WinhttpException(GetLastError())
hConnect = AutoWinHttpHandle(WinHttpConnect(hSession, server, port, 0))
if hConnect == 0: if hConnect == 0:
raise WinhttpException(GetLastError()) raise WinhttpException(GetLastError())
hRequest = AutoWinHttpHandle( hRequest = AutoWinHttpHandle(
@ -195,7 +199,7 @@ class Requester(Requester_common):
resp.status_code = self._getStatusCode(hRequest) resp.status_code = self._getStatusCode(hRequest)
if stream: if stream:
resp.hSession = hSession resp.hSession = self.hSession
resp.hconn = hConnect resp.hconn = hConnect
resp.hreq = hRequest resp.hreq = hRequest
return resp return resp

View File

@ -5,6 +5,8 @@ from urllib.parse import urlencode, urlsplit
from functools import partial from functools import partial
from myutils.config import globalconfig from myutils.config import globalconfig
default_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
class RequestException(Exception): class RequestException(Exception):
pass pass
@ -120,6 +122,7 @@ class ResponseBase:
class Requester_common: class Requester_common:
Accept_Encoding = "gzip, deflate, br" Accept_Encoding = "gzip, deflate, br"
default_UA = default_UA
def request(self, *argc) -> ResponseBase: ... def request(self, *argc) -> ResponseBase: ...
@ -160,18 +163,20 @@ class Session:
def __init__(self) -> None: def __init__(self) -> None:
self.requester = None self.requester = None
self.requester_type = None self.requester_type = None
self.UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" self.default_UA = default_UA
self.last_error = 0 self.last_error = 0
self.cookies = {} self.cookies = {}
self.headers = CaseInsensitiveDict( self.headers = CaseInsensitiveDict(
{ {
"User-Agent": self.UA, "User-Agent": self.default_UA,
"Accept-Encoding": "gzip, deflate, br", # "Accept-Encoding": "gzip, deflate, br",
"Accept": "*/*", "Accept": "*/*",
"Connection": "keep-alive", "Connection": "keep-alive",
} }
) )
self._requester = None
self._libidx = -1
def __enter__(self): def __enter__(self):
return self return self
@ -253,11 +258,15 @@ class Session:
return scheme, server, port, path, url return scheme, server, port, path, url
def loadrequester(self) -> Requester_common: def loadrequester(self) -> Requester_common:
if self._libidx == globalconfig["network"]:
return self._requester
if globalconfig["network"] == 1: if globalconfig["network"] == 1:
from network.libcurl.requester import Requester from network.libcurl.requester import Requester
elif globalconfig["network"] == 0: elif globalconfig["network"] == 0:
from network.winhttp.requester import Requester from network.winhttp.requester import Requester
return Requester() self._requester = Requester()
self._libidx = globalconfig["network"]
return self._requester
def request( def request(
self, self,

View File

@ -29,7 +29,7 @@ include(generate_product_version)
set(VERSION_MAJOR 5) set(VERSION_MAJOR 5)
set(VERSION_MINOR 9) set(VERSION_MINOR 9)
set(VERSION_PATCH 0) set(VERSION_PATCH 1)
add_library(pch pch.cpp) add_library(pch pch.cpp)
target_precompile_headers(pch PUBLIC pch.h) target_precompile_headers(pch PUBLIC pch.h)