I am using Finch.stream to fetch a large CSV file from a server, but neither the ‘done’ state nor the ‘error’ state is being triggered when I use "{:halt, {:error, reason}}". I need help figuring out how to determine when the stream has finished fetching data.
I think you’re looking for stream_while instead of stream, documented here. The stream function ignores the value returned from the given callback, whereas stream_while will look for the :cont/:halt tuples.
It seems that the third-party library I’m using to get CSV data doesn’t support trailers in the server, which is a component of the state in stream_loop . As a result, I’m unable to determine if the server has finished using stream_while . Does anyone have any other suggestions?
Finch.build(:get, url, @headers)
|> Finch.stream_while(
Pdex.Finch,
{"", {nil, nil}},
fn
{:status, status}, acc when status in 200..299 ->
IO.inspect(status)
{:cont, acc}
{:headers, headers}, acc ->
IO.inspect(headers)
{:cont, acc}
{:data, data}, acc ->
result = process_stream_data(data, acc, callback)
result
# never getting call
{:trailers, trailers}, acc ->
IO.inspect(trailers, label: "trailers")
{:cont, acc}
end,
receive_timeout: 3_000_000
)
Yes, it was included. I tried the ‘done’ state, but according to the documentation, ‘stream_while’ does not have a ‘done’ state, and the server does not respond with trailers when it finishes. here
The server should close the connection once it has finished sending the file, which will cause stream to finish. If the server is not closing the connection then you’ll need to use stream_while, storing content length from the headers and the sum of bytes received as data and then returning :halt once you have all the data to end your side of the connection.