diff options
author | Daniel Stenberg <daniel@haxx.se> | 2002-09-02 22:31:18 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2002-09-02 22:31:18 +0000 |
commit | 64bbe9dfafc6693a96b742f3133c636385835a19 (patch) | |
tree | 012bda8b5d41f89cd774b0aa7cc8cacc23aac175 /lib/transfer.c | |
parent | 2e8a9416af0b59e98132e64c29f3919d9a7b9570 (diff) |
James Gallagher's Content-Encoding work
Diffstat (limited to 'lib/transfer.c')
-rw-r--r-- | lib/transfer.c | 70 |
1 files changed, 67 insertions, 3 deletions
diff --git a/lib/transfer.c b/lib/transfer.c index 20088b17d..2567ca91b 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -82,6 +82,8 @@ #include <curl/types.h> #include "netrc.h" +#include "content_encoding.h" /* content encoding support. 08/27/02 jhrg */ + #include "hostip.h" #include "transfer.h" #include "sendf.h" @@ -368,7 +370,7 @@ CURLcode Curl_readwrite(struct connectdata *conn, * we got: "417 Expectation Failed" this means: * we have made a HTTP call and our Expect Header * seems to cause a problem => abort the write operations - * (or prevent them from starting + * (or prevent them from starting). */ k->write_after_100_header = FALSE; k->keepon &= ~KEEP_WRITE; @@ -575,6 +577,34 @@ CURLcode Curl_readwrite(struct connectdata *conn, /* init our chunky engine */ Curl_httpchunk_init(conn); } + else if (strnequal("Content-Encoding:", k->p, 17) && + data->set.encoding) { + /* + * Process Content-Encoding. Look for the values: identity, gzip, + * defalte, compress, x-gzip and x-compress. x-gzip and + * x-compress are the same as gzip and compress. (Sec 3.5 RFC + * 2616). zlib cannot handle compress, and gzip is not currently + * implemented. However, errors are handled further down when the + * response body is processed 08/27/02 jhrg */ + char *start; + + /* Find the first non-space letter */ + for(start=k->p+18; + *start && isspace((int)*start); + start++); + + /* Record the content-encoding for later use. 08/27/02 jhrg */ + if (strnequal("identity", start, 8)) + k->content_encoding = IDENTITY; + else if (strnequal("deflate", start, 7)) + k->content_encoding = DEFLATE; + else if (strnequal("gzip", start, 4) + || strnequal("x-gzip", start, 6)) + k->content_encoding = GZIP; + else if (strnequal("compress", start, 8) + || strnequal("x-compress", start, 10)) + k->content_encoding = COMPRESS; + } else if (strnequal("Content-Range:", k->p, 14)) { if (sscanf (k->p+14, " bytes %d-", &k->offset) || sscanf (k->p+14, " bytes: %d-", &k->offset)) { @@ -737,6 +767,7 @@ CURLcode Curl_readwrite(struct connectdata *conn, * the name says read, this function both reads and writes away * the data. The returned 'nread' holds the number of actual * data it wrote to the client. */ + /* Handle chunking here? 08/27/02 jhrg */ CHUNKcode res = Curl_httpchunk_read(conn, k->str, nread, &nread); @@ -776,8 +807,39 @@ CURLcode Curl_readwrite(struct connectdata *conn, if(!conn->bits.chunk && nread) { /* If this is chunky transfer, it was already written */ - result = Curl_client_write(data, CLIENTWRITE_BODY, k->str, - nread); + + /* This switch handles various content encodings. If there's an + error here, be sure to check over the almost identical code in + http_chunk.c. 08/29/02 jhrg */ +#ifdef HAVE_LIBZ + switch (k->content_encoding) { + case IDENTITY: +#endif + /* This is the default when the server sends no + Content-Encoding header. See Curl_readwrite_init; the + memset() call initializes k->content_encoding to zero. + 08/28/02 jhrg */ + result = Curl_client_write(data, CLIENTWRITE_BODY, k->str, + nread); +#ifdef HAVE_LIBZ + break; + + case DEFLATE: + /* Assume CLIENTWRITE_BODY; headers are not encoded. */ + result = Curl_unencode_deflate_write(data, k, nread); + break; + + case GZIP: /* FIXME 08/27/02 jhrg */ + case COMPRESS: + default: + failf (data, "Unrecognized content encoding type. " + "libcurl understands `identity' and `deflate' " + "content encodings."); + result = CURLE_BAD_CONTENT_ENCODING; + break; + } +#endif + if(result) return result; } @@ -954,6 +1016,8 @@ CURLcode Curl_readwrite_init(struct connectdata *conn) struct SessionHandle *data = conn->data; struct Curl_transfer_keeper *k = &conn->keep; + /* NB: the content encoding software depends on this initialization of + Curl_transfer_keeper. 08/28/02 jhrg */ memset(k, 0, sizeof(struct Curl_transfer_keeper)); k->start = Curl_tvnow(); /* start time */ |