X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgi.c;h=4a523b21a8e4d3efc8cdce3fa1f8596351b2cfa4;hp=df20340be94e193a27a45058fca4ecf8524f368d;hb=c9a8017d00255057eabf02a2d5e469d619851657;hpb=949d36c345d6be2e6860cfec3e8d88c10b192481 diff --git a/cgi.c b/cgi.c index df20340b..4a523b21 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.63 2002/04/15 19:06:43 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,31 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.63 2002/04/15 19:06:43 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 + * + * 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 + * - Moved get_char_param, get_string_param and get_number_param here + * from cgiedit.c + * * Revision 1.63 2002/04/15 19:06:43 jongfoster * Typos * @@ -568,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. * @@ -715,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 */ @@ -740,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. * @@ -1091,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) @@ -1114,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. @@ -1188,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 @@ -1222,6 +1326,47 @@ jb_err cgi_error_bad_param(struct client_state *csp, } +/********************************************************************* + * + * Function : add_help_link + * + * 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 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, + struct configuration_spec *config) +{ + char *result; + + if (!item) return NULL; + + result = strdup("usermanual); + string_append(&result, ACTIONS_HELP_PREFIX); + string_join (&result, string_toupper(item)); + string_append(&result, "\">"); + string_append(&result, item); + string_append(&result, " "); + + return result; +} + + /********************************************************************* * * Function : get_http_time @@ -1454,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 * @@ -1701,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 @@ -1772,6 +1918,8 @@ struct map *default_exports(const struct client_state *csp, const char *caller) if (!err) err = map(exports, "default-cgi", 1, html_encode(CGI_PREFIX), 0); 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, "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); @@ -1941,9 +2089,10 @@ jb_err map_conditional(struct map *exports, const char *name, int choose_first) * Function : make_menu * * Description : Returns an HTML-formatted menu of the available - * unhidden CGIs, excluding the one given in . + * unhidden CGIs, excluding the one given in * - * Parameters : self = name of CGI to leave out, can be NULL + * Parameters : self = name of CGI to leave out, can be NULL for + * complete listing. * * Returns : menu string, or NULL on out-of-memory error. * @@ -1979,7 +2128,7 @@ char *make_menu(const char *self) * * Function : dump_map * - * Description : HTML-dump a map for debugging + * Description : HTML-dump a map for debugging (as table) * * Parameters : * 1 : the_map = map to dump