]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
request: eliminate request `getheader` bool, reverse `header` default
authorStefan Eissing <stefan@eissing.org>
Thu, 7 Aug 2025 09:29:10 +0000 (11:29 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 7 Aug 2025 11:39:50 +0000 (13:39 +0200)
Deduce that the transfer response expects headers by the protocol
handler implementing `write_resp_hd` callback. This eleminates the
`getheader` parameter in the `Curl_xfer_setup_*()` methods.

Add an implementation to RTSP for `write_resp_hd`, joining the HTTP
protocol in the only handlers having it.

Reverse the default of request's `header` bit that signals that headers
are expected. Default is now FALSE, set to TRUE when setting up the
transfer by presence of `write_resp_hd` in the protocol handler.

Closes #18218

16 files changed:
lib/curl_rtmp.c
lib/dict.c
lib/ftp.c
lib/gopher.c
lib/http.c
lib/imap.c
lib/openldap.c
lib/pop3.c
lib/request.c
lib/request.h
lib/rtsp.c
lib/transfer.c
lib/transfer.h
lib/vssh/libssh.c
lib/vssh/libssh2.c
lib/vssh/wolfssh.c

index 07e0eeba2652a25afffae9e657fc092da8dc64a6..b178dff84503e28012bfea846530841554893e9e 100644 (file)
@@ -299,7 +299,7 @@ static CURLcode rtmp_do(struct Curl_easy *data, bool *done)
     Curl_xfer_setup_send(data, FIRSTSOCKET);
   }
   else
-    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
   *done = TRUE;
   return CURLE_OK;
 }
index b8ede7848d49e88e6d69fa1d69a50c41b1578aa0..819584f284a0f8582e38b99a0681ef2241c0a605 100644 (file)
@@ -242,7 +242,7 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done)
       failf(data, "Failed sending DICT request");
       goto error;
     }
-    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
   }
   else if(curl_strnequal(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
           curl_strnequal(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
@@ -283,7 +283,7 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done)
       failf(data, "Failed sending DICT request");
       goto error;
     }
-    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
   }
   else {
 
@@ -305,7 +305,7 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done)
         goto error;
       }
 
-      Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+      Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
     }
   }
 
index d9539c7fd4d3b29107b2465884bf0d1a95a92e97..f088054b2df4f193efd59ca6fae4d92227c1b723 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -551,8 +551,7 @@ static CURLcode ftp_initiate_transfer(struct Curl_easy *data,
   }
   else {
     /* FTP download, shutdown, do not ignore errors */
-    Curl_xfer_setup_recv(data, SECONDARYSOCKET,
-                         ftpc->retr_size_saved, FALSE);
+    Curl_xfer_setup_recv(data, SECONDARYSOCKET, ftpc->retr_size_saved);
     Curl_xfer_set_shutdown(data, TRUE, FALSE);
   }
 
index 9ac3cca3e1911f15ee00adb2f484b6b1bdf877cb..93db85e9d02742d8a2843a85e72e082c953edb9d 100644 (file)
@@ -240,7 +240,7 @@ static CURLcode gopher_do(struct Curl_easy *data, bool *done)
   if(result)
     return result;
 
-  Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+  Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
   return CURLE_OK;
 }
 #endif /* CURL_DISABLE_GOPHER */
index 5e36decdd43cf39029c2ee7ddc01979b7c48ec62..972d9af23ea6a95503fcc3ce4a6ddb2822b56327 100644 (file)
@@ -2415,7 +2415,7 @@ static CURLcode http_req_complete(struct Curl_easy *data,
 out:
   if(!result) {
     /* setup variables for the upcoming transfer */
-    Curl_xfer_setup_sendrecv(data, FIRSTSOCKET, -1, TRUE);
+    Curl_xfer_setup_sendrecv(data, FIRSTSOCKET, -1);
   }
   return result;
 }
index d8f46a034c69e04b78370345b547926aa8995fe0..7e6b132ba0dd2cf6ea4f8545d0ec44958973676c 100644 (file)
@@ -1347,7 +1347,7 @@ static CURLcode imap_state_fetch_resp(struct Curl_easy *data,
     else {
       /* IMAP download */
       data->req.maxdownload = size;
-      Curl_xfer_setup_recv(data, FIRSTSOCKET, size, FALSE);
+      Curl_xfer_setup_recv(data, FIRSTSOCKET, size);
     }
   }
   else {
index c10f07220fe96c7116dc52ffb2c81292c62d3b36..1b32e12b6861cb3442f7b1743b6e73af63e5cc87 100644 (file)
@@ -993,7 +993,7 @@ static CURLcode oldap_do(struct Curl_easy *data, bool *done)
   }
 
   lr->msgid = msgid;
-  Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+  Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
   *done = TRUE;
 
 out:
index 9417bb5fe822ca0a32e2a6baa6d980dbd20eded5..508f8faed3d385d5b4770c7d9c53f982cb3d4a6b 100644 (file)
@@ -1116,7 +1116,7 @@ static CURLcode pop3_state_command_resp(struct Curl_easy *data,
 
   if(pop3->transfer == PPTRANSFER_BODY) {
     /* POP3 download */
-    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, FALSE);
+    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
 
     if(pp->overflow) {
       /* The recv buffer contains data that is actually body content so send
index 7e4082bee3cc7beb5db3c7a7d6a85a11ffede0ff..733e3e92947908a93674e88e96e415ce4aa9c4bc 100644 (file)
@@ -62,7 +62,7 @@ CURLcode Curl_req_soft_reset(struct SingleRequest *req,
   req->shutdown = FALSE;
   req->bytecount = 0;
   req->writebytecount = 0;
-  req->header = TRUE; /* assume header */
+  req->header = FALSE;
   req->headerline = 0;
   req->headerbytecount = 0;
   req->allheadercount =  0;
@@ -161,7 +161,6 @@ void Curl_req_hard_reset(struct SingleRequest *req, struct Curl_easy *data)
   req->chunk = FALSE;
   req->ignore_cl = FALSE;
   req->upload_chunky = FALSE;
-  req->getheader = FALSE;
   req->no_body = data->set.opt_no_body;
   req->authneg = FALSE;
   req->shutdown = FALSE;
index 74d9f5343964c1c16d0377bbf0b0c8b23b21bd09..bce34de8ba9e47ab8eedd907b053f424de1ecf3b 100644 (file)
@@ -123,7 +123,6 @@ struct SingleRequest {
   BIT(ignore_cl);     /* ignore content-length */
   BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
                          on upload */
-  BIT(getheader);    /* TRUE if header parsing is wanted */
   BIT(no_body);      /* the response has no body */
   BIT(authneg);      /* TRUE when the auth phase has started, which means
                         that we are creating a request with an auth header,
index 153b98ea39f7871d5d2a48ec9222722157556561..dbe3e63cf315e50ef99e6a3cce1d5a003d144d4d 100644 (file)
@@ -100,6 +100,10 @@ static CURLcode rtsp_rtp_write_resp(struct Curl_easy *data,
                                     const char *buf,
                                     size_t blen,
                                     bool is_eos);
+static CURLcode rtsp_rtp_write_resp_hd(struct Curl_easy *data,
+                                       const char *buf,
+                                       size_t blen,
+                                       bool is_eos);
 
 static CURLcode rtsp_setup_connection(struct Curl_easy *data,
                                       struct connectdata *conn);
@@ -141,7 +145,7 @@ const struct Curl_handler Curl_handler_rtsp = {
   ZERO_NULL,                            /* perform_pollset */
   ZERO_NULL,                            /* disconnect */
   rtsp_rtp_write_resp,                  /* write_resp */
-  ZERO_NULL,                            /* write_resp_hd */
+  rtsp_rtp_write_resp_hd,               /* write_resp_hd */
   rtsp_conncheck,                       /* connection_check */
   ZERO_NULL,                            /* attach connection */
   Curl_http_follow,                     /* follow */
@@ -370,7 +374,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
   }
 
   if(rtspreq == RTSPREQ_RECEIVE) {
-    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1, TRUE);
+    Curl_xfer_setup_recv(data, FIRSTSOCKET, -1);
     goto out;
   }
 
@@ -636,7 +640,7 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done)
   if(result)
     goto out;
 
-  Curl_xfer_setup_sendrecv(data, FIRSTSOCKET, -1, TRUE);
+  Curl_xfer_setup_sendrecv(data, FIRSTSOCKET, -1);
 
   /* issue the request */
   result = Curl_req_send(data, &req_buffer, httpversion);
@@ -935,6 +939,14 @@ out:
   return result;
 }
 
+static CURLcode rtsp_rtp_write_resp_hd(struct Curl_easy *data,
+                                       const char *buf,
+                                       size_t blen,
+                                       bool is_eos)
+{
+  return rtsp_rtp_write_resp(data, buf, blen, is_eos);
+}
+
 static
 CURLcode rtp_client_write(struct Curl_easy *data, const char *ptr, size_t len)
 {
index 76b7a8964bd712658d5fb76cba52168d6c759be7..50f621056f7ac0ae1d6c61c1ed98677b880f79c9 100644 (file)
@@ -721,8 +721,7 @@ static void xfer_setup(
   struct Curl_easy *data,   /* transfer */
   int send_idx,             /* sockindex to send on or -1 */
   int recv_idx,             /* sockindex to receive on or -1 */
-  curl_off_t recv_size,     /* how much to receive, -1 if unknown */
-  bool getheader            /* TRUE if header parsing is wanted */
+  curl_off_t recv_size      /* how much to receive, -1 if unknown */
   )
 {
   struct SingleRequest *k = &data->req;
@@ -738,10 +737,10 @@ static void xfer_setup(
   conn->send_idx = send_idx;
   conn->recv_idx = recv_idx;
 
-  k->getheader = getheader;
   /* without receiving, there should be not recv_size */
   DEBUGASSERT((conn->recv_idx >= 0) || (recv_size == -1));
   k->size = recv_size;
+  k->header = !!conn->handler->write_resp_hd;
   /* by default, we do not shutdown at the end of the transfer */
   k->shutdown = FALSE;
   k->shutdown_err_ignore = FALSE;
@@ -749,14 +748,11 @@ static void xfer_setup(
   /* The code sequence below is placed in this function just because all
      necessary input is not always known in do_complete() as this function may
      be called after that */
-  if(!k->getheader) {
-    k->header = FALSE;
-    if(recv_size > 0)
-      Curl_pgrsSetDownloadSize(data, recv_size);
-  }
+  if(!k->header && (recv_size > 0))
+    Curl_pgrsSetDownloadSize(data, recv_size);
 
   /* we want header and/or body, if neither then do not do this! */
-  if(k->getheader || !data->req.no_body) {
+  if(conn->handler->write_resp_hd || !data->req.no_body) {
 
     if(conn->recv_idx != -1)
       k->keepon |= KEEP_RECV;
@@ -771,29 +767,27 @@ static void xfer_setup(
 
 void Curl_xfer_setup_nop(struct Curl_easy *data)
 {
-  xfer_setup(data, -1, -1, -1, FALSE);
+  xfer_setup(data, -1, -1, -1);
 }
 
 void Curl_xfer_setup_sendrecv(struct Curl_easy *data,
                               int sockindex,
-                              curl_off_t recv_size,
-                              bool getheader)
+                              curl_off_t recv_size)
 {
-  xfer_setup(data, sockindex, sockindex, recv_size, getheader);
+  xfer_setup(data, sockindex, sockindex, recv_size);
 }
 
 void Curl_xfer_setup_send(struct Curl_easy *data,
                           int sockindex)
 {
-  xfer_setup(data, sockindex, -1, -1, FALSE);
+  xfer_setup(data, sockindex, -1, -1);
 }
 
 void Curl_xfer_setup_recv(struct Curl_easy *data,
                           int sockindex,
-                          curl_off_t recv_size,
-                          bool getheader)
+                          curl_off_t recv_size)
 {
-  xfer_setup(data, -1, sockindex, recv_size, getheader);
+  xfer_setup(data, -1, sockindex, recv_size);
 }
 
 void Curl_xfer_set_shutdown(struct Curl_easy *data,
index 095c94fe27b57f4edfcca8d4f346d0beebbe8f49..91a81e52e8fb2d62809e53eccea583af92d92b1d 100644 (file)
@@ -72,11 +72,10 @@ void Curl_xfer_setup_send(struct Curl_easy *data,
                           int sockindex);
 
 /* The transfer receives data on the given socket index, the
- * amount to receive (or -1 if unknown) and if headers are expected */
+ * amount to receive (or -1 if unknown). */
 void Curl_xfer_setup_recv(struct Curl_easy *data,
                           int sockindex,
-                          curl_off_t recv_size,
-                          bool getheader);
+                          curl_off_t recv_size);
 
 /* *After* Curl_xfer_setup_xxx(), tell the transfer to shutdown the
  * connection at the end. Let the transfer either fail or ignore any
@@ -87,13 +86,11 @@ void Curl_xfer_set_shutdown(struct Curl_easy *data,
 
 /**
  * The transfer will use socket 1 to send/recv. `recv_size` is
- * the amount to receive or -1 if unknown. `getheader` indicates
- * response header processing is expected.
+ * the amount to receive or -1 if unknown.
  */
 void Curl_xfer_setup_sendrecv(struct Curl_easy *data,
                               int sockindex,
-                              curl_off_t recv_size,
-                              bool getheader);
+                              curl_off_t recv_size);
 
 /**
  * Multi has set transfer to DONE. Last chance to trigger
index f04d5fe320c6948a7f8af1ea6fa5d58b6c6b399b..8c366aafae10a5cc7045969190ae6144df701fe4 100644 (file)
@@ -1423,7 +1423,7 @@ static int myssh_in_SFTP_DOWNLOAD_STAT(struct Curl_easy *data,
     myssh_to(data, sshc, SSH_STOP);
     return rc;
   }
-  Curl_xfer_setup_recv(data, FIRSTSOCKET, data->req.size, FALSE);
+  Curl_xfer_setup_recv(data, FIRSTSOCKET, data->req.size);
 
   /* not set by Curl_xfer_setup to preserve keepon bits */
   data->conn->send_idx = 0;
@@ -2279,7 +2279,7 @@ static CURLcode myssh_statemach_act(struct Curl_easy *data,
         /* download data */
         bytecount = ssh_scp_request_get_size(sshc->scp_session);
         data->req.maxdownload = (curl_off_t) bytecount;
-        Curl_xfer_setup_recv(data, FIRSTSOCKET, bytecount, FALSE);
+        Curl_xfer_setup_recv(data, FIRSTSOCKET, bytecount);
 
         /* not set by Curl_xfer_setup to preserve keepon bits */
         conn->send_idx = 0;
index 089a7af02039133edcc62b685cb51e326844c530..f6985ed251b71c986ec77b20d76a841831c39761 100644 (file)
@@ -1540,7 +1540,7 @@ sftp_download_stat(struct Curl_easy *data,
     myssh_state(data, sshc, SSH_STOP);
     return CURLE_OK;
   }
-  Curl_xfer_setup_recv(data, FIRSTSOCKET, data->req.size, FALSE);
+  Curl_xfer_setup_recv(data, FIRSTSOCKET, data->req.size);
 
   /* not set by Curl_xfer_setup to preserve keepon bits */
   data->conn->send_idx = 0;
@@ -2460,7 +2460,7 @@ static CURLcode ssh_state_scp_download_init(struct Curl_easy *data,
   /* download data */
   bytecount = (curl_off_t)sb.st_size;
   data->req.maxdownload = (curl_off_t)sb.st_size;
-  Curl_xfer_setup_recv(data, FIRSTSOCKET, bytecount, FALSE);
+  Curl_xfer_setup_recv(data, FIRSTSOCKET, bytecount);
 
   /* not set by Curl_xfer_setup to preserve keepon bits */
   data->conn->send_idx = 0;
index 7696545a07fee98d5912676673e623d8d84f9cb5..556eda0cb5f6a95f988b25b4ddc1610d52c4a082 100644 (file)
@@ -816,7 +816,7 @@ static CURLcode wssh_statemach_act(struct Curl_easy *data,
         wssh_state(data, sshc, SSH_STOP);
         break;
       }
-      Curl_xfer_setup_recv(data, FIRSTSOCKET, data->req.size, FALSE);
+      Curl_xfer_setup_recv(data, FIRSTSOCKET, data->req.size);
 
       /* not set by Curl_xfer_setup to preserve keepon bits */
       conn->send_idx = 0;