ColdFusion - HTTP块缺少第一个字符

时间:2016-02-17 08:43:49

标签: java coldfusion chunked-encoding coldfusion-11

这个问题是关于ColdFusion中HTTP块传输的previous question的延续。 现在,我使用java.net.URL来读取块,这就是我尝试过的:

<cfset local.objURL = createObject("java", "java.net.URL")
                         .init(javaCast("string", "https://test.com/abc.xml"))>

<!--- Open Connection --->
<cfset local.objConnection = local.objURL.openConnection()>

<!--- Input Stream --->
<cfset local.inputStream = local.objConnection.getInputStream()>

<!--- Read Chunks --->
<cfloop condition="true">
    <!--- Get Chunk Length --->
    <cfset local.chunkLength = local.inputStream.read()>
    <cfif local.chunkLength LT 0>
        <cfbreak>
    </cfif>

    <!--- Byte Array --->
    <cfset local.chunk = getByteArray(local.chunkLength)>
    <cfset local.offset = 0>

    <!--- Read Chunk Data --->
    <cfloop condition="local.offset LT local.chunkLength">
        <cfset local.bytesRead = local.inputStream.read(local.chunk, local.offset, local.chunkLength - local.offset)>
        <cfif local.bytesRead LT 0>
            <cfbreak>
        </cfif>
        <cfset local.offset += local.bytesRead>
    </cfloop>
    <!--- Chunk --->
    <cfdump var="#charsetEncode( local.chunk, 'utf-8' )#"><br />
</cfloop>

使用上面的代码,我能够读取数据,但我遇到的问题是每个块中的第一个字符缺失,即

  

First Chunk是:<?xml version="1.0" encoding="utf-8" ?> <root>但我只是   得到?xml version="1.0" encoding="utf-8" ?> <root>

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我不认为这部分是正确的:

<!--- Get Chunk Length --->
<cfset local.chunkLength = local.inputStream.read()>
<cfif local.chunkLength LT 0>
    <cfbreak>
</cfif>

您希望块长度位于流的开头。为什么?这是你自己的协议吗?如果您正在讨论http分块,则应检查http响应标头Transfer-Encoding是否具有值chunked。否则,假设内容被分块是完全错误的。 另外,你only read one byte。这意味着块长度最多可以是255个字节,这不是很灵活。 HTTP块可以比这长,并且块大小由所有数字组成,直到换行,例如1234\r\n

我强烈怀疑上面的read()总是消耗你的<并返回一个60的chunkLength,这是<的ascii值。