diff options
author | Daniel Stenberg <daniel@haxx.se> | 2018-02-16 10:23:44 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-02-16 22:54:08 +0100 |
commit | 367689d8c91228139af735b51ae9ec4968e2df3d (patch) | |
tree | 9407af1fe9df11a12b35c5be72623c282b233ca9 /lib/sendf.c | |
parent | 5e17a5f6cf1d25a219626b0c14f72694d029688d (diff) | |
download | curl-367689d8c91228139af735b51ae9ec4968e2df3d.tar.gz |
header callback: don't chop headers into smaller pieces
Reported-by: Guido Berhoerster
Fixes #2314
Closes #2316
Diffstat (limited to 'lib/sendf.c')
-rw-r--r-- | lib/sendf.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/lib/sendf.c b/lib/sendf.c index 0fca81555..227d1fc6a 100644 --- a/lib/sendf.c +++ b/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 * 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 - * CURL_MAX_WRITE_SIZE via client write callback(s) and - * takes care of pause requests from the callbacks. +/* chop_write() writes chunks of data not larger than CURL_MAX_WRITE_SIZE via + * client write callback(s) and takes care of pause requests from the + * callbacks. */ -CURLcode Curl_client_chop_write(struct connectdata *conn, - int type, - char *ptr, - size_t len) +static CURLcode chop_write(struct connectdata *conn, + int type, + char *optr, + size_t olen) { struct Curl_easy *data = conn->data; curl_write_callback writeheader = NULL; curl_write_callback writebody = NULL; + char *ptr = optr; + size_t len = olen; if(!len) return CURLE_OK; @@ -598,26 +600,28 @@ 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); + ptr += chunklen; + len -= chunklen; + } - 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(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(wrote != chunklen) { - failf(data, "Failed writing header"); - return CURLE_WRITE_ERROR; - } - } + 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); - ptr += chunklen; - len -= chunklen; + if(wrote != len) { + failf(data, "Failed writing header"); + return CURLE_WRITE_ERROR; + } } return CURLE_OK; @@ -661,7 +665,7 @@ CURLcode Curl_client_write(struct connectdata *conn, #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, |