]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
ws: fix multiframe send handling
authorMike Duglas <mikeduglas66@gmail.com>
Mon, 6 Feb 2023 09:34:46 +0000 (10:34 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 6 Feb 2023 16:27:46 +0000 (17:27 +0100)
Fixes #10413
Closes #10420

lib/ws.c

index 18d7193862d025d827acaa0f165b343c942bd16d..44333309f1b54b03e669d6a1e6ca73b65d994724 100644 (file)
--- a/lib/ws.c
+++ b/lib/ws.c
@@ -561,17 +561,27 @@ static size_t ws_packethead(struct Curl_easy *data,
   }
 
   if(!(flags & CURLWS_CONT)) {
-    /* if not marked as continuing, assume this is the final fragment */
-    firstbyte |= WSBIT_FIN | opcode;
+    if(!ws->ws.contfragment)
+      /* not marked as continuing, this is the final fragment */
+      firstbyte |= WSBIT_FIN | opcode;
+    else
+      /* marked as continuing, this is the final fragment; set CONT
+         opcode and FIN bit */
+      firstbyte |= WSBIT_FIN | WSBIT_OPCODE_CONT;
+
     ws->ws.contfragment = FALSE;
+    infof(data, "WS: set FIN");
   }
   else if(ws->ws.contfragment) {
     /* the previous fragment was not a final one and this isn't either, keep a
        CONT opcode and no FIN bit */
     firstbyte |= WSBIT_OPCODE_CONT;
+    infof(data, "WS: keep CONT, no FIN");
   }
   else {
+    firstbyte = opcode;
     ws->ws.contfragment = TRUE;
+    infof(data, "WS: set CONT, no FIN");
   }
   out[0] = firstbyte;
   if(len > 65535) {