int check_client_header(FILE *file) { char buffer[1024]; http_request request; fgets_or_exit(buffer, 1024, file); if (parse_http_request(buffer, &request) == 1) { char *url = rewrite_url(request.url); if (request.method != HTTP_GET) { skip_headers(file); send_response(file, 400, "Bad request", "Bad request\r\n"); free(url); return 400; } else if (strcmp(url, "/")) { skip_headers(file); send_response(file, 404, "Not Found", "Not Found\r\n"); free(url); return 404; } else { skip_headers(file); free(url); return 200; } } else { skip_headers(file); send_response(file, 400, "Bad Request", "Bad request\r\n"); return 400; } }
static void next_fragment(struct dpipe *source, struct FeederState *state) { char filename[PATH_MAX]; if (state->file) { fclose(state->file); if (destructive && state->destructive) { sprintf(filename, "%s/%u", state->directory, state->sequence); unlink(filename); } } sprintf(filename, "%s/%u", state->directory, ++state->sequence); if (state->file = state->sequence == 1 ? efopen(filename, "r", WHERE(next_fragment)) : fopen(filename, "r")) if (state->sequence > 1) skip_headers(state->file); }
void fgets_or_exit(char * buf , int size , FILE * stream ){ //VARIABLE /*char* e400="HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Length: 17\r\n\r\n400 Bad request\r\n"; char* w200="HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 17\r\n\r\nSalut poto ! :)\r\n"; char* e404="HTTP/1.1 404 Not Found\r\nConnection: close\r\nContent-Length: 15\r\n\r\n404 Not Found\r\n";*/ http_request request; fgets(buf, size,stream); char * request_line = malloc(size); strcpy(request_line, buf); skip_headers (stream , size); int bad_request = parse_http_request(request_line,&request); if ( bad_request ) send_response ( stream , 400 , "Bad Request" , "Bad request\r\n" ); else if (request.method == HTTP_UNSUPPORTED ) send_response ( stream , 405 , "Method Not Allowed" , "Method Not Allowed\r\n" ); else if (strcmp(request.url , "/" ) == 0) send_response ( stream , 200 , "OK" , "Salut poto ! :)\r\n" ); else send_response ( stream , 404 , "Not Found" , "Not Found\r\n" ); }
int main(void){ int socket_client, socket_serveur = creer_serveur(8080); initialiser_signaux(); while(1){ socket_client = accept(socket_serveur, NULL, NULL); FILE *server = fdopen(socket_client, "w+"); if(server == NULL){ perror("fdopen"); return EXIT_FAILURE; } if(fork()==0){ if(socket_client == -1){ perror("socket client"); exit(EXIT_FAILURE); } sleep(1); FILE *client = fdopen(socket_client,"w+"); char buffer[BUFFER_SIZE]; char *buf; while(1){ memset(buffer, '\0', BUFFER_SIZE); int parse_status, done=0, line_header=0; http_request request; // int request_value; skip_headers(client); while((buf=fgets(buffer, BUFFER_SIZE, server))!=NULL){ printf("%s", buffer); line_header++; if(line_header == 1) parse_status = parse(buffer, &request); if(strcmp(buffer, "\r\n") == 0) done = 1; if(parse_status == 0 && done == 1){ send_response(server, 400, "Bad Request", "Bad Request\r\n"); } else if(done == 1){ if(request.method == HTTP_GET){ if(strcmp(request.url, "/") == 0){ send_response(server, 200, "OK", mess); } else { send_response(server, 404, "Not Found", "Not Found\r\n"); } } else { send_response(server, 400, "Bad Request", "Bad Request\r\n"); } done = 0; line_header = 0; parse_status = 0; } } /* if (request_value){ send_response ( client, 400, "Bad Request", "Bad request \r\n " ); }else if ( request.method == HTTP_UNSUPPORTED ){ send_response ( client, 405, "Method Not Allowed", " Method Not Allowed\r\n " ); }else if ( strcmp ( request.url, "/" ) == 0){ send_response ( client, 200, "OK", mess ); }else send_response ( client, 404, " Not Found ", "Not Found \r\n " ); */ exit(EXIT_SUCCESS); } } else { close(socket_client); } } //close(socket_client); //deja fermée close(socket_serveur); return EXIT_SUCCESS; }
int main(){ int taille=0; int socket_client, pid, erreur = 0; char str[1024]; http_request req; FILE *f = NULL; const char *message_bienvenue = "Bonjour, c'est un grand honneur de vous avoir sur notre serveur. Bienvenue à bord !\n"; int socket_serveur = creer_serveur(8080); message_bienvenue +=0; taille+=0; initialiser_signaux(); while((socket_client = accept(socket_serveur , NULL , NULL)) != -1){ if((pid = fork()) == -1){ perror("Erreur fork"); /* traitement d’erreur */ } if(pid == 0){ sleep(1); f = fdopen(socket_client, "w+"); /* if(write(socket_client, message_bienvenue, strlen(message_bienvenue)) == -1){ perror("Erreur write bienvenu"); traitement d’erreur }*/ fgets_or_exit(str, sizeof(str), f); skip_headers(f); erreur=parse_http_request(str,&req); //erreur = 1; /*strcpy(s, str); char* token = strtok(s, " "); while (token) { tokenCounter++; if(tokenCounter == 1 && !strcmp(token,"GET") == 0){ erreur = 0; } if(tokenCounter ==2 && !strcmp(token, "/") ==0){ erreur=0; } if(tokenCounter == 3 && (strncmp(token, "HTTP/1.1",8) != 0 && strncmp(token, "HTTP/1.0",8) !=0)){ erreur = 0; } if(tokenCounter >=4){ printf("%s\n", token); } token = strtok(NULL, " "); }*/ if(erreur == 404){ send_response(f,404,"Page not found","Page not found\r\n"); }else if(erreur == 400){ send_response(f,400,"Bad Request","Bad Request\r\n"); }else{ fprintf(f, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s\r\n", (int)strlen(message_bienvenue)+2, message_bienvenue); } fflush(f); fclose(f); /*while((taille = read(socket_client, buffer, 256)) != 0){ if(write(socket_client, buffer, taille)== -1){ perror("Erreur write retour de message"); } }*/ exit(EXIT_SUCCESS); }else{ close(socket_client); } } return 1; }
int init_socket_tcp(int port){ //IpV4 - TCP Socket int server_socket = socket(AF_INET, SOCK_STREAM, 0); int server_init_state = -1; if (server_socket == (-1)){ //Error while creating tcp socket perror("init_socket_tcp"); //Cancelling next operations return server_socket; } //Binding socket if ((server_init_state = bind_socket_tcp(server_socket, port)) == -1) //Cancelling next operations return server_init_state; //Listening if ((server_init_state = listen_socket_tcp(server_socket)) == -1) //Cancelling next operations return server_init_state; //LOG struct tm * timeinfo; timeinfo = time_get_time(); printf("[%d:%d:%d] Server started on port %d\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, port); //Accepting connections (Server loop process) if (!fork()){ //Init signals init_signals(); //Clients accept() loop while(1){ //Client information struct sockaddr_in client_addr; //Accepting client int client_socket = accept_socket_tcp(server_socket, &client_addr); if (client_socket != (-1)){ //LOG _client_idata client_information; get_client_information(&client_addr, &client_information); printf("Request from [%s:%d] !\n", client_information.client_ip, client_information.client_port); //New instance for client if(!fork()){ //Client pipe FILE * clnt_sd = fdopen(client_socket, "w+"); //Receive buffer char rcv_buff[SERVER_RECEIVE_BUFFER_SIZE]; //HTTP header http_request http_req; //Header check vars int header_valid = 0, url_valid = 0; //Reading client request fgets_or_exit(rcv_buff, sizeof(rcv_buff), clnt_sd); //Parsing http header_valid = parse_http_request(rcv_buff, &http_req); //Checking header header_valid = (((http_req.method == HTTP_GET) && (http_req.major_version == 1) && ((http_req.minor_version == 1) || (http_req.minor_version = 0))) ? 1 : 0); //Valid URL url_valid = ((strcmp(http_req.url,"/") == 0) ? 1 : 0); //Skipping headers skip_headers(clnt_sd); //Header validation if (http_req.method == HTTP_UNSUPPORTED) //Method not supported send_response (clnt_sd, 405, "Method Not Allowed", "Method Not Allowed\r\n"); else if ((header_valid == 1) && (url_valid == 1)) //Welcome message send_response(clnt_sd, 200 , "OK" , SERVER_WELCOME_MSG ); else if ((header_valid == 1) && (url_valid == 0)) //404 send_response(clnt_sd, 404,"Not Found", "Not Found\r\n"); else //Bad request send_response(clnt_sd, 400, "Bad Request" , "Bad request\r\n"); //Disconnected fclose(clnt_sd); //Client child-process ending exit(0); } //Closing client socket close(client_socket); } } } //Success return server_socket; }