From dcf287516033f2009e5813580fc89f26d7d8ed58 Mon Sep 17 00:00:00 2001
From: Abhisha Nirmalathas <a.nirmalathas1@student.unimelb.edu.au>
Date: Sat, 13 Apr 2019 17:26:39 +1000
Subject: [PATCH] adding a user who holds keywords

---
 Makefile        |   4 +-
 hashtable.o     | Bin 0 -> 12232 bytes
 http-parser.c   |   3 +-
 http-parser.o   | Bin 0 -> 7240 bytes
 http-response.c |  31 ++++++++++-
 http-response.h |   4 +-
 http-response.o | Bin 0 -> 6928 bytes
 http-server     | Bin 0 -> 14496 bytes
 http-server.c   | 145 ++++++++++++++++++++++++++++++------------------
 http-server.o   | Bin 0 -> 22176 bytes
 image_tagger    | Bin 0 -> 37096 bytes
 server          | Bin 0 -> 14480 bytes
 user.c          |  50 +++++++++++++++++
 user.h          |  30 ++++++++++
 user.o          | Bin 0 -> 7032 bytes
 15 files changed, 207 insertions(+), 60 deletions(-)
 create mode 100644 hashtable.o
 create mode 100644 http-parser.o
 create mode 100644 http-response.o
 create mode 100644 http-server
 create mode 100644 http-server.o
 create mode 100644 image_tagger
 create mode 100644 server
 create mode 100644 user.c
 create mode 100644 user.h
 create mode 100644 user.o

diff --git a/Makefile b/Makefile
index 55a5580..9dba7ae 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ CC     = gcc
 CFLAGS = -Wall -std=c99 -g
 # modify the flags here ^
 EXE    = image_tagger
-OBJ    = hashtable.o http-parser.o http-response.o http-server.o
+OBJ    = hashtable.o user.o http-parser.o http-response.o http-server.o
 # add any new object files here ^
 # top (default) target
 all: $(EXE)
@@ -14,7 +14,7 @@ $(EXE): $(OBJ)
 # other dependencies
 http-parser.o: http-parser.h hashtable.h
 http-response.o: http-response.h http-parser.h hashtable.h
-http-server.o: http-parser.h
+http-server.o: http-parser.h user.h
 
 # ^ add any new dependencies here (for example if you add new modules)
 
diff --git a/hashtable.o b/hashtable.o
new file mode 100644
index 0000000000000000000000000000000000000000..3d009356e879e27341f185114559a9f4dd7c78e1
GIT binary patch
literal 12232
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
Al>h($

literal 0
HcmV?d00001

diff --git a/http-parser.c b/http-parser.c
index 92ac25c..ddbe631 100644
--- a/http-parser.c
+++ b/http-parser.c
@@ -33,7 +33,7 @@ Request* parse_request(char* request_message){
     char header_field_name[MAX_HEADER_SIZE];
     char header_value[MAX_HEADER_SIZE];
     while(*request_message != '\r' && *request_message != '\n'){
-        printf("req message first char %d\n", *request_message);
+       printf("req message first char %d\n", *request_message);
        strcpy(header_field_name,strtok(request_message, " "));
        printf("header field name: %s\n", header_field_name);
        request_message += strcspn(request_message, " ")+1;
@@ -42,6 +42,7 @@ Request* parse_request(char* request_message){
        request_message += strcspn(request_message, "\r\n")+2;
        hash_table_put(req->header, header_field_name, header_value);
     }
+    request_message += strcspn(request_message, "\r\n")+2;
     if(*request_message != '\r'||*request_message != '\n'){
         req->body = request_message;
     }
diff --git a/http-parser.o b/http-parser.o
new file mode 100644
index 0000000000000000000000000000000000000000..988eedd96577d49a833768472065914ea30d7f3d
GIT binary patch
literal 7240
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

literal 0
HcmV?d00001

diff --git a/http-response.c b/http-response.c
index feaf292..e7d1846 100644
--- a/http-response.c
+++ b/http-response.c
@@ -11,10 +11,37 @@
 #define MAX_HEADER_SIZE 300
 #define MAX_VERSION_SIZE 10
 
-Response* redirect(Request* request_message){
-    
+Response* redirect(Request* request, char* url_string){
+    Response *resp = malloc(sizeof *resp);
+	assert(resp);
+    resp->status_code=303;
+    resp->version = request->version;
+    resp->phrase = "Moved Permanently";
+    resp->header = new_hash_table(2);
+    hash_table_put(resp->header, "Location:", url_string);
+    resp->body="";
+    return resp;
 }
 
+char* parse_response(Response* response){
+    char* response_string;
+    char int_buff[4];
+    response_string = (char *) malloc(sizeof(char)*100);
+    strcat(response_string, response->version);
+    strcat(response_string," ");
+    sprintf(int_buff, "%d", response->status_code);
+    strcat(response_string, int_buff);
+    strcat(response_string, " ");
+    strcat(response_string, response->phrase);
+    strcat(response_string, "\r\n");
+    strcat(response_string, "Location: ");
+    strcat(response_string,hash_table_get(response->header, "Location:"));
+    strcat(response_string, "\r\n\r\n");
+    strcat(response_string, response->body);
+    return response_string;
+}
+
+
 void free_response(Response* resp){
     free_hash_table(resp->header);
     free(resp);
diff --git a/http-response.h b/http-response.h
index 7fdf1ba..1421696 100644
--- a/http-response.h
+++ b/http-response.h
@@ -11,4 +11,6 @@ typedef struct Response {
 
 
 //Creates a new hash table of input size
-Response *redirect(Request *req);
\ No newline at end of file
+Response *redirect(Request *req, char* url_string);
+
+char* parse_response(Response* response);
\ No newline at end of file
diff --git a/http-response.o b/http-response.o
new file mode 100644
index 0000000000000000000000000000000000000000..5ab883eb71fd341af4e8733938c009aefa145748
GIT binary patch
literal 6928
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
NAj6O_$UY=40|2HX(m((J

literal 0
HcmV?d00001

diff --git a/http-server b/http-server
new file mode 100644
index 0000000000000000000000000000000000000000..763fea59bb89bfd22a8d3b5633e585be3bf457cc
GIT binary patch
literal 14496
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

literal 0
HcmV?d00001

diff --git a/http-server.c b/http-server.c
index e215827..9b7244d 100644
--- a/http-server.c
+++ b/http-server.c
@@ -20,6 +20,8 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include "http-parser.h"
+#include "http-response.h"
+#include "user.h"
 
 // constants
 static char const * const HTTP_200_FORMAT = "HTTP/1.1 200 OK\r\n\
@@ -60,56 +62,57 @@ bool get_request(char* buff, int sockfd, char* file_name){
     return true;
 }
 
-bool post_request(char *buff, int sockfd, char* file_name){
+bool post_request(char *buff, int sockfd, char* file_name, char* response){
 	// locate the username, it is safe to do so in this sample code, but usually the result is expected to be
-            // copied to another buffer using strcpy or strncpy to ensure that it will not be overwritten.
-            char * username = strcpy(buff, "user=") + 5;
-            int username_length = strlen(username);
-            // the length needs to include the ", " before the username
-            long added_length = username_length + 2;
+    // copied to another buffer using strcpy or strncpy to ensure that it will not be overwritten.
+    printf("USERNAME IS %s\n\n", buff);
+    char * username = strcpy(buff, "user=") + 5;
+    int username_length = strlen(username);
+    // the length needs to include the ", " before the username
+    long added_length = username_length + 2;
 
-            // get the size of the file
-            struct stat st;
-            stat(file_name, &st);
-            // increase file size to accommodate the username
-            long size = st.st_size + added_length;
-            int n = sprintf(buff, HTTP_200_FORMAT, size);
-            // send the header first
-            if (write(sockfd, buff, n) < 0)
-            {
-                perror("write");
-                return false;
-            }
-            // read the content of the HTML file
-            int filefd = open(file_name, O_RDONLY);
-            n = read(filefd, buff, 2048);
-            if (n < 0)
-            {
-                perror("read");
-                close(filefd);
-                return false;
-            }
-            close(filefd);
-            // move the trailing part backward
-            int p1, p2;
-            for (p1 = size - 1, p2 = p1 - added_length; p1 >= size - 25; --p1, --p2)
-                buff[p1] = buff[p2];
-            ++p2;
-            // put the separator
-            buff[p2++] = ',';
-            buff[p2++] = ' ';
-            // copy the username
-            strncpy(buff + p2, username, username_length);
-            if (write(sockfd, buff, size) < 0)
-            {
-                perror("write");
-                return false;
-            }
+    // get the size of the file
+    struct stat st;
+    stat(file_name, &st);
+    // increase file size to accommodate the username
+    long size = st.st_size + added_length;
+    int n = sprintf(buff, response, size);
+    // send the header first
+    if (write(sockfd, buff, n) < 0)
+    {
+        perror("write");
+        return false;
+    }
+    // read the content of the HTML file
+    int filefd = open(file_name, O_RDONLY);
+    n = read(filefd, buff, 2048);
+    if (n < 0)
+    {
+        perror("read");
+        close(filefd);
+        return false;
+    }
+    close(filefd);
+    // move the trailing part backward
+    int p1, p2;
+    for (p1 = size - 1, p2 = p1 - added_length; p1 >= size - 25; --p1, --p2)
+        buff[p1] = buff[p2];
+    ++p2;
+    // put the separator
+    buff[p2++] = ',';
+    buff[p2++] = ' ';
+    // copy the username
+    strncpy(buff + p2, username, username_length);
+    if (write(sockfd, buff, size) < 0)
+    {
+        perror("write");
+        return false;
+    }
 	return true;
 }
 
 
-static bool handle_http_request(int sockfd)
+static bool handle_http_request(int sockfd, User_list* users)
 {
     // try to read the request
     char buff[2049];
@@ -129,16 +132,37 @@ static bool handle_http_request(int sockfd)
     char * curr = buff;
 
     // parse the method
-    printf("cur is:      %s\n\n", curr);
     Request* req = parse_request(curr);
-    printf("%s\n%s\n", req->url, req->version);
-    if (strncmp(req->url, "?start=Start", 12)  == 0){
+    printf("REQUEST BODY IS \n\n%s\n", req->body);
+    if (strncmp(req->url, "/welcome_page?start=Start", 24)  == 0){
         printf("matches start");
         if (req->method == GET){
                 get_request(buff,sockfd, "3_first_turn.html");
         }
         if (req->method == POST){
-                post_request(buff,sockfd, "7_gameover.html");
+            Response* response = redirect(req, "gameover_page");
+            
+            char *resp = parse_response(response);
+		    post_request(buff,sockfd, "7_gameover.html",resp); 
+            free(response);
+        }
+    }
+    else if (strncmp(req->url, "/gameover_page", 14) == 0){
+        if(req->method == GET){
+            get_request(buff,sockfd, "7_gameover.html");
+            printf("i return false\n");
+        }
+    }
+    else if (strncmp(req->url, "/welcome_page", 13) == 0){
+        if(req->method == GET){
+            get_request(buff,sockfd, "2_start.html");
+        }
+        if (req->method == POST){
+            Response* response = redirect(req, "gameover_page");
+            
+            char *resp = parse_response(response);
+		    post_request(buff,sockfd, "7_gameover.html",resp); 
+            free(response);
         }
     }
     // assume the only valid request URI is "/" but it can be modified to accept more files
@@ -146,12 +170,24 @@ static bool handle_http_request(int sockfd)
     else if (*req->url == '/')
         if (req->method == GET)
         {
-            printf("%s\n", curr);
             get_request(buff,sockfd, "1_welcome.html");
         }
         else if (req->method == POST)
         {
-		post_request(buff,sockfd, "2_start.html");    
+            char *name = strchr(req->body, '=')+1;
+            printf("**%s**\n", name);
+            if (name != NULL){
+                // for (int i=0; i < users->n_users; i++){
+                //     if(users->users[i]->name == NULL){
+                //         users->users[i]->name = name;
+                //     }
+                // }
+                Response* response = redirect(req, "welcome_page");
+                char *resp = parse_response(response);
+                post_request(buff,sockfd, "2_start.html",resp); 
+                free(resp);
+                free(response);   
+            }
         }
         else
             // never used, just for completeness
@@ -215,7 +251,6 @@ int main(int argc, char * argv[])
     FD_SET(sockfd, &masterfds);
     // record the maximum socket number
     int maxfd = sockfd;
-
     while (1)
     {
         // monitor file descriptors
@@ -225,9 +260,9 @@ int main(int argc, char * argv[])
             perror("select");
             exit(EXIT_FAILURE);
         }
-
+        User_list* users = initialise_player_list();
         // loop all possible descriptor
-        for (int i = 0; i <= maxfd; ++i)
+        for (int i = 0; i <= maxfd; ++i){
             // determine if the current file descriptor is active
             if (FD_ISSET(i, &readfds))
             {
@@ -257,12 +292,14 @@ int main(int argc, char * argv[])
                     }
                 }
                 // a request is sent from the client
-                else if (!handle_http_request(i))
+                else if (!handle_http_request(i, users))
                 {
                     close(i);
                     FD_CLR(i, &masterfds);
                 }
             }
+        }
+    free(users);
     }
 
     return 0;
diff --git a/http-server.o b/http-server.o
new file mode 100644
index 0000000000000000000000000000000000000000..093df8e7e2a3ddabcd0698b5ad7665901308b55f
GIT binary patch
literal 22176
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
SvkII24$ujr`DhlRaTx$T(GrvZ

literal 0
HcmV?d00001

diff --git a/image_tagger b/image_tagger
new file mode 100644
index 0000000000000000000000000000000000000000..0032bce3a0d8b40dcdcd0f00cb256e60db02cc9b
GIT binary patch
literal 37096
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

literal 0
HcmV?d00001

diff --git a/server b/server
new file mode 100644
index 0000000000000000000000000000000000000000..c63bbc29bdba00c9da7a64d718dba72f1c414565
GIT binary patch
literal 14480
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
NXc-1%A4CR10szatrI`Q#

literal 0
HcmV?d00001

diff --git a/user.c b/user.c
new file mode 100644
index 0000000..169b93d
--- /dev/null
+++ b/user.c
@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <stdbool.h>
+
+#include "user.h"
+
+
+User* new_user(){
+    User *user = malloc(sizeof(User*));
+    assert(user);
+    user->n_capacity = 5;
+    user->n_keywords = 0;
+    user->status = WAIT;
+    user->keywords = malloc(sizeof(char*)*user->n_capacity);
+    assert(user->keywords);
+    return user;
+}
+
+User_list* initialise_player_list(){
+    User_list *users = malloc(sizeof(User_list));
+    assert(users);
+    users->n_users = 0;
+    users->users = malloc(sizeof(User*)*3);
+    assert(users->users);
+    return users;
+}
+
+void add_user(User* user, User_list* users){
+    users->users[users->n_users] = user;
+    users->n_users++;
+}
+
+void free_users(User_list* users){
+    for (int i=0; i <users->n_users; i++){
+        free(users->users[i]->keywords);
+        free(users->users[i]);
+    }
+    free(users->users);
+    free(users);
+}
+
+bool is_players_ready(User_list* users){
+    for(int i=0; i < users->n_users; i++){
+        if (users->users[i]->status != READY){
+            return false;
+        }
+    }
+    return true;
+}
\ No newline at end of file
diff --git a/user.h b/user.h
new file mode 100644
index 0000000..6a2d92c
--- /dev/null
+++ b/user.h
@@ -0,0 +1,30 @@
+#include <stdbool.h>
+typedef enum
+{
+    READY,
+    WAIT
+} STATUS;
+
+
+typedef struct User {
+    char* name;
+    char** keywords;
+    int n_keywords;
+    STATUS status;
+    int n_capacity;
+}User;
+
+typedef struct User_list{
+    int n_users;
+    User **users;
+}User_list;
+
+User* new_user();
+
+User_list* initialise_player_list();
+
+void add_user(User* user, User_list* users);
+
+void free_users(User_list* users);
+
+bool is_players_ready(User_list* users);
\ No newline at end of file
diff --git a/user.o b/user.o
new file mode 100644
index 0000000000000000000000000000000000000000..96afe21927a303d79fb739e295414526e16770b1
GIT binary patch
literal 7032
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

literal 0
HcmV?d00001

-- 
GitLab