-const char parsers_rcs[] = "$Id: parsers.c,v 1.103 2007/06/01 16:31:54 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.104 2007/07/14 07:38:19 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/parsers.c,v $
  *
  * Revisions   :
  *    $Log: parsers.c,v $
+ *    Revision 1.104  2007/07/14 07:38:19  fabiankeil
+ *    Move the ACTION_FORCE_TEXT_MODE check out of
+ *    server_content_type(). Signal other functions
+ *    whether or not a content type has been declared.
+ *    Part of the fix for BR#1750917.
+ *
  *    Revision 1.103  2007/06/01 16:31:54  fabiankeil
  *    Change sed() to return a jb_err in preparation for forward-override{}.
  *
 #define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
 #define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
 
-jb_err header_tagger(struct client_state *csp, char *header);
-jb_err scan_headers(struct client_state *csp);
+static jb_err scan_headers(struct client_state *csp);
+static jb_err header_tagger(struct client_state *csp, char *header);
+static jb_err parse_header_time(const char *header_time, time_t *result);
+
+static jb_err crumble                   (struct client_state *csp, char **header);
+static jb_err connection                (struct client_state *csp, char **header);
+static jb_err filter_header             (struct client_state *csp, char **header);
+static jb_err client_referrer           (struct client_state *csp, char **header);
+static jb_err client_uagent             (struct client_state *csp, char **header);
+static jb_err client_ua                 (struct client_state *csp, char **header);
+static jb_err client_from               (struct client_state *csp, char **header);
+static jb_err client_send_cookie        (struct client_state *csp, char **header);
+static jb_err client_x_forwarded        (struct client_state *csp, char **header);
+static jb_err client_accept_encoding    (struct client_state *csp, char **header);
+static jb_err client_te                 (struct client_state *csp, char **header);
+static jb_err client_max_forwards       (struct client_state *csp, char **header);
+static jb_err client_host               (struct client_state *csp, char **header);
+static jb_err client_if_modified_since  (struct client_state *csp, char **header);
+static jb_err client_accept_language    (struct client_state *csp, char **header);
+static jb_err client_if_none_match      (struct client_state *csp, char **header);
+static jb_err crunch_client_header      (struct client_state *csp, char **header);
+static jb_err client_x_filter           (struct client_state *csp, char **header);
+static jb_err server_set_cookie         (struct client_state *csp, char **header);
+static jb_err server_content_type       (struct client_state *csp, char **header);
+static jb_err server_content_length     (struct client_state *csp, char **header);
+static jb_err server_content_md5        (struct client_state *csp, char **header);
+static jb_err server_content_encoding   (struct client_state *csp, char **header);
+static jb_err server_transfer_coding    (struct client_state *csp, char **header);
+static jb_err server_http               (struct client_state *csp, char **header);
+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);
+
+static jb_err client_host_adder       (struct client_state *csp);
+static jb_err client_cookie_adder     (struct client_state *csp);
+static jb_err client_xtra_adder       (struct client_state *csp);
+static jb_err client_x_forwarded_adder(struct client_state *csp);
+static jb_err connection_close_adder  (struct client_state *csp); 
 
 const struct parsers client_patterns[] = {
    { "referer:",                  8,   client_referrer },
  * Returns     :  JB_ERR_OK
  *
  *********************************************************************/
-jb_err scan_headers(struct client_state *csp)
+static jb_err scan_headers(struct client_state *csp)
 {
    struct list_entry *h; /* Header */
    jb_err err = JB_ERR_OK;
  * Returns     :  JB_ERR_OK on success and always succeeds
  *
  *********************************************************************/
-jb_err header_tagger(struct client_state *csp, char *header)
+static jb_err header_tagger(struct client_state *csp, char *header)
 {
    int wanted_filter_type;
    int multi_action_index;
  * Returns     :  JB_ERR_OK on success and always succeeds
  *
  *********************************************************************/
-jb_err filter_header(struct client_state *csp, char **header)
+static jb_err filter_header(struct client_state *csp, char **header)
 {
    int hits=0;
    int matches;
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err connection(struct client_state *csp, char **header)
+static jb_err connection(struct client_state *csp, char **header)
 {
    char *old_header = *header;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err crumble(struct client_state *csp, char **header)
+static jb_err crumble(struct client_state *csp, char **header)
 {
    log_error(LOG_LEVEL_HEADER, "crumble crunched: %s!", *header);
    freez(*header);
  * Returns     :  JB_ERR_OK on success and always succeeds
  *
  *********************************************************************/
-jb_err crunch_server_header(struct client_state *csp, char **header)
+static jb_err crunch_server_header(struct client_state *csp, char **header)
 {
    const char *crunch_pattern;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_content_type(struct client_state *csp, char **header)
+static jb_err server_content_type(struct client_state *csp, char **header)
 {
    /* Remove header if it isn't the first Content-Type header */
    if ((csp->content_type & CT_DECLARED))
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_transfer_coding(struct client_state *csp, char **header)
+static jb_err server_transfer_coding(struct client_state *csp, char **header)
 {
    /*
     * Turn off pcrs and gif filtering if body compressed
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_content_encoding(struct client_state *csp, char **header)
+static jb_err server_content_encoding(struct client_state *csp, char **header)
 {
 #ifdef FEATURE_ZLIB
    if ((csp->flags & CSP_FLAG_MODIFIED)
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_content_length(struct client_state *csp, char **header)
+static jb_err server_content_length(struct client_state *csp, char **header)
 {
    const size_t max_header_length = 80;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_content_md5(struct client_state *csp, char **header)
+static jb_err server_content_md5(struct client_state *csp, char **header)
 {
    if (csp->flags & CSP_FLAG_MODIFIED)
    {
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_content_disposition(struct client_state *csp, char **header)
+static jb_err server_content_disposition(struct client_state *csp, char **header)
 {
    const char *newval;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_last_modified(struct client_state *csp, char **header)
+static jb_err server_last_modified(struct client_state *csp, char **header)
 {
    const char *newval;
    char buf[BUFFER_SIZE];
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_accept_encoding(struct client_state *csp, char **header)
+static jb_err client_accept_encoding(struct client_state *csp, char **header)
 {
    if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
    {
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_te(struct client_state *csp, char **header)
+static jb_err client_te(struct client_state *csp, char **header)
 {
    if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
    {
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_referrer(struct client_state *csp, char **header)
+static jb_err client_referrer(struct client_state *csp, char **header)
 {
    const char *newval;
    const char *host;
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_accept_language(struct client_state *csp, char **header)
+static jb_err client_accept_language(struct client_state *csp, char **header)
 {
    const char *newval;
 
    return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
 }
 
+
 /*********************************************************************
  *
  * Function    :  crunch_client_header
  * Returns     :  JB_ERR_OK on success and always succeeds
  *
  *********************************************************************/
-jb_err crunch_client_header(struct client_state *csp, char **header)
+static jb_err crunch_client_header(struct client_state *csp, char **header)
 {
    const char *crunch_pattern;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_uagent(struct client_state *csp, char **header)
+static jb_err client_uagent(struct client_state *csp, char **header)
 {
    const char *newval;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_ua(struct client_state *csp, char **header)
+static jb_err client_ua(struct client_state *csp, char **header)
 {
    if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0)
    {
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_from(struct client_state *csp, char **header)
+static jb_err client_from(struct client_state *csp, char **header)
 {
    const char *newval;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_send_cookie(struct client_state *csp, char **header)
+static jb_err client_send_cookie(struct client_state *csp, char **header)
 {
    if (csp->action->flags & ACTION_NO_COOKIE_READ)
    {
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_max_forwards(struct client_state *csp, char **header)
+static jb_err client_max_forwards(struct client_state *csp, char **header)
 {
    int max_forwards;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_host(struct client_state *csp, char **header)
+static jb_err client_host(struct client_state *csp, char **header)
 {
    char *p, *q;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_if_modified_since(struct client_state *csp, char **header)
+static jb_err client_if_modified_since(struct client_state *csp, char **header)
 {
    char newheader[50];
 #ifdef HAVE_GMTIME_R
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_if_none_match(struct client_state *csp, char **header)
+static jb_err client_if_none_match(struct client_state *csp, char **header)
 {
    if (csp->action->flags & ACTION_CRUNCH_IF_NONE_MATCH)
    {  
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_host_adder(struct client_state *csp)
+static jb_err client_host_adder(struct client_state *csp)
 {
    char *p;
    jb_err err;
    return err;
 }
 
-
+#if 0
 /*********************************************************************
  *
  * Function    :  client_accept_encoding_adder
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_accept_encoding_adder(struct client_state *csp)
+static jb_err client_accept_encoding_adder(struct client_state *csp)
 {
-   assert(0); /* Not in use */
-
    if (   ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
        && (!strcmpic(csp->http->ver, "HTTP/1.1")) )
    {
 
    return JB_ERR_OK;
 }
-
+#endif
 
 /*********************************************************************
  *
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_xtra_adder(struct client_state *csp)
+static jb_err client_xtra_adder(struct client_state *csp)
 {
    struct list_entry *lst;
    jb_err err;
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err client_x_forwarded_adder(struct client_state *csp)
+static jb_err client_x_forwarded_adder(struct client_state *csp)
 {
    char *p = NULL;
    jb_err err;
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err connection_close_adder(struct client_state *csp)
+static jb_err connection_close_adder(struct client_state *csp)
 {
    const unsigned int flags = csp->flags;
 
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_http(struct client_state *csp, char **header)
+static jb_err server_http(struct client_state *csp, char **header)
 {
    sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status));
    if (csp->http->status == 206)
  *                JB_ERR_MEMORY on out-of-memory error.
  *
  *********************************************************************/
-jb_err server_set_cookie(struct client_state *csp, char **header)
+static jb_err server_set_cookie(struct client_state *csp, char **header)
 {
    time_t now;
    time_t cookie_time; 
  *                JB_ERR_PARSE otherwise.
  *
  *********************************************************************/
-jb_err parse_header_time(const char *header_time, time_t *result)
+static jb_err parse_header_time(const char *header_time, time_t *result)
 {
    struct tm gmt;