2008-10-02 7 views
3

J'ai un serveur HTTP qui renvoie des corps volumineux en réponse à des requêtes POST (c'est un serveur SOAP). Ces corps sont "streamés" par segmentation. Si je rencontre une erreur au milieu de la diffusion de la réponse, comment puis-je signaler cette erreur au client tout en maintenant la connexion ouverte? L'implémentation utilise une pile HTTP/SOAP propriétaire, donc je suis intéressé par les réponses au niveau du protocole HTTP.Comment signaler une erreur à mi-chemin d'une réponse http fragmentée sans fermer la connexion?

+0

Mark, j'ai fait une mise à jour à mon poste d'origine. Mais, je ne sais pas si vous le remarquerez puisque vous avez déjà marqué la réponse comme acceptée. Ce commentaire est là pour attirer votre attention en apparaissant dans l'onglet Réponses de votre compte ... – Alexander

Répondre

2

Une fois que le serveur a envoyé la ligne d'état (la toute première ligne de la réponse) au client, vous ne pouvez plus modifier le code d'état de la réponse. De nombreux serveurs retardent l'envoi de la réponse en la tamponnant en interne jusqu'à ce que le tampon soit plein. Pendant que le tampon se remplit, vous pouvez toujours changer d'avis sur la réponse.

Si votre client a accès aux en-têtes de réponse, vous pouvez utiliser le fait que l'encodage en segments permet au serveur d'ajouter une bande-annonce avec des en-têtes après le corps codé en segments. Ainsi, votre serveur, ayant rencontré l'erreur, pourrait gracieusement arrêter d'envoyer le corps, puis envoyer une bande-annonce qui définit un en-tête à une certaine valeur. Votre client interpréterait alors la présence de cet en-tête comme un signe qu'une erreur s'est produite.

+0

J'espérais qu'il y avait une convention pour négocier la livraison d'un statut «alternatif». Par exemple. en l'enfonçant dans une extension finale de bloc de taille zéro (après 0, avant \ r \ n \ r \ n). –

+0

Oui, cette idée m'est également venue à l'esprit (mais seulement après mon article original). Voir le deuxième paragraphe que j'ai ajouté. – Alexander

0

vous pouvez modifier le code d'état tant que response.iscommitted() renvoie la valeur false. (pour HttpServletResponse dans java, je suis sûr qu'il existe un équivalent dans d'autres langages)

2

Gardez également à l'esprit que les réponses en blocs peuvent contenir "footers" qui sont exactement comme les en-têtes HTTP. Après avoir échoué, vous pouvez envoyer un pied de page tels que:

X-RealStatus: 500 Some bad stuff happened

Ou si vous réussissez:

X-RealStatus: 200 OK
Questions connexes