diff --git a/form_response.c b/form_response.c index 945a1f749e6a05bed9b14a9eec3405b8d2f4367e..b77caaf4b5fad58874e3074f1b7668b129e6776b 100644 --- a/form_response.c +++ b/form_response.c @@ -54,7 +54,6 @@ int sendresponse(int sockfd, struct GET_header* header){ fp = fopen(header->filepath, "r"); struct RESP_header resphead; char buffer[BUFFERSIZE]; - printf("%zu\n", sizeof(buffer)); memset(buffer, 0, BUFFERSIZE); if (fp == NULL) { @@ -78,8 +77,21 @@ int sendresponse(int sockfd, struct GET_header* header){ return send(sockfd, buffer, BUFFERSIZE, 0); } formresponse(buffer, &resphead); - fclose(fp); - return send(sockfd, buffer, BUFFERSIZE, 0); + if(send(sockfd, buffer, BUFFERSIZE, 0)<0){ + return -1; + } + while(!feof(fp)){ + memset(buffer, 0, BUFFERSIZE); + int n_bytes = fread(buffer, 1, BUFFERSIZE, fp); + if(n_bytes <=0){ + break; + } + if(send(sockfd, buffer,n_bytes,0)<0){ + return -1; + } + + } + return 0; } fclose(fp); diff --git a/server b/server index 1c46ef1dce07553ecf74015d404308972ce0da59..b3ce87548f745b9c48c1b643b9813367ae78a383 100755 Binary files a/server and b/server differ diff --git a/server.c b/server.c index 30ef036f388d086be28d4909de74c76c3017d122..ede5a95754fee01df857abe93019767805ee5db9 100644 --- a/server.c +++ b/server.c @@ -16,7 +16,6 @@ int main(int argc, char *argv[]){ fprintf(stderr,"ERROR, no port provided\n");//to check if there is no port provided at start exit(1); } - printf("%s\n", argv[2]); strcpy(root, argv[2]); memset(&info, 0, sizeof(info)); info.ai_family = AF_UNSPEC; ///sets it to unspecified @@ -93,9 +92,10 @@ void* handleclient(void * newsockfd){ char buffer[BUFFERSIZE]; bzero(buffer, BUFFERSIZE); - if ((numbytes = recv(sockfd, buffer, 255, 0)) <0) + if ((numbytes = recv(sockfd, buffer, BUFFERSIZE, 0)) <0) { perror("ERROR recieving"); + close(sockfd); return NULL; } struct GET_header header; @@ -105,6 +105,7 @@ void* handleclient(void * newsockfd){ if (sendresponse(sockfd, &header) <0) { perror("ERROR sending"); + close(sockfd); return NULL; } diff --git a/test/directory/index.html b/test/directory/index.html new file mode 100644 index 0000000000000000000000000000000000000000..e499c4e287063a978eec3bda814c8438d6c8b206 --- /dev/null +++ b/test/directory/index.html @@ -0,0 +1,5 @@ +<html> + <body> + <p>hello</p> + </body> +</html> \ No newline at end of file diff --git a/test/directory/sample.jpg b/test/directory/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14ce979b6625ed3b809778ab969b7b0f30690cb6 Binary files /dev/null and b/test/directory/sample.jpg differ diff --git a/test/directory/script.js b/test/directory/script.js new file mode 100644 index 0000000000000000000000000000000000000000..57efed4f2cf86aa6a381108cfe89dbfb29d3319d --- /dev/null +++ b/test/directory/script.js @@ -0,0 +1,3 @@ +function test(){ + alert("hello world!"); +} diff --git a/test/directory/style.css b/test/directory/style.css new file mode 100644 index 0000000000000000000000000000000000000000..4a57d6b234e565d041ce39ab806721bf18315547 --- /dev/null +++ b/test/directory/style.css @@ -0,0 +1,3 @@ +body { + background-color: lightblue; +} \ No newline at end of file diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000000000000000000000000000000000000..e499c4e287063a978eec3bda814c8438d6c8b206 --- /dev/null +++ b/test/index.html @@ -0,0 +1,5 @@ +<html> + <body> + <p>hello</p> + </body> +</html> \ No newline at end of file diff --git a/test/sample.jpg b/test/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14ce979b6625ed3b809778ab969b7b0f30690cb6 Binary files /dev/null and b/test/sample.jpg differ diff --git a/test/script.js b/test/script.js new file mode 100644 index 0000000000000000000000000000000000000000..57efed4f2cf86aa6a381108cfe89dbfb29d3319d --- /dev/null +++ b/test/script.js @@ -0,0 +1,3 @@ +function test(){ + alert("hello world!"); +} diff --git a/test/style.css b/test/style.css new file mode 100644 index 0000000000000000000000000000000000000000..4a57d6b234e565d041ce39ab806721bf18315547 --- /dev/null +++ b/test/style.css @@ -0,0 +1,3 @@ +body { + background-color: lightblue; +} \ No newline at end of file diff --git a/test_log.txt b/test_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..cd676f45bd268ee327d49e2d984c5b3625ef2fa2 --- /dev/null +++ b/test_log.txt @@ -0,0 +1,8 @@ +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer +ERROR sending: Connection reset by peer diff --git a/test_script.sh b/test_script.sh new file mode 100755 index 0000000000000000000000000000000000000000..17f50818b4965526acdc41994b891ff9df3f38ac --- /dev/null +++ b/test_script.sh @@ -0,0 +1,96 @@ +#!/bin/bash +if [ "$#" -ne 2 ]; then + echo "Usage: $0 server_name port" >&2 + exit 1 +fi +./$1 $2 ./test &>test_log.txt & +echo "Starting server, saving log: $temp_log_file" + +sleep 1s +server_pid=$! +if ps -p $server_pid > /dev/null +then + echo "Server started with PID: $server_pid" +else + echo "Error starting server, check test_log.txt" + exit 1 +fi +base_url="http://127.0.0.1:$2/" +sub_url="${base_url}directory/" + +web_root="./test/" +sub_root=${web_root}"directory/" +index_file="index.html" +css_file="style.css" +javascript_file="script.js" +jpeg_file="sample.jpg" +mime_html="Content-Type: text/html$" +mime_jpeg="Content-Type: image/jpeg$" +mime_css="Content-Type: text/css$" +mime_javascript="Content-Type: text/javascript$|Content-Type: application/javascript$" + +do_http_get () { + test_num=$1 + test_desc=$2 + test_url=$3 + test_file=$4 + test_resp=$5 + test_mime=$6 + + temp_file="$(mktemp /tmp/myscript.XXXXXX)" + + temp_header="$(mktemp /tmp/myscript.XXXXXX)" + + header_pass=false + get_pass=false + mime_pass=false + wget -q --server-response -O $temp_file $test_url 2> $temp_header + if [ "$test_resp" == "404" ];then + if grep -Eiq 'HTTP/1.0 404|HTTP/1.1 404' $temp_header + then + header_pass=true + fi + get_pass=true + mime_pass=true + else + if grep -Eiq 'HTTP/1.0 200 OK$|HTTP/1.1 200 OK$' $temp_header + then + header_pass=true + fi + if grep -Eiq "$test_mime" $temp_header + then + mime_pass=true + fi + diff $test_file $temp_file &>/dev/null + diff_res=$? + if [ $diff_res -eq 0 ]; + then + get_pass=true + else + get_pass=false + diff $test_file $temp_file + fi + fi + rm -f "$temp_file" + rm -f "$temp_header" + + if $header_pass && $get_pass && $mime_pass; + then + echo "Test $test_num: $test_desc: PASS" + else + echo "Test $test_num: $test_desc: FAIL: header:$header_pass, get:$get_pass, mime:$mime_pass" + fi +} + +do_http_get 1 "GET HTML file in root" $base_url$index_file $web_root$index_file "200" "$mime_html" +do_http_get 2 "GET Non-existent HTML file in root" $base_url"junk.html" $web_root$index_file "404" +do_http_get 3 "GET CSS file in root" $base_url$css_file $web_root$css_file "200" "$mime_css" +do_http_get 4 "GET JavaScript file in root" $base_url$javascript_file $web_root$javascript_file "200" "$mime_javascript" +do_http_get 5 "GET JPEG file in root" $base_url$jpeg_file $web_root$jpeg_file "200" "$mime_jpeg" +do_http_get 6 "GET HTML file in directory" "$sub_url$index_file" "$sub_root$index_file" "200" "$mime_html" +do_http_get 7 "GET CSS file in directory" "$sub_url$css_file" "$sub_root$css_file" "200" "$mime_css" +do_http_get 8 "GET JavaScript file in directory" "$sub_url$javascript_file" "$sub_root$javascript_file" "200" "$mime_javascript" +do_http_get 9 "GET JPEG file in directory" "$sub_url$jpeg_file" "$sub_root$jpeg_file" "200" "$mime_jpeg" + + +kill $server_pid