2016-02-17 2 views
3

Этот вопрос является продолжением моего previous question относительно передачи HTTP-пакетов в ColdFusion. Теперь, я использовал java.net.URL читать куски, и это то, что я пробовал:ColdFusion - HTTP chunk missing first character

<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> 

Используя код выше, я могу прочитать данные, но проблему я обращенную в том, что первый символ каждый фрагмент является то отсутствует,

Первый Chunk это: <?xml version="1.0" encoding="utf-8" ?> <root>, но я только получение ?xml version="1.0" encoding="utf-8" ?> <root>

есть предложения?

ответ

2

Я не думаю, что эта часть является правильным:

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

Вы ожидаете, что длина куска, чтобы быть в начале потока. Зачем? это ваш собственный протокол? Если вы говорите о http chunking, вы должны проверить, имеет ли заголовок ответа HTTP Transfer-Encoding значение chunked. В противном случае просто неправильно предположить, что содержимое разделено. Также, вы only read one byte. Это означает, что длина блока может быть не более 255 байт, что не очень гибко. HTTP-фрагменты могут быть длиннее, а размер блока состоит из всех цифр до разрыва строки, например 1234\r\n.

Я сильно подозреваю, что read() выше всегда потребляет < и возвращает chunkLength 60, что является значением ascii <.

+0

Спасибо за указание. Это первый раз, когда я имею дело с читателем чанка, и я больше копаю в нем. Да, «Transfer-Encoding» является «chunked». – Beginner

+0

Вы взглянули на весь контент вашего входного потока? Я подозреваю, что java '' URLConnection'' обрабатывает http chunking внутри, что означает, что вам не нужно это решать. Это объясняет, почему в вашем коде нет «длины» куска. – f1sh

+0

Да, да. Спасибо :) – Beginner

Смежные вопросы