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