Sample code for 30+ languages & platforms
Tcl

Read the REST Response Body in Chunks

See more REST Examples

Demonstrates Rest.ReadRespChunkBd, which reads the response body one chunk at a time, appending each chunk to a BinData. A return value of 0 signals the body is complete, while -1 indicates a read failure.

Background. Chunked reading lets an application process a large response incrementally rather than buffering the entire body at once. It is used after ReadResponseHeader within the staged request model.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

set rest [new_CkRest]

set bTls 1
set bAutoReconnect 1
set success [CkRest_Connect $rest "example.com" 443 $bTls $bAutoReconnect]
if {$success == 0} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    exit
}

set success [CkRest_SendReqNoBody $rest "GET" "/api/largefile"]
if {$success == 0} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    exit
}

set statusCode [CkRest_ReadResponseHeader $rest]
if {$statusCode < 0} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    exit
}

#  Check for the expected success status code.  If the response is not 200, the body is likely
#  error text formatted as JSON, XML, or HTML rather than the expected content.  In that case read
#  the body as text, report it, and return.
if {$statusCode != 200} then {
    set sbError [new_CkStringBuilder]

    set success [CkRest_ReadRespSb $rest $sbError]
    if {$success == 0} then {
        puts [CkRest_lastErrorText $rest]
        delete_CkRest $rest
        delete_CkStringBuilder $sbError
        exit
    }

    puts "Request failed with status code $statusCode"
    puts [CkStringBuilder_getAsString $sbError]
    delete_CkRest $rest
    delete_CkStringBuilder $sbError
    exit
}

#  The status code is 200.  Read the response body in chunks, appending each chunk to the BinData.
#  Each call waits until at least the requested number of bytes is available, unless the response
#  ends first.  A return value of 0 means the final bytes were returned and the body is complete;
#  -1 indicates a read failure.
set bdBody [new_CkBinData]

set chunkResult [CkRest_ReadRespChunkBd $rest 8192 $bdBody]
while {$chunkResult > 0} {
    set chunkResult [CkRest_ReadRespChunkBd $rest 8192 $bdBody]
}
if {$chunkResult < 0} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    delete_CkStringBuilder $sbError
    delete_CkBinData $bdBody
    exit
}

puts "Received [CkBinData_get_NumBytes $bdBody] bytes."

delete_CkRest $rest
delete_CkStringBuilder $sbError
delete_CkBinData $bdBody