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
zcmY$iNi0gvu;bEKKm`U!TnHPPR8TN7G=Zu};9_84;9+23lwx4ud4?TZRxvPyr6J?w
zqSVx)_~O)}veeQdhP3q5lH&OMqWIK`%o2vo;`rpEoHT~w?977rjMT)G)S_aB;?%s9
z_~Mepl2RzUD7CmCKd(5Ip`<7=vm`Y)HLt`uCo?s#grOj@s5mt~qokxDz9_Y@G_|;d
z0jd$9G`=`9JufkbAu}(tBr`E5vl!$WkWgs_LvCVb9s@&hesXqdiC#V|WFY>BcpAcn
zkY*;3kT9||g9s=jaMio|xG^y@GQa>MgB=5c2NPvr2;e}l9l%Tn23`gphER{rryk93
z3_5G?>;ehz18LsR#K6Gt0>tff{nK3g=YOe~N3Si24;I`HQUhikcl`ijd-R5W=yv_%
zxPyg(fx)Bm;x3SWut}ZA!RnfS;4~ubxa$KZhHlq8{M!#eRi|~jK05CD1Z1B_ukV9y
z*FU=izy_a#D!^l0x9gvMpkzXnN{Ej^_CS?)y8dXc#qCzGUpigCG}nH?>7VA>FAVjI
zyIp@kjYJ7JkX2wqpm7dQmJH5`c?x;?B?`r<B?`g*@j<Sk!LE)jE<p<U1tppJc??OJ
zc_|9ugn~%RIhn;Jsd*6561Y)`$;qh&B@Ai#McE2ziJ3VJX_<KnDWwX@kR;3C?(A%(
zpy865l$n^PV4-KMXP|4Q31KiWFo=Mh$iTqBSQW&;SRueD&BM+yfsuhhh5>>>(&eBy
zcjOajV{+zY0}0^4Af+q}AOB-h!i+VgGB7YRFk@5Bz{~(jUzk$N46K-f3?OsZafl;j
z1|${C44A$Fr6nOGcY^)Sz`!8Ez`y`Xlt|jaOg$XprZ~iHaELqN5ck0$9)v?Y9EW%u
z4)IhR;#oMvt8s`!6S!V718Vsj@9yL8<meOc@8%Zl8WJDk=;Y%X4^_-ikXlrfU&H_|
znu}9QK*>G7poAf#BtNehoC6pjNuB{Ijbka4OG}Cwq`|Sl08TO73=9l^{zHH^R2)=7
zfl>`j+yE*LN?|-m>aCE(d6C4Eki_|r#PguyF!MoXfrN@d1Ovo9ATgM|wMgQ~=1)Kp
z=SMPsBa%2M{lU!H3l)dis{`d9g3{>zI)fyRZ0~I(aX}<|pF_oA=0oZb28K6Kadh*)
zA&DcK&jl(Fpy42dWWE$s9A<tPRKGk_9Nm0PBynW(^^nAck<7P)io?v0g_`dS6-PJU
z7fBr1{8%J$P+18J{}iY=%=~ny`I%60kolrW?kPqRM>bypst;ri2t&CH40^?txh087
z40^>SMG!gz#wtq9Nz^Mzttes8OGzwAWY9}0E@sdx%7<{0^K(Hh76!e%{E}2XcfU~G
z;*!MVYz95Bw$zOHw4%gZP_~C#MF|7sevsGDOHx>Rft8;yJ3wk-Y!D5~x1g|ssRxOH
zummWxGB7agfCdVvTn6cdmE@rE7^F@ORCj^Peh?3Vw}TWTxNsJ_Feu-E%tWt&h}CZh
zwIAwCxIH_d7FEJUAPkUQ5Eg{AgzATtM-Wj421BTUvM>QC4K)^CLpee9L#5%AA5=eF
z0Lp;rhjJM}^#w=_U3mahzyhWaN~60UR1aZ`zYEZ+7#2^U_yg$$VUSTUacp*j<U64D
z3qWa5na;_;z<{nFB!(V$ApJ8yj$&Y7XaI4LFvvb6E(55{!>0cQ)cuLbim`+>q?JW{
zTi(#n*whHz)F-|zFQJZb1SFq0Fo-gUz}xa3owYAIOP_djhTib#4!zOs`^2N$^+o47
z4_K45)Aff(bL|g?5;l)+*B`IB5Dog1hru0!&e|U!8UAeyHoT?$Af`w20Y(s)tArcG
z1v5+8!KwN+>kg26Vj)@^-vr2mIstokJox|LqkAft>TNyn;Q#-94qzEbm%sxe26I#E
zfl{W|7bZ-AI-vQDf=6fVkIvFB9-W~tJi2{fbccQcS?tjZYDqD8bRGv=3T{l}(A4Ss
zz@t0#MYk_lBa-*KeIF2ETH~7rWd?@My*+pS|M%zx7e5}Iu0Oh4Ap&4$AOiG*N4M(-
zkIsX;KnV!k^+9g<do<U6V8GRh^5_oz;L+Q<05gQ9P5|2tmh$Ml1`DfB*EbN`AR*aY
z`{sYCZ+9z5aq|zxQbn+2FQ`^w@aP3qIt=@!GJ@g+qW*O~76qU-KFs{raUQ*3(>$6F
z@E`&l9M-J|K<0;nlE(*+&WkYfPk{SpQ1j)nm_G%{0bprp(1By|<YAAHkN|x{JwpZ6
z6b02{UM>db{JfIXyb@iX)V%bP3<WC%LvsaQF0d?vQ)X&jS!!NsDy&bFsEr}U#o!8R
zODg0Sq~>Mjr7NUm=A<(Crj}&nrzrU4mnb;q<m8v9rtorM5oB;mOi_UL=XtrnydY@r
zUZ26=n*pTXEx$Amq#Mp=*uw^C-7zq5fD08+D-V<};CMH*=mH6VnM^mtLB%~Y2e@ou
zW&%?zEUcM%B@C<_2@DJjY<{4sj1gR!vPFW~-~x}C1+11CA_F#zSydcVi8C{SQz}GA
zT?SM<K-ijMIUxNUNYc|JmohLgK%}QjgV^jGtQ;U~z?QJcGx6VKU|?Y7IL5%h04i7+
zSXKBCY$G0bxVSkI+ZxOU74Qr<*bF(QF)=WJN^1r-V|I`RD94NwWD*BN#vIHMfN(6p
z90>@=63kJ6aIC-_4G6~?%rSs)Y``1~2*(!8ae#0fz#I<<#}Uj4fN-3^oCpZVMQlA2
z149CY<0i6|iGd*l!tnsRx&XrQ1anFt953!Q3=9kv5RR`9D6AVG96x?gd%p?7@#g@=
zd^3a-$bXuNfuRG!iR1+({|OLIwD>h928J0BPK@M3CI*HD5Kb)EIV&KXIL;#s3=A6}
zoOmu>P@4$CNdUX;0ECmo@tlc);Rqyl+1Vxe8Nowm3=C}AeBhFSm17kXC~iR#e4sc7
zxr-l^9zmjum>3wK$}S?9cbFI$z-qrUF))DD3PaKbM<*XMGe{pOvcV~ZqYEqoVRs|g
zoKoP_!56~7z+k})>O-^XGDA}rr?eDE2%I3fB!sJAiIYoGq!-SX5}653$B+yFNzQ@-
z+*eswGBYrMdK3)Y*SQev8{9kL;y1ZZf~s~tPi6)NkSN#({0w}d%nS@588DxnfiIDn
zf#D`I)Q8Lr;FK)DeVOA6Gc+Z0-{PzWnZ&>bQU>-T_hUJbG=%*G%m({Wkp*gw0|T2N
z3$(q$BgZHOk^pBj9(f1{)LUU-X949>UKO@@7T8z}sF%UO$RNtY!mGzQj|J)kUIS4F
zP?H86+q{Mxpq#}5;TVBAketP94A#N}iMI7D3=CqRDE`k3Nf^8)%pi-zK}8Z{I4j5y
z5EF!pz=aqC1LGVUR>*J%17o-pNCnHpKRfCrL24Ky!9@ep#0;t8k|GAiD0Yxq=7|#=
zA=1(OARAdGHtejIN=sp2jNt&K5~hg>5a|>)ka0{CV<4{cWre!VULMkYXVe83d?1@Z
z<sgV=oU;P%8eJ)fX&K<QBcrYw#IzJB*8-%6X<`JF8w}wFK#kUb8x5|=K`psCU*JY-
zNT3+4p@L$xh8e`H2&h@IaI@S%ZUmcU%mxcISxJyt%oA5Y14SMhNE;l%gK7+n5-8zr
z4L2f{je$WH9Ig_Q5DPOH<Uq2FyzHQ|6T}2zR}cZV6yjB08IUa8=e!ya$A`#*qJY-~
z<Qk@l9#TcAB@B#w0uZ$s3=E8djH-OX+{}E^e1eQZ>;mEp3`}AS%zRed*4&odp27?a
z%qk4r+;-f|d<+aMP$mZh11moRH&~iYjRB;J9mHo~;4p#cWd-TAm$Z>&VBmxbfsKO*
zaS1ar^Ko-S>|hjTVBqG3XalPOmFGMNH!v{p3NtYCfsEo~Wb_mUspnT@@D$ePW?&Fd
zWME(r6lX*>ObFR91_ogkMrJ-cZjfsc7K&&vF!RZ9Gcbq>Gjg*c#Kph{vobJ<>oM9(
z!h%6v(o+}|It~)koFqZ^ORyrjmq~(wK@!=MAOR^824)V3xt_ux0clhNQH+y8m4jI}
z9b%a*E1FSq*p*Ln0%b5zR~B5B!aGTjgaWFKAS_hUlnK-r2xDYmU}XHw$IHOT2%c8}
z@%2lKi}Z6cll0S*ll3bs%;L>VbaOKEN-K2J^GfwC^fU94b4pWE8NlkG987gdnI*+2
zN>Di1)$5m37Nnx;($7mR$;?YFVPJrEwvs{qC@x7!Nlnws0QH2ydh{|tWn5`qW^qZ1
zUIu7LIX$%`zn~;OIlm|sB3WEgRGM58@8;>_s+R#8Dnzh~OHwlPA=-*7i{n#^ia<k;
zFl{NBc_q4~nRz975Rps}&C0+4nd*UP1J4S9Cy4YiKn`SJHD}<2#0RJX<6&eK<Ird2
z=4fV>C}kDQU}a=rVqsjsDr>~b+svv{!YU8qd$CG_s5Puc3`{I6UaUGGs)T`wg_X^V
zfr*8!1gwpdEs|Bikd>K3g_WISJ}cW3R%TBFRz@XO7kgGF4g*$3j_a%mcC1Vs=^Q>_
zjs~-u4J!wS2rK&rRwj;8Ru+!ktjwjmS(z5F3UQROGI6YBW!=rnm(I$T#>x`O%FOYF
zm51XCD>ugkR%UOGFRV-)H&}Ugvoc09F)=VQf~F|)QW)|JN)n6G8RGMEQsVQ|(uz|{
z81yspb5r%x6O&R)iu9dIi&7Iy^#h9X)8j#5npmcvYhq|%n5<u(ngpJoD`Ln6x6m0t
z(s`*xMGWzt{_(|$WvTJ0c`0B{c~NEwgjbxAUsR$1YAY9KR;9+5Fl6SL#V4ku6hTLm
z;~}X7tScu!IXk|D0p=`_sStw-N{Sfb({d8iiy7kMK@n<f1X2fP8k&Kbsd;6YMfrIQ
z@wtgb+2HxX%3{!*9w<G)ClKS)K(mag#qmj{X$&B9EaE}q)+Gh;P#@(Nlz{yc4{~KG
zLvcw8h?|q2m#zRNK>h%ynB2sy{34KJAf7QaV~7X29-7t};ELmuON-)@^K(jb^FXRI
z^GZNgqE2t-=9i>^f&~;R@j3bV1xcWRKalT137w%d50qY0QxuXj5{n?yp75zoWSRKn
z{FKz>vJ!~pU>Cr(g4_-AFC^T+aRLqkn9(44kcE)I0|yN_Tro`nSptqMNX#T97N;`A
zm*$lgr=}P&Kzn0g`J&Xsl=uQr#DS7Yab`L=CP0=Xm8O9c3S#mVI!}u-zYFSX#=E<Q
zFo3<Cn_66)n4TJ+l%G<`5MQ2|k{S;lH-*P2#Ps-r#1vD8q|&ss)FKA3Hx*FAz}+uY
z!P(FpGLNR9n_E(vmuj1ynwMIXnXI6j3!3`2t*|iDH8WArO@~INUNSs#67wn{5dfV&
zjt3=GGn4odhN9HO;{3e$f{Y??fPln7$uc<uG<6J0`QR`?xEoyJ#Dgk#aEK%(XO|Yl
zg98&(q~(ECgTe_c1WEcv4Dq@7DXCy7aNt7Z;!7b((AbCpl(ADw7~;!H5|eULL2dx$
zZjc4w%n4QxiVSEm2`UOe6F2doUUyzT130yTRD(?iWo1ZG&&)$k>J|*(m<ja@4h;zK
z4+?R0VE`+G#eH!}N`7ex*p;BP0!onhCo{n<XHdfk&s?S}sAz`GWimPNuya7>IYIMs
zASrNj3?^R&mIgQ5VnC7%3=H5FA55Of5v%|-S6Ty=2e&R^@&#aNu>Ltvc~HZS0VdDn
z3045ozXvK0Zid6;nR6Mz3ZQc66eD<EWuWF-;f-JvXECESK46l}kd7ma3#XYO!vk<W
zjKK`)j>5QbnwbGKI|k>%8O&H`XF+qqpxHXOGB5+w!9$+o1*Zuz=6FFpIMAFN*ia<G
zgaOnuWn_Sv3r<rE3=E(&2C^46CJjzY3=9mOQ1zguImj4r8e(8z2*oki3YyCTne!W@
zn1O)-oTeBU7_y<}c!ClJ0|Ns%Eio`KfYK&5cQ)fNzYB->L>%HvaEPzQA&w{xQL8WP
zbH!ja@QN3uWJg}PlU7ianOBkqDOKUs8b-~KmI4|fWJm*7I<N_7NEwP&_!K4Q7BHkG
z=j0cI#@RqYtpXyzc@8v=ftX{qM-m4O2gBwFS0agnQXxznGzbKe0`=!XBN#Ao^f_0U
z_!p33sJ)=!U6{BsG@e1`fXY6YxG7W|)c6Dq|A7Z~7#J9wpyD9)$mYQ2IAQ8Fq4woL
z)x*SLbK|8@agaHnE-1|2iBNHvdhiM&1_p*{P;roYP)7x(ehE|@rrsZF?@FjRNWByT
zBAhoPi6e*eX(VyvaDIX$4w`3#+4~tu9F&J);`|_oKnI>c;Rc)Y7ef;-hq_Z4Dh_g|
z7?L{;pyD73WDY1lfwY)|1dz<10TN_jU~qwoqni@}6$eoub3pkFq$L3)08I~|x&!9^
zGN?F+0;yjHQp~`>&<qlQsz-L`1gJQO0;z|k*XbYuBzJCwnzIBdj_%G4NaCRRN|<|K
zH3X=<1rOgr&4G=SgTz6Y1w6LK0G^8jDFKOrun|-olva_&L1_ZS2c;zt4T?^v6F^)B
zSo#H-0Un?Oi!v~P*6M(mAaM|emBXNN8Cl!}YM3)fkbwa_AP7?b5h@OA3xLEx7&b?p
zfu<fjTgJe^kdG!V3^k_=P5cVTBMb}-pfxriDUjJ9+z1u#1PLO!2d2LdP5dI1KMP8O
z%m86n{jvg0JO^t2S~T%&X!!3$6Ay-ppG6bD1LZ$}(jYrQ7#8=iwId)g5QZva_yJ{r
z#6VaD>K+y-4H5%kAyC2t)hTG=>!EyEC=F5z!uz4-YN3f|L&M)3O<WCXz6+Z838;Sq
z(Zs!>=ER|i!`AF%qlv@PM+KVrTB!N0XyUC<^CzK+|A4BWk0w4HD!v9yJQ^AfJJH0S
zLB)@ui5El7xr`<*2@RhIXyUt|>ffS?gUVu%6~EBLVf6<))PJD30^yfXb41X@VWTLD
zXyWlubM?@~Vda=LnmEke9%$mHp!`rM4RQ+zUxo6MpfpGfgqflC=A(%}hVpBmG)OH7
zAA<U;6HPn{%7>M=AhjS2nkoQ=+hV9ZNDPGMfdm;C7*?Z+D?s^|pfpG=2<JiL>n@sj
zJ=8rv(8QNR#kpWKw5&;onj?lLZVU|vB{Xr+nh=mv?a;*8pyqg?i3>o@2}2XthPp2a
zO&m1N2Qt3^P5dR)oN_dAE2wxYnz$X*JrmKygQ4o@qKRLF@^3+DP#A-7JIFB%3=GfF
z#I>R3{6Z7AhVo(I0Wt%G=Rwu0L)`@u1K|p2IGCV`zlYlEh$b!pH76KN95mwz(h`X#
z?g`~*L1~bkAnXlN%)r1<jwbE_HNOQ-+!)HA2&F-0fbb)ze>b3sM?v{}pfpG=2v3Ci
z_c&A>WF1Hd)~~q-6$hyWVc6Qq_h{lXK^hqt82CVq8)#YvsZRzO#=yX!izeO+b*CSi
zIIMgOg^GiW1sMVBf8{{ML1u$+Do6pS9!C>*18HJlVCX^<kA>Ph6HR<CRQ*acad)Wt
z4N!5Abs(j%`u#Xm9OM=dhPme&nmEioPtn9-?)i!)4w@teC5b;!ahScZc9bx*!3VMv
zgkkn7qlv!)IhKKe!30el7M}J{ahUnAesmgC9Aq{KcY_o#FfbHC#X(%C(I96sv_Qo{
zYC#xg?_@ObDrk5@g~9DT7#m~|tnZ9&KFojU;-EE=AblXWfG~&+!k`5MAQ~hF!Z3e<
zR(>Fh!@?6rgVcgBEPfY&6hqtRAaPi@9Y7O@<rnhTl7g3vrlcm7rpIUIrR6i|LD-2&
zNkyq;&=sXnp`ygR^i<F?RM6s7h*(Z$UMfrrXkJr~PD@ik;SY)v<TwNc4J`c8C&WN%
zLGmyR>MMeZ5}10J_y+L2IRk?MG`)cO?jXJ3X?^JU5lAhrHL1Trkp)tKhCyZ^3xOu`
zKxRU%flCpqAJ>{xnEu0X6Cn(A`|Utus1PX>av#(|2hai*T|a2W0k-ga0PVPK0A)t-
zSQP_!2L{NmAd5g_2_V`Fhy8U>eHYOzMB_4m#>ddbK<4^GJD%ukZPC?6K>Nz*@jpQo
zWC{ZVOg||8LH$c~_ZQ-De?8QGOSE)=Za-*A2)6J$0JR?$P9Xb1OF+==2kkKcnF(_z
z#MKN8JD?5nDv;qYK_s_=^niprpknCyjX;AX3=9mQK0Zht48!!nXwWzzj15x*qWz)z
zL2P7<t`;<I0TM$CCWZj0{u{`ek=6vmgcst7zZ=l-gS8hx;Rh<)(Zdg$-5|3yK!a=y
z3=9{b4g)y{6r||-L1_Y-RY2O{_y=h4g@J)#6I=ws0NDp&K}gWp7B>AEpn?Uo7!0Be
zPNM4v4`hPJG$HGfp_>Q6tBxUT2npL?Xl`r**=R_@{=x!iSqO3jB%ffcNxtFHS$e^v
z+x5mSP<q2yS6U+C(d~NSIB5Q!VFzfl&dY_MHKSlLkf|V@`#?oGY?&%(H7<A=b14@@
zeIZDFv+EB=&_ZE!r5_+`aG^@wKuSR?cC}r9>;ldFd)R_We*Z(Au5Y?s-*_a0oO;2d
z*MkRSnn&j`kIwVp6|f%Np%*|3W*l>2;$Z-<Wo<sd=+Wu=z@yvs!7fl+2-9y+YtMt0
z$#%Ow@Mu233R*&~Uk6%T4d+_cLDelssAB`E(<^~WfQEKJ)_61@U<XMc3;=U2>)63T
z@j4T#h=YF{L(72@RV1zrZ;2Q(m#YM-#}q0GavA@=1HA#@5a<kGfr^7{Ko;i!k6WKS
z?Cu((0G_(jXSmBuU=8eJq_hdnHRP;;g)Dw$=U`?8=QQXlSm?@EX2_C2u;I+pBtdf;
z5cYIw5F2TI>kSq|4t*x*+CvuT;#5#xWneMmTm&jdARKcrM*zaH0COZD97`}q0m88Y
zb2K0vYcR(E!m$B!EFc_PFvkJHaR75XARI?9Cji260&^lD92YUr5Jdun<0b;y%aH-$
zKo_S%IMBtZ5RMl&XqdSI!htSMg>d}%OBom#njjp1ju0jWhGqySkUs^qI2FQ)<ekRA
zz%T*Ai53S9Zp?siVkE1W7#J2nII&>otblOhI6-yQ1_%ebI2FQyE>4ATk~kU=i&I(I
zB|!s_;JTben-5fhF|cwtgBPcQBzQoJQ$g<H1+^nUi%db|I8bF-u*Jo!9HmSQ3}CgO
zVQjEkVFplX%)r*kHwSDQD6%0UU0@LiyBon~hb&Iz0WD4iEqmo>U^@m{@(L<`*rlaF
zLZJGAft>|31;nAk#>fmCr3RJJ42%pyJS-e~oDQ%RtsDlTk3gvp>}?K1@WM<M2nV`K
z6T&eDYvF;oKaiP$K^Wv$*eXp96K0S_;M#^!17)=!EI%>M0S!Wc2gVsSR6rAeOcOnz
zTt|=;(?kbwZNq3J0FljraLu_uDV=Fz0)%S?b|TZn7zo!DDjUGS$^mi~)fWk(FaP62
zUa<#S{>O#9{Er*9{Er8={ErvBN{^d?fe(4v9b|1GKWIgu0Jb%Mg0MAzLa1y0gu$k<
zGBAkXTvrEL^CybF=1&aSa?lb#22hh76!Fjnzn}yJ#<2JTbC8G|jG(o5OrW)PbXt3-
zkFksov^)>XaytgdDhx>b0pC))VwBZ%%naaVACR?hprt3E)pRTj;H6#AWg?KZb4aZd
z$bdL2Bl0>q4MtXuFRbhwC9L8;tbFrXMHaA1E?{Nn@Mh&JW#yXBDjo&n@Xu%E;7DU-
zv1JubV`XV#m3qd?b&r)}H&`>DH!J6SR`xZloS^k|UaTA-Y7Hx&H!D9_7>|4@NSi81
zy%(!Ah+4yH&A`OM<i%<TqSmnTdb28)vZ`KVm9RlDxJzNn<3I~vlAtS-C|Vp>mReK{
zItu{0qztks2fW~^xUx8&<n?mM%Xq-k-;hOBX^_=$p8lY<Y><^h@TG4cufW&vz*k6t
z7JPwY5$Z7L;x>p7WH}pn2^)CL7kEJ!^4c{|fA9iK^wnsY>3Oh~Y4G)DC@Zc&Zh@{U
ziw7^r0yzUD2=NPeO%nd~V_;pV%ecTRkl<^>2rUN#*#=vR1YM;R4<6(oZ8aD;Tu}T5
z4mwzlL#zb@v+%C|0=WpZ$PaDJ7dTF_FY^N1f_j7rBw-Q1+6!fw7ue~!;FVqAz$9il
z7btbamoVU8&BXu)B485#`4r$n7QSZc-sqYsXqdq$YOI+8wVgm~j$mej!<>PE0bJ+8
z1d(WS&^#>?AI1c&l>xV@U;<DYv=$1RIBI2tCGlckG*nztlm}YBQ(RJ%oKeI8<`#hV
zVuRL8fUE>n)}XE%Y^?&WwLPHy(IEApE-a|c2UFh!5`>O3Ad8<v5(kYhz|_O$xMB9f
z`$bR&$b69hVd`N+Y@lW`Z2lZ%G;|0FJVp(YgRNx&xd9{(5(8mlkVOm(4B$2)(%c7Z
z?1<8}6QD63kbUTDCt!25=xZlnb1~>^C$>WU4`~V@)>?Q$#X)0fAbUW50%3Kicm+rh
z$zQNFPxWZxu(`Q5G;vO-Io)XDUeIuxjwbE^6^G3&gWLkba!_-&p{ZX7<-^8WL25y`
z2de%8R30P-!l$A9yHFY=2Ew4u4M^w}h(Pjh4%D3QXyUNB0ra&KptKKCDhSmFG8=?p
zYkOe+0EvMxNG%A%<}g8GAbcDe4i;$U<Uqw;(ZxZAFfcF#p^3xJDS^%5gUkluAgDPo
z|AE9n7_>bSWK<=ZIZaUYZD``Kd@>nLTnNfv0Hr}@gD`9j&ssF`Bq)Culm@8<Vb~gg
z<7ncrHC?c^JRr3o><Cr&5K4o@Kp1B3J2dg5Q2uWy4N?oju(3}LsJ}sCAPifpA&Ms6
z1?4M2X^>hFu7;WmTdM{V1L2oYbv95MBnHBA&;d!<S~ZXu2!}(>fvu?liGlDfs5op*
z8b}O;<Dllk=6FG3APieGfxhNJ9BMCY?i!>Pgg=530|NsCY%T{R2EyPD3j+hgb*Mcc
zF%X8W<$$fx0EvO{Q>Zy#(bU7%(7@(QKx#qwCsZ8|)LkGk5DtWzBZ(#sEBDpV#NR>9
zF-8;L2o(=P6NjzIh(i;f2UVX56$b@7R0!;%2B<j5jUfCCq=12ep&w1W1u8xdO&sPP
z*cv5}86XUrBLP{k2Tgq>)bi74;-EFoAoa-g8jKAR2i1Kb8srS95g;xDth_=O2Mr8^
z6oAx%Fo+GtWS^TeJm)%L?KE)MK<9N}Y!HoWuJZw?!N<VB02+}4sROlTKyd&bfhA(D
z6Sg)Mq!$^3%s}RY22Ma`LX!(zidg-)<~m{e!Q+N-QyIXs4M<!DTyveUHDwRc9ER?G
z(6}9_?FN|xL73bD-KKB@n#e)n2V#Q!3Q`4YhvAy*<OeBcU|`Tdvk;AobFR}I+Gs?d
z!$a2(%E#E;4;ddMf37nfYX2QH3(>d?pz&jD_D=v0NJ95iL+6S?afu#&xaK;Y!2_)f
z44OFN59SVBbDcTR1_Zftot;qqptwfHFneKQxaK-1K=l(ke+k!I=L#(02P$LH!w=*h
zl=2hmuoF=GPk<CKFffoh*Es=Net-s_p+<r!sBvI6hye9l(4q(=%y0ne{taLrf<V^~
zI#Cre%L$&|RDjHEBC{bPu(?hn3k!$<33HvuTbdyG9OW!kh0a>g3}WXo=m|jJX)^HC
z;cKyO*FRXq!HquXq~U(h)F)Uq<m^?3`qQxUjT+y8TJzw;h4zE?aDY{LfDS|Dfm#I-
zfgM)Vn(!ZVbP<GVKEMH+I6dwPQYYZi3zh*Ng6h$EY(FUIK@toYCc+%h{6?U&_K!zr
z>4)apKa6#T(8*5@k8TF2>tR;39w-$?cGC_m1_p-L3Si@r#rIE;hn_SG4yBWagFz?b
z=75d?DoQ=Pyp)TfATvdwB(*3vGcU0uHAO)+g$ugN8bl=~gAPa42=;V$_V97hWYA4a
zDa%YwWpK&QQ!h~nNX*MjR%Gx?O-)fq%u|5K*%KaSB4&&UyoMS!#>5l`-j)X%OMvx%
z8$n4FE?)zehxK>C{ad(vGFTp@1sevX@u7T%DyWPRWcc(SRIY>k2ctn%BJvm#I84bH
zLju*=pt1~PHZlf{A%V<?nG22+1_lPuvLkHjqi~E-fzEuxral*kdeD9#kiD?|58${a
zW8WR9F2ZIn_}FN@WZXwhV;=*9Zip*S%q%I$1nmpQJdYZB0Bdn(dTMS#NhN5LZ*gWi
zB$t701&y46#?cBuXRM;0><Xz9K;aLnKaj`LV09)a-a*v}Y)lLNELKpN2GS4P?})A*
zbS5rH9%MeKI)|A9TbB${4>AKL4jU^1iG$J_OuP<c2z0$9$epmh1898!ND8DL6z(wf
zpow&lILKa5Uk4@*+kXX84=Oxi;-CYXK<Yu_pmrWi95%)SG6!TY>=?hRAjQzJLu7kl
zhbF_+!}i;;g9-$wdQe#fGaojV0aFh;3le0sIFfqM_#aF?@_s>3^$Zh-?T>+(1KWqE
zkHZ{GBymtR4KoK8t{`(j7~~cZhSZs$2~P-y<xli=udw_>{(4n9EieUnih+Rv<X=!w
zK%44NQ3eK>e_{KGU=kp;FgA$B)%S7$B^FRw0}Vt_8U*PDm8&3qu)YImIT%PBz5N91
z%Y)P+V~|>8KCZqOvHEfKy<qxbV=*v0(d`HIoj_vfeU#@QK_b=}g3>!wDa;Bm%>oTK
zFb9c1R|^{32Z^C8hmEbl#+YG7z``HK2kmnK<#||q!^8uieIE~~04V-IdO;W@1dBgx
zc7x<Wi)BEx2Gn7oeh;YpL)Q-yLyvoqz7-%xf%e^kI7k>|9}*Y5-x8bt8Bq6w>Oo}n
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