mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-17 20:44:38 +03:00
chore: optimize rpc
This commit is contained in:
56
rpc/gRPC.cpp
56
rpc/gRPC.cpp
@@ -14,6 +14,7 @@
|
||||
#include <QtEndian>
|
||||
#include <QThread>
|
||||
#include <QMutex>
|
||||
#include <QAbstractNetworkCache>
|
||||
|
||||
namespace QtGrpc {
|
||||
const char *GrpcAcceptEncodingHeader = "grpc-accept-encoding";
|
||||
@@ -23,16 +24,41 @@ namespace QtGrpc {
|
||||
const char *GrpcStatusMessage = "grpc-message";
|
||||
const int GrpcMessageSizeHeaderSize = 5;
|
||||
|
||||
class NoCache : public QAbstractNetworkCache {
|
||||
public:
|
||||
QNetworkCacheMetaData metaData(const QUrl &url) override {
|
||||
return {};
|
||||
}
|
||||
void updateMetaData(const QNetworkCacheMetaData &metaData) override {
|
||||
}
|
||||
QIODevice *data(const QUrl &url) override {
|
||||
return nullptr;
|
||||
}
|
||||
bool remove(const QUrl &url) override {
|
||||
return false;
|
||||
}
|
||||
[[nodiscard]] qint64 cacheSize() const override {
|
||||
return 0;
|
||||
}
|
||||
QIODevice *prepare(const QNetworkCacheMetaData &metaData) override {
|
||||
return nullptr;
|
||||
}
|
||||
void insert(QIODevice *device) override {
|
||||
}
|
||||
void clear() override {
|
||||
}
|
||||
};
|
||||
|
||||
class Http2GrpcChannelPrivate : public QObject {
|
||||
private:
|
||||
QString url_base;
|
||||
QThread *thread;
|
||||
QNetworkAccessManager *nm;
|
||||
|
||||
QString nekoray_auth;
|
||||
QString url_base;
|
||||
QString serviceName;
|
||||
QByteArray nekoray_auth;
|
||||
|
||||
// TODO WTF
|
||||
// TODO Fixed?
|
||||
// https://github.com/semlanik/qtprotobuf/issues/116
|
||||
// setCachingEnabled: 5 bytesDownloaded
|
||||
// QNetworkReplyImpl: backend error: caching was enabled after some bytes had been written
|
||||
@@ -43,15 +69,15 @@ namespace QtGrpc {
|
||||
// qDebug() << "Service call url: " << callUrl;
|
||||
|
||||
QNetworkRequest request(callUrl);
|
||||
request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
|
||||
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
|
||||
// request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
|
||||
// request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
|
||||
request.setAttribute(QNetworkRequest::Http2DirectAttribute, true);
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String{"application/grpc"});
|
||||
request.setRawHeader("Cache-Control", "no-store");
|
||||
request.setRawHeader(GrpcAcceptEncodingHeader, QByteArray{"identity,deflate,gzip"});
|
||||
request.setRawHeader(AcceptEncodingHeader, QByteArray{"identity,gzip"});
|
||||
request.setRawHeader(TEHeader, QByteArray{"trailers"});
|
||||
request.setAttribute(QNetworkRequest::Http2DirectAttribute, true);
|
||||
request.setRawHeader("nekoray_auth", nekoray_auth.toLatin1());
|
||||
request.setRawHeader("nekoray_auth", nekoray_auth);
|
||||
|
||||
QByteArray msg(GrpcMessageSizeHeaderSize, '\0');
|
||||
*reinterpret_cast<int *>(msg.data() + 1) = qToBigEndian((int) args.size());
|
||||
@@ -111,6 +137,7 @@ namespace QtGrpc {
|
||||
auto grpcStatus = QNetworkReply::NetworkError::ProtocolUnknownError;
|
||||
qByteArray = processReply(networkReply, grpcStatus);
|
||||
// qDebug() << __func__ << "RECV: " << qByteArray.toHex() << "grpcStatus" << grpcStatus;
|
||||
// qDebug() << networkReply->rawHeaderPairs();
|
||||
|
||||
networkReply->deleteLater();
|
||||
return grpcStatus;
|
||||
@@ -119,11 +146,12 @@ namespace QtGrpc {
|
||||
public:
|
||||
Http2GrpcChannelPrivate(const QString &url_, const QString &nekoray_auth_, const QString &serviceName_) {
|
||||
url_base = "http://" + url_;
|
||||
nekoray_auth = nekoray_auth_;
|
||||
nekoray_auth = nekoray_auth_.toLatin1();
|
||||
serviceName = serviceName_;
|
||||
//
|
||||
thread = new QThread;
|
||||
nm = new QNetworkAccessManager();
|
||||
nm->setCache(new NoCache);
|
||||
nm->moveToThread(thread);
|
||||
thread->start();
|
||||
}
|
||||
@@ -208,18 +236,6 @@ namespace NekoRay::rpc {
|
||||
}
|
||||
}
|
||||
|
||||
bool Client::KeepAlive() {
|
||||
libcore::EmptyReq request;
|
||||
libcore::EmptyResp reply;
|
||||
auto status = grpc_channel->Call("KeepAlive", request, &reply, 500);
|
||||
|
||||
if (status == QNetworkReply::NoError) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
long long Client::QueryStats(const std::string &tag, const std::string &direct) {
|
||||
libcore::QueryStatsReq request;
|
||||
request.set_tag(tag);
|
||||
|
||||
Reference in New Issue
Block a user