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>
は、どのように私は知っていますか?それがあれば、チャンクサイズは見えませんか?
「接続:閉じる」は、正常に機能していないことを示しています。 –