ithewei 6 роки тому
батько
коміт
c25cc37a86
2 змінених файлів з 22 додано та 12 видалено
  1. 20 10
      http/Http2Session.cpp
  2. 2 2
      http/Http2Session.h

+ 20 - 10
http/Http2Session.cpp

@@ -101,12 +101,12 @@ int Http2Session::GetSendData(char** data, size_t* len) {
         framehd.stream_id = stream_id;
         *data = (char*)frame_hdbuf;
         *len = HTTP2_FRAME_HDLEN;
-        printd("HTTP2 DATA framehd-------------------\n");
+        printd("HTTP2 SEND_DATA_FRAME_HD...\n");
         if (submited->ContentType() == APPLICATION_GRPC) {
-            printd("grpc DATA framehd-----------------\n");
             grpc_message_hd msghd;
             msghd.flags = 0;
             msghd.length = content_length;
+            printd("grpc_message_hd: flags=%d length=%d\n", msghd.flags, msghd.length);
 
             if (type == HTTP_SERVER) {
                 // grpc server send grpc-status in HTTP2 header frame
@@ -139,7 +139,6 @@ int Http2Session::GetSendData(char** data, size_t* len) {
     }
     else if (state == HSS_SEND_DATA_FRAME_HD) {
         // HTTP2 DATA
-        printd("HTTP2 DATA-------------------\n");
         void* content = submited->Content();
         int content_length = submited->ContentLength();
         if (content_length == 0) {
@@ -147,6 +146,7 @@ int Http2Session::GetSendData(char** data, size_t* len) {
             goto send_done;
         }
         else {
+            printd("HTTP2 SEND_DATA... content_length=%d\n", content_length);
             state = HSS_SEND_DATA;
             *data = (char*)content;
             *len = content_length;
@@ -158,7 +158,7 @@ send_done:
         if (submited->ContentType() == APPLICATION_GRPC) {
             if (type == HTTP_SERVER && stream_closed) {
                 // grpc HEADERS grpc-status
-                printd("grpc HEADERS grpc-status-----------------\n");
+                printd("grpc HEADERS grpc-status: 0\n");
                 int flags = NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_END_HEADERS;
                 nghttp2_nv nv = make_nv("grpc-status", "0");
                 nghttp2_submit_headers(session, flags, stream_id, NULL, &nv, 1, NULL);
@@ -360,10 +360,13 @@ int on_data_chunk_recv_callback(nghttp2_session *session,
 
     if (hss->parsed->ContentType() == APPLICATION_GRPC) {
         // grpc_message_hd
-        printd("grpc Length-Prefixed-Message-----------------\n");
         if (len >= GRPC_MESSAGE_HDLEN) {
+            grpc_message_hd msghd;
+            grpc_message_hd_unpack(data, &msghd);
+            printd("grpc_message_hd: flags=%d length=%d\n", msghd.flags, msghd.length);
             data += GRPC_MESSAGE_HDLEN;
             len -= GRPC_MESSAGE_HDLEN;
+            //printd("%.*s\n", (int)len, data);
         }
     }
     hss->parsed->body.append((const char*)data, len);
@@ -388,14 +391,21 @@ int on_frame_recv_callback(nghttp2_session *session,
     case NGHTTP2_PING:
         hss->state = HSS_RECV_PING;
         break;
+    case NGHTTP2_RST_STREAM:
+    case NGHTTP2_WINDOW_UPDATE:
+        // ignore
+        return 0;
     default:
         break;
     }
-    hss->stream_id = frame->hd.stream_id;
-    hss->stream_closed = 0;
-    if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
-        printd("on_stream_closed stream_id=%d\n", hss->stream_id);
-        hss->stream_closed = 1;
+    if (frame->hd.stream_id >= hss->stream_id) {
+        hss->stream_id = frame->hd.stream_id;
+        hss->stream_closed = 0;
+        if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
+            printd("on_stream_closed stream_id=%d\n", hss->stream_id);
+            hss->stream_closed = 1;
+            hss->frame_type_when_stream_closed = frame->hd.type;
+        }
     }
 
     return 0;

+ 2 - 2
http/Http2Session.h

@@ -34,6 +34,7 @@ public:
     int error;
     int stream_id;
     int stream_closed;
+    int frame_type_when_stream_closed;
     // http2_frame_hd + grpc_message_hd
     // at least HTTP2_FRAME_HDLEN + GRPC_MESSAGE_HDLEN = 9 + 5 = 14
     unsigned char                   frame_hdbuf[32];
@@ -57,8 +58,7 @@ public:
     }
 
     virtual bool IsComplete() {
-        // HTTP2_HEADERS / HTTP2_DATA EOS
-        return (state == HSS_RECV_HEADERS || state == HSS_RECV_DATA) && stream_closed == 1;
+        return stream_closed && (frame_type_when_stream_closed == HTTP2_DATA || frame_type_when_stream_closed == HTTP2_HEADERS);
     }
 
     virtual int GetError() {