]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
test2302: improve reliability
authorStefan Eissing <stefan@eissing.org>
Mon, 9 Oct 2023 08:18:20 +0000 (10:18 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 9 Oct 2023 12:07:08 +0000 (14:07 +0200)
- make result print collected write data, unless
  change in meta flags is detected
- will show same result even when data arrives via
  several writecb invocations

Closes #12068

tests/libtest/lib2302.c

index b581659a4bf2984a517378f2624af323a6434fe6..9e2b80044196eff45b65ae6659026a88e22a5f44 100644 (file)
 
 #ifdef USE_WEBSOCKETS
 
-#if 0
-
-static int ping(CURL *curl, const char *send_payload)
+struct ws_data {
+  CURL *easy;
+  char buf[1024*1024];
+  size_t blen;
+  size_t nwrites;
+  int has_meta;
+  int meta_flags;
+};
+
+static void flush_data(struct ws_data *wd)
 {
-  size_t sent;
-  CURLcode result =
-    curl_ws_send(curl, send_payload, strlen(send_payload), &sent, CURLWS_PING);
-  fprintf(stderr,
-          "ws: curl_ws_send returned %u, sent %u\n", (int)result, (int)sent);
+  size_t i;
 
-  return (int)result;
-}
+  if(!wd->nwrites)
+    return;
 
-static int recv_pong(CURL *curl, const char *expected_payload)
-{
-  size_t rlen;
-  unsigned int rflags;
-  char buffer[256];
-  CURLcode result =
-    curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &rflags);
-  if(rflags & CURLWS_PONG) {
-    int same = 0;
-    fprintf(stderr, "ws: got PONG back\n");
-    if(rlen == strlen(expected_payload)) {
-      if(!memcmp(expected_payload, buffer, rlen)) {
-        fprintf(stderr, "ws: got the same payload back\n");
-        same = 1;
-      }
-    }
-    if(!same)
-      fprintf(stderr, "ws: did NOT get the same payload back\n");
-  }
-  else {
-    fprintf(stderr, "recv_pong: got %u bytes rflags %x\n", (int)rlen, rflags);
-  }
-  fprintf(stderr, "ws: curl_ws_recv returned %u, received %u\n", (int)result,
-         rlen);
-  return (int)result;
-}
+  for(i = 0; i < wd->blen; ++i)
+    printf("%02x ", (unsigned char)wd->buf[i]);
 
-/* just close the connection */
-static void websocket_close(CURL *curl)
-{
-  size_t sent;
-  CURLcode result =
-    curl_ws_send(curl, "", 0, &sent, CURLWS_CLOSE);
-  fprintf(stderr,
-          "ws: curl_ws_send returned %u, sent %u\n", (int)result, (int)sent);
+  printf("\n");
+  if(wd->has_meta)
+    printf("RECFLAGS: %x\n", wd->meta_flags);
+  else
+    fprintf(stderr, "RECFLAGS: NULL\n");
+  wd->blen = 0;
+  wd->nwrites = 0;
 }
 
-static void websocket(CURL *curl)
+static size_t add_data(struct ws_data *wd, const char *buf, size_t blen,
+                       const struct curl_ws_frame *meta)
 {
-  int i = 0;
-  fprintf(stderr, "ws: websocket() starts\n");
-  do {
-    if(ping(curl, "foobar"))
-      return;
-    if(recv_pong(curl, "foobar"))
-      return;
-    sleep(2);
-  } while(i++ < 10);
-  websocket_close(curl);
+  if((wd->nwrites == 0) ||
+     (!!meta != !!wd->has_meta) ||
+     (meta && meta->flags != wd->meta_flags)) {
+    if(wd->nwrites > 0)
+      flush_data(wd);
+    wd->has_meta = (meta != NULL);
+    wd->meta_flags = meta? meta->flags : 0;
+  }
+
+  if(wd->blen + blen > sizeof(wd->buf)) {
+    return 0;
+  }
+  memcpy(wd->buf + wd->blen, buf, blen);
+  wd->blen += blen;
+  wd->nwrites++;
+  return blen;
 }
 
-#endif
 
 static size_t writecb(char *buffer, size_t size, size_t nitems, void *p)
 {
-  CURL *easy = p;
-  size_t i;
+  struct ws_data *ws_data = p;
   size_t incoming = nitems;
   const struct curl_ws_frame *meta;
   (void)size;
-  for(i = 0; i < nitems; i++)
-    printf("%02x ", (unsigned char)buffer[i]);
-  printf("\n");
 
-  meta = curl_ws_meta(easy);
-  if(meta)
-    printf("RECFLAGS: %x\n", meta->flags);
-  else
-    fprintf(stderr, "RECFLAGS: NULL\n");
+  meta = curl_ws_meta(ws_data->easy);
+  incoming = add_data(ws_data, buffer, incoming, meta);
 
-  /* this assumes we get a simple TEXT frame first */
-  {
-    CURLcode result = CURLE_OK;
-    fprintf(stderr, "send back a TEXT\n");
-    (void)easy;
-    if(result)
-      nitems = 0;
-  }
   if(nitems != incoming)
     fprintf(stderr, "returns error from callback\n");
   return nitems;
@@ -126,26 +95,27 @@ int test(char *URL)
 {
   CURL *curl;
   CURLcode res = CURLE_OK;
+  struct ws_data ws_data;
+
 
   global_init(CURL_GLOBAL_ALL);
 
   curl = curl_easy_init();
   if(curl) {
-    curl_easy_setopt(curl, CURLOPT_URL, URL);
+    memset(&ws_data, 0, sizeof(ws_data));
+    ws_data.easy = curl;
 
+    curl_easy_setopt(curl, CURLOPT_URL, URL);
     /* use the callback style */
     curl_easy_setopt(curl, CURLOPT_USERAGENT, "webbie-sox/3");
     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb);
-    curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl);
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ws_data);
     res = curl_easy_perform(curl);
     fprintf(stderr, "curl_easy_perform() returned %u\n", (int)res);
-#if 0
-    if(res == CURLE_OK)
-      websocket(curl);
-#endif
     /* always cleanup */
     curl_easy_cleanup(curl);
+    flush_data(&ws_data);
   }
   curl_global_cleanup();
   return (int)res;