diff --git a/GETheader.c b/GETheader.c index a51c9eb13dfa2858edf3e50feb01375939321e44..7185d8c90ba36de246f46c37e327efbba4c8deb2 100644 --- a/GETheader.c +++ b/GETheader.c @@ -6,27 +6,7 @@ -/*int main(int argc, char const *argv[]) -{ - char getrequest[BUFFERSIZE]; - root = "/home/neeserg/Dropbox/CompSys/practice"; - memset(getrequest, 0, BUFFERSIZE); - fread(getrequest, 1, BUFFERSIZE, stdin); - - struct GET_header header; - parse_GET_request(getrequest, &header); - printf("%s\n", header.filepath); - sendresponse(0, &header); - - - - - - - return 0; -} -*/ int parse_GET_request(char* message, struct GET_header* header){ char workingcopy[BUFFERSIZE]; char delimeter[6] = " \r\n\t\v"; @@ -35,13 +15,13 @@ int parse_GET_request(char* message, struct GET_header* header){ char *get; - if((get = strtok(workingcopy, delimeter))==NULL){ + if((get = strtok(workingcopy, delimeter))==NULL){//there is anything perror("NOT VALID"); header->status = BADREQUEST; return -1; } - if (strcmp(get, "GET") != 0) + if (strcmp(get, "GET") != 0)//check if it has a get { perror("NOT VALID"); header->status = BADREQUEST; @@ -49,7 +29,7 @@ int parse_GET_request(char* message, struct GET_header* header){ } char *temp; - if((temp = strtok(NULL, delimeter)) == NULL){ + if((temp = strtok(NULL, delimeter)) == NULL){ //checks for file path perror("NOT VALID"); header->status = FILENOTFOUND; return -1; @@ -57,7 +37,7 @@ int parse_GET_request(char* message, struct GET_header* header){ memset(header->filepath, 0, PATHLEN); strcat(header->filepath, root); strcat(header->filepath, temp); - + //saves the file path diff --git a/form_response.c b/form_response.c index c0b3a42eeed6f3910c2a6578520214567235d843..b5ca6c95f37ee545b6fce9458927fb0161419454 100644 --- a/form_response.c +++ b/form_response.c @@ -16,7 +16,7 @@ int formresponse(char buffer[BUFFERSIZE], struct RESP_header* header){ strcat(buffer, header->httpversion); strcat(buffer, " "); - if(header->status == 200){ + if(header->status == SUCCESS){//form responce header if it is valid char status[4]; sprintf(status, "%d", header->status); strcat(buffer, status); @@ -29,7 +29,7 @@ int formresponse(char buffer[BUFFERSIZE], struct RESP_header* header){ } - else if (header->status ==404) + else if (header->status ==BADREQUEST)// 404 response header { char status[4]; sprintf(status, "%d", header->status); @@ -38,7 +38,7 @@ int formresponse(char buffer[BUFFERSIZE], struct RESP_header* header){ return 1; } - else{ + else{ // other response header char status[4]; sprintf(status, "%d", header->status); strcat(buffer, status); @@ -58,13 +58,13 @@ int sendresponse(int sockfd, struct GET_header* header){ if (fp == NULL) { strcpy(resphead.httpversion, header->httpversion); - resphead.status = 404; + resphead.status = BADREQUEST; formresponse(buffer, &resphead); return send(sockfd, buffer, strlen(buffer), 0); - } + }// sends the 404 response else{ - resphead.status = 200, + resphead.status = SUCCESS; strcpy(resphead.httpversion, header->httpversion); fseek(fp, 0, SEEK_END); @@ -77,9 +77,11 @@ int sendresponse(int sockfd, struct GET_header* header){ return send(sockfd, buffer,strlen(buffer), 0); } formresponse(buffer, &resphead); + if(send(sockfd, buffer,strlen(buffer), 0)<0){ return -1; } + //sends the desired file while(!feof(fp)){ memset(buffer, 0, BUFFERSIZE); int n_bytes = fread(buffer, 1, BUFFERSIZE, fp); @@ -98,7 +100,7 @@ int sendresponse(int sockfd, struct GET_header* header){ return -1; } - +//determining mime type int getfiletype(const char *filepath, struct RESP_header* resphead){ if (strstr(filepath, htmlext) != NULL) { diff --git a/server.c b/server.c index ede5a95754fee01df857abe93019767805ee5db9..01d00bf7b36c729de961204b97a8f09b680bb42e 100644 --- a/server.c +++ b/server.c @@ -8,26 +8,36 @@ void* handleclient(void * newsockfd); int main(int argc, char *argv[]){ - struct addrinfo info, *res, *p; - int sockfd, newsockfd; - struct sockaddr_storage clien_addr; - socklen_t clien_size; + + struct addrinfo info, *res, *p;//struct to hold all the server adress info + int sockfd, newsockfd;//socket number to hold socket ids + struct sockaddr_storage clien_addr;//holds client adress info + socklen_t clien_size; //size of clien adress + + + if (argc <3){ fprintf(stderr,"ERROR, no port provided\n");//to check if there is no port provided at start exit(1); } - strcpy(root, argv[2]); + strcpy(root, argv[2]);// sets root directory memset(&info, 0, sizeof(info)); + + + + info.ai_family = AF_UNSPEC; ///sets it to unspecified info.ai_socktype = SOCK_STREAM; //TCP connection stream oriented info.ai_flags = AI_PASSIVE; //listen on on all ip interface of machine info.ai_protocol = 0; //set this to zero as default - if((getaddrinfo(NULL, argv[1], &info, &res) != 0)){ + if((getaddrinfo(NULL, argv[1], &info, &res) != 0))// gets a lnked list of adress infos + { fprintf(stderr,"ERROR, no port provided\n");//to check if getaddrinfo gets any addrinfos exit(1); } + //loops through the linked list for a connection for (p = res; p!= NULL; p = p->ai_next) { if((sockfd = socket(p-> ai_family, p->ai_socktype, p->ai_protocol)) < 0){ @@ -44,35 +54,37 @@ int main(int argc, char *argv[]){ break; } - if (p == NULL) + if (p == NULL)//if no connection established { perror("ERROR on creating and binding"); return 2; } - if(listen(sockfd,MAXUSER)<0){ + if(listen(sockfd,MAXUSER)<0){ //listens on that socket perror("ERROR listening"); return 2; - } + while(1){ clien_size = sizeof (clien_addr); + //accepts connections, opening a new scoket for sending and recieving - if((newsockfd = accept(sockfd, (struct sockaddr *) &clien_addr, &clien_size)) < 0){ + if((newsockfd = accept(sockfd, (struct sockaddr *) &clien_addr, &clien_size)) < 0) + { perror("ERROR accepting"); return 3; } pthread_t tid; - if (pthread_create(&tid, NULL, handleclient, &newsockfd) <0) + if (pthread_create(&tid, NULL, handleclient, &newsockfd) <0)//create a worker thread { perror("ERROR creating thread"); return 3; } - pthread_detach(tid); + pthread_detach(tid);// free all the resource associated with thread } @@ -92,6 +104,7 @@ void* handleclient(void * newsockfd){ char buffer[BUFFERSIZE]; bzero(buffer, BUFFERSIZE); + //recieve the message if ((numbytes = recv(sockfd, buffer, BUFFERSIZE, 0)) <0) { perror("ERROR recieving"); @@ -99,9 +112,10 @@ void* handleclient(void * newsockfd){ return NULL; } struct GET_header header; - + //parse the message parse_GET_request(buffer, &header); + //send the appropriate message according to get response if (sendresponse(sockfd, &header) <0) { perror("ERROR sending");