mirror of
https://github.com/moparisthebest/curl
synced 2024-12-24 00:58:48 -05:00
header callback: don't chop headers into smaller pieces
Reported-by: Guido Berhoerster Fixes #2314 Closes #2316
This commit is contained in:
parent
5e17a5f6cf
commit
367689d8c9
@ -1079,10 +1079,8 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
|
|||||||
/* even if one function returns error, this loops through and frees all
|
/* even if one function returns error, this loops through and frees all
|
||||||
buffers */
|
buffers */
|
||||||
if(!result)
|
if(!result)
|
||||||
result = Curl_client_chop_write(conn,
|
result = Curl_client_write(conn, writebuf[i].type, writebuf[i].buf,
|
||||||
writebuf[i].type,
|
writebuf[i].len);
|
||||||
writebuf[i].buf,
|
|
||||||
writebuf[i].len);
|
|
||||||
free(writebuf[i].buf);
|
free(writebuf[i].buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
58
lib/sendf.c
58
lib/sendf.c
@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -541,18 +541,20 @@ static CURLcode pausewrite(struct Curl_easy *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Curl_client_chop_write() writes chunks of data not larger than
|
/* chop_write() writes chunks of data not larger than CURL_MAX_WRITE_SIZE via
|
||||||
* CURL_MAX_WRITE_SIZE via client write callback(s) and
|
* client write callback(s) and takes care of pause requests from the
|
||||||
* takes care of pause requests from the callbacks.
|
* callbacks.
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_client_chop_write(struct connectdata *conn,
|
static CURLcode chop_write(struct connectdata *conn,
|
||||||
int type,
|
int type,
|
||||||
char *ptr,
|
char *optr,
|
||||||
size_t len)
|
size_t olen)
|
||||||
{
|
{
|
||||||
struct Curl_easy *data = conn->data;
|
struct Curl_easy *data = conn->data;
|
||||||
curl_write_callback writeheader = NULL;
|
curl_write_callback writeheader = NULL;
|
||||||
curl_write_callback writebody = NULL;
|
curl_write_callback writebody = NULL;
|
||||||
|
char *ptr = optr;
|
||||||
|
size_t len = olen;
|
||||||
|
|
||||||
if(!len)
|
if(!len)
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
@ -598,28 +600,30 @@ CURLcode Curl_client_chop_write(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(writeheader) {
|
|
||||||
size_t wrote;
|
|
||||||
Curl_set_in_callback(data, true);
|
|
||||||
wrote = writeheader(ptr, 1, chunklen, data->set.writeheader);
|
|
||||||
Curl_set_in_callback(data, false);
|
|
||||||
|
|
||||||
if(CURL_WRITEFUNC_PAUSE == wrote)
|
|
||||||
/* here we pass in the HEADER bit only since if this was body as well
|
|
||||||
then it was passed already and clearly that didn't trigger the
|
|
||||||
pause, so this is saved for later with the HEADER bit only */
|
|
||||||
return pausewrite(data, CLIENTWRITE_HEADER, ptr, len);
|
|
||||||
|
|
||||||
if(wrote != chunklen) {
|
|
||||||
failf(data, "Failed writing header");
|
|
||||||
return CURLE_WRITE_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr += chunklen;
|
ptr += chunklen;
|
||||||
len -= chunklen;
|
len -= chunklen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(writeheader) {
|
||||||
|
size_t wrote;
|
||||||
|
ptr = optr;
|
||||||
|
len = olen;
|
||||||
|
Curl_set_in_callback(data, true);
|
||||||
|
wrote = writeheader(ptr, 1, len, data->set.writeheader);
|
||||||
|
Curl_set_in_callback(data, false);
|
||||||
|
|
||||||
|
if(CURL_WRITEFUNC_PAUSE == wrote)
|
||||||
|
/* here we pass in the HEADER bit only since if this was body as well
|
||||||
|
then it was passed already and clearly that didn't trigger the
|
||||||
|
pause, so this is saved for later with the HEADER bit only */
|
||||||
|
return pausewrite(data, CLIENTWRITE_HEADER, ptr, len);
|
||||||
|
|
||||||
|
if(wrote != len) {
|
||||||
|
failf(data, "Failed writing header");
|
||||||
|
return CURLE_WRITE_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -661,7 +665,7 @@ CURLcode Curl_client_write(struct connectdata *conn,
|
|||||||
#endif /* CURL_DO_LINEEND_CONV */
|
#endif /* CURL_DO_LINEEND_CONV */
|
||||||
}
|
}
|
||||||
|
|
||||||
return Curl_client_chop_write(conn, type, ptr, len);
|
return chop_write(conn, type, ptr, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode Curl_read_plain(curl_socket_t sockfd,
|
CURLcode Curl_read_plain(curl_socket_t sockfd,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -51,8 +51,6 @@ void Curl_failf(struct Curl_easy *, const char *fmt, ...);
|
|||||||
#define CLIENTWRITE_HEADER (1<<1)
|
#define CLIENTWRITE_HEADER (1<<1)
|
||||||
#define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER)
|
#define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER)
|
||||||
|
|
||||||
CURLcode Curl_client_chop_write(struct connectdata *conn, int type, char *ptr,
|
|
||||||
size_t len) WARN_UNUSED_RESULT;
|
|
||||||
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr,
|
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr,
|
||||||
size_t len) WARN_UNUSED_RESULT;
|
size_t len) WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user