<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Computer, Electron and Technology &#187; transfer</title>
	<atom:link href="http://www.donevii.com/post/tag/transfer/feed" rel="self" type="application/rss+xml" />
	<link>http://www.donevii.com</link>
	<description>DoneVII CET &#38; CPPLITE</description>
	<lastBuildDate>Wed, 02 Jun 2010 10:45:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[转] Chunked编码</title>
		<link>http://www.donevii.com/post/466.html</link>
		<comments>http://www.donevii.com/post/466.html#comments</comments>
		<pubDate>Tue, 02 Sep 2008 13:57:02 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[doc]]></category>
		<category><![CDATA[protocol]]></category>
		<category><![CDATA[chunked]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[transfer]]></category>
		<category><![CDATA[编码]]></category>
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=466</guid>
		<description><![CDATA[转至: http://www.21andy.com/blog/20071109/660.html 有时候，Web服务器生成HTTP Response是无法在Header就确定消息大小的，这时一般来说服务器将不会提供Content-Length的头信息，而采用Chunked编码动态的提供body... ]]></description>
			<content:encoded><![CDATA[<p>转至: <a title="Chunked编码" href="http://www.21andy.com/blog/20071109/660.html">http://www.21andy.com/blog/20071109/660.html</a></p>
<p>有时候，Web服务器生成<a href="http://www.donevii.com/post/tag/http" class="st_tag internal_tag" rel="tag" title="Posts tagged with http">HTTP</a> Response是无法在<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">Header</a>就确定消息大小的，这时一般来说服务器将不会提供Content-Length的头信息，而采用<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">Chunked</a>编码动态的提供body内容的长度。</p>
<p>进行<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">Chunked</a>编码传输的<a href="http://www.donevii.com/post/tag/http" class="st_tag internal_tag" rel="tag" title="Posts tagged with http">HTTP</a> Response会在消息头部设置：</p>
<div class="hl-surround">
<div class="hl-main"><a href="http://www.donevii.com/post/tag/transfer" class="st_tag internal_tag" rel="tag" title="Posts tagged with transfer">Transfer</a>-<a href="http://www.donevii.com/post/tag/encoding" class="st_tag internal_tag" rel="tag" title="Posts tagged with encoding">Encoding</a>: <a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">chunked</a></div>
</div>
<p>表示Content Body将用<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">Chunked</a>编码传输内容。</p>
<p><a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">Chunked</a>编码使用若干个Chunk串连而成，由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分，头部内容指定下一段正文的字符总数（十六进制的数字）和数量单位（一般不写），正文部分就是指定长度的实际内容，两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容，是一些附加的<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">Header</a>信息（通常可以直接忽略）。具体的Chunk编码格式如下：</p>
<div class="hl-surround">
<div class="hl-main">　　<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">Chunked</a>-Body = *chunk<br />
　　　　　　　　　&#8221;0&#8243; CRLF<br />
　　　　　　　　　footer<br />
　　　　　　　　　CRLF<br />
　　chunk = chunk-size [ chunk-ext ] CRLF<br />
　　　　　　chunk-data CRLF</p>
<p>　　hex-no-zero = &lt;HEX excluding &#8220;0&#8243;&gt;</p>
<p>　　chunk-size = hex-no-zero *HEX<br />
　　chunk-ext = *( &#8220;;&#8221; chunk-ext-name [ "=" chunk-ext-value ] )<br />
　　chunk-ext-name = token<br />
　　chunk-ext-val = token | quoted-string<br />
　　chunk-data = chunk-size(OCTET)</p>
<p>　　footer = *entity-<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">header</a></p></div>
</div>
<p>RFC文档中的<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">Chunked</a>解码过程如下：</p>
<div class="hl-surround">
<div class="hl-main">　　length := 0<br />
　　read chunk-size, chunk-ext (if any) and CRLF<br />
　　while (chunk-size &gt; 0) {<br />
　　read chunk-data and CRLF<br />
　　append chunk-data to entity-body<br />
　　length := length + chunk-size<br />
　　read chunk-size and CRLF<br />
　　}<br />
　　read entity-<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">header</a><br />
　　while (entity-<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">header</a> not empty) {<br />
　　append entity-<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">header</a> to existing <a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">header</a> fields<br />
　　read entity-<a href="http://www.donevii.com/post/tag/header" class="st_tag internal_tag" rel="tag" title="Posts tagged with header">header</a><br />
　　}<br />
　　Content-Length := length<br />
　　Remove &#8220;<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">chunked</a>&#8221; from <a href="http://www.donevii.com/post/tag/transfer" class="st_tag internal_tag" rel="tag" title="Posts tagged with transfer">Transfer</a>-<a href="http://www.donevii.com/post/tag/encoding" class="st_tag internal_tag" rel="tag" title="Posts tagged with encoding">Encoding</a></div>
</div>
<p>最后提供一段PHP版本的<a href="http://www.donevii.com/post/tag/chunked" class="st_tag internal_tag" rel="tag" title="Posts tagged with chunked">chunked</a>解码代码：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> = </span><span style="color: olive;">(</span><span style="color: blue;">integer</span><span style="color: olive;">)</span><span style="color: blue;">hexdec</span><span style="color: olive;">(</span><span style="color: blue;">fgets</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: maroon;">4096</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">while</span><span style="color: olive;">(</span><span style="color: gray;">!</span><span style="color: blue;">feof</span><span style="color: olive;">(</span><span style="color: #00008b;">$socket_fd</span><span style="color: olive;">)</span><span style="color: gray;"> &amp;&amp; </span><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> &gt; </span><span style="color: maroon;">0</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
    </span><span style="color: #00008b;">$bodyContent</span><span style="color: gray;"> .= </span><span style="color: blue;">fread</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">;<br />
    </span><span style="color: blue;">fread</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: maroon;">2</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">; </span><span style="color: #ffa500;">// skip \r\n</span><span style="color: gray;"><br />
    </span><span style="color: #00008b;">$chunk_size</span><span style="color: gray;"> = </span><span style="color: olive;">(</span><span style="color: blue;">integer</span><span style="color: olive;">)</span><span style="color: blue;">hexdec</span><span style="color: olive;">(</span><span style="color: blue;">fgets</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #00008b;">$socket_fd</span><span style="color: gray;">, </span><span style="color: maroon;">4096</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span></div>
</div>

	<h4>相关文章</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.donevii.com/post/468.html" title="[转] HTTP协议之Chunked解析 (2008-09-02)">[转] HTTP协议之Chunked解析</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/466.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
