Welcome to the forum @spurgus!
If the response includes the content-length header then you can check that from a response step:
req =
Req.new()
|> Req.Request.prepend_response_steps(validate_content_length: fn {req, resp} ->
with [header] <- Req.Response.get_header(resp, "content-length"),
{content_length, ""} <- Integer.parse(header) do
if content_length > @max_content_length do
Req.cancel_async_response(resp)
{req, RuntimeError.exception(message: "content-length too large")}
else
{req, resp}
end
else
_ ->
Req.cancel_async_response(resp)
{req, RuntimeError.exception(message: "Invalid content-length")}
end
end)
Otherwise, you’ll have to keep track of received bytes and halt the request. You mentioned streaming but didn’t say which form of streaming (into: :self, into: &fun/2, into: collectable). Here’s an example for the function form of streaming:
Req.get(req, into: fn {:data, data}, {req, resp} ->
resp = Req.Response.update_private(resp, :length, 0, & &1 + byte_size(data))
if Req.Response.get_private(resp, :length) > @max_content_length do
{:halt, {req, RuntimeError.exception(message: "content length too large")}}
else
{:cont, {req, resp}}
end
end)


















