Commit dbcced8e authored by Patrick Monnerat's avatar Patrick Monnerat
Browse files

HTTP: support multiple Content-Encodings

This is implemented as an output streaming stack of unencoders, the last
calling the client write procedure.

New test 230 checks this feature.

Bug: https://github.com/curl/curl/pull/2002
Reported-By: Daniel Bankhead
parent 462f3cac
Loading
Loading
Loading
Loading
+1 −1
Changes for docs/INTERNALS.md: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -673,7 +673,7 @@ Content Encoding

 where string is the intended value of the Accept-Encoding header.

 Currently, libcurl does not support multiple encodings and only
 Currently, libcurl does support multiple encodings but only
 understands how to process responses that use the "deflate" or "gzip"
 Content-Encoding, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
 that will work (besides "identity," which does nothing) are "deflate"
+0 −7
Changes for docs/TODO: 0 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -67,7 +67,6 @@
 5.7 Brotli compression
 5.8 QUIC
 5.9 Leave secure cookies alone
 5.10 Support Multiple Content-Encodings

 6. TELNET
 6.1 ditch stdin
@@ -538,12 +537,6 @@ This is not detailed in any FTP specification.

 https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01

5.10 Support Multiple Content-Encodings

 RFC 7231 Section 3.1.2.2 allows multiple encodings for a single request. Using
 this may result in lower bandwidth and promotes a more resource-friendly web.
 Currently, Chrome and Firefox support multiple encodings.


6. TELNET

+466 −86

File changed.

Preview size limit exceeded, changes collapsed.

+26 −19
Changes for lib/content_encoding.h: 26 added lines, 19 removed lines.
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
 * Copyright (C) 1998 - 2017, 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
@@ -23,26 +23,33 @@
 ***************************************************************************/
#include "curl_setup.h"

/*
 * Comma-separated list all supported Content-Encodings ('identity' is implied)
 */
#ifdef HAVE_LIBZ
#define ALL_CONTENT_ENCODINGS "deflate, gzip"
/* force a cleanup */
void Curl_unencode_cleanup(struct connectdata *conn);
#else
#define ALL_CONTENT_ENCODINGS "identity"
#define Curl_unencode_cleanup(x) Curl_nop_stmt
#endif
/* Decoding writer. */
typedef struct contenc_writer_s contenc_writer;
typedef struct content_encoding_s content_encoding;

struct contenc_writer_s {
  const content_encoding *handler;  /* Encoding handler. */
  contenc_writer *downstream;  /* Downstream writer. */
  void *params;  /* Encoding-specific storage (variable length). */
};

CURLcode Curl_unencode_deflate_write(struct connectdata *conn,
                                     struct SingleRequest *req,
                                     ssize_t nread);
/* Content encoding writer. */
struct content_encoding_s {
  const char *name;        /* Encoding name. */
  const char *alias;       /* Encoding name alias. */
  CURLcode (*init_writer)(struct connectdata *conn, contenc_writer *writer);
  CURLcode (*unencode_write)(struct connectdata *conn, contenc_writer *writer,
                             const char *buf, size_t nbytes);
  void (*close_writer)(struct connectdata *conn, contenc_writer *writer);
  size_t paramsize;
};

CURLcode
Curl_unencode_gzip_write(struct connectdata *conn,
                         struct SingleRequest *k,
                         ssize_t nread);

CURLcode Curl_build_unencoding_stack(struct connectdata *conn,
                                     const char *enclist, int maybechunked);
CURLcode Curl_unencode_write(struct connectdata *conn, contenc_writer *writer,
                             const char *buf, size_t nbytes);
void Curl_unencode_cleanup(struct connectdata *conn);
char *Curl_all_content_encodings(void);

#endif /* HEADER_CURL_CONTENT_ENCODING_H */
+7 −61

File changed.

Preview size limit exceeded, changes collapsed.

Loading