1
0
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:
Daniel Stenberg 2018-02-16 10:23:44 +01:00
parent 5e17a5f6cf
commit 367689d8c9
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 34 additions and 34 deletions

View File

@ -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);
} }

View File

@ -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,

View File

@ -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;