Bonjour,
Ma question concerne le format des header HTTP
Je programme des petit serveurs et des petits clients HTTP en C++ sur des cartes embarquées
Avec mon serveur, je dois créer un header HTTP avant ma payload :
La longueur 'len', qui est le paramètre affiché après "Content-length:" à la place du '%d', est un nombre qui sera imprimé dans la chaine de caractères en décimal, et que ce nombre peut occuper :
Code : Sélectionner tout - Visualiser dans une fenêtre à part sprintf_P(Buffer_HTTP, PSTR("HTTP/1.1 200 OK\r\nContent-type: text/html\r\nContent-length: %d\r\nConnection: close\r\n\r\n"), len);
- un caractère (si len est compris de 0 à 9)
- deux caractères (si len est compris de 10 à 99)
...
Mon soucis est que je ne peut connaitre la valeur de 'Content-length:' qu'une fois que j'ai généré toute ma réponse.
Et la longueur de mon header HTTP dépend donc de la valeur de la longueur de 'Content-length:'
Ca serait plus simple si cette valeur était codée sur 16 bits ces satanés "nombres en texte" c'est bien pour les humains, pas pour le codage
Pour résoudre le problème j'utilise un buffer, dans lequel j'écris ma réponse avec un offset qui laisse assez de place pour contenir le header + un 'Content-length:' de 4 caractères
Ensuite une fois que je connais le 'Content-length:', je peut écrire le header HTTP avec un offset de 0, 1, 2 ou 3 caractères (0 si 'Content-length:' occupe 4 caractères, 3 si 'Content-length:' occupe 1 caractère)
Enfin, je peux envoyer la réponse au client avec un offset de 0, 1, 2 ou 3 caractères
Cette façon de faire est très lourde.
Elle m'oblige à stocker toute la réponse avec le header dans un gros buffer dans la RAM de mon microcontroleur, alors que je pourrais envoyer à la puce de la carte réseau les données aux fur et à mesure (la puce de la carte réseau a en fait plus de RAM que mon microcontroleur)
La question que je me pose est s'il est possible de préciser une valeur de 'Content-length:' avec des espaces et/ou des zéros non significatifs, par exemple :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part "HTTP/1.1 200 OK\r\nContent-type: text/html\r\nContent-length: 0001\r\nConnection: close\r\n\r\n"
Je souhaite que la page générée soit conforme W3C pour garantir qu'elle sera correctement affichée quelque soit le client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part "HTTP/1.1 200 OK\r\nContent-type: text/html\r\nContent-length: 1\r\nConnection: close\r\n\r\n"
Sinon, ça serait trop facile et moins drôle
Merci
A bientôt
Partager