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