major fixes and better tests
[webserver.git] / http.c
diff --git a/http.c b/http.c
index f0e53afe908f511a7724546750fb5fbef265d5c7..fbd18ef87e67ba23e0ceabc2728e4d1c6d298e34 100644 (file)
--- a/http.c
+++ b/http.c
@@ -1,4 +1,5 @@
 #include <malloc.h>
+#include <stdlib.h>
 #include <string.h>
 #include <time.h>
 
@@ -221,7 +222,7 @@ int add_entity (char **buffer, char *entity, int size, char *type, char *encodin
 
         /* Content-Encoding */
         if (encoding != NULL) {
-            sprintf (tmp, "Content-Encoding: %sn", encoding);
+            sprintf (tmp, "Content-Encoding: %s", encoding);
             add_line (buffer, tmp);
         }
 
@@ -302,11 +303,12 @@ char *trim (char *str)
 
 int processing (char *data, int len, conf_t *conf, char **pdata)
 {
+    char *saved_data = data;
     char location[BUFFER_SIZE] = {0};
     VERBOSE (DEBUG, PRINT ("Start processing\n"));
 
     /* check method */
-    char *line = find_sequence (data, len, "\r\n", &data);
+    char *line = find_sequence (data, len + data - saved_data, "\r\n", &data);
     if (line == NULL) {
         VERBOSE (WARNING, PRINT ("Unknown received data\n"));
         if (pdata != NULL) {
@@ -333,13 +335,15 @@ int processing (char *data, int len, conf_t *conf, char **pdata)
     VERBOSE (INFO, PRINT ("%s %s (%s)\n", (type == get_e) ? "Get" : (type == head_e) ? "Head" : "Post", uri, version));
 
     /* analyse uri */
-    char *filename = (char *)calloc (strlen (conf->root) + strlen (uri) + 2, 1);
+    char *filename = strtok (uri, "&");
+    char *variables = strtok (NULL, "\n");
+    char *path = (char *) calloc (strlen (conf->root) + strlen (filename) + 2, 1);
     //sprintf (filename, "%s%s%s", conf->root, ((conf->root[strlen (conf->root) - 1] != '/') && (uri[0] != '/')) ? "/" : "", uri);
-    sprintf (filename, "%s/%s", conf->root, uri);
+    sprintf (path, "%s/%s", conf->root, filename);
 
     /* check header */
     header_t header = {0};
-    while (strcmp (line = find_sequence (data, len, "\r\n", &data), "") != 0) {
+    while (strcmp (line = find_sequence (data, len + data - saved_data, "\r\n", &data), "") != 0) {
         VERBOSE (DEBUG, PRINT ("Header line: '%s'\n", line));
         char *field = strtok (line, ":");
         char *value = trim (strtok (NULL, "\r"));
@@ -369,46 +373,51 @@ int processing (char *data, int len, conf_t *conf, char **pdata)
     }
     VERBOSE (DEBUG, print_header_values (&header));
 
+    /* body */
+    char *body = data;
+    len -= saved_data - data;
+    if (len != (header.content_length ? atoi (header.content_length) : 0)) {
+        VERBOSE (WARNING, PRINT ("Incoherent size (%d <> %s)\n", len, header.content_length));
+    }
+
     /* response */
     char *buffer = NULL;
     FILE *fid = NULL;
     switch (type) {
     case get_e:
-        VERBOSE (DEBUG, PRINT ("Read file %s\n", filename));
-        len = readfile (&buffer, filename);
+    case post_e: /* fall through */
+        VERBOSE (DEBUG, PRINT ("Read file %s\n", path));
+        len = readfile (&buffer, path);
         if (len < 0) {
             sprintf (location, "http://%s/", conf->servername);
             len = error_404 (pdata, location);
         } else {
-            sprintf (location, "http://%s%s", conf->servername, filename);
+            sprintf (location, "http://%s%s", conf->servername, path);
             len = generic_response (pdata, location, buffer, len);
             free (buffer);
         }
         break;
     case head_e:
-        VERBOSE (DEBUG, PRINT ("Read file %s\n", filename));
-        fid = fopen (filename, "rb");
+        VERBOSE (DEBUG, PRINT ("Test file %s\n", path));
+        fid = fopen (path, "rb");
         if (fid == NULL) {
             sprintf (location, "http://%s/", conf->servername);
             len = error_404 (pdata, location);
         } else {
             fclose (fid);
-            sprintf (location, "http://%s%s", conf->servername, filename);
+            sprintf (location, "http://%s%s", conf->servername, path);
             len = generic_response (pdata, location, NULL, 0);
         }
         break;
-    case post_e:
-        VERBOSE (DEBUG, PRINT ("Write file %s\n", filename));
-        break;
     case not_supported_e:
         break;
     }
 
     /* cleaning */
     VERBOSE (DEBUG, PRINT ("Cleaning\n"));
-    if (filename) {
-        VERBOSE (DEBUG, PRINT ("Cleaning filename\n"));
-        free (filename);
+    if (path) {
+        VERBOSE (DEBUG, PRINT ("Cleaning path\n"));
+        free (path);
     }
 
     return len;