Nuova versione con unificata la stampa degli errori e dei codici HTTP
authorSimone Piccardi <piccardi@gnulinux.it>
Thu, 17 Mar 2005 18:10:48 +0000 (18:10 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Thu, 17 Mar 2005 18:10:48 +0000 (18:10 +0000)
sources/wwwd.c

index f144eb0bcaff90face8eb8a429a2c5ccddc52f3d..cb7752680ec47e59237c3e54b8c6fde06895f2fe 100644 (file)
@@ -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."
+         "<P>The request line<P>%s<P> is invalid following the protocol<P>"}, 
+       { "404", "Not Found", 
+          "The requested URL %s was not found on this server.<P>"},
+       { "500", "Internal Server Error", 
+          "We got an error processing your request.<P>Error is: %s<P>"},
+       { "405", "Method Not Allowed", "Method %s not allowed.<P>"},
+       { "403", "Forbidden", "You cannot access %s.<P>"}
     };
     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, "<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>\n");
-    fprintf(file, "<BODY><H1>Not Found</H1>\nThe requested ");
-    fprintf(file, "URL %s was not found on this server.<P><HR>", filename);
-    fprintf(file, "<ADDRESS>WWWd by Simone Piccardi</ADDRESS></BODY></HTML>");
-    return;
-}
-
-void print_err400(FILE *file, char *string)
+void print_error(FILE *file, struct code_page page, char * string)
 {
-    fprintf(file, "<HTML><HEAD><TITLE>404 Bad Request</TITLE></HEAD>\n");
-    fprintf(file, "<BODY><H1>Bad Request</H1>\n ");
-    fprintf(file, "Your browser sent a request that this server could not ");
-    fprintf(file, "understand.<P>The request line<P> %s <P>", string);
-    fprintf(file, "is invalid following the protocol<p><HR>");
-    fprintf(file, "<ADDRESS>WWWd by Simone Piccardi </ADDRESS></BODY></HTML>");
+    fprintf(file, "<HTML><HEAD><TITLE>%s %s</TITLE></HEAD>\n",
+           page.code, page.name);
+    fprintf(file, "<BODY><H1>%s</H1>\n", page.name);
+    fprintf(file, page.body, string);
+    fprintf(file, "<HR><ADDRESS>WWWd by S. Piccardi</ADDRESS></BODY></HTML>");
     return;
 }
 
-
-void print_err500(FILE *file, char *string)
-{
-    fprintf(file, "<HTML><HEAD><TITLE>500 Internal Server Error</TITLE>\n");
-    fprintf(file, "</HEAD><BODY><H1>Internal Server Error</H1>\n ");
-    fprintf(file, "We got an error processing your request.<P>");
-    fprintf(file, "Error is: %s <P><HR>\n", string);
-    fprintf(file, "<ADDRESS>WWWd by Simone Piccardi </ADDRESS></BODY></HTML>");
-    return;
-}