#include #include #include #include #include #include #include #include void server_close(struct Server *server){ server->running=false; sleep(1); int shuterr=shutdown(server->socket,SHUT_RDWR); int closeerr=close(server->socket); printf("\nshutdown with %d : %d\n",shuterr,closeerr); //free(server); } void *server_loop(void *threadarg){ struct Server *server; server=(struct Server *) threadarg; char buffer[30000]={0}; int addrlen= sizeof(server->address); int new_socket; char *meta_type="\r\ncontent-type: text/html\r\n\r\n"; printf("running on port: %d",server->port); while (server->running){ char metadata[100]=""; printf("\n=== WAITING FOR CONNECTION ===\n\n"); new_socket = accept(server->socket, (struct sockaddr *)&server->address, (socklen_t *)&addrlen); if(new_socket<0){ break; } if(read(new_socket,buffer,29999)<0){ printf("\nREAD FAILED\n\n"); close(new_socket); break; } buffer[29999]='\0'; printf("%s\n",buffer); char response[30000] = {0}; char file_req_buf[1000]={0}; strcpy(file_req_buf,server->html_folder); char file_req[1000]={0}; str_before_nth(buffer+5, file_req, ' ', 0); strcat(file_req_buf,file_req); printf("file req: %s====\n",file_req_buf); if(strncmp(file_req, "", 1) == 0){ strcat(file_req_buf,"index.html"); } char file_req_buf2[1000]={0}; strcpy(file_req_buf2,str_remove_all(file_req_buf,"..")); printf("file ret: %s====\n",file_req_buf); if (access(file_req_buf, F_OK) == 0) { char *status="HTTP/1.0 200 OK"; memcpy(metadata,status,strlen(status)); memcpy(metadata+strlen(metadata),meta_type,strlen(meta_type)); memcpy(response, metadata, strlen(metadata)); FILE* file=fopen(file_req_buf, "r"); fread(response + strlen(metadata), 30000 - strlen(metadata) - 1, 1, file); fclose(file); } else { char *status="HTTP/1.0 404 Not Found"; memcpy(metadata,status,strlen(status)); memcpy(metadata+strlen(metadata),meta_type,strlen(meta_type)); memcpy(response, metadata, strlen(metadata)); char* error = "error 404 file not found"; memcpy(response + strlen(metadata), error, strlen(error)); } printf("\n\n==response==\n%s\n",response); write(new_socket, response, strlen(response)); close(new_socket); } pthread_exit(NULL); } pthread_t launch(struct Server *server){ //HTTP/1.0 200 OK pthread_t id; int thread_err=pthread_create(&id, NULL, server_loop, (void *) server); return id; }