From: jongfoster Date: Sun, 16 Sep 2001 11:38:02 +0000 (+0000) Subject: Splitting fill_template() into 2 functions: X-Git-Tag: v_2_9_9~82 X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=commitdiff_plain;h=c35324374411cae44d7c40dd8403e30ef53ea1f0 Splitting fill_template() into 2 functions: template_load() loads the file template_fill() performs the PCRS regexps. This is because the CGI edit interface has a "table row" template which is used many times in the page - this change means it's only loaded from disk once. --- diff --git a/cgi.c b/cgi.c index 7bbfff11..6860dd91 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.22 2001/09/16 11:00:10 jongfoster Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.23 2001/09/16 11:16:05 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ @@ -36,6 +36,9 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.22 2001/09/16 11:00:10 jongfoster Exp $"; * * Revisions : * $Log: cgi.c,v $ + * Revision 1.23 2001/09/16 11:16:05 jongfoster + * Better error handling in dispatch_cgi() and parse_cgi_parameters() + * * Revision 1.22 2001/09/16 11:00:10 jongfoster * New function alloc_http_response, for symmetry with free_http_response * @@ -334,7 +337,6 @@ struct http_response *dispatch_cgi(struct client_state *csp) /* Can't get here, since cgi_default will match all requests */ free_http_response(rsp); return(NULL); - } @@ -427,7 +429,8 @@ int cgi_default(struct client_state *csp, struct http_response *rsp, map(exports, "cgi-parameters", 1, "", 1); } - rsp->body = fill_template(csp, "default", exports); + rsp->body = template_load(csp, "default"); + template_fill(&rsp->body, exports); free_map(exports); return(0); @@ -500,7 +503,8 @@ int cgi_show_version(struct client_state *csp, struct http_response *rsp, map(exports, "sourceversions", 1, show_rcs(), 0); - rsp->body = fill_template(csp, "show-version", exports); + rsp->body = template_load(csp, "show-version"); + template_fill(&rsp->body, exports); free_map(exports); return(0); @@ -593,7 +597,8 @@ int cgi_show_status(struct client_state *csp, struct http_response *rsp, fclose(fp); map(exports, "contents", 1, s, 0); } - rsp->body = fill_template(csp, "show-status-file", exports); + rsp->body = template_load(csp, "show-status-file"); + template_fill(&rsp->body, exports); free_map(exports); return(0); @@ -649,14 +654,15 @@ int cgi_show_status(struct client_state *csp, struct http_response *rsp, map_block_killer(exports, "trust-support"); #endif /* ndef FEATURE_TRUST */ - rsp->body = fill_template(csp, "show-status", exports); + rsp->body = template_load(csp, "show-status"); + template_fill(&rsp->body, exports); free_map(exports); return(0); } - /********************************************************************* +/********************************************************************* * * Function : cgi_show_url_info * @@ -721,7 +727,8 @@ int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, freez(url_param); free_current_action(action); - rsp->body = fill_template(csp, "show-url-info", exports); + rsp->body = template_load(csp, "show-url-info"); + template_fill(&rsp->body, exports); free_map(exports); return 0; @@ -757,7 +764,8 @@ int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, freez(path); free_current_action(action); - rsp->body = fill_template(csp, "show-url-info", exports); + rsp->body = template_load(csp, "show-url-info"); + template_fill(&rsp->body, exports); free_map(exports); return 0; @@ -815,7 +823,8 @@ int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, free_current_action(action); } - rsp->body = fill_template(csp, "show-url-info", exports); + rsp->body = template_load(csp, "show-url-info"); + template_fill(&rsp->body, exports); free_map(exports); return 0; @@ -845,7 +854,7 @@ struct http_response *error_response(struct client_state *csp, const char *templ if (NULL == (rsp = alloc_http_response())) { return NULL; - } + } map(exports, "host-html", 1, html_encode(csp->http->host), 0); map(exports, "hostport", 1, csp->http->hostport, 1); @@ -855,9 +864,10 @@ struct http_response *error_response(struct client_state *csp, const char *templ map(exports, "error", 1, safe_strerror(err), 0); map(exports, "host-ip", 1, csp->http->host_ip_addr_str, 1); - rsp->body = fill_template(csp, templatename, exports); + rsp->body = template_load(csp, templatename); + template_fill(&rsp->body, exports); free_map(exports); - + if (!strcmp(templatename, "no-such-domain")) { rsp->status = strdup("404 No such domain"); @@ -1020,7 +1030,7 @@ struct http_response *finish_http_response(struct http_response *rsp) return(rsp); } - + /********************************************************************* * @@ -1054,13 +1064,13 @@ struct http_response * alloc_http_response(void) *********************************************************************/ void free_http_response(struct http_response *rsp) { - if(rsp) + if (rsp) { freez(rsp->status); freez(rsp->head); freez(rsp->body); destroy_list(rsp->headers); - freez(rsp); + free(rsp); } } @@ -1078,23 +1088,16 @@ void free_http_response(struct http_response *rsp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * 3 : template = name of the HTML template to be used - * 2 : exports = map with fill in symbol -> name pairs * - * Returns : char * with filled out form, or NULL if failiure + * Returns : char * with loaded template, or NULL if failure * *********************************************************************/ -char *fill_template(struct client_state *csp, const char *templatename, struct map *exports) +char *template_load(struct client_state *csp, const char *templatename) { - struct map_entry *m; - pcrs_job *job; char buf[BUFFER_SIZE]; - char *tmp_out_buffer; char *file_buffer = NULL; - int size; - int error; FILE *fp; - /* * Open template file or fail */ @@ -1113,16 +1116,54 @@ char *fill_template(struct client_state *csp, const char *templatename, struct m while (fgets(buf, BUFFER_SIZE, fp)) { /* skip lines starting with '#' */ - if(*buf == '#') continue; + if(*buf == '#') + { + continue; + } file_buffer = strsav(file_buffer, buf); } fclose(fp); + return(file_buffer); +} - /* - * Execute the jobs - */ + +/********************************************************************* + * + * Function : fill_template + * + * Description : CGI support function that loads a given HTML + * template from the confdir, and fills it in + * by replacing @name@ with value using pcrs, + * for each item in the output map. + * + * Parameters : + * 1 : template_ptr = IN: Template to be filled out. + * Will be free()d. + * OUT: Filled out template. + * Caller must free(). + * 2 : exports = map with fill in symbol -> name pairs + * + * Returns : N/A + * + *********************************************************************/ +void template_fill(char ** template_ptr, struct map *exports) +{ + struct map_entry *m; + pcrs_job *job; + char buf[BUFFER_SIZE]; + char *tmp_out_buffer; + char *file_buffer; + int size; + int error; + const char * flags; + + assert(template_ptr); + assert(*template_ptr); + assert(exports); + + file_buffer = *template_ptr; size = strlen(file_buffer) + 1; /* @@ -1130,11 +1171,34 @@ char *fill_template(struct client_state *csp, const char *templatename, struct m */ for (m = exports->first; m != NULL; m = m->next) { - /* Enclose name in @@ */ - snprintf(buf, BUFFER_SIZE, "@%s@", m->name); + if (*m->name == '$') + { + /* + * First character of name is '$', so remove this flag + * character and allow backreferences ($1 etc) in the + * "replace with" text. + */ + snprintf(buf, BUFFER_SIZE, "%s", m->name + 1); + flags = "sigU"; + } + else + { + /* + * Treat the "replace with" text as a literal string - + * no quoting needed, no backreferences allowed. + * ("Trivial" ['T'] flag). + */ + flags = "sigTU"; + + /* Enclose name in @@ */ + snprintf(buf, BUFFER_SIZE, "@%s@", m->name); + } + + + log_error(LOG_LEVEL_CGI, "Substituting: s/%s/%s/%s", buf, m->value, flags); /* Make and run job. */ - job = pcrs_compile(buf, m->value, "sigTU", &error); + job = pcrs_compile(buf, m->value, flags, &error); if (job == NULL) { log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error); @@ -1151,12 +1215,10 @@ char *fill_template(struct client_state *csp, const char *templatename, struct m } } - /* * Return */ - return(file_buffer); - + *template_ptr = file_buffer; } @@ -1406,6 +1468,7 @@ struct map *add_stats(struct map *exports) } #endif /* def FEATURE_STATISTICS */ + /* Local Variables: tab-width: 3 diff --git a/cgi.h b/cgi.h index 56016bbb..5cc92d76 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.12 2001/09/13 23:31:25 jongfoster Exp $" +#define CGI_H_VERSION "$Id: cgi.h,v 1.13 2001/09/16 11:00:10 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ @@ -38,6 +38,9 @@ * * Revisions : * $Log: cgi.h,v $ + * Revision 1.13 2001/09/16 11:00:10 jongfoster + * New function alloc_http_response, for symmetry with free_http_response + * * Revision 1.12 2001/09/13 23:31:25 jongfoster * Moving image data to cgi.c rather than cgi.h. * @@ -127,7 +130,9 @@ extern struct http_response *finish_http_response(struct http_response *rsp); extern struct map * default_exports(const struct client_state *csp, const char *caller); extern void map_block_killer(struct map *map, const char *name); extern void map_conditional(struct map *exports, const char *name, int choose_first); -extern char *fill_template(struct client_state *csp, const char *templatename, struct map *exports); + +extern char *template_load(struct client_state *csp, const char *templatename); +extern void template_fill(char ** template_ptr, struct map *exports); /* diff --git a/filters.c b/filters.c index 42446193..b0dbd2db 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.29 2001/09/13 23:32:40 jongfoster Exp $"; +const char filters_rcs[] = "$Id: filters.c,v 1.30 2001/09/16 11:00:10 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ @@ -38,6 +38,9 @@ const char filters_rcs[] = "$Id: filters.c,v 1.29 2001/09/13 23:32:40 jongfoster * * Revisions : * $Log: filters.c,v $ + * Revision 1.30 2001/09/16 11:00:10 jongfoster + * New function alloc_http_response, for symmetry with free_http_response + * * Revision 1.29 2001/09/13 23:32:40 jongfoster * Moving image data to cgi.c rather than cgi.h * Fixing a GPF under Win32 (and any other OS that protects global @@ -533,7 +536,8 @@ struct http_response *block_url(struct client_state *csp) map(exports, "path", 1, csp->http->path, 1); map(exports, "path-html", 1, html_encode(csp->http->path), 0); - rsp->body = fill_template(csp, "blocked", exports); + rsp->body = template_load(csp, "blocked"); + template_fill(&rsp->body, exports); free_map(exports); /* @@ -661,7 +665,8 @@ struct http_response *trust_url(struct client_state *csp) /* * Build the response */ - rsp->body = fill_template(csp, "untrusted", exports); + rsp->body = template_load(csp, "untrusted"); + template_fill(&rsp->body, exports); free_map(exports); return(finish_http_response(rsp));