Browse Source

Implement correct arguments serialization to http2 channel

- Enable argument sending in http2 channel
- Fix http2 response read
- Add and update tests
Alexey Edelev 6 years ago
parent
commit
9c27001d34
4 changed files with 26 additions and 10 deletions
  1. 1 1
      src/generator/clientsourcegenerator.cpp
  2. 2 4
      src/lib/abstractclient.h
  3. 12 5
      src/lib/http2channel.cpp
  4. 11 0
      tests/clienttest.cpp

+ 1 - 1
src/generator/clientsourcegenerator.cpp

@@ -66,5 +66,5 @@ void ClientSourceGenerator::printConstructor()
 {
     mPrinter.Print({ {"classname", mClassName},
                      {"parent_class", "AbstractClient"},
-                     {"service_name", mService->name()} }, Templates::ConstructorDefinitionSyncTemplate);
+                     {"service_name", mService->full_name()} }, Templates::ConstructorDefinitionSyncTemplate);
 }

+ 2 - 4
src/lib/abstractclient.h

@@ -51,13 +51,11 @@ protected:
         }
 
         QByteArray retData;
-        AbstractChannel::StatusCodes status = m_channel->call(method, m_service, QByteArray(), retData);
-        qCritical() << "Answer: " << retData << status;
+        AbstractChannel::StatusCodes status = m_channel->call(method, m_service, arg.serialize(), retData);
         if (status != AbstractChannel::Ok) {
             return status;
         }
-        qCritical() << "Answer: " << retData;
-        ret.deserialize(retData.mid(0, 5));
+        ret.deserialize(retData.mid(5));
         return status;
     }
 

+ 12 - 5
src/lib/http2channel.cpp

@@ -34,9 +34,12 @@
 #include <QNetworkRequest>
 #include <QEventLoop>
 #include <QTimer>
+#include <QtEndian>
 
 #include <unordered_map>
 
+#include "qtprotobuflogging.h"
+
 using namespace qtprotobuf;
 
 namespace qtprotobuf {
@@ -93,7 +96,6 @@ Http2Channel::Http2Channel(const QString &addr, quint16 port) : AbstractChannel(
   , d(new Http2ChannelPrivate)
 {
     d->url.setScheme("http");
-    qCritical() << "Authority: " << (addr + ":" + QString::number(port));
     d->url.setHost(addr, QUrl::StrictMode);
     d->url.setPort(port);
 }
@@ -108,16 +110,20 @@ AbstractChannel::StatusCodes Http2Channel::call(const QString &method, const QSt
     QUrl callUrl = d->url;
     callUrl.setPath("/" + service + "/" + method);
 
-    qCritical() << "url: " << callUrl;
+    qProtoDebug() << "Service call url: " << callUrl;
     QNetworkRequest request(callUrl);
     request.setHeader(QNetworkRequest::ContentTypeHeader, "application/grpc");
-    request.setRawHeader(GrpcAcceptEncodingHeader, "deflate, gzip");
-    request.setRawHeader(AcceptEncodingHeader, "deflate, gzip");
+    request.setRawHeader(GrpcAcceptEncodingHeader, "identity,deflate,gzip");
+    request.setRawHeader(AcceptEncodingHeader, "identity,gzip");
     request.setRawHeader(TEHeader, "trailers");
 
     request.setAttribute(QNetworkRequest::Http2DirectAttribute, true);
 
-    QNetworkReply *reply = d->nm.post(request, QByteArray(5, '\0') + args);
+    QByteArray msg(5, '\0');
+    *(unsigned int*)(msg.data() + 1) = qToBigEndian(args.size());
+    msg += args;
+    qProtoDebug() << "SEND: " << msg.toHex();
+    QNetworkReply *reply = d->nm.post(request, msg);
     QEventLoop loop;
     QTimer timer;
     loop.connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
@@ -151,5 +157,6 @@ AbstractChannel::StatusCodes Http2Channel::call(const QString &method, const QSt
     }
 
     ret = reply->readAll();
+    qProtoDebug() << "RECV: " << ret.toHex();
     return StatusCodes::Ok;
 }

+ 11 - 0
tests/clienttest.cpp

@@ -40,6 +40,16 @@ ClientTest::ClientTest()
 }
 
 TEST_F(ClientTest, CheckMethodsGeneration)
+{
+    //Dummy compile time check of functions generation
+    TestServiceClient testClient;
+    SimpleStringMessage result;
+    SimpleStringMessage request;
+    testClient.testMethod(result, request);
+    testClient.testMethod(result, std::function<void(const SimpleStringMessage&)>([](const SimpleStringMessage&){}));
+}
+
+TEST_F(ClientTest, StringEchoTest)
 {
     int argc = 0;
     QCoreApplication app(argc, nullptr);
@@ -49,4 +59,5 @@ TEST_F(ClientTest, CheckMethodsGeneration)
     SimpleStringMessage request;
     request.setTestFieldString("Hello beach!");
     testClient.testMethod(request, result);
+    ASSERT_TRUE(result.testFieldString() == "Hello beach!");
 }