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