From: jongfoster Date: Sun, 19 May 2002 11:33:21 +0000 (+0000) Subject: If a CGI error was not handled, and propogated back to X-Git-Tag: v_3_0_branchpoint~49 X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=commitdiff_plain;h=13b08c65c799cfe50468441feee932724b6230ee If a CGI error was not handled, and propogated back to dispatch_known_cgi(), then it was assumed to be "out of memory". This gave a very misleading error message. Now other errors will cause a simple message giving the error number and asking the user to report a bug. Bug report: http://sourceforge.net/tracker/index.php?func=detail &aid=557905&group_id=11118&atid=111118 --- diff --git a/cgi.c b/cgi.c index ad4768d3..4a523b21 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.68 2002/05/12 21:36:29 jongfoster 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,11 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.68 2002/05/12 21:36:29 jongfoster 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 * @@ -735,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 */ @@ -1130,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. @@ -1204,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 diff --git a/cgi.h b/cgi.h index 3ddd73b5..39c6938d 100644 --- a/cgi.h +++ b/cgi.h @@ -1,6 +1,6 @@ #ifndef CGI_H_INCLUDED #define CGI_H_INCLUDED -#define CGI_H_VERSION "$Id: cgi.h,v 1.27 2002/04/24 02:16:51 oes Exp $" +#define CGI_H_VERSION "$Id: cgi.h,v 1.28 2002/04/26 12:54:03 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ @@ -38,6 +38,9 @@ * * Revisions : * $Log: cgi.h,v $ + * Revision 1.28 2002/04/26 12:54:03 oes + * New function add_help_link + * * Revision 1.27 2002/04/24 02:16:51 oes * Moved get_char_param, get_string_param and get_number_param here from cgiedit.c * @@ -195,6 +198,9 @@ extern jb_err cgi_error_no_template(struct client_state *csp, const char *template_name); extern jb_err cgi_error_bad_param(struct client_state *csp, struct http_response *rsp); +jb_err cgi_error_unknown(struct client_state *csp, + struct http_response *rsp, + jb_err error_to_report); extern jb_err get_number_param(struct client_state *csp, const struct map *parameters,