From 3e015f91f0044c2594cdfcbd58f3d86971851b06 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 17 Mar 2005 18:10:48 +0000 Subject: [PATCH] Nuova versione con unificata la stampa degli errori e dei codici HTTP --- sources/wwwd.c | 121 ++++++++++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 68 deletions(-) diff --git a/sources/wwwd.c b/sources/wwwd.c index f144eb0..cb77526 100644 --- a/sources/wwwd.c +++ b/sources/wwwd.c @@ -53,13 +53,17 @@ int demonize = 1; /* daemon use option: default is daemon */ int debugging = 0; /* debug info printing option: default is no debug */ /* Subroutines declaration */ +struct code_page { + char * code; + char * name; + char * body; +}; + void usage(void); void ServPage(int sockfd); void PrintErr(char * error); -void print_headers(FILE *file); -void print_err404(FILE *file, char *filename); -void print_err400(FILE *file, char *string); -void print_err500(FILE *file, char *string); +void print_headers(FILE *file, struct code_page code); +void print_error(FILE *file, struct code_page page, char * string); /* Program beginning */ int main(int argc, char *argv[]) @@ -81,7 +85,7 @@ int main(int argc, char *argv[]) */ int i; opterr = 0; /* don't want writing to stderr */ - while ( (i = getopt(argc, argv, "hdicw:r:")) != -1) { + while ( (i = getopt(argc, argv, "hdicr:")) != -1) { switch (i) { /* * Handling options @@ -215,7 +219,7 @@ void usage(void) printf(" -d write debug info\n"); printf(" -i use interactively\n"); printf(" -c disable BSD semantics\n"); - printf(" -w N wait N sec. before calling accept\n"); + printf(" -r /path chroot on /path\n"); exit(1); } /* @@ -227,16 +231,21 @@ void ServPage(int sockfd) char outbuf[1024]; FILE *sock, *file; char *line, *copy, *method, *ptr, *filename, *version; - char *methods[] = { "GET", "PUT", NULL }; - char *codes[] = { - "200 OK", - "400 Bad Request", - "404 Not Found", - "500 Internal Server Error", - NULL + char *methods[] = { "GET", "HEAD", NULL }; + struct code_page codes[] = { + { "200", "OK", "%s"}, + { "400", "Bad Request", + "Your browser sent a request that this server could not understand." + "

The request line

%s

is invalid following the protocol

"}, + { "404", "Not Found", + "The requested URL %s was not found on this server.

"}, + { "500", "Internal Server Error", + "We got an error processing your request.

Error is: %s

"}, + { "405", "Method Not Allowed", "Method %s not allowed.

"}, + { "403", "Forbidden", "You cannot access %s.

"} }; int nleft; - int i, j; + int i; sock = fdopen(sockfd, "w+"); /* main loop, reading 0 char means client close connection */ @@ -248,21 +257,18 @@ void ServPage(int sockfd) /* parsing first line, getting method and filename */ copy = strndupa(line, MAXLINE); if ((method = strtok_r(copy, " ", &ptr)) == NULL) { - fprintf(sock, "HTTP/1.0 %s\n", codes[2]); - print_headers(sock); - print_err400(sock, line); + print_headers(sock, codes[1]); + print_error(sock, codes[1], line); return; } if ((filename = strtok_r(NULL, " ", &ptr)) == NULL) { - fprintf(sock, "HTTP/1.0 %s\n", codes[2]); - print_headers(sock); - print_err400(sock, line); + print_headers(sock, codes[1]); + print_error(sock, codes[1], line); return; } if ((version = strtok_r(NULL, " ", &ptr)) == NULL) { - fprintf(sock, "HTTP/1.0 %s\n", codes[2]); - print_headers(sock); - print_err400(sock, line); + print_headers(sock, codes[1]); + print_error(sock, codes[1], line); return; } i = 0; @@ -273,9 +279,8 @@ void ServPage(int sockfd) i++; } if (i>=2) { - fprintf(sock, "HTTP/1.0 %s\n", codes[2]); - print_headers(sock); - print_err400(sock, line); + print_headers(sock, codes[4]); + print_error(sock, codes[4], method); return; } @@ -284,31 +289,30 @@ void ServPage(int sockfd) } if ( (file = fopen(filename, "r")) == NULL) { - fprintf(sock, "HTTP/1.0 %s\n", codes[2]); - print_headers(sock); - print_err404(sock, filename); + if ( (errno == EACCES)||(errno == EPERM) ) { + print_headers(sock, codes[5]); + print_error(sock, codes[5], filename); + } else { + print_headers(sock, codes[2]); + print_error(sock, codes[2], filename); + } return; } - fprintf(sock, "HTTP/1.0 %s\n", codes[0]); - print_headers(sock); - - j = 0; + print_headers(sock, codes[0]); while (!feof(file)) { if ( (nleft = full_fread(file, outbuf, 1024)) != 0) { if (ferror(file)) { - fprintf(sock, "HTTP/1.0 %s\n", codes[3]); - print_headers(sock); - snprintf(buffer, MAXLINE, "reading %s", filename); - print_err500(sock, buffer); + strncpy(buffer, strerror(errno), MAXLINE); + print_headers(sock, codes[3]); + print_error(sock, codes[3], buffer); return; } } if (full_fwrite(sock, outbuf, 1024-nleft) != 0) { if (ferror(file)) { - fprintf(sock, "HTTP/1.0 %s\n", codes[3]); - print_headers(sock); - snprintf(buffer, MAXLINE, "writing"); - print_err500(sock, buffer); + strncpy(buffer, strerror(errno), MAXLINE); + print_headers(sock, codes[3]); + print_error(sock, codes[3], buffer); return; } } @@ -330,10 +334,11 @@ void PrintErr(char * error) return; } -void print_headers(FILE *file) +void print_headers(FILE *file, struct code_page code) { time_t tempo; + fprintf(file, "HTTP/1.0 %s %s \n", code.code, code.name); time(&tempo); fprintf(file, "Date: %s", ctime(&tempo)); fprintf(file, "Server: WWWd test server\n"); @@ -343,33 +348,13 @@ void print_headers(FILE *file) return; } -void print_err404(FILE *file, char *filename) -{ - fprintf(file, "404 Not Found\n"); - fprintf(file, "

Not Found

\nThe requested "); - fprintf(file, "URL %s was not found on this server.


", filename); - fprintf(file, "
WWWd by Simone Piccardi
"); - return; -} - -void print_err400(FILE *file, char *string) +void print_error(FILE *file, struct code_page page, char * string) { - fprintf(file, "404 Bad Request\n"); - fprintf(file, "

Bad Request

\n "); - fprintf(file, "Your browser sent a request that this server could not "); - fprintf(file, "understand.

The request line

%s

", string); - fprintf(file, "is invalid following the protocol


"); - fprintf(file, "
WWWd by Simone Piccardi
"); + fprintf(file, "%s %s\n", + page.code, page.name); + fprintf(file, "

%s

\n", page.name); + fprintf(file, page.body, string); + fprintf(file, "
WWWd by S. Piccardi
"); return; } - -void print_err500(FILE *file, char *string) -{ - fprintf(file, "500 Internal Server Error\n"); - fprintf(file, "

Internal Server Error

\n "); - fprintf(file, "We got an error processing your request.

"); - fprintf(file, "Error is: %s


\n", string); - fprintf(file, "
WWWd by Simone Piccardi
"); - return; -} -- 2.30.2