aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/http_chunks.c20
-rw-r--r--lib/transfer.c6
-rw-r--r--lib/url.c13
-rw-r--r--lib/urldata.h4
4 files changed, 38 insertions, 5 deletions
diff --git a/lib/http_chunks.c b/lib/http_chunks.c
index 1b03a5569..36bee789c 100644
--- a/lib/http_chunks.c
+++ b/lib/http_chunks.c
@@ -116,6 +116,12 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
*wrote = 0; /* nothing's written yet */
+ /* the original data is written to the client, but we go on with the
+ chunk read process, to properly calculate the content length*/
+ if ( data->set.http_te_skip )
+ Curl_client_write(conn, CLIENTWRITE_BODY, datap,datalen);
+
+
while(length) {
switch(ch->state) {
case CHUNK_HEX:
@@ -206,12 +212,17 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
/* Write the data portion available */
#ifdef HAVE_LIBZ
- switch (data->reqdata.keep.content_encoding) {
+ switch (conn->data->set.http_ce_skip?
+ IDENTITY : data->reqdata.keep.content_encoding) {
case IDENTITY:
#endif
- if(!k->ignorebody)
- result = Curl_client_write(conn, CLIENTWRITE_BODY, datap,
- piece);
+ if(!k->ignorebody) {
+ if ( !data->set.http_te_skip )
+ result = Curl_client_write(conn, CLIENTWRITE_BODY, datap,
+ piece);
+ else
+ result = CURLE_OK;
+ }
#ifdef HAVE_LIBZ
break;
@@ -334,6 +345,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
return(CHUNKE_BAD_CHUNK);
}
#endif /* CURL_DOES_CONVERSIONS */
+ if ( !data->set.http_te_skip )
Curl_client_write(conn, CLIENTWRITE_HEADER,
conn->trailer, conn->trlPos);
}
diff --git a/lib/transfer.c b/lib/transfer.c
index 828108204..cf4264cc8 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -689,6 +689,9 @@ CURLcode Curl_readwrite(struct connectdata *conn,
k->keepon &= ~KEEP_READ;
}
+ if(data->set.verbose)
+ Curl_debug(data, CURLINFO_HEADER_IN,
+ k->str_start, headerlen, conn);
break; /* exit header line loop */
}
@@ -1286,7 +1289,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
Make sure that ALL_CONTENT_ENCODINGS contains all the
encodings handled here. */
#ifdef HAVE_LIBZ
- switch (k->content_encoding) {
+ switch (conn->data->set.http_ce_skip ?
+ IDENTITY : k->content_encoding) {
case IDENTITY:
#endif
/* This is the default when the server sends no
diff --git a/lib/url.c b/lib/url.c
index 076f50ebd..148d7b2bb 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -1725,6 +1725,19 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
data->set.ssh_private_key = va_arg(param, char *);
break;
+ case CURLOPT_HTTP_TRANSFER_DECODING:
+ /*
+ * disable libcurl transfer encoding is used
+ */
+ data->set.http_te_skip = (bool)(0 == va_arg(param, long));
+ break;
+
+ case CURLOPT_HTTP_CONTENT_DECODING:
+ /*
+ * raw data passed to the application when content encoding is used
+ */
+ data->set.http_ce_skip = (bool)(0 == va_arg(param, long));
+ break;
default:
/* unknown tag and its companion, just ignore: */
result = CURLE_FAILED_INIT; /* correct this */
diff --git a/lib/urldata.h b/lib/urldata.h
index acc9d1ba6..3ba7fcacd 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1292,6 +1292,10 @@ struct UserDefined {
authentication */
char *ssh_private_key; /* the path to the private key file for
authentication */
+ bool http_te_skip; /* pass the raw body data to the user, even when
+ transfer-encoded (chunked, compressed) */
+ bool http_ce_skip; /* pass the raw body data to the user, even when
+ content-encoded (chunked, compressed) */
};
struct Names {