X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgi.c;h=4a523b21a8e4d3efc8cdce3fa1f8596351b2cfa4;hp=2ff7e605e924f5c78b77d4d6fb4cd161c26a9a9f;hb=18e3588a109908e89842c0d79338fbdc5b812949;hpb=d3b49edb39bfc457d4c9047b01e1dbcdd3cf209e diff --git a/cgi.c b/cgi.c index 2ff7e605..4a523b21 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.67 2002/04/30 12:02:07 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,14 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.67 2002/04/30 12:02:07 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 * @@ -732,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 */ @@ -1127,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. @@ -1201,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[] = + "\r\n" + "500 Internal Privoxy Error\r\n" + "\r\n" + "

500 Internal Privoxy Error

\r\n" + "

Privoxy encountered an error while processing your request:

\r\n" + "

Unexpected internal error: "; + static const char body_suffix[] = + "

\r\n" + "

Please " + "" + "file a bug report.

\r\n" + "\r\n" + "\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 @@ -1241,10 +1332,13 @@ 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. @@ -1254,7 +1348,7 @@ jb_err cgi_error_bad_param(struct client_state *csp, * out-of-memory * *********************************************************************/ -char *add_help_link(const char *item, +char *add_help_link(const char *item, struct configuration_spec *config) { char *result; @@ -1263,7 +1357,7 @@ char *add_help_link(const char *item, result = strdup("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); @@ -1825,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);