Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

c-hyper: add support for transfer-encoding in the request #7348

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lib/c-hyper.c
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,15 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)
else
Curl_safefree(data->state.aptr.accept_encoding);

#ifdef HAVE_LIBZ
/* we only consider transfer-encoding magic if libz support is built-in */
result = Curl_transferencode(data);
if(result)
return result;
if(Curl_hyper_header(data, headers, data->state.aptr.te))
goto error;
#endif

result = cookies(data, conn, headers);
if(result)
return result;
Expand Down
63 changes: 36 additions & 27 deletions lib/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -2956,6 +2956,39 @@ CURLcode Curl_http_firstwrite(struct Curl_easy *data,
return CURLE_OK;
}

#ifdef HAVE_LIBZ
CURLcode Curl_transferencode(struct Curl_easy *data)
{
if(!Curl_checkheaders(data, "TE") &&
data->set.http_transfer_encoding) {
/* When we are to insert a TE: header in the request, we must also insert
TE in a Connection: header, so we need to merge the custom provided
Connection: header and prevent the original to get sent. Note that if
the user has inserted his/her own TE: header we don't do this magic
but then assume that the user will handle it all! */
char *cptr = Curl_checkheaders(data, "Connection");
#define TE_HEADER "TE: gzip\r\n"

Curl_safefree(data->state.aptr.te);

if(cptr) {
cptr = Curl_copy_header_value(cptr);
if(!cptr)
return CURLE_OUT_OF_MEMORY;
}

/* Create the (updated) Connection: header */
data->state.aptr.te = aprintf("Connection: %s%sTE\r\n" TE_HEADER,
cptr ? cptr : "", (cptr && *cptr) ? ", ":"");

free(cptr);
if(!data->state.aptr.te)
return CURLE_OUT_OF_MEMORY;
}
return CURLE_OK;
}
#endif

#ifndef USE_HYPER
/*
* Curl_http() gets called from the generic multi_do() function when a HTTP
Expand Down Expand Up @@ -3072,33 +3105,9 @@ CURLcode Curl_http(struct Curl_easy *data, bool *done)

#ifdef HAVE_LIBZ
/* we only consider transfer-encoding magic if libz support is built-in */

if(!Curl_checkheaders(data, "TE") &&
data->set.http_transfer_encoding) {
/* When we are to insert a TE: header in the request, we must also insert
TE in a Connection: header, so we need to merge the custom provided
Connection: header and prevent the original to get sent. Note that if
the user has inserted his/her own TE: header we don't do this magic
but then assume that the user will handle it all! */
char *cptr = Curl_checkheaders(data, "Connection");
#define TE_HEADER "TE: gzip\r\n"

Curl_safefree(data->state.aptr.te);

if(cptr) {
cptr = Curl_copy_header_value(cptr);
if(!cptr)
return CURLE_OUT_OF_MEMORY;
}

/* Create the (updated) Connection: header */
data->state.aptr.te = aprintf("Connection: %s%sTE\r\n" TE_HEADER,
cptr ? cptr : "", (cptr && *cptr) ? ", ":"");

free(cptr);
if(!data->state.aptr.te)
return CURLE_OUT_OF_MEMORY;
}
result = Curl_transferencode(data);
if(result)
return result;
#endif

result = Curl_http_body(data, conn, httpreq, &te);
Expand Down
1 change: 1 addition & 0 deletions lib/http.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ CURLcode Curl_http_statusline(struct Curl_easy *data,
struct connectdata *conn);
CURLcode Curl_http_header(struct Curl_easy *data, struct connectdata *conn,
char *headp);
CURLcode Curl_transferencode(struct Curl_easy *data);
CURLcode Curl_http_body(struct Curl_easy *data, struct connectdata *conn,
Curl_HttpReq httpreq,
const char **teep);
Expand Down