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[])
char *methods[] = { "GET", "PUT", NULL };
char *codes[] = {
"200 OK",
+ "400 Bad Request",
"404 Not Found",
+ "500 Internal Server Error",
NULL
};
int nleft;
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)) {
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;
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;
}
}
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;
}