#include <malloc.h>
+#include <stdlib.h>
#include <string.h>
#include <time.h>
/* Content-Encoding */
if (encoding != NULL) {
- sprintf (tmp, "Content-Encoding: %sn", encoding);
+ sprintf (tmp, "Content-Encoding: %s", encoding);
add_line (buffer, tmp);
}
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) {
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"));
}
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;
// test: webserver.exe -p -1 2>&1 | grep -q 'incorrect port number'
// test: webserver.exe -s 2>&1 | grep -q 'missing server name'
// test: webserver.exe -r 2>&1 | grep -q 'missing directory name'
-// test: webserver.exe >& test.log & pid=$!; sleep 1; kill -INT $pid; grep -q 'Listening socket on port 8080' test.log
-// test: webserver.exe -p 8000 >& test.log & pid=$!; sleep 1; kill -INT $pid; grep -q 'Listening socket on port 8000' test.log
-// test: webserver.exe -c iso-8859-1 -r webroot -s localhost >&/dev/null & pid=$!; sleep 1; curl http://localhost:8080/index.html > test; kill -TERM $pid; grep -q '<title>Test</title>' test
-// test: webserver.exe -v 3 -p 8001 >&/dev/null & pid=$!; sleep 1; curl http://localhost:8001/index.html > test; kill -TERM $pid
-// test: webserver.exe -v 3 -p 8002 >&/dev/null & pid=$!; sleep 1; curl http://localhost:8002/not_found.html > test; kill -TERM $pid; grep -q '404' test
-// test: webserver.exe -v 3 -p 8003 >&/dev/null & pid=$!; sleep 1; curl -I http://localhost:8003/index.html > test; kill -TERM $pid
-
+// test: webserver.exe >& test.log & pid=$!; sleep 1; kill -ABRT $pid; sleep 1; grep -q 'Listening socket on port 8080' test.log
+// test: webserver.exe -p 8000 >& test.log & pid=$!; sleep 1; kill -TERM $pid; sleep 1; grep -q 'Listening socket on port 8000' test.log
+// test: webserver.exe -p 8001 -c iso-8859-1 -r webroot -s localhost >&/dev/null & pid=$!; sleep 1; curl http://localhost:8001/index.html > test.log; kill -TERM $pid; sleep 1; grep -q '<title>Test</title>' test.log
+// test: webserver.exe -v 3 -p 8002 >&/dev/null & pid=$!; sleep 1; curl -v http://localhost:8002/index.html >& test.log; kill -TERM $pid; sleep 1; grep -q 200 test.log
+// test: webserver.exe -v 3 -p 8003 >&/dev/null & pid=$!; sleep 1; curl -v http://localhost:8003/not_found.html >& test.log; kill -TERM $pid; sleep 1; grep -q 404 test.log
+// test: webserver.exe -v 3 -p 8004 >&/dev/null & pid=$!; sleep 1; curl -v -I http://localhost:8004/index.html >& test.log; kill -TERM $pid; sleep 1; grep -q Content-Length test.log; test $? -eq 1
+// test: webserver.exe -v 3 -p 8005 >&/dev/null & pid=$!; sleep 1; curl -v -d '' http://localhost:8005/index.html >& test.log; kill -TERM $pid; sleep 1; grep -q '<title>Test</title>' test.log
/* vim: set ts=4 sw=4 et: */