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?

Que "Connection: close" signaux qu'il ya quelque chose ne fonctionne pas ok.

OriginalL'auteur nont | 2011-08-11