diff --git a/webserver/.client.c.swp b/webserver/.client.c.swp index 89bfb748a7ce25b0d9b9abd494ac610f6ec1825b..1aad83d5cbf6b3e4aac257f4777c24d68b7d3ebf 100644 Binary files a/webserver/.client.c.swp and b/webserver/.client.c.swp differ diff --git a/webserver/.document.txt.swp b/webserver/.client.c.swp.save similarity index 75% rename from webserver/.document.txt.swp rename to webserver/.client.c.swp.save index 54dd4c4c00b2fab3b7db91a173d9677d338c3341..b86799163a6af268ebb63ebcfd0034b947390d31 100644 Binary files a/webserver/.document.txt.swp and b/webserver/.client.c.swp.save differ diff --git a/webserver/.nano.swp b/webserver/.nano.swp deleted file mode 100644 index 9a0a707f9ff6e8d7a6a754ec740646d767a2cf9a..0000000000000000000000000000000000000000 Binary files a/webserver/.nano.swp and /dev/null differ diff --git a/webserver/..client.c.swp.swp b/webserver/.socket.c.swp similarity index 87% rename from webserver/..client.c.swp.swp rename to webserver/.socket.c.swp index 17b95d71f499cd101e051c580b8489881decd84e..76d211972c3b571d46420700438a25d4eb1132d5 100644 Binary files a/webserver/..client.c.swp.swp and b/webserver/.socket.c.swp differ diff --git a/webserver/.test.swp b/webserver/.test.swp deleted file mode 100644 index c5d593cd0bd14f5f57bd4022477ae4ae6a0cdb52..0000000000000000000000000000000000000000 Binary files a/webserver/.test.swp and /dev/null differ diff --git a/webserver/client.c b/webserver/client.c index f0d43e8205a9b52376b1074cff277a47e8a0924e..57fb9fa563b1c3074cc1bddf8be01dafa621cf28 100644 --- a/webserver/client.c +++ b/webserver/client.c @@ -50,7 +50,7 @@ FILE* check_and_open(const char* target, const char *document_root){ char* rewrite_target(char *target){ char* ret = strrchr(target, '?'); - printf("rewrite target ret : %s\n",ret); +// printf("rewrite target ret : %s\n",ret); if(ret != NULL){ char* rep = malloc(strlen(target)*sizeof(char)); size_t i = (int)(strlen(target)-strlen(ret)); @@ -58,8 +58,8 @@ char* rewrite_target(char *target){ return rep; }else{ char* rep = malloc(strlen(target)*sizeof(char)); - size_t i = (int)(strlen(target)); - rep = strncpy(rep,target+1,i); + size_t i = (int)(strlen(target)); + rep = strncpy(rep,target+1,i); return rep; } } @@ -110,7 +110,7 @@ void send_response(FILE *client, int code, const char *reason_phrase, const char int traitementClient(int socket_client){ /* On peut maintenant dialoguer avec le client */ - char *motd="Votre requète est bonne"; +// char *motd="Votre requète est bonne"; printf("test\n"); char str[8000]; http_request request; @@ -130,28 +130,29 @@ int traitementClient(int socket_client){ }else{ send_response(fd, 400, "Bad Request", "Bad request"); } - }else if (strcmp(request.target, "/") == 0){ - send_response(fd, 200, "OK", motd); + }else if (strcmp(request.target, "/html") == 0){ + //send_response(fd, 200, "OK", motd); //--- + char* absolute_path = rewrite_target(request.target); +// printf("test - - - - - - - - %s\n",absolute_path); + FILE* fichier = check_and_open(absolute_path, "index.html"); + if(fichier == NULL){ + send_response(fd, 404, "Not Found", "Not Found"); + }else{ + int size = get_file_size(fileno(fichier)); + send_status(fd, 200, "OK"); + fprintf(fd,"Content-Lenght : %d\r\n\r\n",size); + if(copy(fichier,fd)==-1){ + //error + } + } + }else{ send_response(fd, 404, "Not Found", "Not Found"); } fflush(fd); //partie 7 - char* absolute_path = rewrite_target(request.target); - printf("test - - - - - - - - %s\n",absolute_path); - - FILE* fichier = check_and_open(absolute_path, "document.txt"); - fprintf(fd,"fichier : \n"); - if(fichier == NULL){ - send_response(fd, 404, "Not Found2", "Not Found2"); - }else{ - int size = get_file_size(fileno(fichier)); - if(copy(fichier,fd)==-1){ - //error - } - fprintf(fd,"Size : %d\n",size); - } + fclose(fd); return 0; } diff --git a/webserver/client.c.save b/webserver/client.c.save new file mode 100644 index 0000000000000000000000000000000000000000..014916e0d4c1da6d2d990558bfc3159213b5de06 --- /dev/null +++ b/webserver/client.c.save @@ -0,0 +1,160 @@ +#include <string.h> +#include <unistd.h> +#include <stdio.h> +#include "socket.h" +#include <netinet/in.h> +#include <sys/wait.h> +#include <stdlib.h> +#include "client.h" +#include "http_parse.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + + +int copy(FILE* in, FILE* out){ + int ch; + if(in && out){ + ch = fgetc(in); + while(ch != EOF ){ + fputc(ch,out); + ch=fgetc(in); + } + }else{ + //error reading + exit(1); + } + return 0; +} +int get_file_size(int fd){ + struct stat sb; + if(fstat(fd,&sb)==-1){ + perror("stat"); + exit(1); + } + return sb.st_size; + return 0; +} + +FILE* check_and_open(const char* target, const char *document_root){ + printf("check and open test\n"); + char tmp[300]=""; + strcat(tmp,target); + strcat(tmp,"/"); + strcat(tmp,document_root); + + printf("testons"); + printf("check and open tmp : %s/%s \n tmp : %s \n",target,document_root,tmp); + return fopen(tmp,"r"); +} + +char* rewrite_target(char *target){ + char* ret = strrchr(target, '?'); +// printf("rewrite target ret : %s\n",ret); + if(ret != NULL){ + char* rep = malloc(strlen(target)*sizeof(char)); + size_t i = (int)(strlen(target)-strlen(ret)); + rep = strncpy(rep,target+1,i-1); + return rep; + }else{ + char* rep = malloc(strlen(target)*sizeof(char)); + size_t i = (int)(strlen(target)); + rep = strncpy(rep,target+1,i); + return rep; + } +} + + +char* fgets_or_exit(char * buffer, int size, FILE *fd){ + char * ret = fgets(buffer,size,fd); + if(ret){ + return ret; + } else { + exit(1); + } +} + + + +int is_crlf(const char *str){ + return (str[0] == '\r' && str[1] == '\n') || str[0] =='\n'; +} + + +void skip_headers(FILE *client){ + //passer les headers files + char buffer[8000]; + while(1){ + fgets_or_exit(buffer, sizeof(buffer), client); + if (is_crlf(buffer)) + break; + } +} + + +void send_status(FILE *client, int code, const char *reason_phrase){ + //transmet le status au client (1ère ligne) + fprintf(client, "HTTP/1.1 %d %s\r\n",code,reason_phrase); +} + +void send_response(FILE *client, int code, const char *reason_phrase, const char *message_body){ + send_status(client,code,reason_phrase); + //transmet la réponse complète (la suite) + fprintf(client,"Content-Lenght: %u\r\n",(unsigned int)strlen(message_body)); + fprintf(client,"\r\n"); + fprintf(client,"%s\r\n",message_body); + fflush(client); +} + + + +int traitementClient(int socket_client){ + /* On peut maintenant dialoguer avec le client */ + char *motd="Votre requète est bonne"; + printf("test\n"); + char str[8000]; + http_request request; + FILE *fd; + fd = fdopen(socket_client, "a+"); + if(fd == NULL) { + perror("Error opening file\n"); + exit(1); + } + //fprintf(fd,"pas d'erreurs d'ouverture\n"); + fgets_or_exit(str,8000,fd); + int parse_ret = parse_http_request(str,&request); + skip_headers(fd); + if (parse_ret == -1) { + if (request.method == HTTP_UNSUPPORTED){ + send_response(fd, 405, "Method Not Allowed", "Method Not Allowed"); + }else{ + send_response(fd, 400, "Bad Request", "Bad request"); + } + }else if (strcmp(request.target, "/html") == 0){ + send_response(fd, 200, "OK", motd); + //--- + + + + }else{ + send_response(fd, 404, "Not Found", "Not Found"); + } + fflush(fd); + //partie 7 + char* absolute_path = rewrite_target(request.target); + printf("test - - - - - - - - %s\n",absolute_path); + + FILE* fichier = check_and_open(absolute_path, "index.html"); +// fprintf(fd,"fichier : \n"); + if(fichier == NULL){ + send_response(fd, 404, "Not Found2", "Not Found2"); + }else{ + int size = get_file_size(fileno(fichier)); + if(copy(fichier,fd)==-1){ + //error + } + //fprintf(fd,"Size : %d\n",size); + } + fclose(fd); + return 0; +} diff --git a/webserver/client.c.save.1 b/webserver/client.c.save.1 new file mode 100644 index 0000000000000000000000000000000000000000..b23f9b1bfc506e8d1f29f4191ff7a6eb0800449c --- /dev/null +++ b/webserver/client.c.save.1 @@ -0,0 +1,144 @@ +#include <string.h> +#include <unistd.h> +#include <stdio.h> +#include "socket.h" +#include <netinet/in.h> +#include <sys/wait.h> +#include <stdlib.h> +#include "client.h" +#include "http_parse.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + + +int copy(FILE* in, FILE* out){ + int ch; + if(in && out){ + while((ch =( fgetc(in))!= EOF) ){ + fputc(ch,out); + } + }else{ + //error reading + exit(1); + } + return 0; +} +int get_file_size(int fd){ + struct stat sb; + if(fstat(fd,&sb)==-1){ + perror("stat"); + exit(1); + } + return sb.st_size; + return 0; +} + +FILE* check_and_open(const char* target, const char *document_root){ + char*tmp=""; + strcat(tmp,target); + strcat(tmp,document_root); + strcat(tmp,"\n"); + return fopen(tmp,"r"); +} + +char* rewrite_target(char *target){ + char* ret = strrchr(target, '?'); + char* rep = malloc(strlen(target)*sizeof(char)); + if (ret!= NULL){ + size_t i = (int)(strlen(target)-strlen(ret)); + rep = strncpy(rep,target,i); + } + return rep; +} + + +char* fgets_or_exit(char * buffer, int size, FILE *fd){ + char * ret = fgets(buffer,size,fd); + if(ret){ + return ret; + } else { + exit(1); + } +} + + + +int is_crlf(const char *str){ + return (str[0] == '\r' && str[1] == '\n') || str[0] =='\n'; +} + + +void skip_headers(FILE *client){ + //passer les headers files + char buffer[8000]; + while(1){ + fgets_or_exit(buffer, sizeof(buffer), client); + if (is_crlf(buffer)) + break; + } +} + + +void send_status(FILE *client, int code, const char *reason_phrase){ + //transmet le status au client (1ère ligne) + fprintf(client, "HTTP/1.1 %d %s\r\n",code,reason_phrase); +} + +void send_response(FILE *client, int code, const char *reason_phrase, const char *message_body){ + send_status(client,code,reason_phrase); + //transmet la réponse complète (la suite) + fprintf(client,"Content-Lenght: %u\r\n",(unsigned int)strlen(message_body)); + fprintf(client,"\r\n"); + fprintf(client,"%s\r\n",message_body); + fflush(client); +} + + + +int traitementClient(int socket_client){ + /* On peut maintenant dialoguer avec le client */ + char *motd="Votre requète est bonne"; + printf("test\n"); + char str[8000]; + http_request request; + FILE *fd; + fd = fdopen(socket_client, "a+"); + if(fd == NULL) { + perror("Error opening file\n"); + exit(1); + } + //fprintf(fd,"pas d'erreurs d'ouverture\n"); + fgets_or_exit(str,8000,fd); + int parse_ret = parse_http_request(str,&request); + skip_headers(fd); + if (parse_ret == -1) { + if (request.method == HTTP_UNSUPPORTED){ + send_response(fd, 405, "Method Not Allowed", "Method Not Allowed"); + }else{ + send_response(fd, 400, "Bad Request", "Bad request"); + } + }else if (strcmp(request.target, "/") == 0){ + send_response(fd, 200, "OK", motd); + //--- + }else{ + send_response(fd, 404, "Not Found", "Not Found"); + } + //fflush(fd); + //partie 7 + char* absolute_path = rewrite_target(request.target); + printf("test - - - - - - - - %s\n",absolute_path); + + FILE* fichier = check_and_open(absolute_path, "document.txt"); + if(fichier == NULL){ + send_response(fd, 404, "Not Found", "Not Found"); + } + int size = get_file_size(fileno(fichier)); + if(copy(fichier,fd)==-1){ + //error + } + fprintf(fd,"Size : %d\n",size); + + fclose(fd); + return 0; +} diff --git a/webserver/client.o b/webserver/client.o index 7c8cbca5fa3bfa1170d9f816730c56282f35a0f3..88b2369c111e19c7d878762d520d6a8990874f8a 100644 Binary files a/webserver/client.o and b/webserver/client.o differ diff --git a/webserver/html/index.html b/webserver/html/index.html new file mode 100644 index 0000000000000000000000000000000000000000..8c33582881288e8139547479adbcb9e17f949aef --- /dev/null +++ b/webserver/html/index.html @@ -0,0 +1,34 @@ +<html> +<head> +<title> </title> +<style type="text/css"> +<!-- +h1 {text-align:center; + font-family:Arial, Helvetica, Sans-Serif; + } + +p {text-indent:20px; + } +--> +</style> +</head> +<body bgcolor = "#ffffcc" text = "#000000"> +<h1>Hello, World!</h1> + +<p>You can modify the text in the box to the left any way you like, and +then click the "Show Page" button below the box to display the +result here. Go ahead and do this as often and as long as you like.</p> + +<p>You can also use this page to test your Javascript functions and local +style declarations. Everything you do will be handled entirely by your own +browser; nothing you type into the text box will be sent back to the +server.</p> + +<p>When you are satisfied with your page, you can select all text in the +textarea and copy it to a new text file, with an extension of +either <b>.htm</b> or <b>.html</b>, depending on your Operating System. +This file can then be moved to your Web server.</p> + +</body> +</html> + diff --git a/webserver/pawnee b/webserver/pawnee index 64b0a4f448da27deb176f20f2ac22a8016a27c44..7898a0eeef236ff65f4a0899df1707b396d61081 100755 Binary files a/webserver/pawnee and b/webserver/pawnee differ diff --git a/webserver/socket.c b/webserver/socket.c index 84ed6a3109be6c69442977f7001c1f445af134ef..10c3514958a161952f284f90e1dee4addcc88c70 100644 --- a/webserver/socket.c +++ b/webserver/socket.c @@ -55,7 +55,7 @@ int creer_serveur(int port){ perror("fork fail"); exit(1); }else if(pid > 0) { - //close(socket_client); fait une erreur si on le met + close(socket_client);// fait une erreur si on le met }else{ // à déplacer ailleurs pour une meilleure lisibilité //traitement final traitementClient(socket_client); diff --git a/webserver/socket.o b/webserver/socket.o index 02a2d23ceca50a003abc28b9e641d79a42a5ea7a..20535edd1ca9c83a38a339db091c21897291131a 100644 Binary files a/webserver/socket.o and b/webserver/socket.o differ diff --git a/webserver/test/document.txt b/webserver/test/document.txt deleted file mode 100644 index 8eca45cd5ac9af096831abc25a50e6c38755d142..0000000000000000000000000000000000000000 --- a/webserver/test/document.txt +++ /dev/null @@ -1,3 +0,0 @@ -testons -le -fopen