From 3b5e17d57913d3f196b7e05efe27508d10603476 Mon Sep 17 00:00:00 2001 From: Robert James Kaes Date: Mon, 27 Aug 2001 03:45:34 +0000 Subject: Split the headers from the message body. Also now include proper headers like Date, Server, Content-Length, etc. Also, fixed the type for an error message to be const char*. --- src/utils.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++------- src/utils.h | 4 ++-- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/utils.c b/src/utils.c index 50110ab..15ef2f7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.4 2001-05-27 02:38:46 rjkaes Exp $ +/* $Id: utils.c,v 1.5 2001-08-27 03:45:34 rjkaes Exp $ * * Misc. routines which are used by the various functions to handle strings * and memory allocation and pretty much anything else we can think of. Also, @@ -61,25 +61,66 @@ char *xstrstr(char *haystack, char *needle, size_t length, /* * Display an error to the client. */ -int httperr(struct conn_s *connptr, int err, char *msg) +#define HEADER_SIZE (1024 * 8) +int httperr(struct conn_s *connptr, int err, const char *msg) { - static char *premsg = "HTTP/1.0 %d %s\r\n" \ - "Content-type: text/html\r\n\r\n" \ + static char *headers = \ + "HTTP/1.0 %d %s\r\n" \ + "Server: %s/%s\r\n" \ + "Date: %s\r\n" \ + "Content-Type: text/mime\r\n" \ + "Content-Length: %d\r\n" \ + "Connection: close\r\n" \ + "\r\n"; + + static char *message = \ "%s\r\n" \ "\r\n" \ "Cache Error!
\r\n" \ "An error of type %d occurred: %s\r\n" \ "
\r\n" \ - "Generated by %s\r\n" \ + "Generated by %s/%s\r\n" \ "\r\n"; - connptr->output_message = malloc(MAXBUFFSIZE); + char *header_buffer; + char *message_buffer; + int output_size; + char timebuf[30]; + time_t global_time; + + header_buffer = malloc(HEADER_SIZE); + if (!header_buffer) { + log_message(LOG_CRIT, "Out of memory!"); + return -1; + } + + message_buffer = malloc(MAXBUFFSIZE); + if (!message_buffer) { + log_message(LOG_CRIT, "Out of memory!"); + safefree(header_buffer); + return -1; + } + + global_time = time(NULL); + strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&global_time)); + + snprintf(message_buffer, MAXBUFFSIZE - 1, message, msg, err, msg, PACKAGE, VERSION); + snprintf(header_buffer, HEADER_SIZE - 1, headers, err, msg, PACKAGE, VERSION, timebuf, strlen(message_buffer)); + + output_size = strlen(message_buffer) + strlen(header_buffer); + connptr->output_message = malloc(output_size + 1); if (!connptr->output_message) { log_message(LOG_CRIT, "Out of memory!"); + safefree(header_buffer); + safefree(message_buffer); return -1; } - snprintf(connptr->output_message, MAXBUFFSIZE, premsg, err, msg, msg, err, msg, VERSION); + strlcpy(connptr->output_message, header_buffer, output_size); + strlcat(connptr->output_message, message_buffer, output_size); + + safefree(header_buffer); + safefree(message_buffer); return 0; } diff --git a/src/utils.h b/src/utils.h index cd53fae..da4dd2f 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1,4 +1,4 @@ -/* $Id: utils.h,v 1.4 2001-05-27 02:38:46 rjkaes Exp $ +/* $Id: utils.h,v 1.5 2001-08-27 03:45:34 rjkaes Exp $ * * See 'utils.h' for a detailed description. * @@ -24,7 +24,7 @@ extern char *xstrstr(char *haystack, char *needle, size_t length, bool_t case_sensitive); -extern int httperr(struct conn_s *connptr, int err, char *msg); +extern int httperr(struct conn_s *connptr, int err, const char *msg); extern void makedaemon(void); extern void pidfile_create(const char *path); -- cgit v1.2.3