From 6f6caf9ae749122edce9219b24f0d0db91103351 Mon Sep 17 00:00:00 2001 From: Manax <paul.ripault.etu@univ-lille.fr> Date: Sat, 27 Mar 2021 16:17:18 +0100 Subject: [PATCH] 7.1 rewrite fonctionne --- parselib/Makefile | 21 +++++++++++++++++++++ parselib/libhttp_parse.a | Bin 0 -> 7484 bytes parselib/makefile.dep | 1 + webserver/client.c | 20 +++++++++----------- webserver/client.o | Bin 12936 -> 13144 bytes webserver/pawnee | Bin 30928 -> 31040 bytes 6 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 parselib/Makefile create mode 100644 parselib/libhttp_parse.a create mode 100644 parselib/makefile.dep diff --git a/parselib/Makefile b/parselib/Makefile new file mode 100644 index 0000000..0a86850 --- /dev/null +++ b/parselib/Makefile @@ -0,0 +1,21 @@ +CFLAGS=-Wall -Wextra -Werror -g +LIB=libhttp_parse.a + +SRC=$(wildcard *.c) +OBJS=$(SRC:.c=.o) +HDR=$(wildcard *.h) + +$(LIB): $(OBJS) + ar rs $@ $^ + ranlib $@ + +makefile.dep: $(SRC) $(HDR) + $(CC) $(CFLAGS) -MM $(SRC) > $@ + +.PHONY: clean mrproper +clean: + $(RM) $(OBJS) +mrproper: clean + $(RM) $(LIB) + +include makefile.dep \ No newline at end of file diff --git a/parselib/libhttp_parse.a b/parselib/libhttp_parse.a new file mode 100644 index 0000000000000000000000000000000000000000..0c4dd11a5c7b87ccd3b3f3e8a126fe136ee4de57 GIT binary patch literal 7484 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 literal 0 HcmV?d00001 diff --git a/parselib/makefile.dep b/parselib/makefile.dep new file mode 100644 index 0000000..6f3c2ce --- /dev/null +++ b/parselib/makefile.dep @@ -0,0 +1 @@ +http_parse.o: http_parse.c http_parse.h diff --git a/webserver/client.c b/webserver/client.c index 86a9585..dc7077c 100644 --- a/webserver/client.c +++ b/webserver/client.c @@ -9,10 +9,11 @@ #include "http_parse.h" char* rewrite_target(char *target){ - char* ret = strchr(target, '?'); - char* rep =""; + char* ret = strrchr(target, '?'); + char* rep = malloc(strlen(target)*sizeof(char)); if (ret!= NULL){ - strncpy(rep,target,atoi(ret)-1); + size_t i = (int)(strlen(target)-strlen(ret)); + rep = strncpy(rep,target,i); } return rep; } @@ -51,13 +52,11 @@ void send_status(FILE *client, int code, const char *reason_phrase){ } void send_response(FILE *client, int code, const char *reason_phrase, const char *message_body){ - fprintf(client, "entree dans send_response\n"); 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); - fprintf(client, "sortie de send_response\n"); fflush(client); } @@ -79,25 +78,24 @@ int traitementClient(int socket_client){ fgets_or_exit(str,8000,fd); int parse_ret = parse_http_request(str,&request); skip_headers(fd); - fprintf(fd, "avant if parse_ret\n"); + + 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){ + }else if (strcmp(request.target, "/test?aled") == 0){ send_response(fd, 200, "OK", motd); - fprintf(fd, "fin du else-if\n"); + }else{ send_response(fd, 404, "Not Found", "Not Found"); } fflush(fd); - fprintf(fd, "après if parse_ret\n"); //partie 7 - fprintf(fd, "avant rewrite\n"); char* absolute_path = rewrite_target(request.target); - fprintf(fd,"test - - - - - - - - %s\n",absolute_path); + printf("test - - - - - - - - %s\n",absolute_path); fclose(fd); return 0; } diff --git a/webserver/client.o b/webserver/client.o index 066d5262986b302f03094657c64a67905db02f24..2c0e013e071acfdb9c3c6a46923d20cfde59dc03 100644 GIT binary patch delta 2890 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 BLBaq4 delta 2656 zcmcbS){#0vgULg8qLx&oNAnv6kIvc`9^I}l_SrKqFnDwxf58BzU4MA=vO<|3Jeq5N zFqEizbi4k5sc3$|=#hNEquUpx`GZI2Ihce;x9f+K8&8EYPqty<o2<wpJ=ufBfGzX^ zNPMy)lepjqn93a><4+!Dn7okX;^b=95H1B>1ziQzVlD>h$v0RP7%evcWS!4a@5Jg3 zQV7M|Ob`a+9B)<z1_=;{(MbxVf@R{L9rco60T+&A3=9lR6EmcWONtm6UD-iunI}$g zgh;#buV-OkV42vkvtBAKg@MtXgP9qmJOLsdzy>moX<`hR%fy&GS(00U(R8vEw`{$s z6hvtT#AZ`9h|&}&*TN5MZv>PZ4B-YaNQ0eazy_i~*c3!CFfcIAVP=E*!axGWXaf}# zqYcbJW^pr3jDQ-ZI{6{DtdgoENE7qK6;Q9KL%q7ekwFGz2cyDd1s=tC1xb)@rimF0 z;$Trxc2EF;m>}#5BEYV>1b2<73`hmjM5tFpH6X4Dkp%^qs0qkcrimU>MX4nWjAD}) z@W`6S!A*hqo*QNYL=g`>PKr_s7#Mk>+=R^{yq6d!zvq)=w3z%+Pn@x6vm$>XqvUQ@ z4i4|NtdgayO1oIuY*;xtqF5QdS<MY6?-W?gxO;M{pgQkvjy<f>9J^VWIMO-RZk{Q) zjb(Cxn1m|G;~)%j57<$Td;)Du&b(|)kv!}i4B&vVnLJTUo-t<fMlpHDn#mW%<QeBo z{wOBTxM#AUxU@V-_Z^US1_lOjf`ggB%*MpS&M{e0PjYjHxCbL++~kcC=8R^OFG`3r zT7yVQX9flaAqGYUu*D1v46v{b1j#b`fJo19sG7x4E3Bb(JXHK1l<x+mbD-iXj1U1> z>Zt&kCfNX$jfBcxfhc0=1IaQ@1(S0?q$J2bklS>jc?j$^1_p*LAX&!UVDb={yb31o zOx`Hv$&s8<#E@8$pE;RFI-0Gxq$npfZ*rQn7YhRegXH9m(&CaTPzyn(f{Khk{~^G7 zvY?DOW60!((&Ca$P&FW3A`A=+Fg0^0JIaWAvO}E?k`+dh6+;piLlSp|io<OD3$gHj z&}2qg@%k1tSw5)UoltR*EuahubHh9&aZu8QiLXKu2c-y@_;#o`%yvzv`9~n)li6hj zJ?}u+3@|lzP&E&s;^=Pp02PO+cZ90{3-XbnC`cGovM?|(fI=9SFr=X3=%%Sn{wOP6 z?+BFzQ6OEQ<OMP|2qb`HS_Mdufq@|sDh@JD9x1f5q2eG4WKK0yeE~>-fq?;}UI9sc z6+~PMEFp>{F$p387DtZe)sr{MiP!H!k_DAgu;9J~6$eou>-(VAUk3?5tw)Z|&rop? z1ya8Vs{R*90Lj}hadu{~f_kvCq>!8|4v~Pz;a0FZ1_n7a@q<utZKyaXJdn+?hl+#j z2RZ00RJ}V?9Hd@}AsCS<VxbZ+4d<a6vY_H14agQWLB(O}FG1C}Pj-|Sub+Y@`v@vK z8;AG`s5rVUTad(Mk%H+AR2*je8>smgA>xzW<pm{QLfG)2WP~R7cOVxsGEV-eAZ{oE zvJfeL1fXgZq2eG4R3pREh3;fUMe)r6iUAyqx|0`bE@zCK?5Wkys51GcRyor>hRH$N zag2*6Z`9UjjGO#WyMA(oPC~r{)NLTQf-tO<PCyd}m6RYMP}vHiL25x5Rx&RD2}0cp z5{H${2hhY}W%2`vI2SkoKpJ#6C+dnbGFnWo)HCPQ03}}r28M#kJN3*ND<*%`vuCWB zY^ZO~Spo7i0|SHp<Vt;W&gG!g!@$5GKY6FVIp+*eo?~EO5SaW^-<<Op55$U#lPwL* z8K+M!G_Yq{p*?w%fgR^@XaQI@`KN(7(+%y(Muv8bwv!7D?U_!BPTpi_$Mj5ea-g`_ zWDX+@t{0#T%fP_!gJH6jkr~qm?a4((cAO7Dr7r^mL&D^pM&_Ijpv1?(!0>qTPa|`# P89ES~H!w`D(vt%K@&y#l diff --git a/webserver/pawnee b/webserver/pawnee index 31cf41fdf96cf65c5704e25bfb80e00d06621ed6..f46482c23bd2832173b8165a1d603411df82bca1 100755 GIT binary patch delta 4545 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 QlM5@%nauJhuPRgn0I}ctssI20 delta 4605 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 LAUyZUibe7O^B~J@ -- GitLab