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:
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:
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;
} |