IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Serveurs (Apache, IIS,...) Discussion :

En-tête HTTP


Sujet :

Serveurs (Apache, IIS,...)

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 28
    Points : 12
    Points
    12
    Par défaut En-tête HTTP
    Bonsoir !

    Je suis pas sur de poster au bon endroit mais bon ...

    Je dois programmer un serveur web en utilisant http 1.1
    Cependant j'ai un problème avec l'en tete que j'envoie au client.
    J'envoie une page html contenant une image et un fichier pdf à télécharger.
    Je ne sais donc pas quel type mettre dans content-type (text/html, application/octet-stream, application/pdf ...) car j'obtiens une page blanche avec firefox
    Pourriez-vous m'éclairer ?

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu envoies les 3 (page HTML, image et PDF) sur 3 requêtes du client différentes. Il faut donc 3 content types :
    • Page HTML : text/html
    • Image : image/xxx avec xxx dépendant du format
    • PDF : application/pdf

    Le plus simple, pour ton serveur, c'est de faire une table de correspondance par extension : .pdf => application/pdf, etc. et donc d'utiliser un type par défaut pour les extensions que tu ne connais pas, par exemple application/octet-stream.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour ta réponse mais je vois pas comment faire pour gérer les 3 requetes ...

    Voici comment j'ai implémenté l'en tete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    char *line[] = {
        "HTTP/1.1 200 OK\r\n",
        "Serveur: Server\r\n",
        //"Content-Length: \r\n",
        "Keep-Alive: timeout=15, max=100\r\n",
        "Connection: Keep-Alive\r\n",
        "Content-Type: application/pdf; charset=ISO-8859-1\r\n\r\n"
    };
    
    for ( i = 0; i < n_line; i++ ) 
         {
    	if ( write( s_client, line[i], strlen(line[i]) ) < 0 ) 
    	{
    	    perror(argv[0]);
    	    exit(__LINE__);
    	}
         }

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Quand tu demandes une page HTML quelconque à n'importe quel serveur Web (Apache, IIS, le tien, etc.), ton navigateur ouvre une connexion TCP sur le serveur et le port indiqués dans l'URL (port 80 si aucun port n'apparaît explicitement dans l'URL http://). Le navigateur envoie alors une série de commandes HTTP du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GET /repertoire/toto.html HTTP/1.1[CR]
    Host: www.monsite.com[CR]
    Connection: keep-alive[CR]
    [CR]
    Tu auras deviné que [CR] marque un saut de ligne.

    Pour info, quand le navigateur fait cette requête, il n'a aucune idée de ce qu'il va recevoir : ce n'est pas parce que l'URL se termine en .html que le navigateur sait ou doir s'attendre à recevoir du code HTML : c'est le serveur, dans sa réponse avec l'en-tête Content-Type qui va dire ce qu'il reçoit.

    Pour revenir au problème, ton serveur Web reçoit donc cette demande, il l'interprète et renvoit ce qu'il a compris qu'on lui demandait : le contenu du fichier repertoire/toto.html se trouvant dans le document root et uniquement le contenu de ce fichier, rien d'autre. Comme le serveur sait (par quel mécanisme ? telle est la question, n'est-ce pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HTTP/1.1 200 OK[CR]
    Connection: close[CR]
    Content-Length: 345[CR]
    Content-Type: text/html; charset=utf-8[CR]
    [CR]
    <html>...
    Plusieurs importantes ici par rapport à ton code :
    • L'en-tête Content-Length a une valeur. On indique ici la taille en octet de ce qu'on renvoie. Si tu ne connais pas cette taille, n'indique pas cet en-tête, mais surtout ne le laisse pas sans valeur.
    • Connection: keep-alive: à moins que tu ne saches le gérer correctement, le plus simple dans un premier temps est de faire un Connection: close comme dans mon exemple pour forcer le navigateur à rétablir une nouvelle connexion à chacune de ses requêtes. Gérer le keep-alive suppose au minimum gérer correctement le Content-Length (pour éviter que le navigateur attende bêtement un contenu supplémentaire qui n'arrivera pas) et pouvoir "parser" les données arrivant sur la connexion en plusieurs fois pour pouvoir identifier et gérer les requêtes successives arrivant sur la même connexion. Donc commence simple (sauf si tu sais déjà gérer le keep-alive) : Connection: close


    On continue. Par hasard, car c'est un hasard, le code HTML contient une balise <img> et un lien ou un <object> vers un PDF. C'est le navigateur, lorsqu'il a lire et interpréter le code HTML renvoyé par le serveur sur la première requête, qui va identifier d'autres requêtes à faire pour pouvoir afficher correctement la page. Il va donc ouvrir une nouvelle connexion sur le serveur pour demander l'image par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GET /repertoire/image.jpg HTTP/1.1[CR]
    Host: www.monsite.com[CR]
    Connection: keep-alive[CR]
    [CR]
    c'est la seconde requête dont je parlais dans ma première réponse. Une fois de plus, le navigateur ne sait pas qu'il va recevoir une image : le .jpg n'a aucun sens pour lui, il attend sagement le Content-Type que va lui indiquer le serveur. Réponse du serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HTTP/1.1 200 OK[CR]
    Connection: close[CR]
    Content-Length: 1234[CR]
    Content-Type: image/jpeg[CR]
    [CR]
    image
    Et pour le PDF, c'est idem.

    Donc, pour ton code, les deux premières lignes sont OK. Pour la suite :
    • Content-Length : incorrect. Il faut soit y indiquer la taille en octets de ce que tu renvoies (= la taille du fichier) ou ne pas indiquer l'en-tête.
    • Keep-alive (les 2 en-têtes suivants) : cf. mes premières remarques
    • Content-Type : pour le PDF uniquement, d'où finalement que le bloc de code que tu donnes ne doit être exécuté exclusivement que si ton serveur a déterminé qu'on demandait un PDF. Pour une image ou un fichier HTML, cet en-tête devra être différent.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

Discussions similaires

  1. Modification d'en-tête http
    Par Freud44 dans le forum ASP.NET
    Réponses: 17
    Dernier message: 14/10/2009, 07h58
  2. Réponses: 0
    Dernier message: 20/05/2009, 10h33
  3. En têtes http
    Par gattous dans le forum Apache
    Réponses: 4
    Dernier message: 31/01/2008, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo