summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/conns.c16
-rw-r--r--src/conns.h12
-rw-r--r--src/htmlerror.c99
-rw-r--r--src/tinyproxy.h19
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.