From 91e4da7ddb75e68c71f19cf5d009550431bdcf4c Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 7 Mar 2001 17:12:12 +0000 Subject: initial chunked transfer-encoding support --- lib/transfer.c | 28 ++++++++++++++++++++++++++-- lib/urldata.h | 1 + 2 files changed, 27 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/transfer.c b/lib/transfer.c index bf67788c2..5786ce777 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -379,10 +379,22 @@ _Transfer(struct connectdata *c_conn) */ conn->bits.close = TRUE; /* close when done */ } + else if (strnequal("Transfer-Encoding: chunked", p, + strlen("Transfer-Encoding: chunked"))) { + /* + * [RFC 2616, section 3.6.1] A 'chunked' transfer encoding + * means that the server will send a series of "chunks". Each + * chunk starts with line with info (including size of the + * coming block) (terminated with CRLF), then a block of data + * with the previously mentioned size. There can be any amount + * of chunks, and a chunk-data set to zero signals the + * end-of-chunks. */ + conn->bits.chunk = TRUE; /* chunks coming our way */ + } else if (strnequal("Content-Range", p, 13)) { if (sscanf (p+13, ": bytes %d-", &offset) || sscanf (p+13, ": bytes: %d-", &offset)) { - /* This second format was added August 1st by Igor + /* This second format was added August 1st 2000 by Igor Khristophorov since Sun's webserver JavaWebServer/1.1.1 obviously sends the header this way! :-( */ if (data->resume_from == offset) { @@ -457,9 +469,14 @@ _Transfer(struct connectdata *c_conn) is non-headers. */ if (str && !header && ((signed int)nread > 0)) { + /* + * If we requested a HTTP header, this might be a good time to get + * out and return home. + */ + if(0 == bodywrites) { /* These checks are only made the first time we are about to - write a chunk of the body */ + write a piece of the body */ if(conn->protocol&PROT_HTTP) { /* HTTP-only checks */ if (data->newurl) { @@ -516,6 +533,13 @@ _Transfer(struct connectdata *c_conn) } /* this is the first time we write a body part */ bodywrites++; + if(conn->bits.chunk) { + /* + * Bless me father for I have sinned. Here come a chunked + * transfer flighing and we need to decode this properly. + */ + } + if(conn->maxdownload && (bytecount + nread >= conn->maxdownload)) { nread = conn->maxdownload - bytecount; diff --git a/lib/urldata.h b/lib/urldata.h index 86dee2101..40e9e5c43 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -196,6 +196,7 @@ struct FILE { struct ConnectBits { bool close; /* if set, we close the connection after this request */ bool reuse; /* if set, this is a re-used connection */ + bool chunk; /* if set, this is a chunked transfer-encoding */ }; /* -- cgit v1.2.3