quick commit
[webserver.git] / http.c
diff --git a/http.c b/http.c
index 20301d6c8e3646540a641a8df7a4a4bcbea64c15..13223210cba9497a1a5cbd67caf66c58feca1889 100644 (file)
--- a/http.c
+++ b/http.c
@@ -3,6 +3,7 @@
 #include <time.h>
 
 #include "debug.h"
+#include "file.h"
 
 #include "http.h"
 
@@ -202,6 +203,18 @@ int error_400 (char **buffer)
     return add_entity (buffer, (unsigned char *)response, strlen (response), "text/html", "iso-8859-1");
 }
 
+/* error 404 */
+
+int error_404 (char **buffer, char *uri)
+{
+    add_status_line (buffer, c404);
+    add_general_header (buffer);
+    add_response_header (buffer, uri);
+
+    char *response = "<html><head><title>Error 404</title></head><body><p>File not found</p></body></html>";
+    return add_entity (buffer, (unsigned char *)response, strlen (response), "text/html", "iso-8859-1");
+}
+
 /* response html */
 
 int response_html (char **buffer, char *location, char *response)
@@ -227,7 +240,7 @@ char *trim (char *str)
 
 /* main HTTP processing */
 
-int processing (char *data, int len, char **pdata)
+int processing (char *data, int len, char *root, char **pdata)
 {
     char *saved_data = data;
     VERBOSE (DEBUG, PRINT ("Start processing\n"));
@@ -260,6 +273,11 @@ int processing (char *data, int len, char **pdata)
     }
     VERBOSE (INFO, PRINT ("%s %s (%s)\n", (type == get_e) ? "Get" : (type == head_e) ? "Head" : "Post", uri, version));
 
+    /* analyse uri */
+    char *filename = calloc (strlen (root) + strlen (uri) + 2, 1);
+    //sprintf (filename, "%s%s%s", root, ((root[strlen (root) - 1] != '/') && (uri[0] != '/')) ? "/" : "", uri);
+    sprintf (filename, "%s/%s", root, uri);
+
     /* check header */
     header_t header = {0};
     while (strcmp (line = find_sequence (data, len, "\r\n", &data), "") != 0) {
@@ -315,13 +333,17 @@ int processing (char *data, int len, char **pdata)
         VERBOSE (DEBUG, PRINT ("Processing data: %s\n", data));
     }
 
-    /* cleaning */
-    free (saved_data);
-
     /* response */
+    char *buffer = NULL;
     switch (type) {
     case get_e:
-        len = response_html (pdata, "http://localhost/", "<html><head><title>Test</title></head><body><p>This a test</p></body></html>");
+        len = readfile ((unsigned char **)&buffer, filename);
+        if (len == 0) {
+            len = error_404 (pdata, "http://localhost/");
+        } else {
+            len = response_html (pdata, "http://localhost/", buffer);
+            free (buffer);
+        }
         break;
     case head_e:
         break;
@@ -331,6 +353,10 @@ int processing (char *data, int len, char **pdata)
         break;
     }
 
+    /* cleaning */
+    free (saved_data);
+    free (filename);
+
     return len;
 }