Some updates regarding header filtering,
[privoxy.git] / cgi.c
diff --git a/cgi.c b/cgi.c
index e377ad2..fac49bd 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-const char cgi_rcs[] = "$Id: cgi.c,v 1.91 2007/01/27 13:09:16 fabiankeil Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 1.95 2007/02/10 17:01:37 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.c,v $
@@ -38,6 +38,24 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.91 2007/01/27 13:09:16 fabiankeil Exp $";
  *
  * Revisions   :
  *    $Log: cgi.c,v $
+ *    Revision 1.95  2007/02/10 17:01:37  fabiankeil
+ *    Don't overlook map result for the forwarding-type.
+ *
+ *    Revision 1.94  2007/02/08 19:44:49  fabiankeil
+ *    Use a transparent background for the PNG replacement pattern.
+ *
+ *    Revision 1.93  2007/02/07 10:45:22  fabiankeil
+ *    - Save the reason for generating http_responses.
+ *    - Fix --disable-toggle (again).
+ *    - Use TBL birthday hack for 403 responses as well.
+ *    - Uglify the @menu@ again to fix JavaScript
+ *      errors on the "blocked" template.
+ *    - Escape an ampersand in cgi_error_unknown().
+ *
+ *    Revision 1.92  2007/01/28 13:41:17  fabiankeil
+ *    - Add HEAD support to finish_http_response.
+ *    - Add error favicon to internal HTML error messages.
+ *
  *    Revision 1.91  2007/01/27 13:09:16  fabiankeil
  *    Add new config option "templdir" to
  *    change the templates directory.
@@ -738,12 +756,12 @@ static const struct cgi_dispatcher cgi_dispatchers[] = {
  */
 const char image_pattern_data[] =
    "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104"
-   "\122\000\000\000\004\000\000\000\004\010\002\000\000\000\046"
-   "\223\011\051\000\000\000\006\142\113\107\104\000\310\000\310"
-   "\000\310\052\045\225\037\000\000\000\032\111\104\101\124\170"
-   "\332\143\070\161\342\304\377\377\377\041\044\003\234\165\342"
-   "\304\011\006\234\062\000\125\200\052\251\125\174\360\223\000"
-   "\000\000\000\111\105\116\104\256\102\140\202";
+   "\122\000\000\000\004\000\000\000\004\010\006\000\000\000\251"
+   "\361\236\176\000\000\000\006\142\113\107\104\000\000\000\000"
+   "\000\000\371\103\273\177\000\000\000\033\111\104\101\124\010"
+   "\327\143\140\140\140\060\377\377\377\077\003\234\106\341\060"
+   "\060\230\063\020\124\001\000\161\021\031\241\034\364\030\143"
+   "\000\000\000\000\111\105\116\104\256\102\140\202";
 
 /*
  * 1x1 transparant PNG.
@@ -1017,10 +1035,6 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
       return cgi_error_memory();
    }
 
-   log_error(LOG_LEVEL_GPC, "%s%s cgi call", csp->http->hostport, csp->http->path);
-   log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", 
-                            csp->ip_addr_str, csp->http->cmd); 
-
    /* 
     * Find and start the right CGI function
     */
@@ -1070,6 +1084,7 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
          if (!err)
          {
             /* It worked */
+            rsp->reason = RSP_REASON_CGI_CALL;
             return finish_http_response(csp, rsp);
          }
          else
@@ -1357,11 +1372,13 @@ struct http_response *error_response(struct client_state *csp,
       return cgi_error_memory();
    }
 
+#ifdef FEATURE_FORCE_LOAD
    if (csp->flags & CSP_FLAG_FORCED)
    {
       path = strdup(FORCE_PREFIX);
    }
    else
+#endif /* def FEATURE_FORCE_LOAD */
    {
       path = strdup("");
    }
@@ -1399,6 +1416,7 @@ struct http_response *error_response(struct client_state *csp,
          free_http_response(rsp);
          return cgi_error_memory();
       }
+      rsp->reason = RSP_REASON_NO_SUCH_DOMAIN;
    }
    else if (!strcmp(templatename, "forwarding-failed"))
    {
@@ -1428,8 +1446,8 @@ struct http_response *error_response(struct client_state *csp,
          csp->error_message = strdup("Failure reason missing. Check the log file for details.");
       }
       if (!err) err = map(exports, "gateway", 1, fwd->gateway_host, 1);
-      if (!err) map(exports, "forwarding-type", 1, (fwd->type == SOCKS_4) ?
-                   "socks4-" : "socks4a-", 1);
+      if (!err) err = map(exports, "forwarding-type", 1, (fwd->type == SOCKS_4) ?
+                         "socks4-" : "socks4a-", 1);
       if (!err) err = map(exports, "error-message", 1, html_encode(csp->error_message), 0);
 
       if (!err) rsp->status = strdup("503 Forwarding failure");
@@ -1439,6 +1457,7 @@ struct http_response *error_response(struct client_state *csp,
          free_http_response(rsp);
          return cgi_error_memory();
       }
+      rsp->reason = RSP_REASON_FORWARDING_FAILED;
    }
    else if (!strcmp(templatename, "connect-failed"))
    {
@@ -1449,6 +1468,7 @@ struct http_response *error_response(struct client_state *csp,
          free_http_response(rsp);
          return cgi_error_memory();
       }
+      rsp->reason = RSP_REASON_CONNECT_FAILED;
    }
 
    err = template_fill_for_cgi(csp, templatename, exports, rsp);
@@ -1541,6 +1561,7 @@ void cgi_init_error_messages(void)
       strlen(cgi_error_memory_response->head);
    cgi_error_memory_response->content_length =
       strlen(cgi_error_memory_response->body);
+   cgi_error_memory_response->reason = RSP_REASON_OUT_OF_MEMORY;
 }
 
 
@@ -1690,7 +1711,7 @@ jb_err cgi_error_unknown(struct client_state *csp,
    static const char body_suffix[] =
       "</b></p>\r\n"
       "<p>Please "
-      "<a href=\"http://sourceforge.net/tracker/?group_id=11118&atid=111118\">"
+      "<a href=\"http://sourceforge.net/tracker/?group_id=11118&amp;atid=111118\">"
       "file a bug report</a>.</p>\r\n"
       "</body>\r\n"
       "</html>\r\n";
@@ -1705,6 +1726,7 @@ jb_err cgi_error_unknown(struct client_state *csp,
    rsp->content_length = 0;
    rsp->head_length = 0;
    rsp->is_static = 0;
+   rsp->reason = RSP_REASON_INTERNAL_ERROR;
 
    snprintf(errnumbuf, sizeof(errnumbuf), "%d", error_to_report);
 
@@ -1856,6 +1878,9 @@ char *add_help_link(const char *item,
  *                HTTP header - e.g.:
  *                "Sun, 06 Nov 1994 08:49:37 GMT"
  *
+ *                XXX: Should probably get a third parameter for
+ *                the buffer size.
+ *
  * Parameters  :  
  *          1  :  time_offset = Time returned will be current time
  *                              plus this number of seconds.
@@ -1985,7 +2010,7 @@ struct http_response *finish_http_response(const struct client_state *csp, struc
       rsp->content_length = 0;
    }
 
-   if ((rsp->status != NULL) && strncmpic(rsp->status, "302", 3))
+   if (strncmpic(rsp->status, "302", 3))
    {
      /*
       * If it's not a redirect without any content,
@@ -2046,7 +2071,7 @@ struct http_response *finish_http_response(const struct client_state *csp, struc
        * is older than Privoxy's error message, the server would send status code
        * 304 and the browser would display the outdated error message again and again.
        *
-       * For documents delivered with status code 404 or 503 we set "Last-Modified"
+       * For documents delivered with status code 403, 404 and 503 we set "Last-Modified"
        * to Tim Berners-Lee's birthday, which predates the age of any page on the web
        * and can be safely used to "revalidate" without getting a status code 304.
        *
@@ -2057,7 +2082,9 @@ struct http_response *finish_http_response(const struct client_state *csp, struc
 
       get_http_time(0, buf);
       if (!err) err = enlist_unique_header(rsp->headers, "Date", buf);
-      if (!strncmpic(rsp->status, "404", 3) || !strncmpic(rsp->status, "503", 3))
+      if (!strncmpic(rsp->status, "403", 3)
+       || !strncmpic(rsp->status, "404", 3)
+       || !strncmpic(rsp->status, "503", 3))
       {
          if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Wed, 08 Jun 1955 12:00:00 GMT");
       }
@@ -2524,7 +2551,7 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
    if (!err) err = map_block_killer(exports, "can-toggle");
 #endif
 
-   snprintf(buf, 20, "%d", csp->config->hport);
+   snprintf(buf, sizeof(buf), "%d", csp->config->hport);
    if (!err) err = map(exports, "my-port", 1, buf, 1);
 
    if(!strcmp(CODE_STATUS, "stable"))
@@ -2593,7 +2620,7 @@ jb_err map_block_killer(struct map *exports, const char *name)
    assert(name);
    assert(strlen(name) < 490);
 
-   snprintf(buf, 1000, "if-%s-start.*if-%s-end", name, name);
+   snprintf(buf, sizeof(buf), "if-%s-start.*if-%s-end", name, name);
    return map(exports, buf, 1, "", 1);
 }
 
@@ -2623,7 +2650,7 @@ jb_err map_block_keep(struct map *exports, const char *name)
    assert(name);
    assert(strlen(name) < 490);
 
-   snprintf(buf, 500, "if-%s-start", name);
+   snprintf(buf, sizeof(buf), "if-%s-start", name);
    err = map(exports, buf, 1, "", 1);
 
    if (err)
@@ -2631,7 +2658,7 @@ jb_err map_block_keep(struct map *exports, const char *name)
       return err;
    }
 
-   snprintf(buf, 500, "if-%s-end", name);
+   snprintf(buf, sizeof(buf), "if-%s-end", name);
    return map(exports, buf, 1, "", 1);
 }
 
@@ -2670,7 +2697,7 @@ jb_err map_conditional(struct map *exports, const char *name, int choose_first)
    assert(name);
    assert(strlen(name) < 480);
 
-   snprintf(buf, 1000, (choose_first
+   snprintf(buf, sizeof(buf), (choose_first
       ? "else-not-%s@.*@endif-%s"
       : "if-%s-then@.*@else-not-%s"),
       name, name);
@@ -2681,7 +2708,7 @@ jb_err map_conditional(struct map *exports, const char *name, int choose_first)
       return err;
    }
 
-   snprintf(buf, 1000, (choose_first ? "if-%s-then" : "endif-%s"), name);
+   snprintf(buf, sizeof(buf), (choose_first ? "if-%s-then" : "endif-%s"), name);
    return map(exports, buf, 1, "", 1);
 }
 
@@ -2731,6 +2758,10 @@ char *make_menu(const char *self, const unsigned feature_flags)
       {
          char *html_encoded_prefix;
 
+         /*
+          * Line breaks would be great, but break
+          * the "blocked" template's JavaScript.
+          */
          string_append(&result, "<li><a href=\"");
          html_encoded_prefix = html_encode(CGI_PREFIX);
          if (html_encoded_prefix == NULL)
@@ -2745,7 +2776,7 @@ char *make_menu(const char *self, const unsigned feature_flags)
          string_append(&result, d->name);
          string_append(&result, "\">");
          string_append(&result, d->description);
-         string_append(&result, "</a></li>\n");
+         string_append(&result, "</a></li>");
       }
    }