QNetworkReply *RedirectNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData) { QNetworkRequest newreq(req); QString url = newreq.url().toString(); for (auto &item : m_pairs) { url.replace(item.first, item.second, Qt::CaseInsensitive); } newreq.setUrl(QUrl::fromUserInput(url)); url = newreq.url().toLocalFile(); /* 第1次请求的网页文件为主页文件 */ if ((m_prgbase3.length() < 1) && (url.endsWith(".html", Qt::CaseInsensitive))) { m_prgbase3 = url; m_prgbase1 = url.left(url.lastIndexOf('/') + 1); } /* editor.md工具目录 */ if (m_prgbase2.length() < 1) { if (url.endsWith("/editormd.min.js")) { m_prgbase2 = url.left(url.length()-15); } } if (redirectPath(url)) { newreq.setUrl(QUrl::fromLocalFile(url)); } return QNetworkAccessManager::createRequest(op, newreq, outgoingData); }
QNetworkReply* NetworkAccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *out){ QNetworkRequest newreq(req); if(m_SslProtocol != QSsl::UnknownProtocol && (req.url().scheme() == QStringLiteral("https") || req.url().scheme() == QStringLiteral("ftps"))){ QSslConfiguration sslConfig = newreq.sslConfiguration(); sslConfig.setProtocol(m_SslProtocol); newreq.setSslConfiguration(sslConfig); } #if 0 //def PASSWORD_MANAGER if(out && op == QNetworkAccessManager::PostOperation){ QByteArray referer = req.rawHeader("Referer"); QString key = m_Id + QStringLiteral(":") + QUrl::fromEncoded(referer).host(); if(Application::GetAuthData(key).isEmpty()){ QByteArray data = out->readAll(); out->reset(); BoolCallBack callBack = [key, data](bool ok){ if(ok) Application::RegisterAuthData(key, data); }; ModelessDialog::Question(tr("An authentication has been executed."), tr("Save this password?"), callBack); } } #endif QNetworkReply *rep = QNetworkAccessManager::createRequest(op, newreq, out); // QNetworkReply::error is overloaded. connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(HandleError(QNetworkReply::NetworkError))); connect(rep, &QNetworkReply::sslErrors, this, &NetworkAccessManager::HandleSslErrors); QString type = newreq.header(QNetworkRequest::ContentTypeHeader).value<QString>(); if(type.toLower().contains(QStringLiteral("multipart/form-data;"))){ UploadItem *item = NetworkController::Upload(rep, newreq.header(QNetworkRequest::ContentLengthHeader).value<qint64>()); if(item){ MainWindow *win = Application::GetCurrentWindow(); if(win && win->GetTreeBank()->GetNotifier()) win->GetTreeBank()->GetNotifier()->RegisterUpload(item); } } return rep; }
void tr_natpmpPulse( tr_natpmp_t * pmp, int * publicPort ) { if( 0 <= pmp->mcastfd ) { mcastpulse( pmp ); } if( NULL != publicPort ) { *publicPort = -1; } if( pmp->active || PMP_STATE_DELETING == pmp->state ) { switch( pmp->state ) { case PMP_STATE_IDLE: case PMP_STATE_TMPFAIL: if( 0 < pmp->newport ) { tr_dbg( "nat-pmp state %s -> add with port %i", ( PMP_STATE_IDLE == pmp->state ? "idle" : "err" ), pmp->newport ); pmp->state = PMP_STATE_ADDING; } break; case PMP_STATE_ADDING: if( NULL == pmp->req ) { if( 0 >= pmp->newport ) { tr_dbg( "nat-pmp state add -> idle, no port" ); pmp->state = PMP_STATE_IDLE; } else if( INADDR_NONE == pmp->dest.s_addr ) { tr_dbg( "nat-pmp state add -> fail, no default route" ); pmp->state = PMP_STATE_FAILED; } else { pmp->req = newreq( 1, pmp->dest, pmp->newport ); if( NULL == pmp->req ) { pmp->state = PMP_STATE_FAILED; tr_dbg( "nat-pmp state add -> fail on req init" ); } } } if( PMP_STATE_ADDING == pmp->state ) { switch( pulsereq( pmp ) ) { case TR_NET_ERROR: if( pmp->req->nobodyhome ) { pmp->state = PMP_STATE_NOBODYHOME; tr_dbg( "nat-pmp state add -> nobodyhome on pulse" ); } else if( pmp->req->tmpfail ) { pmp->state = PMP_STATE_TMPFAIL; tr_dbg( "nat-pmp state add -> err on pulse" ); if( pmp->req->askport == pmp->newport ) { pmp->newport = 0; } } else { pmp->state = PMP_STATE_FAILED; tr_dbg( "nat-pmp state add -> fail on pulse" ); } killreq( &pmp->req ); break; case TR_NET_OK: pmp->mappedport = pmp->req->gotport; if( pmp->mappedport != pmp->newport && pmp->newport == pmp->req->askport ) { pmp->newport = pmp->req->gotport; } killreq( &pmp->req ); pmp->state = PMP_STATE_MAPPED; pmp->mapped = 1; tr_dbg( "nat-pmp state add -> mapped with port %i", pmp->mappedport); tr_inf( "nat-pmp mapped port %i", pmp->mappedport ); if( NULL != publicPort ) { *publicPort = pmp->mappedport; } break; case TR_NET_WAIT: break; } } break; case PMP_STATE_DELETING: if( NULL == pmp->req ) { assert( 0 < pmp->mappedport ); pmp->req = newreq( 0, pmp->dest, pmp->mappedport ); if( NULL == pmp->req ) { pmp->state = PMP_STATE_FAILED; tr_dbg( "nat-pmp state del -> fail on req init" ); } } if( PMP_STATE_DELETING == pmp->state ) { switch( pulsereq( pmp ) ) { case TR_NET_ERROR: if( pmp->req->nobodyhome ) { pmp->mapped = 0; pmp->state = PMP_STATE_NOBODYHOME; tr_dbg( "nat-pmp state del -> nobodyhome on pulse" ); } else if( pmp->req->tmpfail ) { pmp->mapped = 0; pmp->state = PMP_STATE_TMPFAIL; tr_dbg( "nat-pmp state del -> err on pulse" ); pmp->mappedport = -1; } else { pmp->state = PMP_STATE_FAILED; tr_dbg( "nat-pmp state del -> fail on pulse" ); } killreq( &pmp->req ); break; case TR_NET_OK: tr_dbg( "nat-pmp state del -> idle with port %i", pmp->req->askport); tr_inf( "nat-pmp unmapped port %i", pmp->req->askport ); pmp->mapped = 0; pmp->mappedport = -1; killreq( &pmp->req ); pmp->state = PMP_STATE_IDLE; break; case TR_NET_WAIT: break; } } break; case PMP_STATE_MAPPED: if( pmp->newport != pmp->mappedport ) { tr_dbg( "nat-pmp state mapped -> del, port from %i to %i", pmp->mappedport, pmp->newport ); pmp->state = PMP_STATE_DELETING; } else if( tr_date() > pmp->renew ) { pmp->state = PMP_STATE_ADDING; tr_dbg( "nat-pmp state mapped -> add for renewal" ); } break; case PMP_STATE_FAILED: case PMP_STATE_NOBODYHOME: break; default: assert( 0 ); break; } } }