2011-08-11 11 views
3

Apache Tomcat/6.0.18なぜチャンクされた転送エンコーディングがFirefoxによって尊重されていないのですか?

を実行している大きなドキュメントをストリーミングしています。そのサイズが大きく、最終的には動的に生成されるので、私はチャンク転送符号化を使用することにしました。私はFirefoxでこれを開くと

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(); 
    } 
} 

はしかし、私はこれを取得:

XML Parsing Error: syntax error 
Location: http://localhost:8082/streaming-mockup-1.0-SNAPSHOT/stream 
Line Number 1, Column 1: 

800 
^ 

よりもむしろそのストリームの一部としてそれらを読んで、ストリームに関するメタデータとしてチャンクサイズを読んで!ライブHTTPヘッダを使用して

、私は転送-Encodingヘッダーが受信されていることがわかります。

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 

だから私は、チャンクサイズが正しく解釈されていない理由のために途方に暮れてよ。私がwgetを使ってリクエストを行うと、返されたドキュメントの中にチャンクサイズの文字が表示されるので、何らかの形で正しくエンコードされていません。誰でも理由が分かりますか?

wiresharkで送信を見る(ストリーム全体で「800」が繰り返されることに注意してください)0x800 = 2048で、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"> 

私はちょうど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:51:05 GMT  
Connection: close  

<records> 
    <REC> 
    <FUID>412286284WOS1</FUID> 
    <UID>WOS:000292284100013</UID> 
    <static_data> 
     <summary> 

は、どのように私は知っていますか?それがあれば、チャンクサイズは見えませんか?

+0

「接続:閉じる」は、正常に機能していないことを示しています。 –

答えて

11

あなた自身でChunkedOutputStreamを構築する必要がありますか?

適切であれば(たとえば、クライアントがHTTP 1.0でない場合など)、ServletResponse.getOutputStream()があなたのチャンクを処理する必要があると私は理解しています。それが本当であれば、実際に送信される返信はチャンクエンコーディングのコード化されたチャンクになります。もちろん、ブラウザはこれらのレイヤーの1つのみを知っています。

ネットワーク上のどこかでサーバーを実行し、Wiresharkでトランザクションを検査しようとしましたか?

更新:(そのエンコーディングはわずか1.1用に発明されたとして、自然に十分な)1.0のクライアントは、すべてのチャンクエンコーディングを理解するために必要とされていないHTTP/

GET /streaming-mockup-1.0-SNAPSHOT/stream HTTP/1.0 

+0

wiresharkからの出力を表示するために私の質問が更新されました。 – nont

+0

非常に興味深い! wgetやcurlにHTTP 1.1の使用を強制すると何が起こるかを見ていきます。ありがとう! – nont

+0

素晴らしい:私は、カールを使用し、直接ストリームをコピーすると、HTTP 1.1を報告し、予想通り、ブラウザではなく、wiresharkストリームにチャンクサイズが表示されます。だから、あなたは絶対に正しいです.ChunkedOutputStreamを自分で使う必要はありません。実際にそうすることで、私のストリームが誤って「ダブルチャンク」になってしまいました。 – nont

関連する問題