-const char parsers_rcs[] = "$Id: parsers.c,v 1.218 2011/02/14 16:11:34 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.223 2011/06/23 13:57:47 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
static jb_err crunch_server_header (struct client_state *csp, char **header);
static jb_err server_last_modified (struct client_state *csp, char **header);
static jb_err server_content_disposition(struct client_state *csp, char **header);
+#ifdef FEATURE_ZLIB
+static jb_err server_adjust_content_encoding(struct client_state *csp, char **header);
+#endif
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
static jb_err server_save_content_length(struct client_state *csp, char **header);
}
/*
- * If we tried the limit and still didn't have enough
- * memory, just give up.
+ * If we reached the buffer limit and still didn't have enough
+ * memory, just give up. Due to the ceiling enforced by the next
+ * if block we could actually check for equality here, but as it
+ * can be easily mistaken for a bug we don't.
*/
- if (bufsize == csp->config->buffer_limit)
+ if (bufsize >= csp->config->buffer_limit)
{
log_error(LOG_LEVEL_ERROR, "Buffer limit reached while decompressing iob");
return JB_ERR_MEMORY;
{ "Content-Length:", 15, server_adjust_content_length },
{ "Transfer-Encoding:", 18, server_transfer_coding },
#ifdef FEATURE_ZLIB
- { "Content-Encoding:", 17, server_content_encoding },
+ { "Content-Encoding:", 17, server_adjust_content_encoding },
#endif /* def FEATURE_ZLIB */
{ NULL, 0, NULL }
};
}
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
+#ifdef FEATURE_COMPRESSION
+ if ((JB_ERR_OK == err)
+ && (csp->flags & CSP_FLAG_BUFFERED_CONTENT_DEFLATED))
+ {
+ err = enlist_unique_header(csp->headers, "Content-Encoding", "deflate");
+ if (JB_ERR_OK == err)
+ {
+ log_error(LOG_LEVEL_HEADER, "Added header: Content-Encoding: deflate");
+ }
+ }
+#endif
+
return err;
}
if (csp->action->flags & ACTION_CONTENT_TYPE_OVERWRITE)
{
/*
- * Make sure the user doesn't accidently
+ * Make sure the user doesn't accidentally
* change the content type of binary documents.
*/
if ((csp->content_type & CT_TEXT) || (csp->action->flags & ACTION_FORCE_TEXT_MODE))
*
* Function : server_content_encoding
*
- * Description : This function is run twice for each request,
- * unless FEATURE_ZLIB and filtering are disabled.
+ * Description : Used to check if the content is compressed, and if
+ * FEATURE_ZLIB is disabled, filtering is disabled as
+ * well.
*
- * The first run is used to check if the content
- * is compressed, if FEATURE_ZLIB is disabled
- * filtering is then disabled as well, if FEATURE_ZLIB
- * is enabled the content is marked for decompression.
+ * If FEATURE_ZLIB is enabled and the compression type
+ * supported, the content is marked for decompression.
*
- * The second run is used to remove the Content-Encoding
- * header if the decompression was successful.
- *
* XXX: Doesn't properly deal with multiple or with
* unsupported but unknown encodings.
* Is case-sensitive but shouldn't be.
- * The second run should be factored out into
- * a different function.
*
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
static jb_err server_content_encoding(struct client_state *csp, char **header)
{
#ifdef FEATURE_ZLIB
- if ((csp->flags & CSP_FLAG_MODIFIED)
- && (csp->content_type & (CT_GZIP | CT_DEFLATE)))
- {
- /*
- * We successfully decompressed the content,
- * and have to clean the header now, so the
- * client no longer expects compressed data..
- *
- * XXX: There is a difference between cleaning
- * and removing it completely.
- */
- log_error(LOG_LEVEL_HEADER, "Crunching: %s", *header);
- freez(*header);
- }
- else if (strstr(*header, "sdch"))
+ if (strstr(*header, "sdch"))
{
/*
* Shared Dictionary Compression over HTTP isn't supported,
}
+#ifdef FEATURE_ZLIB
+/*********************************************************************
+ *
+ * Function : server_adjust_content_encoding
+ *
+ * Description : Remove the Content-Encoding header if the
+ * decompression was successful and the content
+ * has been modifed.
+ *
+ * Parameters :
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : header = On input, pointer to header to modify.
+ * On output, pointer to the modified header, or NULL
+ * to remove the header. This function frees the
+ * original string if necessary.
+ *
+ * Returns : JB_ERR_OK on success, or
+ * JB_ERR_MEMORY on out-of-memory error.
+ *
+ *********************************************************************/
+static jb_err server_adjust_content_encoding(struct client_state *csp, char **header)
+{
+ if ((csp->flags & CSP_FLAG_MODIFIED)
+ && (csp->content_type & (CT_GZIP | CT_DEFLATE)))
+ {
+ /*
+ * We successfully decompressed the content,
+ * and have to clean the header now, so the
+ * client no longer expects compressed data..
+ *
+ * XXX: There is a difference between cleaning
+ * and removing it completely.
+ */
+ log_error(LOG_LEVEL_HEADER, "Crunching: %s", *header);
+ freez(*header);
+ }
+
+ return JB_ERR_OK;
+
+}
+#endif /* defined(FEATURE_ZLIB) */
+
+
/*********************************************************************
*
* Function : server_adjust_content_length
*********************************************************************/
static jb_err client_accept_encoding(struct client_state *csp, char **header)
{
+#ifdef FEATURE_COMPRESSION
+ if (strstr(*header, "deflate"))
+ {
+ csp->flags |= CSP_FLAG_CLIENT_SUPPORTS_DEFLATE;
+ }
+#endif
if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
{
log_error(LOG_LEVEL_HEADER, "Suppressed offer to compress content");
*
* Function : server_connection_adder
*
- * Description : Adds an appropiate "Connection:" header to csp->headers
+ * Description : Adds an appropriate "Connection:" header to csp->headers
* unless the header was already present. Called from `sed'.
*
* Parameters :
*
* Description : Adds a "Proxy-Connection: keep-alive" header to
* csp->headers if the client asked for keep-alive.
- * XXX: We should reuse existant ones.
+ * XXX: We should reuse existent ones.
*
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
*
* Function : strclean
*
- * Description : In-Situ-Eliminate all occurances of substring in
+ * Description : In-Situ-Eliminate all occurrences of substring in
* string
*
* Parameters :
return JB_ERR_PARSE;
}
- if (NULL == (p = strdup((host))))
+ p = strdup(host);
+ if (NULL == p)
{
log_error(LOG_LEVEL_ERROR, "Out of memory while parsing \"Host:\" header");
return JB_ERR_MEMORY;