Non-martian version
[privoxy.git] / cgi.c
diff --git a/cgi.c b/cgi.c
index 0cc7fe4..4a523b2 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-const char cgi_rcs[] = "$Id: cgi.c,v 1.64 2002/04/24 02:17:21 oes Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 1.69 2002/05/14 21:28:40 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.c,v $
@@ -38,6 +38,25 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.64 2002/04/24 02:17:21 oes Exp $";
  *
  * Revisions   :
  *    $Log: cgi.c,v $
+ *    Revision 1.69  2002/05/14 21:28:40  oes
+ *     - Fixed add_help_link to link to the (now split) actions
+ *       part of the config chapter
+ *     - Renamed helplink export to actions-help-prefix
+ *
+ *    Revision 1.68  2002/05/12 21:36:29  jongfoster
+ *    Correcting function comments
+ *
+ *    Revision 1.67  2002/04/30 12:02:07  oes
+ *    Nit: updated a comment
+ *
+ *    Revision 1.66  2002/04/26 18:32:57  jongfoster
+ *    Fixing a memory leak on error
+ *
+ *    Revision 1.65  2002/04/26 12:53:51  oes
+ *     - New function add_help_link
+ *     - default_exports now exports links to the user manual
+ *       and a prefix for links into the config chapter
+ *
  *    Revision 1.64  2002/04/24 02:17:21  oes
  *     - Better descriptions for CGIs
  *     - Hide edit-actions, more shortcuts
@@ -574,7 +593,7 @@ static struct map *parse_cgi_parameters(char *argstring);
  * Description :  Checks if a request URL has either the magical
  *                hostname CGI_SITE_1_HOST (usually http://p.p/) or
  *                matches CGI_SITE_2_HOST CGI_SITE_2_PATH (usually
- *                http://ijbswa.sourceforge.net/config). If so, it passes
+ *                http://config.privoxy.org/). If so, it passes
  *                the (rest of the) path onto dispatch_known_cgi, which
  *                calls the relevant CGI handler function.
  *
@@ -721,6 +740,12 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
          {
             err = cgi_error_bad_param(csp, rsp);
          }
+         if (err && (err != JB_ERR_MEMORY))
+         {
+            /* Unexpected error! Shouldn't get here */
+            log_error(LOG_LEVEL_ERROR, "Unexpected CGI error %d in top-level handler.  Please file a bug report!", err);
+            err = cgi_error_unknown(csp, rsp, err);
+         }
          if (!err)
          {
             /* It worked */
@@ -746,7 +771,7 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
  *                pairs and store them in a struct map list.
  *
  * Parameters  :
- *          1  :  string = string to be parsed.  Will be trashed.
+ *          1  :  argstring = string to be parsed.  Will be trashed.
  *
  * Returns     :  pointer to param list, or NULL if out of memory.
  *
@@ -1097,14 +1122,10 @@ void cgi_init_error_messages(void)
  * Description :  Called if a CGI function runs out of memory.
  *                Returns a statically-allocated error response.
  *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  template_name = Name of template that could not
- *                                be loaded.
+ * Parameters  :  N/A
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  http_response data structure for output.  This is
+ *                statically allocated, for obvious reasons.
  *
  *********************************************************************/
 struct http_response *cgi_error_memory(void)
@@ -1120,7 +1141,7 @@ struct http_response *cgi_error_memory(void)
  *
  * Function    :  cgi_error_no_template
  *
- * Description :  Almost-CGI function that is called if a templae
+ * Description :  Almost-CGI function that is called if a template
  *                cannot be loaded.  Note this is not a true CGI,
  *                it takes a template name rather than a map of 
  *                parameters.
@@ -1194,6 +1215,83 @@ jb_err cgi_error_no_template(struct client_state *csp,
 }
 
 
+/*********************************************************************
+ *
+ * Function    :  cgi_error_unknown
+ *
+ * Description :  Almost-CGI function that is called if an unexpected
+ *                error occurs in the top-level CGI dispatcher.
+ *                In this context, "unexpected" means "anything other
+ *                than JB_ERR_MEMORY or JB_ERR_CGI_PARAMS" - CGIs are
+ *                expected to handle all other errors internally,
+ *                since they can give more relavent error messages
+ *                that way.
+ *
+ *                Note this is not a true CGI, it takes an error
+ *                code rather than a map of parameters.
+ *
+ * Parameters  :
+ *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          2  :  rsp = http_response data structure for output
+ *          3  :  error_to_report = Error code to report.
+ *
+ * Returns     :  JB_ERR_OK on success
+ *                JB_ERR_MEMORY on out-of-memory error.  
+ *
+ *********************************************************************/
+jb_err cgi_error_unknown(struct client_state *csp,
+                         struct http_response *rsp,
+                         jb_err error_to_report)
+{
+   static const char status[] =
+      "500 Internal Privoxy Error";
+   static const char body_prefix[] =
+      "<html>\r\n"
+      "<head><title>500 Internal Privoxy Error</title></head>\r\n"
+      "<body>\r\n"
+      "<h1>500 Internal Privoxy Error</h1>\r\n"
+      "<p>Privoxy encountered an error while processing your request:</p>\r\n"
+      "<p><b>Unexpected internal error: ";
+   static const char body_suffix[] =
+      "</b></p>\r\n"
+      "<p>Please "
+      "<a href=\"http://sourceforge.net/tracker/?group_id=11118&atid=111118\">"
+      "file a bug report</a>.</p>\r\n"
+      "</body>\r\n"
+      "</html>\r\n";
+   char errnumbuf[30];
+   assert(csp);
+   assert(rsp);
+
+   /* Reset rsp, if needed */
+   freez(rsp->status);
+   freez(rsp->head);
+   freez(rsp->body);
+   rsp->content_length = 0;
+   rsp->head_length = 0;
+   rsp->is_static = 0;
+
+   sprintf(errnumbuf, "%d", error_to_report);
+
+   rsp->body = malloc(strlen(body_prefix) + strlen(errnumbuf) + strlen(body_suffix) + 1);
+   if (rsp->body == NULL)
+   {
+      return JB_ERR_MEMORY;
+   }
+   strcpy(rsp->body, body_prefix);
+   strcat(rsp->body, errnumbuf);
+   strcat(rsp->body, body_suffix);
+
+   rsp->status = strdup(status);
+   if (rsp->body == NULL)
+   {
+      return JB_ERR_MEMORY;
+   }
+
+   return JB_ERR_OK;
+}
+
+
 /*********************************************************************
  *
  * Function    :  cgi_error_bad_param
@@ -1234,28 +1332,32 @@ jb_err cgi_error_bad_param(struct client_state *csp,
  *
  * Description :  Produce a copy of the string given as item,
  *                embedded in an HTML link to its corresponding
- *                section (item name in uppercase) in the configuration
+ *                section (item name in uppercase) in the actions
  *                chapter of the user manual, (whose URL is given in
  *                the config and defaults to our web site).
  *
+ *                FIXME: I currently only work for actions, and would
+ *                       like to be generalized for other topics.
+ *
  * Parameters  :  
  *          1  :  item = item (will NOT be free()d.) 
  *                       It is assumed to be HTML-safe.
+ *          2  :  config = The current configuration.
  *
  * Returns     :  String with item embedded in link, or NULL on
  *                out-of-memory
  *
  *********************************************************************/
-char *add_help_link(const char *item, 
+char *add_help_link(const char *item,
                     struct configuration_spec *config)
 {
-   char *result = strdup("");
+   char *result;
 
    if (!item) return NULL;
-   
-   string_append(&result, "<a href=\"");
+
+   result = strdup("<a href=\"");
    string_append(&result, config->usermanual);
-   string_append(&result, HELP_LINK_PREFIX);
+   string_append(&result, ACTIONS_HELP_PREFIX);
    string_join  (&result, string_toupper(item));
    string_append(&result, "\">");
    string_append(&result, item);
@@ -1497,7 +1599,7 @@ void free_http_response(struct http_response *rsp)
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *          2  :  template_ptr = Destination for pointer to loaded
  *                               template text.
- *          3  :  template = name of the HTML template to be used
+ *          3  :  templatename = name of the HTML template to be used
  *          4  :  recursive = Flag set if this function calls itself
  *                            following an #include statament
  *
@@ -1744,6 +1846,7 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
  *          2  :  templatename = name of the HTML template to be used
  *          3  :  exports = map with fill in symbol -> name pairs.
  *                          Will be freed by this function.
+ *          4  :  rsp = Response structure to fill in.
  *
  * Returns     :  JB_ERR_OK on success
  *                JB_ERR_MEMORY on out-of-memory error
@@ -1816,7 +1919,7 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
    if (!err) err = map(exports, "menu",          1, make_menu(caller), 0);
    if (!err) err = map(exports, "code-status",   1, CODE_STATUS, 1);
    if (!err) err = map(exports, "user-manual",   1, csp->config->usermanual ,1);
-   if (!err) err = map(exports, "helplink",      1, HELP_LINK_PREFIX ,1);
+   if (!err) err = map(exports, "actions-help-prefix", 1, ACTIONS_HELP_PREFIX ,1);
    if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB);
 
    snprintf(buf, 20, "%d", csp->config->hport);