#include "NetMgr.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "log.h" #include "global.h" enum{ HTTP_CMD_ID = QNetworkRequest::User+100, }; NetMgr *g_NetMgr = NULL; NetMgr &NetMgr::instance() { static NetMgr ins; return ins; } NetMgr::NetMgr(QObject *parent) :QObject(parent) ,m_netMgr(new QNetworkAccessManager(this)) { qDebug()<supportedSchemes(); connect(m_netMgr,SIGNAL(finished(QNetworkReply *)),SLOT(httpFinished(QNetworkReply *))); } NetMgr::~NetMgr() { } void NetMgr::RequestFileList(const QString &sAddr) { QString sUrl = QString("http://%1%2").arg(sAddr).arg("/cgi-bin/General.cgi"); qDebug()<<"url[RequestLicList]:"< &postData) { AddMultiPartSignature(req, postData); qDebug()<<"suport ssl"<append(textPart); } QNetworkReply* pReply = m_netMgr->post(req,multiPart); multiPart->setParent(pReply); connect(pReply, QOverload::of(&QNetworkReply::error),[=](QNetworkReply::NetworkError err) { qDebug()<<"net error:"; qDebug()<errorString(); //pReply->deleteLater(); }); } void NetMgr::PostJson(QNetworkRequest &req, QJsonObject &postData) { AddJsonSignature(req, postData); req.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); QSslConfiguration config; config.setProtocol(QSsl::TlsV1SslV3); config.setPeerVerifyMode(QSslSocket::VerifyNone); req.setSslConfiguration(config); //QString sBody; QByteArray bzData = QJsonDocument(postData).toJson(QJsonDocument::Compact); QNetworkReply* pReply = m_netMgr->post(req,bzData); customLogMessageHandler(QtDebugMsg,QString(QJsonDocument(postData).toJson())); connect(pReply, QOverload::of(&QNetworkReply::error),[=](QNetworkReply::NetworkError err) { qDebug()<<"error:"; qDebug()<errorString(); //pReply->deleteLater(); }); } void NetMgr::PostData(QNetworkRequest &req, QByteArray &postData) { AddDataSignature(req, postData); req.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); QSslConfiguration config; config.setProtocol(QSsl::TlsV1SslV3); config.setPeerVerifyMode(QSslSocket::VerifyNone); req.setSslConfiguration(config); QNetworkReply* pReply = m_netMgr->post(req,postData); connect(pReply, QOverload::of(&QNetworkReply::error),[=](QNetworkReply::NetworkError err) { qDebug() << "error:"; qDebug() << pReply->errorString(); //pReply->deleteLater(); }); } void NetMgr::DownLoad(QNetworkRequest &req, const QString &sFileSavePath) { QSslConfiguration config; config.setProtocol(QSsl::TlsV1SslV3); config.setPeerVerifyMode(QSslSocket::VerifyNone); req.setSslConfiguration(config); QString sDir = QFileInfo(sFileSavePath).dir().path(); QDir dir(sDir); if(!dir.exists()) { if(!dir.mkpath(sDir)) { qDebug()<<"mkpath failed"< pFile(new QFile(sFileSavePath)); if(!pFile->open(QIODevice::WriteOnly|QIODevice::Truncate)) { qDebug()<errorString()<get(req); m_mpDownload[pReply] = pFile; pFile->setParent(pReply); connect(pReply,&QNetworkReply::readyRead,[=] { if(!pFile.isNull()) { pFile->write(pReply->readAll()); } }); connect(pReply, QOverload::of(&QNetworkReply::error),[=](QNetworkReply::NetworkError err) { //qDebug()<<"error:"; //qDebug()<errorString(); if(!pFile.isNull()) { pFile->close(); QFile::remove(pFile->fileName()); } pReply->deleteLater(); }); } void NetMgr::GetData(QNetworkRequest &req) { //req.setHeader(QNetworkRequest::ContentTypeHeader,"application/json"); QSslConfiguration config; config.setProtocol(QSsl::TlsV1SslV3); config.setPeerVerifyMode(QSslSocket::VerifyNone); req.setSslConfiguration(config); //QString sBody; QNetworkReply* pReply = m_netMgr->get(req); connect(pReply, QOverload::of(&QNetworkReply::error),[=](QNetworkReply::NetworkError err) { //qDebug()<<"error:"; //qDebug()<errorString(); //pReply->deleteLater(); }); } void NetMgr::AddMultiPartSignature(QNetworkRequest &req, QMap &postData) { QString sSrcKey; QStringList listParams; foreach(const QString& sKey, postData.keys()) { listParams << QString("%1=%2").arg(sKey, postData.value(sKey)); } sSrcKey = listParams.join("&"); AddSignature(req, sSrcKey); } void NetMgr::AddJsonSignature(QNetworkRequest &req, QJsonObject &postData) { QString sSrcKey; //if(!postData.isEmpty()) { sSrcKey = QJsonDocument(postData).toJson(QJsonDocument::Compact); } AddSignature(req, sSrcKey); } void NetMgr::AddDataSignature(QNetworkRequest &req, QByteArray &postData) { Q_UNUSED(postData) QString sSrcKey; AddSignature(req, sSrcKey); } void NetMgr::AddSignature(QNetworkRequest &req, QString& sSrcKey) { qDebug() << sSrcKey; QString sToken = ""; if (req.hasRawHeader("commtoken")) { sToken = req.rawHeader("commtoken"); } else if (req.hasRawHeader("accesstoken")) { sToken = req.rawHeader("accesstoken"); } QString sTimeStamp = QString::number(QDateTime::currentMSecsSinceEpoch()); if (sSrcKey.isEmpty()) { sSrcKey = QString("timestamp=%1").arg(sTimeStamp); } else { sSrcKey = sSrcKey + QString("×tamp=%1").arg(sTimeStamp); } sSrcKey = QUrl::toPercentEncoding(sSrcKey); QByteArray key = sToken.toUtf8(); QByteArray message = sSrcKey.toUtf8(); QByteArray bzSign = QMessageAuthenticationCode::hash(message, key, QCryptographicHash::Sha256).toHex(); bzSign = bzSign.toBase64(); req.setRawHeader("timestamp", sTimeStamp.toUtf8()); req.setRawHeader("signature", bzSign); } void NetMgr::httpFinished(QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { if (m_mpDownload.contains(reply)) { QString sAddr = reply->request().attribute((QNetworkRequest::Attribute)HTTP_CMD_ID).toString(); reply->waitForReadyRead(3000); QFile* pFile = m_mpDownload.value(reply); //emit sigNetMgr(sAddr, pFile->fileName()); m_mpDownload.remove(reply); } else { QString sAddr = reply->request().attribute((QNetworkRequest::Attribute)HTTP_CMD_ID).toString(); //qDebug()<<"nCmdId:"<readAll(); QString sPath = reply->request().url().path(); parseData(bzData, sPath, sAddr); } } else {//错误 QMessageBox::warning(NULL, "提示", "通信失败!"); } reply->deleteLater(); } void NetMgr::parseData(const QByteArray &szData, const QString &sUrlPath, QString sAddr) { //qDebug() << sUrlPath << szData; QJsonDocument doc = QJsonDocument::fromJson(szData); QJsonObject obj = doc.object(); QVariant var; var.setValue(obj); customLogMessageHandler(QtDebugMsg,QString(QJsonDocument(obj).toJson())); emit sigNetMgr(sAddr, var); } void NetMgr::setReqUserAttr(QNetworkRequest &req, QVariant attr) { req.setAttribute((QNetworkRequest::Attribute)HTTP_CMD_ID,attr); } void NetMgr::DetectNet() { QJsonObject allObj; allObj.insert("cmd", "110"); QNetworkRequest req; QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP); req.setUrl(sUrl); PostJson(req,allObj); }