QtRequests: Use QNetworkAccessManager's queue
This commit is contained in:
parent
4e2ffaae93
commit
50276384cc
|
@ -8,7 +8,6 @@ import orjson
|
|||
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, QUrlQuery, pyqtSlot
|
||||
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply, QNetworkDiskCache
|
||||
|
||||
REQUEST_LIMIT = 8
|
||||
USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
|
||||
RequestHandler = TypeVar("RequestHandler", bound=Callable[[Union[Dict, bytes]], None])
|
||||
|
||||
|
@ -33,7 +32,6 @@ class QtRequests(QObject):
|
|||
self.log = getLogger(f"{type(self).__name__}_{type(parent).__name__}")
|
||||
self.manager = QNetworkAccessManager(self)
|
||||
self.manager.finished.connect(self.__on_finished)
|
||||
self.manager.finished.connect(self.__process_next)
|
||||
self.cache = None
|
||||
if cache is not None:
|
||||
self.log.debug("Using cache dir %s", cache)
|
||||
|
@ -44,8 +42,7 @@ class QtRequests(QObject):
|
|||
self.log.debug("Manager is authorized")
|
||||
self.token = token
|
||||
|
||||
self.__pending_requests = []
|
||||
self.__active_requests = {}
|
||||
self.__active_requests: Dict[QNetworkReply, RequestQueueItem] = {}
|
||||
|
||||
@staticmethod
|
||||
def __prepare_query(url, params) -> QUrl:
|
||||
|
@ -58,7 +55,7 @@ class QtRequests(QObject):
|
|||
|
||||
def __prepare_request(self, item: RequestQueueItem) -> QNetworkRequest:
|
||||
request = QNetworkRequest(item.url)
|
||||
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json;charset=UTF-8")
|
||||
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json; charset=UTF-8")
|
||||
request.setHeader(QNetworkRequest.UserAgentHeader, USER_AGENT)
|
||||
request.setAttribute(QNetworkRequest.RedirectPolicyAttribute, QNetworkRequest.NoLessSafeRedirectPolicy)
|
||||
if self.cache is not None:
|
||||
|
@ -76,10 +73,7 @@ class QtRequests(QObject):
|
|||
|
||||
def post(self, url: str, handler: RequestHandler, payload: dict):
|
||||
item = RequestQueueItem(method="post", url=QUrl(url), payload=payload, handlers=[handler])
|
||||
if len(self.__active_requests) < REQUEST_LIMIT:
|
||||
self.__post(item)
|
||||
else:
|
||||
self.__pending_requests.append(item)
|
||||
self.__post(item)
|
||||
|
||||
def __get(self, item: RequestQueueItem):
|
||||
request = self.__prepare_request(item)
|
||||
|
@ -90,10 +84,7 @@ class QtRequests(QObject):
|
|||
def get(self, url: str, handler: RequestHandler, payload: Dict = None, params: Dict = None):
|
||||
url = self.__prepare_query(url, params) if params is not None else QUrl(url)
|
||||
item = RequestQueueItem(method="get", url=url, payload=payload, handlers=[handler])
|
||||
if len(self.__active_requests) < REQUEST_LIMIT:
|
||||
self.__get(item)
|
||||
else:
|
||||
self.__pending_requests.append(item)
|
||||
self.__get(item)
|
||||
|
||||
def __on_error(self, error: QNetworkReply.NetworkError) -> None:
|
||||
self.log.error(error)
|
||||
|
@ -102,19 +93,9 @@ class QtRequests(QObject):
|
|||
def __parse_content_type(header) -> Tuple[str, str]:
|
||||
# lk: this looks weird but `cgi` is deprecated, PEP 594 suggests this way of parsing MIME
|
||||
m = Message()
|
||||
m['content-type'] = header
|
||||
m["content-type"] = header
|
||||
return m.get_content_type(), m.get_content_charset()
|
||||
|
||||
def __process_next(self):
|
||||
if self.__pending_requests:
|
||||
item = self.__pending_requests.pop(0)
|
||||
if item.method == "post":
|
||||
self.__post(item)
|
||||
elif item.method == "get":
|
||||
self.__get(item)
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
@pyqtSlot(QNetworkReply)
|
||||
def __on_finished(self, reply: QNetworkReply):
|
||||
item = self.__active_requests.pop(reply, None)
|
||||
|
|
Loading…
Reference in a new issue