diff options
Diffstat (limited to '')
-rw-r--r-- | src/conns.c | 16 | ||||
-rw-r--r-- | src/conns.h | 12 | ||||
-rw-r--r-- | src/htmlerror.c | 99 | ||||
-rw-r--r-- | src/tinyproxy.h | 19 |
4 files changed, 64 insertions, 82 deletions
diff --git a/src/conns.c b/src/conns.c index f25e4f4..6a320ac 100644 --- a/src/conns.c +++ b/src/conns.c @@ -1,4 +1,4 @@ -/* $Id: conns.c,v 1.18 2003-07-31 23:38:28 rjkaes Exp $ +/* $Id: conns.c,v 1.19 2003-08-01 00:14:34 rjkaes Exp $ * * Create and free the connection structure. One day there could be * other connection related tasks put here, but for now the header @@ -60,7 +60,6 @@ initialize_conn(int client_fd, const char* ipaddr, const char* string_addr) /* These store any error strings */ connptr->error_variables = NULL; - connptr->error_variable_count = 0; connptr->error_string = NULL; connptr->error_number = -1; @@ -113,17 +112,8 @@ destroy_conn(struct conn_s *connptr) if (connptr->request_line) safefree(connptr->request_line); - if (connptr->error_variables) { - int i; - - for (i = 0; i != connptr->error_variable_count; ++i) { - safefree(connptr->error_variables[i]->error_key); - safefree(connptr->error_variables[i]->error_val); - safefree(connptr->error_variables[i]); - } - - safefree(connptr->error_variables); - } + if (connptr->error_variables) + hashmap_delete(connptr->error_variables); if (connptr->error_string) safefree(connptr->error_string); diff --git a/src/conns.h b/src/conns.h index a2c9017..c5ad9a7 100644 --- a/src/conns.h +++ b/src/conns.h @@ -1,4 +1,4 @@ -/* $Id: conns.h,v 1.14 2003-05-04 04:35:10 rjkaes Exp $ +/* $Id: conns.h,v 1.15 2003-08-01 00:14:34 rjkaes Exp $ * * See 'conns.c' for a detailed description. * @@ -19,6 +19,7 @@ #define TINYPROXY_CONNS_H #include "tinyproxy.h" +#include "hashmap.h" /* * Connection Definition @@ -37,16 +38,11 @@ struct conn_s { unsigned int connect_method; unsigned int show_stats; - /* - * Store the error response if there is one. + /* * This structure stores key -> value mappings for substitution * in the error HTML files. */ - struct error_variable_s { - char *error_key; - char *error_val; - } **error_variables; - int error_variable_count; + hashmap_t error_variables; int error_number; char *error_string; diff --git a/src/htmlerror.c b/src/htmlerror.c index c8d67a5..d02eae8 100644 --- a/src/htmlerror.c +++ b/src/htmlerror.c @@ -1,4 +1,4 @@ -/* $Id: htmlerror.c,v 1.6 2003-07-14 17:42:43 rjkaes Exp $ +/* $Id: htmlerror.c,v 1.7 2003-08-01 00:14:34 rjkaes Exp $ * * This file contains source code for the handling and display of * HTML error pages with variable substitution. @@ -29,31 +29,23 @@ /* * Add an error number -> filename mapping to the errorpages list. */ +#define ERRORNUM_BUFSIZE 8 /* this is more than required */ +#define ERRPAGES_BUCKETCOUNT 16 + int add_new_errorpage(char *filepath, unsigned int errornum) { - static int errorpage_count = 1; + char errornbuf[ERRORNUM_BUFSIZE]; - /* First, add space for another pointer to the errorpages array. */ - config.errorpages = saferealloc(config.errorpages, sizeof(struct error_pages_s *) * (errorpage_count + 1)); - if(!config.errorpages) + config.errorpages = hashmap_create(ERRPAGES_BUCKETCOUNT); + if (!config.errorpages) return(-1); - /* Allocate space for an actual structure */ - config.errorpages[errorpage_count - 1] = safemalloc(sizeof(struct error_pages_s)); - if(!config.errorpages[errorpage_count - 1]) - return(-1); + snprintf(errornbuf, ERRORNUM_BUFSIZE, "%u", errornum); - /* Set values for errorpage structure. */ - config.errorpages[errorpage_count - 1]->errorpage_path = safestrdup(filepath); - if(!config.errorpages[errorpage_count - 1]->errorpage_path) + if (hashmap_insert(config.errorpages, errornbuf, + filepath, strlen(filepath) + 1) < 0) return(-1); - config.errorpages[errorpage_count - 1]->errorpage_errnum = errornum; - - /* Set NULL to denote end of array */ - config.errorpages[errorpage_count] = NULL; - - errorpage_count++; return(0); } @@ -61,17 +53,28 @@ add_new_errorpage(char *filepath, unsigned int errornum) { * Get the file appropriate for a given error. */ static char* -get_html_file(int errornum) { - int i; +get_html_file(unsigned int errornum) { + hashmap_iter result_iter; + char errornbuf[ERRORNUM_BUFSIZE]; + char *key; + static char *val; + + assert(errornum >= 100 && errornum < 1000); if (!config.errorpages) return(config.errorpage_undef); - for (i = 0; config.errorpages[i]; i++) { - if (config.errorpages[i]->errorpage_errnum == errornum) - return config.errorpages[i]->errorpage_path; - } + snprintf(errornbuf, ERRORNUM_BUFSIZE, "%u", errornum); + + result_iter = hashmap_find(config.errorpages, errornbuf); + + if (hashmap_is_end(config.errorpages, result_iter)) + return(config.errorpage_undef); - return(config.errorpage_undef); + if (hashmap_return_entry(config.errorpages, result_iter, + &key, (void **)&val) < 0) + return(config.errorpage_undef); + + return(val); } /* @@ -79,14 +82,20 @@ get_html_file(int errornum) { */ static char* lookup_variable(struct conn_s *connptr, char *varname) { - int i; + hashmap_iter result_iter; + char *key; + static char *data; - for (i = 0; i != connptr->error_variable_count; i++) { - if (!strcasecmp(connptr->error_variables[i]->error_key, varname)) - return connptr->error_variables[i]->error_val; - } + result_iter = hashmap_find(connptr->error_variables, varname); - return(NULL); + if (hashmap_is_end(connptr->error_variables, result_iter)) + return(NULL); + + if (hashmap_return_entry(connptr->error_variables, result_iter, + &key, (void **)&data) < 0) + return(NULL); + + return(data); } #define HTML_BUFSIZE 4096 @@ -195,31 +204,19 @@ send_http_error_message(struct conn_s *connptr) /* * Add a key -> value mapping for HTML file substitution. */ + +#define ERRVAR_BUCKETCOUNT 16 + int add_error_variable(struct conn_s *connptr, char *key, char *val) { - connptr->error_variable_count++; - - /* Add space for a new pointer to the error_variables structure. */ - if (!connptr->error_variables) - connptr->error_variables = safemalloc(sizeof(struct error_variables_s *) * connptr->error_variable_count); - else - connptr->error_variables = saferealloc(connptr->error_variables, sizeof(struct error_variable_s *) * connptr->error_variable_count); - if(!connptr->error_variables) - return(-1); - - /* Allocate a new variable mapping structure. */ - connptr->error_variables[connptr->error_variable_count - 1] = safemalloc(sizeof(struct error_variable_s)); - if(!connptr->error_variables[connptr->error_variable_count - 1]) - return(-1); + if (!(connptr->error_variables = hashmap_create(ERRVAR_BUCKETCOUNT))) + return(-1); - /* Set values for variable mapping. */ - connptr->error_variables[connptr->error_variable_count - 1]->error_key = safestrdup(key); - connptr->error_variables[connptr->error_variable_count - 1]->error_val = safestrdup(val); - if((!connptr->error_variables[connptr->error_variable_count - 1]->error_key) - || (!connptr->error_variables[connptr->error_variable_count - 1]->error_val)) - return(-1); + if (hashmap_insert(connptr->error_variables, key, val, + strlen(val) + 1) < 0) + return(-1); return(0); } diff --git a/src/tinyproxy.h b/src/tinyproxy.h index d014748..0c4e461 100644 --- a/src/tinyproxy.h +++ b/src/tinyproxy.h @@ -1,4 +1,4 @@ -/* $Id: tinyproxy.h,v 1.41 2003-06-20 17:02:12 rjkaes Exp $ +/* $Id: tinyproxy.h,v 1.42 2003-08-01 00:14:34 rjkaes Exp $ * * See 'tinyproxy.c' for a detailed description. * @@ -20,6 +20,7 @@ #define TINYPROXY_TINYPROXY_H #include "common.h" +#include "hashmap.h" /* Global variables for the main controls of the program */ #define MAXBUFFSIZE ((size_t)(1024 * 96)) /* Max size of buffer */ @@ -35,6 +36,9 @@ struct upstream { }; #endif +/* + * Hold all the configuration time information. + */ struct config_s { char *logf_name; char *config_file; @@ -66,16 +70,11 @@ struct config_s { */ char* via_proxy_name; - /* - * Error page support. This is an array of pointers to structures - * which describe the error page path, and what HTTP error it handles. - * an example would be { "/usr/local/etc/tinyproxy/404.html", 404 } - * Ending of array is noted with NULL, 0. + /* + * Error page support. Map error numbers to file paths. */ - struct error_pages_s { - char *errorpage_path; - unsigned int errorpage_errnum; - } **errorpages; + hashmap_t errorpages; + /* * Error page to be displayed if appropriate page cannot be located * in the errorpages structure. |