【问题标题】:ColdFusion - HTTP chunk missing first characterColdFusion - HTTP 块缺少第一个字符
【发布时间】:2016-05-28 20:38:19
【问题描述】:

这个问题是我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>

使用上面的代码,我可以读取数据,但我面临的问题是每个块中的第一个字符丢失,即,

第一个块是:&lt;?xml version="1.0" encoding="utf-8" ?&gt; &lt;root&gt; 但我只是 获取?xml version="1.0" encoding="utf-8" ?&gt; &lt;root&gt;

有什么建议吗?

【问题讨论】:

    标签: java coldfusion chunked-encoding coldfusion-11


    【解决方案1】:

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

    <!--- 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() 总是在消耗你的&lt; 并返回一个60 的chunkLength,这是&lt; 的ascii 值。

    【讨论】:

    • 感谢您的指出。这是我第一次与块阅读器打交道,我正在深入研究它。是的,Transfer-Encodingchunked
    • 你看过输入流的全部内容了吗?我怀疑 java URLConnection 在内部处理 http 分块,这意味着您不必处理它。这就解释了为什么没有块长度“到达”您的代码。
    • 是的,确实如此。谢谢:)
    • 同意。您只需循环并读取响应,直到响应被消耗,即它返回 -1。
    猜你喜欢
    • 2014-07-20
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多