Les données ne sont pas envoyées avec une réponse http sur mon serveur http
Question
Je travaille sur la création d'un serveur HTTP pour ma classe. Mais, le fichier renvoyé n'est pas affiché par Firefox. Je construis un en-tête de réponse et je mets à la droite content-length
du fichier que je veux envoyer, puis j'envoie les en-têtes de réponse avec un appel à send()
. Ensuite, j'utilise à nouveau error_response
pour envoyer le fichier. Pourquoi Firefox ne l'a-t-il pas affiché? Je posterai le code correspondant ci-dessous.
Comme vous le verrez avec le code, je ne parviens pas à envoyer un cout << error_response << endl;
, lors d’une erreur 404. En utilisant des en-têtes http en direct, je peux voir que Firefox reçoit l'en-tête de la réponse correcte et que le <=> affiche la réponse correcte. Pourquoi Firefox ne l'affiche-t-il pas? Dois-je passer un seul appel à <=> contenant l'en-tête et le paquet de réponse?
// send response headers
response->Print( buffer, 2000 );
if ( send( acc_tcp_sock, buffer, sizeof(buffer), 0 ) < 0 ) {
cerr << "Unable to send response headers to client." << endl;
return 5;
}
// if 200 and GET then send file
if ( response->Get_code() == 200 && method == "GET" ) {
// send file
}
// close file, if it has been opened
if ( response->Get_code() == 200 ) {
fclose( returned_file );
}
else if ( method == "GET" ) {
if ( send( acc_tcp_sock, error_response.c_str(), error_response.length(), 0 ) < 0 ) {
cerr << "Unable to send data to client." << endl;
return 6;
}
cout << error_response << endl;
}
close( acc_tcp_sock ); // close the connection
}
return 0;
}
La solution
Avez-vous essayé d'envoyer l'en-tête de réponse et le fichier dans la même commande d'envoi? Existe-t-il un moyen de savoir ce que firefox reçoit? Vous pouvez essayer d’écrire, en utilisant une classe HTTPRequester, une application de console qui envoie une requête HTTP à votre serveur et voir ce qu’elle reçoit en retour.