2222#include " BDiskConst.h"
2323#include " BDiskTokenProvider.h"
2424#include " BDiskCookieJar.h"
25-
26-
27- #define INNER_EVENT (QEvent::Type(QEvent::User))
28- // #define INNER_CAPTCHA_URL (QEvent::Type(QEvent::User + 1))
29-
30- class InnerEvent : public QEvent
31- {
32- public:
33- enum EventState {
34- EVENT_LOGIN_ABORT = 0x0 ,
35- EVENT_LOGIN_SUCCESS,
36- EVENT_LOGIN_FAILURE,
37- EVENT_CAPTCHA_URL,
38- EVENT_CAPTCHA_TEXT,
39- EVENT_CAPTCHA_URL_NEED_REFRESH
40- };
41-
42- public:
43- InnerEvent (InnerEvent::EventState ret, const QString &value)
44- : QEvent(INNER_EVENT)
45- , m_url(QUrl())
46- {
47- m_ret = ret;
48- m_data = value;
49- }
50- InnerEvent (InnerEvent::EventState ret, const QUrl &value)
51- : QEvent(INNER_EVENT)
52- , m_data(QString())
53- {
54- m_ret = ret;
55- m_url = value;
56- }
57- virtual ~InnerEvent () {}
58-
59- EventState state () const {
60- return m_ret;
61- }
62- QString data () const {
63- return m_data;
64- }
65- QUrl url () const {
66- return m_url;
67- }
68- private:
69- EventState m_ret;
70- QString m_data;
71- QUrl m_url;
72- };
73-
74-
75- class InnerStateHandler : public QObject
76- {
77- Q_OBJECT
78- public:
79- InnerStateHandler (QObject *parent = 0 )
80- : QObject(parent)
81- , m_mutex(QMutex::Recursive)
82- {
83-
84- }
85- virtual ~InnerStateHandler () {}
86-
87- void dispatch (InnerEvent::EventState ret, const QString &data = QString()) {
88- m_mutex.lock ();
89- qApp->postEvent (parent (), new InnerEvent (ret, data));
90- m_mutex.unlock ();
91- }
92- void dispatch (InnerEvent::EventState ret, const QUrl &data) {
93- m_mutex.lock ();
94- qApp->postEvent (parent (), new InnerEvent (ret, data));
95- m_mutex.unlock ();
96- }
97-
98- private:
99- QMutex m_mutex;
100- };
101-
25+ #include " BDiskLogin_p.h"
10226
10327BDiskLogin::BDiskLogin (QObject *parent)
10428 : QThread(parent)
@@ -139,18 +63,11 @@ void BDiskLogin::loginByCookie()
13963 QUrl url = QUrl (BDISK_URL_DISK_HOME);
14064 QNetworkRequest request (url);
14165 fillRequest (&request);
142- m_reply = m_networkMgr->get (request);
14366
67+ m_reply = m_networkMgr->head (request);
14468 if (m_reply) {
14569 connect (m_reply, &QNetworkReply::finished,
14670 [&](){
147- // if (m_requestAborted) {
148- // m_requestAborted = false;
149- // m_handler->dispatch(InnerEvent::EVENT_LOGIN_ABORT);
150- // m_breakThread = true;
151- // freeReply();
152- // return;
153- // }
15471 QNetworkReply::NetworkError e = m_reply->error ();
15572 bool success = (e == QNetworkReply::NoError);
15673 if (!success) {
@@ -159,46 +76,74 @@ void BDiskLogin::loginByCookie()
15976 emit loginByCookieFailure (str);
16077 return ;
16178 }
162- QByteArray qba = m_reply->readAll ();
163- qDebug ()<<Q_FUNC_INFO<<" reply data " <<qba;
164- if (qba.trimmed ().isEmpty ()) {
165- freeReply ();
166- emit loginByCookieSuccess ();
167- // emit loginFailure(" reply data "+qba);
79+ QVariant code = m_reply->attribute (QNetworkRequest::HttpStatusCodeAttribute);
80+ freeReply ();
81+ if (code.isNull () || !code.isValid ()) {
82+ emit loginByCookieFailure (QString (" Invalid http code." ));
83+ return ;
84+ }
85+ bool ok = false ;
86+ int ret = code.toInt (&ok);
87+ if (!ok) {
88+ emit loginByCookieFailure (QString (" Invalid http code to int." ));
89+ return ;
90+ }
91+ // TODO 302, url redirect
92+ if (ret != 200 ) {
93+ emit loginByCookieFailure (QString (" Http code [%1] error." ).arg (QString::number (ret)));
16894 return ;
16995 }
17096
171- // TODO get bdstoken from response by key yunData.MYBDSTOKEN or FileUtils.bdstoken
172- // if (m_tokenProvider->bdstoken().isEmpty()) {
173- QString value = truncateYunData (QString (qba));
174- if (value.isEmpty ()) {
175- qDebug ()<<Q_FUNC_INFO<<" Can't get yunData values" ;
176- freeReply ();
177- emit loginByCookieFailure (" Can't get yunData values" );
178- return ;
179- }
180- QJsonParseError error;
181- QJsonDocument doc = QJsonDocument::fromJson (value.toLocal8Bit (), &error);
182- if (error.error != QJsonParseError::NoError) {
183- qDebug ()<<Q_FUNC_INFO<<" Parse json error => " <<error.errorString ();
97+ m_reply = m_networkMgr->get (request);
98+
99+ if (m_reply) {
100+ connect (m_reply, &QNetworkReply::finished,
101+ [&](){
102+ QNetworkReply::NetworkError e = m_reply->error ();
103+ bool success = (e == QNetworkReply::NoError);
104+ if (!success) {
105+ QString str = m_reply->errorString ();
106+ freeReply ();
107+ emit loginByCookieFailure (str);
108+ return ;
109+ }
110+ QByteArray qba = m_reply->readAll ();
111+ qDebug ()<<Q_FUNC_INFO<<" reply data " <<qba;
184112 freeReply ();
185- emit loginByCookieFailure (QString (" Parse json error [%1]" ).arg (error.errorString ()));
186- return ;
187- }
188- QJsonObject obj = doc.object ();
189- QString bdstoken = obj.value (" bdstoken" ).toString ();
190- if (bdstoken.isEmpty ()) {
191- emit loginByCookieFailure (" Can't get bdstoken" );
192- return ;
193- }
194- m_tokenProvider->setBdstoken (bdstoken);
195- QString uname = obj.value (" username" ).toString ();
196- // FIXME emit failure if uname is empty;
197- m_tokenProvider->setUidStr (uname);
198- // }
199- freeReply ();
200- m_tokenProvider->flush ();
201- emit loginByCookieSuccess ();
113+ if (qba.trimmed ().isEmpty ()) {
114+ emit loginByCookieSuccess ();
115+ return ;
116+ }
117+ // TODO get bdstoken from response by key yunData.MYBDSTOKEN or FileUtils.bdstoken
118+ // if (m_tokenProvider->bdstoken().isEmpty()) {
119+ QString value = truncateYunData (QString (qba));
120+ if (value.isEmpty ()) {
121+ qDebug ()<<Q_FUNC_INFO<<" Can't get yunData values" ;
122+ emit loginByCookieFailure (" Can't get yunData values" );
123+ return ;
124+ }
125+ QJsonParseError error;
126+ QJsonDocument doc = QJsonDocument::fromJson (value.toLocal8Bit (), &error);
127+ if (error.error != QJsonParseError::NoError) {
128+ qDebug ()<<Q_FUNC_INFO<<" Parse json error => " <<error.errorString ();
129+ emit loginByCookieFailure (QString (" Parse json error [%1]" ).arg (error.errorString ()));
130+ return ;
131+ }
132+ QJsonObject obj = doc.object ();
133+ QString bdstoken = obj.value (" bdstoken" ).toString ();
134+ if (bdstoken.isEmpty ()) {
135+ emit loginByCookieFailure (" Can't get bdstoken" );
136+ return ;
137+ }
138+ m_tokenProvider->setBdstoken (bdstoken);
139+ QString uname = obj.value (" username" ).toString ();
140+ // FIXME emit failure if uname is empty;
141+ m_tokenProvider->setUidStr (uname);
142+ // }
143+ m_tokenProvider->flush ();
144+ emit loginByCookieSuccess ();
145+ });
146+ }
202147 });
203148 }
204149}
@@ -975,5 +920,3 @@ void BDiskLogin::fillRequest(QNetworkRequest *req)
975920 req->setRawHeader (" Accept" , " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" );
976921}
977922
978-
979- #include " BDiskLogin.moc"
0 commit comments