Adesso fa un po' meno schifo
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 6 Mar 2005 18:19:27 +0000 (18:19 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 6 Mar 2005 18:19:27 +0000 (18:19 +0000)
sources/wwwd.c

index 3379486e08a431d0e8febd3f003632e369120537..5d22a875b5ddaada1024fb6cb25b900ef5172972 100644 (file)
@@ -57,6 +57,9 @@ 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);
 
 /* Program beginning */
 int main(int argc, char *argv[])
@@ -215,7 +218,9 @@ void ServPage(int sockfd)
     char *methods[] = { "GET", "PUT", NULL };
     char *codes[] = {
        "200 OK",
+       "400 Bad Request",
        "404 Not Found",
+       "500 Internal Server Error",
        NULL
     };
     int nleft;
@@ -224,25 +229,30 @@ void ServPage(int sockfd)
     sock = fdopen(sockfd, "w+");
     /* main loop, reading 0 char means client close connection */
     line = fgets(buffer, MAXLINE, sock);
-    copy = strndupa(line, MAXLINE);
-
     if (line == NULL) {
        PrintErr("Errore in lettura");
        return;
     }
+    /* parsing first line, getting method and filename */
+    copy = strndupa(line, MAXLINE);
     if ((method = strtok_r(copy, " ", &ptr)) == NULL) {
-       PrintErr("Non ho trovato il metodo");
+       fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
+       print_headers(sock);
+       print_err400(sock, line);
        return;
     }
     if ((filename = strtok_r(NULL, " ", &ptr)) == NULL) {
-       PrintErr("Non ho trovato il file");
+       fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
+       print_headers(sock);
+       print_err400(sock, line);
        return;
     }
     if ((version = strtok_r(NULL, " ", &ptr)) == NULL) {
-       PrintErr("Non ho trovato la versione");
+       fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
+       print_headers(sock);
+       print_err400(sock, line);
        return;
     }
-    printf("metodo %s -- file %s -- versione %s\n", method, filename, version);
     i = 0;
     while ( (ptr = methods[i]) != NULL) {
        if ( (strncmp(ptr, method, strlen(ptr)) == 0)) {
@@ -251,24 +261,23 @@ void ServPage(int sockfd)
        i++;
     }
     if (i>=2) {
-       printf("No method %s found\n", method);
+       fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
+       print_headers(sock);
+       print_err400(sock, line);
        return;
     }
 
     while (strcmp(line,"\r\n")) {
-       line =  fgets(buffer, MAXLINE, sock);
-       printf("letto: %s\n", line);
+       line = fgets(buffer, MAXLINE, sock);
     }
 
     if ( (file = fopen(filename, "r")) == NULL) {
-       printf("file %s", filename);
-       perror("Error opening");
-       fprintf(sock, "HTTP/1.0 %s\n", codes[1]);
+       fprintf(sock, "HTTP/1.0 %s\n", codes[2]);
        print_headers(sock);
+       print_err404(sock, filename);
        return;
     }
     fprintf(sock, "HTTP/1.0 %s\n", codes[0]);
-    //PrintHeader(sock);
     print_headers(sock);
 
     j = 0;
@@ -276,14 +285,20 @@ void ServPage(int sockfd)
        printf("Loop %d\n", j++);
        if ( (nleft = full_fread(file, outbuf, 1024)) != 0) {
            if (ferror(file)) {
-               printf("Errore in lettura");
+               fprintf(sock, "HTTP/1.0 %s\n", codes[3]);
+               print_headers(sock);
+               snprintf(buffer, MAXLINE, "reading %s", filename);
+               print_err500(sock, buffer);
                return;
            }
        }
        printf("Loop %d rimasti %d\n", j, nleft);
        if (full_fwrite(sock, outbuf, 1024-nleft) != 0) {
            if (ferror(file)) {
-               printf("Errore in scrittura");
+               fprintf(sock, "HTTP/1.0 %s\n", codes[3]);
+               print_headers(sock);
+               snprintf(buffer, MAXLINE, "writing");
+               print_err500(sock, buffer);
                return;
            }   
        }
@@ -317,10 +332,36 @@ void print_headers(FILE *file)
     fprintf(file, "Connection: close\n");
     fprintf(file, "Content-Type: text/html; charset=iso-8859-1\n");
     fprintf(file, "\n");
-    printf("Date: %s", ctime(&tempo));
-    printf("Server: WWWd test server\n");
-    printf("Connection: close\n");
-    printf("Content-Type: text/html; charset=iso-8859-1\n");
-    printf("\n");
+    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)
+{
+    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>");
+    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;
 }