
Projet développé à l'école de codage Khouribga 1337.
Auteurs: @jamiafathiya & @achrafelkhnissi & @ abellaismail7
HTTP signifie Hypertext Transfer Protocol, qui est un protocole utilisé pour transférer l'hypertexte. Cela soulève deux questions: qu'est-ce qu'un protocole et qu'est-ce que l'hypertexte? Dans ce contexte, un protocole est un système de règles qui permet la communication d'informations entre différentes entités, telles que les ordinateurs. Hypertext est un terme obsolète pour le texte affiché sur un écran d'ordinateur contenant des hyperliens vers un autre texte, c'est-à-dire des documents Web. Par conséquent, le protocole de transfert hypertexte fait référence à l'ensemble des règles, des serveurs et des navigateurs utilisés pour transférer des documents Web dans les deux sens.
HTTP permet des sessions et les états stockés sont partagés entre le navigateur et le serveur. Si un visiteur navigue sur une galerie de photos, le navigateur et le serveur peuvent échanger des informations sur l'emplacement du visiteur dans la séquence en passant des informations dans la forme de cookies. Lorsque la page est rechargée, le navigateur envoie un cookie au serveur indiquant la dernière position visitée, permettant à la visionneuse de reprendre à partir de ce point. Cela signifie que même si HTTP est sans état, il n'est pas sans session.
| Terme | Définition |
|---|---|
| Navigateur | Une application utilisée pour accéder et naviguer entre les documents HTML. |
| Agent utilisateur | Une application qui agit au nom de l'utilisateur, généralement un navigateur. |
| TCP | Abréviation du protocole de contrôle de transmission, l'un des principaux protocoles Internet utilisés par le World Wide Web, le courrier électronique, le FTP et l'administration à distance. |
| IP | Abréviation pour le protocole Internet. IP est utilisé pour transférer des données entre les ordinateurs sur un réseau. Chaque appareil connecté à Internet a une adresse IP. |
| URL | Abréviation du localisateur de ressources uniformes, une adresse pointant sur une ressource sur le Web. |
| DNS | Abréviation du serveur de noms de domaine. DNS catalogue toutes les URL de nom de domaine et les pointe vers les adresses IP des serveurs. |
| Ressource | Le fichier ou les fichiers disponibles sur un serveur lorsqu'ils suivent une URL. |
| Serveur | Un ordinateur sur Internet exécutant une forme d'application de stockage et de partage de données, le plus souvent une application de serveur Web. |
| Procuration | Service de logiciel ou de matériel agissant comme une personne intermédiaire entre les clients et les serveurs. |
| Paies de demande de réponse | Les clients et les serveurs communiquent sur HTTP à l'aide de paires de demandes de réponse. Une demande est envoyée et une réponse est retournée. |
| Tête | Les demandes et les réponses utilisent des en-têtes HTTP pour transmettre des informations dans les deux sens. |
| Méthode / verbe de demande HTTP | Chaque demande HTTP contient une méthode, également connue sous le nom de verbe, qui explique l'action que l'expéditeur souhaite effectuer sur la ressource (par exemple, obtenir, mettre, supprimer). |
| Code de réponse d'état | Un code numérique dans la plage de 100 à 500 décrivant le type de réponse que le serveur a renvoyé au client. |
| Cache | Une méthode pour stocker des données sur le client ou sur le serveur pour accélérer les performances. |
| Apatride | HTTP est apatride, ce qui signifie que chaque demande et réponse est unique et aucun état n'est stocké. |
| Cookie | Une chaîne de données a été transmise entre le client et le serveur pour créer une session avec état. |
| Session | Les clients et les serveurs peuvent partager des informations sur les états en passant des informations dans les deux sens, créant une session. |


| Méthode | Description | Succès | Échec |
|---|---|---|---|
| OBTENIR | Obtenez la ressource spécifiée, si disponible | 200 ok | 404 introuvable |
| POSTE | Créez une nouvelle ressource et ajoutez-la à une collection | 201 créé | 401 non autorisé, 409 conflit, 404 non trouvé |
| METTRE | Mettre à jour un singleton de singleton existant ou une pièce d'identité | 200 ok | 401 non autorisé, 404 non trouvé, 405 méthode non autorisée |
| CORRECTIF | Modifiez un singleton de singleton existant ou une pièce d'identité | 200 ok | 401 non autorisé, 404 non trouvé, 405 méthode non autorisée |
| SUPPRIMER | Supprimer les ressources Singleton basées sur les ressources ou ID (vous ne pouvez pas supprimer une collection de ressources) | 200 ok | 401 non autorisé, 404 introuvable |
| OPTION | Obtenez les options disponibles à partir de cette ressource | 200 ok | - |
| TÊTE | Obtenez uniquement les en-têtes de réponse de la ressource | 200 ok | 404 introuvable |
Cette section comprend la description des fonctions nécessaires pour créer un serveur Web.
int getaddrinfo ( const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); node : le nom d'hôte ou l'adresse IP du serveur.
node est NULL , l'adresse IP de l'hôte local est utilisée. service : le numéro de port du serveur.
service est NULL , le numéro de port par défaut pour le service demandé dans hints est utilisé. hints : un pointeur vers une struct addrinfo qui spécifie les critères de sélection des structures d'adresse de socket renvoyées dans la liste pointée par res .
hints sont NULL , la liste retournée comprend des adresses de prise pour tous les types de socket, pour toutes les familles de protocoles soutenues par la famille d'adresses du nœud spécifié et pour l'adresse de l'hôte local.struct addrinfo sont utilisés:ai_family : La famille d'adresses. Les constantes suivantes sont définies pour le champ ai_family :AF_INET : Protocoles Internet IPv4AF_INET6 : Protocoles Internet IPv6AF_UNIX : communication localeAF_UNSPEC : non spécifiéai_socktype : Le type de socket. Les constantes suivantes sont définies pour le champ ai_socktype :SOCK_STREAM : fournit des flux d'octets séquencés, fiables, bidirectionnels, basés sur la connexion. Un mécanisme de transmission de données hors bande peut être pris en charge.SOCK_DGRAM : prend en charge les datagrammes (messages sans connexion, peu fiables d'une longueur maximale fixe).SOCK_RAW : fournit un accès au protocole de réseau brut.SOCK_RDM : fournit une couche de données fiable qui ne garantit pas la commande.SOCK_SEQPACKET : fournit une couche de paquet séquencée qui ne garantit pas la commande.ai_protocol : Le protocole de la prise. Les constantes suivantes sont définies pour le champ ai_protocol :IPPROTO_TCP : protocole de contrôle de transmissionIPPROTO_UDP : protocole de datagramme utilisateurIPPROTO_RAW : interface du protocole brutIPPROTO_IP : protocole InternetIPPROTO_ICMP : protocole de message de contrôle InternetIPPROTO_IGMP : protocole de gestion des groupes InternetIPPROTO_IPV4 : Protocole Internet version 4IPPROTO_IPV6 : Protocole Internet version 6 res : un pointeur vers une liste liée d'une ou plusieurs structures struct addrinfo qui contient des informations de réponse sur l'hôte.
Valeur de retour: sur le succès, zéro est renvoyé. Sur l'erreur, -1 est renvoyé et errno est défini correctement.
struct addrinfo :
struct addrinfo {
int ai_flags; // input flags
int ai_family; // socket protocol family
int ai_socktype; // socket type
int ai_protocol; // protocol for socket
socklen_t ai_addrlen; // socket address length
struct sockaddr *ai_addr; // socket address
char * ai_canonname; // service name
struct addrinfo *ai_next; // next item in the list
}; int socket ( int domain, int type, int protocol);domain : Le domaine de communication, qui spécifie la sémantique de communication et la famille du protocole à utiliser. Les constantes suivantes sont définies pour l'argument domain :AF_INET : Protocoles Internet IPv4AF_INET6 : Protocoles Internet IPv6AF_UNIX : communication localeAF_UNSPEC : non spécifiétype : La sémantique de communication. Les constantes suivantes sont définies pour l'argument type :SOCK_STREAM : fournit des flux d'octets séquencés, fiables, bidirectionnels, basés sur la connexion. Un mécanisme de transmission de données hors bande peut être pris en charge.SOCK_DGRAM : prend en charge les datagrammes (messages sans connexion, peu fiables d'une longueur maximale fixe).SOCK_RAW : fournit un accès au protocole de réseau brut.SOCK_RDM : fournit une couche de données fiable qui ne garantit pas la commande.SOCK_SEQPACKET : fournit une couche de paquet séquencée qui ne garantit pas la commande.protocol : le protocole à utiliser avec la prise. Normalement, un seul protocole existe pour soutenir un type de socket particulier dans une famille de protocole donnée, auquel cas protocol peut être spécifié comme 0. Les constantes suivantes sont définies pour l'argument protocol :IPPROTO_TCP : protocole de contrôle de transmissionIPPROTO_UDP : protocole de datagramme utilisateurIPPROTO_SCTP : protocole de transmission de contrôle du fluxIPPROTO_TIPC : communication inter-processus transparenteIPPROTO_RAW : paquets IP brutserrno est défini correctement. int bind ( int sockfd, const struct sockaddr *addr, socklen_t addrlen);sockfd : le descripteur de fichier de la prise à limiter.addr : un pointeur vers une structure sockaddr contenant l'adresse à lier à la prise. La longueur et le format de l'adresse dépendent de la famille d'adresses de la prise.addrlen : la taille, en octets, de la structure d'adresse indiquée par l'argument addr .errno est défini correctement. int listen ( int sockfd, int backlog);sockfd : le descripteur de fichier de la prise à écouter.backlog : la longueur maximale à laquelle la file d'attente des connexions en attente pour sockfd peut croître.errno est défini correctement. int accept ( int sockfd, struct sockaddr *addr, socklen_t *addrlen);sockfd : le descripteur de fichier de la prise à accepter.addr : un pointeur vers une structure sockaddr . Cette structure est remplie de l'adresse de la prise par les pairs, comme connu de la couche de communication. Le format exact de l'adresse renvoyée ADDR est déterminé par la famille d'adresses du socket. Lorsque l'adresse retournée est trop longue pour s'adapter à la structure sockaddr fourni, l'adresse est tronquée.addrlen : un pointeur vers un objet socklen_t qui sur l'entrée spécifie la longueur de la structure sockaddr fournie, et à la sortie spécifie la longueur de l'adresse stockée.errno est défini correctement. ssize_t recv ( int sockfd, void *buf, size_t len, int flags);sockfd : le descripteur de fichier de la prise à recevoir.buf : un pointeur vers un tampon où le message doit être stocké.len : La longueur des octets du tampon pointée par l'argument buf .flags : Spécifie le type de réception de messages. La valeur est formée par logiquement ou zéro ou plus des valeurs suivantes:MSG_OOB : traitez les données hors bande.MSG_PEEK : Jetez un coup d'œil aux messages entrants.MSG_WAITALL : attendez une demande complète, sauf si la prise n'est pas bloquante.MSG_DONTWAIT : permet une opération non bloquante; Si l'opération bloquait, l'appel échoue avec l'erreur EAGAIN ou EWOULDBLOCK .MSG_NOSIGNAL : ne générez pas SIGPIPE lorsque vous écrivez à un tuyau sans personne pour le lire.recv() renvoie 0. Sur l'erreur, -1 est renvoyé et errno est défini correctement. ssize_t send ( int sockfd, const void *buf, size_t len, int flags);sockfd : le descripteur de fichier de la prise à envoyer.buf : un pointeur vers un tampon contenant le message à envoyer.len : La longueur dans les octets du message indiqué par l'argument buf .MSG_OOB : traitez les données hors bande.MSG_DONTROUTE : Route de contournement, utilisez l'interface directe.MSG_DONTWAIT : permet une opération non bloquante; Si l'opération bloquait, l'appel échoue avec l'erreur EAGAIN ou EWOULDBLOCK .MSG_NOSIGNAL : ne générez pas SIGPIPE lorsque vous écrivez à un tuyau sans personne pour le lire.errno est défini correctement. Général
Demande HTTP
Réponse HTTP
CGI
Tests de stress