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

C++ Discussion :

Probleme d'envoie d'une reponse HTTP.


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 64
    Points
    64
    Par défaut Probleme d'envoie d'une reponse HTTP.
    Bonjour,

    J'ai un soucis lors de l'envoie d'une réponse HTTP.

    Quand je définis Content-Length, Le navigateur n'affiche rien.
    Quand je le supprime de l'entête, les données text/html sont affichés. Mais quelques soit le cas, les données images ne le sont pas. Pourtant, je reçois bien la requête du navigateur sur mon serveur, j'y réponds bien, puisque le fichier COPIE est bien écrit en local, donc logiquement les mêmes données sont envoyées mais le navigateur affiche toujours rien.
    L'ecriture sur un fichier ou sur un socket dépond simplement d'un descripteur.

    Je pense donc que le soucis se situe donc au niveau de l'entête et du Content-Lenght car c'est pas normal que quand il soit présent, rien ne s'affiche. J'ai essayé de voir (dans la RFC) une quelconque incompatibilité du Content-Lenght avec d'autres champs mais je n'ai rien trouvé.

    Quelqu'un aurait-il une solution, une piste ? Merci à vous?

    Je définis l'entête de ma réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            enteteReponse+="HTTP/1.1 200 OK\r\n";
            //entete+="Date : \r\n";
            enteteReponse+="Server: uHTTP Server\r\n";
            enteteReponse+="Content-Type: "+Fonctions::getMime(r->getFichier())+"\r\n";
            enteteReponse+="Content-Length: "+Fonctions::long2string(Fonctions::getTailleFichier(filename))+"\r\n";
            //entete+="Last-Modified : \r\n";
            enteteReponse+="Connection: close\r\n";
     
            enteteReponse+="\r\n";
    J'envoie la réponse :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    int Thread::envoyerData(string enteteReponse,Requete * r){
     
     
        char buffer[100];
        char * enteteReponseChar;
     
        // On convertie l'entete en char *
        enteteReponseChar = Fonctions::string2char(enteteReponse);
     
        int erEnvoye;
        int erRestant = strlen(enteteReponseChar)*sizeof(char);
        printf("Taille entete : %d\n",erRestant);
        // Envoie de l'entete.
        do{
                // On vide le buffer à chaque fois.
                Fonctions::viderBuffer(buffer);
     
                // On remplit le buffer avec enteteReponse.
                strncpy(buffer,enteteReponseChar,sizeof(buffer));
     
                // On envoie le buffer.
                erEnvoye = send(getFdClient(),buffer,sizeof(buffer),0);
                cout<<buffer;
                // On decale le pointeur sur enteteReponse, pour envoyer la suite.
                enteteReponseChar += erEnvoye;
     
                // Mise à jour du compteur.
                erRestant-=erEnvoye;
        }while(erRestant>0);
        // Tant qu'on a pas envoyé toute l'entete.
     
        // ICI l'entête a été envoyé.
     
        // Envoie du fichier demandé.
     
        FILE *fichier = fopen(Fonctions::string2char(r->getFichier()),"r");
     
        // Fichier qui crée un fichier, correspondant aux données envoyées. (Pour les tests).
        FILE *copie = fopen("/home/greg/copie.jpg","w+");
     
        // On récupère les descripteurs des 2 FILE.
        int fdFichier = fileno(fichier);
        int fdCopie = fileno(copie);
     
        int dataLu;
     
        do{
            //Fonctions::viderBuffer(buffer);
     
            // On lit le fichier.
            dataLu = read(fdFichier,buffer,sizeof(buffer));
     
            // On écrit le fichier en local. (COPIE)
            write(fdCopie,buffer,dataLu);
     
            // On envoie le fichier
            send(getFdClient(),buffer,dataLu,0);
    	}while(dataLu>0);
     
        // On ferme tout
        fclose(fichier);
        fclose(copie);
        close(getFdClient());
        return 0;
    }

  2. #2
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 64
    Points
    64
    Par défaut
    J'avance un peu, dans mes recherches. J'ai comparé la reponse faite par un serveur Apache et mon serveur sur un même fichier :

    Le serveur Apache renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    HTTP/1.1 200 OK
    Date: Sat, 19 Apr 2008 13:31:32 GMT
    Server: Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.3
    Last-Modified: Sat, 19 Apr 2008 13:17:34 GMT
    ETag: "90070b-33-b08b9780"
    Accept-Ranges: bytes
    Content-Length: 51
    Keep-Alive: timeout=15, max=99
    Connection: Keep-Alive
    Content-Type: text/html
     
    <html><body><h1>Serveur HTTP OK</h1></body></html>
    Mon serveur renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HTTP/1.1 200 OK
    Server: uHTTP Server
    Content-Type: text/html
    Connection: close
     
    ...............<html><body><h1>Serveur HTTP OK</h1></body></html>
    Mon serveur semble rajouter des ...... (15 octets) ce qui fout la merde lorsque le Content-Length est specifié. Lorsqu'il n'est pas spécifié, la page est tout de même interpreté mais pese 15 octets de plus que le fichier. Cela passe quand même pour xt/html mais pour une image forcement ca plante...

    Reste plus qu'a analyser mon algo pour voir comment apparaissent ces 15 octets...

    Tout aide est bienvenie. MERCI

Discussions similaires

  1. [Socket][Byte] Probleme d'envoi d'une taille de fichier
    Par Erok dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 12/05/2009, 17h38
  2. Envoi d'une requête HTTP POST
    Par Alexey dans le forum Langage
    Réponses: 4
    Dernier message: 10/05/2009, 20h35
  3. Envoi d'une requête HTTP
    Par jpean.net dans le forum Web & réseau
    Réponses: 2
    Dernier message: 16/05/2008, 08h38
  4. Réponses: 2
    Dernier message: 10/01/2008, 03h24
  5. Interpreter une reponse http
    Par Chtouk dans le forum C
    Réponses: 5
    Dernier message: 16/05/2007, 23h16

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