2009-10-12 7 views
4

J'ai souvent besoin de générer dynamiquement du contenu à partir d'un servlet/restlet ou autre, et je ne connais pas la longueur à l'avance. Si le client est un navigateur, la barre de progression ne fonctionne pas correctement, car je n'ai pas défini l'en-tête Content-Length. Existe-t-il un moyen de définir une longueur de contenu estimée, de sorte que la barre de progression fonctionne "plus ou moins"?Envoi de devis HTTP Content-Length from Servlet etc

Répondre

7

Non, le Content-Length value must be the exact content length:

Lorsqu'un Content-Length est donnée dans un message où un corps de message est autorisé, sa valeur de champ doit correspondre exactement au nombre d'octets dans le corps de message. Les agents utilisateurs HTTP/1.1 DOIVENT aviser l'utilisateur lorsqu'une longueur invalide est reçue et détectée.

vous ne pouvez donc pas envoyer juste une estimation Content-Length valeur pour obtenir une barre de progression.

1

Vous ne savez pas exactement ce que vous demandez. Vous pouvez toujours définir vous-même l'en-tête Content-Length, même s'il doit correspondre à la quantité de données que vous envoyez. La manière standard de gérer les données dynamiques lorsque vous ne savez rien sur la longueur à l'avance est de mettre en tampon la sortie, de trouver la longueur réelle, de définir l'en-tête, puis de vider la sortie. Pas vraiment répondre à ce que vous semblez demander, mais je pense que ce que vous demandez est impossible.

+0

Je soupçonne aussi que ce soit impossible, mais j'espère que c'est juste que mon HTTP-fu n'est pas à la hauteur! –

0

La seule façon de le faire (as decribed in an RFC) n'est pas de définir l'en-tête Content-Length, c'est-à-dire. l'en-tête de réponse ne contient pas de ligne Content-Length. Dans ce cas, le navigateur ne sait pas combien de temps le corps est, de sorte que le serveur "dit" au navigateur que tout le corps a été envoyé par closing the connection.

Je ne sais pas si le conteneur Java fermera automatiquement la connexion dans ce cas ou si vous pouvez le faire vous-même via une sorte de filtre.

Pour répondre à votre question: Je ne pense pas qu'il soit possible de donner une estimation au navigateur.

0

Si la longueur de votre contenu n'est pas connue à l'avance, vous pouvez utiliser le “chunked” content encoding (selon HTTP version 1.1). Cependant, cela ne résoudra pas votre problème de barre de progression, et il n'y a aucun moyen de le faire fonctionner, à moins de connaître le contenu que vous allez envoyer.

3

Bien que je ne vous recommande pas de le faire, vous pouvez définir la longueur du contenu à une estimation de ce que le contenu est, et vous obtiendrez une barre de progression. Tant que vous pouvez garantir que votre estimation est égale ou supérieure au contenu réel, cela fonctionnera généralement. Si votre contenu réel est supérieur à l'estimation, le contenu sera tronqué à la longueur de contenu spécifiée.

J'ai testé cela dans Firefox, IE et Chrome sans problème. La spécification HTTP indique que les agents utilisateurs DOIVENT aviser l'utilisateur si la longueur spécifiée ne correspond pas à la longueur réelle, mais je n'ai pas observé ce comportement avec un navigateur que j'ai testé. J'ai étudié cette option en tant qu'option, mais je l'ai abandonnée en raison des conflits potentiels imprévus pour jouer en dehors des limites de la spécification.

Questions connexes