Helpviewer/Network/FollowRedirectReply.py

changeset 1953
26aa6fd94dc2
child 1955
9e6da33c1c10
equal deleted inserted replaced
1952:af4103f0e93f 1953:26aa6fd94dc2
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a network reply delegate allowing to check redirects.
8 """
9
10 from PyQt4.QtCore import pyqtSignal, QObject
11 from PyQt4.QtNetwork import QNetworkRequest
12
13
14 class FollowRedirectReply(QObject):
15 """
16 Class implementing a network reply delegate allowing to check redirects
17 """
18 finished = pyqtSignal()
19
20 def __init__(self, url, manager, maxRedirects=5):
21 """
22 Constructor
23
24 @param url URL to get (QUrl)
25 @param manager reference to the network access manager (QNetworkAccessManager)
26 @keyparam maxRedirects maximum allowed redirects (integer)
27 """
28 super().__init__()
29
30 self.__manager = manager
31 self.__maxRedirects = maxRedirects
32 self.__redirectCount = 0
33
34 self.__reply = self.__manager.get(QNetworkRequest(url))
35 self.__reply.finished[()].connect(self.__replyFinished)
36
37 def reply(self):
38 """
39 Public method to get the reply object.
40
41 @return reference to the reply object (QNetworkReply)
42 """
43 return self.__reply
44
45 def originalUrl(self):
46 """
47 Public method to get the original URL.
48
49 @return original URL (QUrl)
50 """
51 return self.__reply.request().url()
52
53 def url(self):
54 """
55 Public method to get the final URL (after redirects).
56
57 @return final URL (QUrl)
58 """
59 return self.__reply.url()
60
61 def error(self):
62 """
63 Public method to get the error information.
64
65 @return error code (QNetworkReply.NetworkError)
66 """
67 return self.__reply.error()
68
69 def readAll(self):
70 """
71 Public method to read all received data.
72
73 @return received raw data (QByteArray)
74 """
75 return self.__reply.readAll()
76
77 def __replyFinished(self):
78 """
79 Private slot handling the receipt of the requested data.
80 """
81 replyStatus = self.__reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
82 if (replyStatus != 301 and replyStatus != 302) or \
83 self.__redirectCount == self.__maxRedirects:
84 self.finished.emit()
85 return
86
87 self.__redirectCount += 1
88
89 redirectUrl = self.__reply.attribute(QNetworkRequest.RedirectionTargetAttribute)
90 self.__reply.close()
91 self.__reply.finished[()].disconnect(self.__replyFinished)
92
93 self.__reply = self.__manager.get(QNetworkRequest(redirectUrl))
94 self.__reply.finished[()].connect(self.__replyFinished)

eric ide

mercurial