From 00656716f220f2f1b16229d1dbcfce7339f766e3 Mon Sep 17 00:00:00 2001 From: "romain.gabet.etu" <romain.gabet.etu@univ-lille.fr> Date: Mon, 8 Mar 2021 14:44:47 +0100 Subject: [PATCH] partie 6 non clean --- webserver/.client.c.swp | Bin 1024 -> 1024 bytes webserver/.http_parse.c.swp | Bin 0 -> 1024 bytes webserver/.socket.c.swp | Bin 1024 -> 1024 bytes webserver/Makefile | 67 +++++----------------- webserver/client.c | 69 +++++++++++++++++++++-- webserver/client.c.save | 64 +++++++++++++++++++++ webserver/client.o | Bin 3488 -> 11352 bytes webserver/http_parse.c | 109 ++++++++++++++++++++++++++++++++++++ webserver/http_parse.h | 64 +++++++++++++++++++++ webserver/http_parse.o | Bin 0 -> 7344 bytes webserver/libhttp_parse.a | Bin 0 -> 25058 bytes webserver/makefile.dep | 3 +- 12 files changed, 317 insertions(+), 59 deletions(-) create mode 100644 webserver/.http_parse.c.swp create mode 100644 webserver/client.c.save create mode 100644 webserver/http_parse.c create mode 100644 webserver/http_parse.h create mode 100644 webserver/http_parse.o create mode 100644 webserver/libhttp_parse.a diff --git a/webserver/.client.c.swp b/webserver/.client.c.swp index a8adeb964feb5960ac505a8183ebe78242a2d52f..262f617627917e7bf7f067072e3599d63ee7d0bf 100644 GIT binary patch delta 83 zcmZqRXyBM2!FXVzWU!%rMt*LpetKe3YDtm4Q)y9ZVyS*WQGR-Sab<CQVwrxfiJ^gE ZvVM7LQgLcgS!$8~#+)E#!B7S?004#57eW94 delta 18 acmZqRXyBM2!MJ3iWbnqhLCg~mH~|1T1qP7- diff --git a/webserver/.http_parse.c.swp b/webserver/.http_parse.c.swp new file mode 100644 index 0000000000000000000000000000000000000000..4b057ebc05b5c11ba9ddc95116f2e7be53239623 GIT binary patch literal 1024 zcmYc?$V<%2S1{HyVn6}TtPBk4iAkv?MJU2pImD{VC@Cq3FGwsZPSs1sYS5_QXb6mk I09``>0F`tM?*IS* literal 0 HcmV?d00001 diff --git a/webserver/.socket.c.swp b/webserver/.socket.c.swp index 9017acf93d988d16bb06a04afd00767c47005434..7637776f53ecf29d2aae54527982f7ababf6641e 100644 GIT binary patch delta 13 UcmZqRXyBM2!DPs?QR*2p02sCdqyPW_ delta 13 UcmZqRXyBM2!F11Wqtr8I03J33n*aa+ diff --git a/webserver/Makefile b/webserver/Makefile index 3caa64d..0a86850 100644 --- a/webserver/Makefile +++ b/webserver/Makefile @@ -1,58 +1,21 @@ -# Ces variables servent à préciser le compilateur que l'on veut utiliser -# ainsi que les paramètres de compilation -CC=gcc -LD=gcc -CFLAGS=-Wall -W -Werror -LDFLAGS= -# Le nom de l'exécutable à fabriquer -EXE=pawnee -# Les variables HEADERS, CFILES et OBJS vont contenir respectivement -# la listes des fichiers .h, .c et le nom des fichiers .o à fabriquer -# On utilise la directive particulière \$(wildcard ...) qui permet -# de construire automatiquement une liste de fichiers -HEADERS=$(wildcard *.h) -CFILES=$(wildcard *.c) -# Cette construction de variable veut dire : remplacer la chaine ".c" par -# ".o" dans la variable CFILES -# Ceci nous permet de construire la liste des fichiers .o à fabriquer -OBJS=$(CFILES:.c=.o) -# Même utilisation que précédemment. On précise les règles qui -# ne fabrique pas de fichier du nom de leur cible -.PHONY: all clean mrproper -# La règle par défaut déclenche la fabrication de l'exécutable -# par dépendance -all: $(EXE) -# Cette règle permet de construire l'exécutable. Elle dépend des fichiers -# .o et effectue l'édition de lien. Rien de nouveau ici -$(EXE): $(OBJS) - $(LD) $^ $(LDFLAGS) -o $@ -# Cette règle permet de construire automatiquement les règles -# de compilation pour chacun des fichiers .c -# l'option -MM de gcc analyse un fichier .c et -# affiche sur sa sortie standard une règle compatible -# make pour le compiler. -# Ceci permet d'ajouter automatiquement les fichiers .h aux dépendances -# des fichiers .o à construire. Ainsi, en modifiant un fichier .h -# tous les fichiers .c qui incluent ce fichier sont recompilés -# Après votre première compilation, regardez le contenu du fichier -# makefile.dep généré afin de comprendre exactement de quoi il retourne. +CFLAGS=-Wall -Wextra -Werror -g +LIB=libhttp_parse.a -makefile.dep: $(CFILES) $(HEADERS) - $(CC) -MM $(CFILES) > $@ +SRC=$(wildcard *.c) +OBJS=$(SRC:.c=.o) +HDR=$(wildcard *.h) -# Cette règle efface le fichier de dépendances et les fichiers .o +$(LIB): $(OBJS) + ar rs $@ $^ + ranlib $@ -clean: - $(RM) $(OBJS) makefile.dep - -# Cette règle effectue la précédente et efface en plus l'exécutable +makefile.dep: $(SRC) $(HDR) + $(CC) $(CFLAGS) -MM $(SRC) > $@ +.PHONY: clean mrproper +clean: + $(RM) $(OBJS) mrproper: clean - $(RM) $(EXE) - -# On inclue le fichier de dépendance qui va contenir les règles -# de construction des fichiers .o -# S'il n'existe pas, make invoque automatiquement la règle -# qui l'a pour cible + $(RM) $(LIB) -include makefile.dep +include makefile.dep \ No newline at end of file diff --git a/webserver/client.c b/webserver/client.c index c1cd904..331af9c 100644 --- a/webserver/client.c +++ b/webserver/client.c @@ -6,19 +6,61 @@ #include <sys/wait.h> #include <stdlib.h> #include "client.h" +#include "http_parse.h" +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-Length : 17 \r\n%d %s",code,message_body); +} +/* char* testCorrect(char* str, int first){ char* strRet; + http_request request; char *correctStr = "GET / HTTP/1.1"; char *correctStr2 = "GET /inexistant HTTP/1.1"; char *incorrectStrBR = "HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Length:17\r\n\r\n400 Bad request"; char *correctStrOk = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 17\r\n\r\n200 OK"; char *incorrectStrNF = "HTTP/1.1 404 not found\r\nConnection close\r\nContent-Length:17\r\n\r\n404 Not Found"; - if(strstr(str,correctStr) == NULL && first == 0) { - strRet=incorrectStrBR; - }else if(!strcmp(str,"\r\n")) { + //start-line à véfifier avec le parse_http_request + if(parse_http_request(str,&request) == -1 && first == 0) { + //strRet=incorrectStrBR; + skip_headers(str); + }else if(!strcmp(correctStr,str)) { strRet = correctStrOk; }else if(strcmp(str,correctStr2)){ strRet = incorrectStrNF; @@ -28,9 +70,9 @@ char* testCorrect(char* str, int first){ printf("---\n%s\n---",strRet); return strRet; } +*/ - -char* fgets_or_exit(char * buffer, int size, FILE *fd){ +/*------------------- int first = 0; while(!feof(fd) && fgets(buffer,size,fd) != NULL){ char* resTest = testCorrect(buffer,first); @@ -40,11 +82,13 @@ char* fgets_or_exit(char * buffer, int size, FILE *fd){ } first=0; exit(1); -} +}*/ int traitementClient(int socket_client){ /* On peut maintenant dialoguer avec le client */ + char *motd="Bienvenue client"; char str[8000]; + http_request request; FILE *fd; fd = fdopen(socket_client, "a+"); fprintf(fd,"Bienvenue client\n"); @@ -53,6 +97,19 @@ int traitementClient(int socket_client){ exit(1); } 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\r\n"); + }else{ + send_response(fd, 400, "Bad Request", "Bad request\r\n"); + } + }else if (strcmp(request.target, "/") == 0){ + send_response(fd, 200, "OK", motd); + }else{ + send_response(fd, 404, "Not Found", "Not Found\r\n"); + } fclose(fd); return 0; } diff --git a/webserver/client.c.save b/webserver/client.c.save new file mode 100644 index 0000000..59fcc42 --- /dev/null +++ b/webserver/client.c.save @@ -0,0 +1,64 @@ +#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" + + + +char* testCorrect(char* str, int first){ +// char* size = ""; +// sprintf(size, "%ld", strlen(str)); + char* strRet; + char *correctStr = "GET / HTTP/1.1"; + char *correctStr2 = "GET /inexistant HTTP/1.1"; + //double strcat fait bugger + char *incorrectStrBR = "HTTP/1.1 400 Bad Request\r\nConnection: close\r\nContent-Length:17\r\n\r\n400 Bad request"; + char *correctStrOk = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 17\r\n\r\n200 OK"; + char *incorrectStrNF = "HTTP/1.1 404 not found\r\nConnection close\r\nContent-Length:17\r\n\r\n404 Not Found"; + if(strstr(str,correctStr) == NULL && first == 0) { + strRet=incorrectStrBR; + //printf("---\n%s\n---",str); + }else if(!strcmp(str,"\r\n")) { + strRet = correctStrOk; + }else if(strcmp(str,correctStr2)){ + strRet = incorrectStrNF; + }else{ + strRet = NULL; + } + printf("---\n%s\n---",strRet); + return strRet; +} + + +char* fgets_or_exit(char * buffer, int size, FILE *fd){ + int first = 0; + while(!feof(fd) && fgets(buffer,size,fd) != NULL){ + char* resTest = testCorrect(buffer,first); + if(resTest!=NULL)fprintf(fd,"<Notre Serveur> %s\n",resTest); + first=1; + fflush(fd); + } + first=0; + exit(1); +} + +int traitementClient(int socket_client){ + /* On peut maintenant dialoguer avec le client */ + //const char *message_bienvenue = "Bonjour, bienvenue sur mon serveur\nExcogitatum est super his, ut homines quidam ignoti, vilitate ipsa parum cavendi ad colligendos rumores per Antiochiae latera cuncta destinarentur relaturi quae audirent. hi peragranter et dissimulanter honoratorum circulis adsistendo pervadendoque divites domus egentium habitu quicquid noscere poterant vel audire latenter intromissi per posticas in regiam nuntiabant, id observantes conspiratione concordi, ut fingerent quaedam et cognita duplicarent in peius, laudes vero supprimerent Caesaris, quas invitis conpluribus formido malorum inpendentium exprimebat.Sed fruatur sane hoc solacio atque hanc insignem ignominiam, quoniam uni praeter se inusta sit, putet esse leviorem, dum modo, cuius exemplo se consolatur, eius exitum expectet, praesertim cum in Albucio nec Pisonis libidines nec audacia Gabini fuerit ac tamen hac una plaga conciderit, ignominia senatus.Post emensos insuperabilis expeditionis eventus languentibus partium animis, quas periculorum varietas fregerat et laborum, nondum tubarum cessante clangore vel milite locato per stationes hibernas, fortunae saevientis procellae tempestates alias rebus infudere communibus per multa illa et dira facinora Caesaris Galli, qui ex squalore imo miseriarum in aetatis adultae primitiis ad principale culmen insperato saltu provectus ultra terminos potestatis delatae procurrens asperitate nimia cuncta foedabat. propinquitate enim regiae stirpis gentilitateque etiam tum Constantini nominis efferebatur in fastus, si plus v + char str[8000]; + FILE *fd; + //status = write(socket_client, message_bienvenue, strlen(message_bienvenue)); + fd = fdopen(socket_client, "a+"); + fprintf(fd,"Bienvenue client\n"); + if(fd == NULL) { + perror("Error opening file"); + exit(1); + } + fgets_or_exit(str,8000,fd); + fclose(fd); + return 0; +} diff --git a/webserver/client.o b/webserver/client.o index 1ed8fdae63b1dd7e3cc24efdf9ffa85921daf1b5..904a2e3cbda3538b0c2c85f6b755c44c460cbeec 100644 GIT binary patch literal 11352 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 HiLM_28{RY? literal 3488 zcmb<-^>JfjWMqH=Mg}_u1P><4z>vU&U^{@B4h*~uJPe^8oliZQ-#B=5)}H7rJ>t>J z3X=5bbp3!}zCbV^Aec80%nKgfp&vZDT~By)Ui0WY{sL@7>w!{%=Gr3+rCc7}t`9sq zU4Ojx0;}mY1<OO#wH^Q~xB*t6>Cqkf0;~vOQ0svbkO>#S3OGEDyZ!)c?{@v+(Rs|H z*A~Rv0U{vQcDw#Kc^K*|1CP$y7oDX~JUT;f9C!T#QuNxpJM@o7x9bap1z^uM*M49q zk%9W-h6mh@2$PSy{s9H7N4M(@xF3<&tp`e_Ji0?~bo)L58-EV2sP#Z;H`Mn1AQQmu z1iP^DO@cfFL+9Q#5B~q}ZUvE0i=kly^0EimqX%~hGB7ag18IkP8ElG2bL|g?QZZy9 zgcTm$p+7u&TQ@xT|9_u@JOcyVL0}Uhu>|(s$-@i`?yeyU`U)N)Ap!b^dWH~gW?pJV zW^qYkUI{`1rb5BQz(Bz%F-0LLwXig`xP+I>IX^EiHMt}+KhH`bIVZn36)aSenpdLh zlbV-al3`_N&dbHi1=Cmr(FlqZ1_lPWxkd&C3jW?;y#$O?fS3o-05t|-j){SZLSBA} zLRx-lUJ9~t1RQ6g;Fn*b;0Dsgz{|y;tE<bUTFj-ZtIJ^HmtRtpst}x7RF+y=WT&87 z%*BwX&ES-onpc*ZSDLDjoRgWFSHi{MT2z!@q>x{bnwOcEu8@|Qlghy0?(A%(py865 zl$n^PV4-KMXP|4Q31NVpE&?VQ7#OR97#J%A7^QjGIVLbNFvu`KFi83uh;ZZ+Xk&8b zWn;R?!_L9LAi==EU;`3oU|?7TqG9q33=9ek3=9z<F$M;PJ`fF)W9kI!1qtE8pp?eK z@bN!3d1kC73<Co*12Z<|49pBHIK;t)4Tc;u13QKoNPwAv14Ln9W(GD4F;H<Qgyc?e z*fB6Lh%qoQ2w<pYV9>!KZj3|R6Nk7J0|NudUYLF0I02<^9O?sbh==14kHI1Cj6*yL z>YfTvgu>DR0|P@b4)s+y#2aylci<3bfMf=}WQLN|;u7clqN3E~5{7tpAAcuDpLl;a zw_w+h_z*`YAJ=$>;*z4`k|Ge5oLj(<mY!Nt9G_nlpIVVw!jM)_l$lqO#*mhlQ(BzC zkd~UC22sIKQk0lklA4>ESK<uLcMNGMpe)CbR$i1@lFCq!3d)5HY2cy=6eo~KXJTMr z0HwM={~<sYBFq32=Z5k%pfpTe1<D7d2M`k`UIXGVFfiCbX_)vCC_fZRgK_}KY?!^J zP;r=gL1_HcLd8Mqc^DWNVCv`L5I+PJhnXV+HRlXe9ApkJk~y#p4HD->5|@PPgP9`_ z<*Pwyka~V3^_EEDp!@`Lrz?^;sLFzg$03OeA(>NxBrc33J_#xgbB{5UKNCuW+#`yl zek)WQrrr$7-vy;X>OpxQ=AIK!ahQ4!DE};!2B{ZEGXFY~II=t6BZ>1NssD{64l1Kz z_JYb}P}G3z1z`{ygduG*25>qAiNnedP<{u=gTz1>mX8_qiYs$V5|bG8ic5+hbOwx7 zl$w*MSCU#$!l0LuSdz$~msDKLpjVU+;Uwqhf-((*US57ls-C-FsBUpdVsbWv9#~sy zMtoXPVs0wPPHJF~e?dWkUP8nC%Leikl0_i3NL&VK1_p5L0aFi?(|}eH9Z>zC@*boY zRzrZo9Hdr_fdO0#pw~=pP<<dZ$QWb>G9OegfXpOUzai9qbn85z0`X`Tg6u-J-x8|d z09lZMfnhn+L9p@*CJi$VMms_E!{lM~5vYC`A4bFU!T6wh2qXq|E=-u=1XO<oTm-^E zcYhF$_}c&~e4zCrNGB-%KzczK#D~QnHoHOc4xkJQYTrN|1}a-YMxyHni9wwT(gw#f jpb4@cE&^eI?1Qi%B&ZC-rvC@XU<L+;M2IptiLM_25-vNi diff --git a/webserver/http_parse.c b/webserver/http_parse.c new file mode 100644 index 0000000..d042a58 --- /dev/null +++ b/webserver/http_parse.c @@ -0,0 +1,109 @@ +// Copyright © 2019, Université de Lille. +// Created: 22 janvier 2019 +// +// Corresponding author: Michael Hauspie <michael.hauspie@univ-lille.fr> +// For full author list, see AUTHORS.md file +// +// This software is governed by the CeCILL license under French law and +// abiding by the rules of distribution of free software. You can use, +// modify and/ or redistribute the software under the terms of the CeCILL +// license as circulated by CEA, CNRS and INRIA at the following URL +// "http://www.cecill.info". +// +// As a counterpart to the access to the source code and rights to copy, +// modify and redistribute granted by the license, users are provided only +// with a limited warranty and the software author, the holder of the +// economic rights, and the successive licensors have only limited +// liability. +// +// In this respect, the user attention is drawn to the risks associated +// with loading, using, modifying and/or developing or reproducing the +// software by the user in light of its specific status of free software, +// that may mean that it is complicated to manipulate, and that also +// therefore means that it is reserved for developers and experienced +// professionals having in-depth computer knowledge. Users are therefore +// encouraged to load and test the software suitability as regards their +// requirements in conditions enabling the security of their systems and/or +// data to be ensured and, more generally, to use and operate it in the +// same conditions as regards security. +// +// The fact that you are presently reading this means that you have had +// knowledge of the CeCILL license and that you accept its terms. +#include <string.h> +#include <stdio.h> + +#include "http_parse.h" + +#define min(a,b) ((a) < (b) ? (a) : (b)) +#define in_range(a,b,c) ((a) < (b) ? 0 : ((a) > (c) ? 0 : 1)) + +int parse_http_request(const char *request_line , http_request *request) +{ + + if (strncmp(request_line, "GET ", 4) != 0) + { + request->method = HTTP_UNSUPPORTED; + return -1; + } + request->method = HTTP_GET; + /* Find the target start */ + const char *target = strchr(request_line, ' '); + if (target == NULL) + return -1; + target++; + /* Find target end and copy target to request */ + char *target_end = strchr(target, ' '); + if (target_end == NULL) + return -1; + int size = min(target_end - target, MAX_TARGET_SIZE); + strncpy(request->target, target, size); + /* If target is more than size, \0 is not add to dst, so... */ + request->target[size] = '\0'; + + /* Now http version (only support HTTP/M.m version format) */ + /* Quote from RFC: + Additionally, version numbers have been restricted to + single digits, due to the fact that implementations are known to + handle multi-digit version numbers incorrectly. + */ + char *version = target_end + 1; + if (strncmp(version, "HTTP/", 5) != 0) + return -1; + if (!in_range(version[5], '0', '9')) // major + return -1; + if (version[6] != '.') // mandatory dot + return -1; + if (!in_range(version[7], '0', '9')) // minor + return -1; + if (version[8] != '\0' && version[8] != '\r' && version[8] != '\n') // only support version number with 1 digit for major and 1 digit for minor + return -1; + request->http_major = version[5] - '0'; + request->http_minor = version[7] - '0'; + return 0; +} + +#ifdef COMPILE_MAIN +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "usage: %s http_request_line\n", argv[0]); + return 1; + } + + http_request r; + if (parse_http_request(argv[1], &r) == -1) + { + fprintf(stderr, "Fails to parse request\n"); + if (r.method == HTTP_UNSUPPORTED) + fprintf(stderr, "Unsupported method\n"); + return 1; + } + printf("request line: %s\n", argv[1]); + printf("method: %s\n", r.method == HTTP_GET ? "GET" : "UNSUPPORTED"); + printf("target: %s\n", r.target); + printf("version: %d.%d\n", r.http_major, r.http_minor); + return 0; +} + +#endif diff --git a/webserver/http_parse.h b/webserver/http_parse.h new file mode 100644 index 0000000..95545d2 --- /dev/null +++ b/webserver/http_parse.h @@ -0,0 +1,64 @@ +// Copyright © 2019, Université de Lille. +// Created: 22 janvier 2019 +// +// Corresponding author: Michael Hauspie <michael.hauspie@univ-lille.fr> +// For full author list, see AUTHORS.md file +// +// This software is governed by the CeCILL license under French law and +// abiding by the rules of distribution of free software. You can use, +// modify and/ or redistribute the software under the terms of the CeCILL +// license as circulated by CEA, CNRS and INRIA at the following URL +// "http://www.cecill.info". +// +// As a counterpart to the access to the source code and rights to copy, +// modify and redistribute granted by the license, users are provided only +// with a limited warranty and the software author, the holder of the +// economic rights, and the successive licensors have only limited +// liability. +// +// In this respect, the user attention is drawn to the risks associated +// with loading, using, modifying and/or developing or reproducing the +// software by the user in light of its specific status of free software, +// that may mean that it is complicated to manipulate, and that also +// therefore means that it is reserved for developers and experienced +// professionals having in-depth computer knowledge. Users are therefore +// encouraged to load and test the software suitability as regards their +// requirements in conditions enabling the security of their systems and/or +// data to be ensured and, more generally, to use and operate it in the +// same conditions as regards security. +// +// The fact that you are presently reading this means that you have had +// knowledge of the CeCILL license and that you accept its terms. +#ifndef __HTTP_PARSE__ +#define __HTTP_PARSE__ + +// Method supported by the parser +enum http_method { + HTTP_GET, + HTTP_UNSUPPORTED, +}; + + +// The maximum size of the target string. +#define MAX_TARGET_SIZE 1024 + +// describes a http request +typedef struct +{ + enum http_method method; + int http_major; + int http_minor; + char target[MAX_TARGET_SIZE]; +} http_request; + +/** Parses a http request line. + + @param in request_line the line to parse (as a null terminated string). The line can end with '\r\n', '\n' or nothing after the HTTP version + @param out request a valid pointer to a http_request that will be filled by the function + + @return -1 if error and 0 on success. If the error is an + unsupported http method, then the method field of request will be set to HTTP_UNSUPPORTED +*/ +int parse_http_request(const char *request_line , http_request *request); + +#endif diff --git a/webserver/http_parse.o b/webserver/http_parse.o new file mode 100644 index 0000000000000000000000000000000000000000..201d5634e46c81fa7db63169a55f2cd59abb0c03 GIT binary patch literal 7344 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 literal 0 HcmV?d00001 diff --git a/webserver/libhttp_parse.a b/webserver/libhttp_parse.a new file mode 100644 index 0000000000000000000000000000000000000000..82b66a6b5ed5439e85a2baf72f535797422bf4b5 GIT binary patch literal 25058 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 G==uSnRoc)1 literal 0 HcmV?d00001 diff --git a/webserver/makefile.dep b/webserver/makefile.dep index 425baca..1d9fbc6 100644 --- a/webserver/makefile.dep +++ b/webserver/makefile.dep @@ -1,3 +1,4 @@ socket.o: socket.c socket.h client.h -client.o: client.c socket.h client.h +client.o: client.c socket.h client.h http_parse.h +http_parse.o: http_parse.c http_parse.h main.o: main.c socket.h -- GitLab