Add a timeout to HTTPClient.

Fixes #629.
This commit is contained in:
Florian Bruhin 2015-04-13 20:59:05 +02:00
parent 9381aac501
commit b609f993c3

View File

@ -23,7 +23,7 @@ import functools
import urllib.request import urllib.request
import urllib.parse import urllib.parse
from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtCore import pyqtSignal, QObject, QTimer
from PyQt5.QtNetwork import (QNetworkAccessManager, QNetworkRequest, from PyQt5.QtNetwork import (QNetworkAccessManager, QNetworkRequest,
QNetworkReply) QNetworkReply)
@ -36,6 +36,7 @@ class HTTPClient(QObject):
Attributes: Attributes:
_nam: The QNetworkAccessManager used. _nam: The QNetworkAccessManager used.
_timers: A {QNetworkReply: QTimer} dict.
Signals: Signals:
success: Emitted when the operation succeeded. success: Emitted when the operation succeeded.
@ -50,6 +51,7 @@ class HTTPClient(QObject):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self._nam = QNetworkAccessManager(self) self._nam = QNetworkAccessManager(self)
self._timers = {}
def post(self, url, data=None): def post(self, url, data=None):
"""Create a new POST request. """Create a new POST request.
@ -65,11 +67,7 @@ class HTTPClient(QObject):
request.setHeader(QNetworkRequest.ContentTypeHeader, request.setHeader(QNetworkRequest.ContentTypeHeader,
'application/x-www-form-urlencoded;charset=utf-8') 'application/x-www-form-urlencoded;charset=utf-8')
reply = self._nam.post(request, encoded_data) reply = self._nam.post(request, encoded_data)
if reply.isFinished(): self._handle_reply(reply)
self.on_reply_finished(reply)
else:
reply.finished.connect(functools.partial(
self.on_reply_finished, reply))
def get(self, url): def get(self, url):
"""Create a new GET request. """Create a new GET request.
@ -81,9 +79,18 @@ class HTTPClient(QObject):
""" """
request = QNetworkRequest(url) request = QNetworkRequest(url)
reply = self._nam.get(request) reply = self._nam.get(request)
self._handle_reply(reply)
def _handle_reply(self, reply):
"""Handle a new QNetworkReply."""
if reply.isFinished(): if reply.isFinished():
self.on_reply_finished(reply) self.on_reply_finished(reply)
else: else:
timer = QTimer(self)
timer.setInterval(10000)
timer.timeout.connect(reply.abort)
timer.start()
self._timers[reply] = timer
reply.finished.connect(functools.partial( reply.finished.connect(functools.partial(
self.on_reply_finished, reply)) self.on_reply_finished, reply))
@ -93,6 +100,10 @@ class HTTPClient(QObject):
Args: Args:
reply: The QNetworkReply which finished. reply: The QNetworkReply which finished.
""" """
timer = self._timers.pop(reply)
if timer is not None:
timer.stop()
timer.deleteLater()
if reply.error() != QNetworkReply.NoError: if reply.error() != QNetworkReply.NoError:
self.error.emit(reply.errorString()) self.error.emit(reply.errorString())
return return