ColdFusion - 缺少第一个字符的 HTTP 块

ColdFusion - HTTP chunk missing first character

这个问题是我 previous question 关于 ColdFusion 中的 HTTP 块传输问题的延续。 现在,我已经使用 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 is: <?xml version="1.0" encoding="utf-8" ?> <root> but I am only getting ?xml version="1.0" encoding="utf-8" ?> <root>

有什么建议吗?

我认为这部分不正确:

<!--- 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()一直在消耗你的<和returns一个60的chunkLength,也就是<的ascii值。