pourquoi est-encodage de transfert en bloc n'est pas respectée par Firefox?
Je suis de la diffusion d'un document volumineux grâce à un contrôleur Spring MVC en cours d'exécution sur Apache Tomcat/6.0.18
parce que son grand, et (éventuellement) être générées de façon dynamique, j'ai décidé d'utiliser un Codage de Transfert.
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.ChunkedOutputStream;
import org.apache.commons.net.io.CopyStreamException;
import org.apache.commons.net.io.Util;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class QueryController {
@Inject
QueryService queryService;
@RequestMapping(value = "/stream")
public void hellostreamer(HttpServletResponse response) throws CopyStreamException, IOException {
response.setHeader("Transfer-Encoding", "chunked");
response.setHeader("Content-type", "text/xml");
InputStream filestream = new FileInputStream("/lotsrecs.xml");
ChunkedOutputStream chunkStream = new ChunkedOutputStream(response.getOutputStream());
Util.copyStream(filestream,chunkStream);
chunkStream.close();
chunkStream.finish();
}
}
Cependant, lorsque j'ai ouvert ce dans firefox, j'obtiens ceci:
XML Parsing Error: syntax error
Location: http://localhost:8082/streaming-mockup-1.0-SNAPSHOT/stream
Line Number 1, Column 1:
800
^
Plutôt que de lire le bloc de tailles des métadonnées sur le flux de, sa lecture comme une partie de la flux de!
À l'aide de Live HTTP headers, je peux voir que le Transfert en-tête de Codage est en cours de réception:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Content-Type: text/xml
Date: Thu, 11 Aug 2011 18:08:07 GMT
Donc je suis à une perte pour laquelle les tailles de segment ne sont pas interprétés correctement. Si je fais la demande à l'aide de wget, je vois aussi le gros morceau de la taille des caractères à l'intérieur du document retourné, donc, quelque part, ils ne sont pas encodées correctement. Quelqu'un a une idée de pourquoi?
À la recherche à la transmission avec wireshark: (notez que le "800" revient dans le flux de données) Remarque que 0 x 800 = 2048, qui est la valeur par défaut chunksize utilisé par la classe ChunkedOutputStream.
GET /streaming-mockup-1.0-SNAPSHOT/stream HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: localhost:8082
Connection: Keep-Alive
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Content-Type: text/xml
Date: Thu, 11 Aug 2011 18:47:24 GMT
Connection: close
800
<records>
<REC>
<FUID>412286284WOS1</FUID>
<UID>WOS:000292284100013</UID>
<static_data>
<summary>
<EWUID uid="WOS:000292284100013" year="2011">
Si je viens de copie de flux de sortie directement sans créer un ChunkedOutputStream, je ne vois pas la taille de segment:
GET /streaming-mockup-1.0-SNAPSHOT/stream HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: localhost:8082
Connection: Keep-Alive
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Content-Type: text/xml
Date: Thu, 11 Aug 2011 18:51:05 GMT
Connection: close
<records>
<REC>
<FUID>412286284WOS1</FUID>
<UID>WOS:000292284100013</UID>
<static_data>
<summary>
Alors, comment puis-je savoir si c'est segmenté? Si elle l'était, n'aurais-je pas voir les tailles de segment?
OriginalL'auteur nont | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr que vous avez besoin pour construire un
ChunkedOutputStream
pour vous-même?Ma compréhension (non corrompue par la pratique), c'est que
ServletResponse.getOutputStream()
doit gérer la segmentation pour vous si nécessaire (par exemple, si le client n'est pas en HTTP 1.0, et ainsi de suite). Si cela est vrai, la réponse qui est envoyé sera fragments de codage à l'intérieur de fragments de codage, et le navigateur de cours de connaît seulement une de ces couches.Avez-vous essayé de lancer le serveur quelque part sur le réseau et d'inspecter la transaction avec Wireshark?
Mise à jour:
Les clients HTTP/1.0 ne sont pas nécessaires pour comprendre fragments de codage (de façon assez naturelle, que le codage a été inventés pour 1.1).
très intéressant!!! Je vais voir ce qui se passe quand je force wget ou curl pour utiliser HTTP 1.1. Merci!
Génial: Quand j'utilise curl et de copier le flux directement, il signale HTTP 1.1 et comme prévu, je vois les tailles de segment dans la wireshark flux, mais pas le navigateur. Donc, vous avez tout à fait raison: pas besoin d'utiliser ChunkedOutputStream moi - même- en fait cela a causé mon flux à tort "double chunked".
OriginalL'auteur Henning Makholm