-const char cgi_rcs[] = "$Id: cgi.c,v 1.65 2002/04/26 12:53:51 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 $
*
* 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
* 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.
*
{
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 */
* 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.
*
* 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)
*
* 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.
}
+/*********************************************************************
+ *
+ * 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
*
* 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;
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);
* 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
*
* 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
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);