Skip to content
Snippets Groups Projects
Commit 8c7d3864 authored by Romain Gabet's avatar Romain Gabet :speech_balloon:
Browse files

666

parents 00656716 c8dbd147
No related branches found
No related tags found
No related merge requests found
No preview for this file type
File deleted
File deleted
File deleted
CFLAGS=-Wall -Wextra -Werror -g
LIB=libhttp_parse.a
# Ces variables servent à préciser le compilateur que l'on veut utiliser
# ainsi que les paramètres de compilation
WRAPPER=$(if $(shell which clang), clang, gcc)
CC=$(WRAPPER)
LD=$(WRAPPER)
CFLAGS=-Wall -W -Werror -g -I../../parselib
LDFLAGS=-lpthread -lrt -L../../parselib -lhttp_parse
SRC=$(wildcard *.c)
OBJS=$(SRC:.c=.o)
HDR=$(wildcard *.h)
# Le nom de l'exécutable à fabriquer
EXE=pawnee
$(LIB): $(OBJS)
ar rs $@ $^
ranlib $@
# 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)
makefile.dep: $(SRC) $(HDR)
$(CC) $(CFLAGS) -MM $(SRC) > $@
# 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
.PHONY: clean mrproper
# La règle par défaut déclenche la fabrication de l'exécutable
# par dépendance
all: alldeps $(EXE)
.PHONY: alldeps
alldeps:
make -C ../../parselib
# 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.
makefile.dep: $(CFILES) $(HEADERS)
$(CC) $(CFLAGS) -MM $(CFILES) > $@
# Cette règle efface le fichier de dépendances et les fichiers .o
clean:
$(RM) $(OBJS)
$(RM) $(OBJS) makefile.dep
# Cette règle effectue la précédente et efface en plus l'exécutable
mrproper: clean
$(RM) $(LIB)
$(RM) $(EXE)
include makefile.dep
\ No newline at end of file
# 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
include makefile.dep
......@@ -10,6 +10,7 @@
char* fgets_or_exit(char * buffer, int size, FILE *fd){
char * ret = fgets(buffer,size,fd);
if(ret){
......@@ -45,53 +46,21 @@ 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){
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);
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);
}
/*
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";
//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;
}else{
strRet = NULL;
}
printf("---\n%s\n---",strRet);
return strRet;
}
*/
/*-------------------
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 */
char *motd="Bienvenue client";
char *motd="Votre requète est bonne";
char str[8000];
http_request request;
FILE *fd;
fd = fdopen(socket_client, "a+");
fprintf(fd,"Bienvenue client\n");
if(fd == NULL) {
perror("Error opening file");
exit(1);
......@@ -101,14 +70,14 @@ int traitementClient(int socket_client){
skip_headers(fd);
if (parse_ret == -1) {
if (request.method == HTTP_UNSUPPORTED){
send_response(fd, 405, "Method Not Allowed", "Method Not Allowed\r\n");
send_response(fd, 405, "Method Not Allowed", "Method Not Allowed");
}else{
send_response(fd, 400, "Bad Request", "Bad request\r\n");
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\r\n");
send_response(fd, 404, "Not Found", "Not Found");
}
fclose(fd);
return 0;
......
#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;
}
No preview for this file type
No preview for this file type
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include "socket.h"
#include <sys/types.h>
#include <sys/wait.h>
int status;
void traitement_signal(int sig) {
printf("Signal %d reçu\n", sig);
int pid;
while((pid = waitpid(-1,&status,WNOHANG))>0){printf("pid terminated %d\n",pid);} //-1 n'importe quel proccessus
}
void initialiser_signaux(void) {
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
perror("signal");
}
struct sigaction sa;
sa.sa_handler = traitement_signal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction(SIGCHLD)");
}
}
int main(int argc, char **argv) {
/* Arnold Robbins in the LJ of February '95, describing RCS */
if (argc > 1 && strcmp(argv[1], "-advice") == 0) {
printf("Don't Panic!\n");
return 42;
}
initialiser_signaux();
printf("Need an advice?\n");
creer_serveur(8080);
return 0;
}
No preview for this file type
No preview for this file type
......@@ -17,13 +17,11 @@ int creer_serveur(int port){
perror("socket_serveur");
exit(1);
}
int optval = 1;
if (setsockopt(socket_serveur, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1) {
perror("Can not set SO_REUSEADDR option");
exit(1);
}
/*Utilisation de la socket serveur */
//bind
struct sockaddr_in saddr;
......@@ -35,7 +33,6 @@ int creer_serveur(int port){
/* traitement de l'erreur */
exit(1);
}
//listen
if (listen(socket_serveur, 10) == -1) {
perror("listen socket_serveur");
......@@ -59,11 +56,9 @@ int creer_serveur(int port){
exit(1);
}else if(pid > 0) {
//close(socket_client); fait une erreur si on le met
}else{ // à déplacer ailleurs pour une meilleure lisibilité
//traitement final
traitementClient(socket_client);
printf("fin du client\n");
exit(0);
}
......
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include "socket.h"
#include <netinet/in.h>
#include <sys/wait.h>
#include <stdlib.h>
int creer_serveur(int port){
//socket
int socket_serveur;
socket_serveur = socket(AF_INET, SOCK_STREAM, 0);
if (socket_serveur == -1) {
/* traitement de l'erreur */
perror("socket_serveur");
exit(1);
}
int optval = 1;
if (setsockopt(socket_serveur, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1) {
perror("Can not set SO_REUSEADDR option");
exit(1);
}
/*Utilisation de la socket serveur */
//bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; /* Socket ipv4 */
saddr.sin_port = htons(port); /* Port d'écoute */
saddr.sin_addr.s_addr = INADDR_ANY; /* écoute sur toutes les interfaces */
if (bind(socket_serveur, (struct sockaddr *)&saddr, sizeof(saddr)) == -1){
perror("bind socker_serveur");
/* traitement de l'erreur */
exit(1);
}
//listen
if (listen(socket_serveur, 10) == -1) {
perror("listen socket_serveur");
/* traitement d'erreur */
exit(1);
}
//decouper ici ---
int socket_client;
while(1){
socket_client = accept(socket_serveur, NULL, NULL);
if (socket_client == -1) {
perror("accept");
/* traitement d'erreur */
exit(1);
}
int pid = fork();
if(pid == -1){
perror("fork fail");
exit(1);
}else if(pid > 0) {
//close(socket_client); fait une erreur si on le met
}else{
/* 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 valuisset, ausurus hostilia in auctorem suae felicitatis, ut videbatur.";
while(1){
write(socket_client, message_bienvenue, strlen(message_bienvenue));
sleep(1);
}
close(socket_client);
exit(0);
}
}
return 0;
}
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include "socket.h"
#include <netinet/in.h>
#include <sys/wait.h>
#include <stdlib.h>
int creer_serveur(int port){
//socket
int socket_serveur;
socket_serveur = socket(AF_INET, SOCK_STREAM, 0);
if (socket_serveur == -1) {
/* traitement de l'erreur */
perror("socket_serveur");
exit(1);
}
int optval = 1;
if (setsockopt(socket_serveur, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1) {
perror("Can not set SO_REUSEADDR option");
exit(1);
}
/*Utilisation de la socket serveur */
//bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; /* Socket ipv4 */
saddr.sin_port = htons(port); /* Port d'écoute */
saddr.sin_addr.s_addr = INADDR_ANY; /* écoute sur toutes les interfaces */
if (bind(socket_serveur, (struct sockaddr *)&saddr, sizeof(saddr)) == -1){
perror("bind socker_serveur");
/* traitement de l'erreur */
exit(1);
}
//listen
if (listen(socket_serveur, 10) == -1) {
perror("listen socket_serveur");
/* traitement d'erreur */
exit(1);
}
//decouper ici ---
int socket_client;
while(1){
socket_client = accept(socket_serveur, NULL, NULL);
if (socket_client == -1) {
perror("accept");
/* traitement d'erreur */
exit(1);
}
int pid = fork();
if(pid == -1){
perror("fork fail");
exit(1);
}else if(pid > 0) {
//close(socket_client); fait une erreur si on le met
}else{ // à déplacer ailleurs pour une meilleure lisibilité
/* 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 valuisset, ausurus hostilia in auctorem suae felicitatis, ut videbatur.";
int status = 1;
while(status>0){
status = write(socket_client, message_bienvenue, strlen(message_bienvenue));
sleep(1);
} //traitement final
printf("fin du client\n");
close(socket_client);
exit(0);
}
}
return 0;
}
#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"
int creer_serveur(int port){
//socket
int socket_serveur;
socket_serveur = socket(AF_INET, SOCK_STREAM, 0);
if (socket_serveur == -1) {
/* traitement de l'erreur */
perror("socket_serveur");
exit(1);
}
int optval = 1;
if (setsockopt(socket_serveur, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1) {
perror("Can not set SO_REUSEADDR option");
exit(1);
}
/*Utilisation de la socket serveur */
//bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; /* Socket ipv4 */
saddr.sin_port = htons(port); /* Port d'écoute */
saddr.sin_addr.s_addr = INADDR_ANY; /* écoute sur toutes les interfaces */
if (bind(socket_serveur, (struct sockaddr *)&saddr, sizeof(saddr)) == -1){
perror("bind socker_serveur");
/* traitement de l'erreur */
exit(1);
}
//listen
if (listen(socket_serveur, 10) == -1) {
perror("listen socket_serveur");
/* traitement d'erreur */
exit(1);
}
//decouper ici ---
int socket_client;
while(1){
socket_client = accept(socket_serveur, NULL, NULL);
if (socket_client == -1) {
perror("accept");
/* traitement d'erreur */
exit(1);
}
int pid = fork();
if(pid == -1){
perror("fork fail");
exit(1);
}else if(pid > 0) {
//close(socket_client); fait une erreur si on le met
}else{ // à déplacer ailleurs pour une meilleure lisibilité
//traitement final
traitementClient(socket_client);
printf("fin du client\n");
close(socket_client);
exit(0);
}
}
return 0;
}
#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"
int creer_serveur(int port){
//socket
int socket_serveur;
socket_serveur = socket(AF_INET, SOCK_STREAM, 0);
if (socket_serveur == -1) {
/* traitement de l'erreur */
perror("socket_serveur");
exit(1);
}
int optval = 1;
if (setsockopt(socket_serveur, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1) {
perror("Can not set SO_REUSEADDR option");
exit(1);
}
/*Utilisation de la socket serveur */
//bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; /* Socket ipv4 */
saddr.sin_port = htons(port); /* Port d'écoute */
saddr.sin_addr.s_addr = INADDR_ANY; /* écoute sur toutes les interfaces */
if (bind(socket_serveur, (struct sockaddr *)&saddr, sizeof(saddr)) == -1){
perror("bind socker_serveur");
/* traitement de l'erreur */
exit(1);
}
//listen
if (listen(socket_serveur, 10) == -1) {
perror("listen socket_serveur");
/* traitement d'erreur */
exit(1);
}
//decouper ici ---
int socket_client;
while(1){
socket_client = accept(socket_serveur, NULL, NULL);
if (socket_client == -1) {
perror("accept");
/* traitement d'erreur */
exit(1);
}
int pid = fork();
if(pid == -1){
perror("fork fail");
exit(1);
}else if(pid > 0) {
//close(socket_client); fait une erreur si on le met
}else{ // à déplacer ailleurs pour une meilleure lisibilité
//traitement final
traitementClient(socket_client);
printf("fin du client\n");
exit(0);
}
}
return 0;
}
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment