Read a streaming body a chunk at a time
Source:R/resp-stream.R
, R/resp-stream-aws.R
resp_stream_raw.Rd
resp_stream_raw()
retrieves bytes (raw
vectors).resp_stream_lines()
retrieves lines of text (character
vectors).resp_stream_sse()
retrieves a single server-sent event.resp_stream_aws()
retrieves a single event from an AWS stream (i.e. mime type `application/vnd.amazon.eventstream“).
Use resp_stream_is_complete()
to determine if there is further data
waiting on the stream.
Usage
resp_stream_raw(resp, kb = 32)
resp_stream_lines(resp, lines = 1, max_size = Inf, warn = TRUE)
resp_stream_sse(resp, max_size = Inf)
resp_stream_aws(resp, max_size = Inf)
# S3 method for class 'httr2_response'
close(con, ...)
resp_stream_is_complete(resp)
Arguments
- resp, con
A streaming response created by
req_perform_connection()
.- kb
How many kilobytes (1024 bytes) of data to read.
- lines
The maximum number of lines to return at once.
- max_size
The maximum number of bytes to buffer; once this number of bytes has been exceeded without a line/event boundary, an error is thrown.
- warn
Like
readLines()
: warn if the connection ends without a final EOL.- ...
Not used; included for compatibility with generic.
Value
resp_stream_raw()
: a raw vector.resp_stream_lines()
: a character vector.resp_stream_sse()
: a list with componentstype
,data
, andid
resp_stream_aws()
: a list with componentsheaders
andbody
.body
will be automatically parsed if the event contents a:content-type
header withapplication/json
.
resp_stream_sse()
and resp_stream_aws()
will return NULL
to signal that
the end of the stream has been reached or, if in nonblocking mode, that
no event is currently available.
Examples
req <- request(example_url()) |>
req_template("GET /stream/:n", n = 5)
con <- req |> req_perform_connection()
while (!resp_stream_is_complete(con)) {
lines <- con |> resp_stream_lines(2)
cat(length(lines), " lines received\n", sep = "")
}
#> 2 lines received
#> 2 lines received
#> 1 lines received
close(con)
# You can also see what's happening by setting verbosity
con <- req |> req_perform_connection(verbosity = 2)
#> -> GET /stream/5 HTTP/1.1
#> -> Host: 127.0.0.1:41599
#> -> User-Agent: httr2/1.1.0.9000 r-curl/6.1.0 libcurl/8.5.0
#> -> Accept: */*
#> -> Accept-Encoding: deflate, gzip, br, zstd
#> ->
#> <- HTTP/1.1 200 OK
#> <- Date: Tue, 21 Jan 2025 17:58:52 GMT
#> <- Content-Type: application/json
#> <- Transfer-Encoding: chunked
#> <-
while (!resp_stream_is_complete(con)) {
lines <- con |> resp_stream_lines(2)
}
#> << {"url":"http://127.0.0.1:41599/stream/5","args":{},"headers":{"Host":"127.0.0.1:41599","User-Agent":"httr2/1.1.0.9000 r-curl/6.1.0 libcurl/8.5.0","Accept":"*/*","Accept-Encoding":"deflate, gzip, br, zstd"},"origin":"127.0.0.1","id":0}<< {"url":"http://127.0.0.1:41599/stream/5","args":{},"headers":{"Host":"127.0.0.1:41599","User-Agent":"httr2/1.1.0.9000 r-curl/6.1.0 libcurl/8.5.0","Accept":"*/*","Accept-Encoding":"deflate, gzip, br, zstd"},"origin":"127.0.0.1","id":1}
#>
#> << {"url":"http://127.0.0.1:41599/stream/5","args":{},"headers":{"Host":"127.0.0.1:41599","User-Agent":"httr2/1.1.0.9000 r-curl/6.1.0 libcurl/8.5.0","Accept":"*/*","Accept-Encoding":"deflate, gzip, br, zstd"},"origin":"127.0.0.1","id":2}<< {"url":"http://127.0.0.1:41599/stream/5","args":{},"headers":{"Host":"127.0.0.1:41599","User-Agent":"httr2/1.1.0.9000 r-curl/6.1.0 libcurl/8.5.0","Accept":"*/*","Accept-Encoding":"deflate, gzip, br, zstd"},"origin":"127.0.0.1","id":3}
#>
#> << {"url":"http://127.0.0.1:41599/stream/5","args":{},"headers":{"Host":"127.0.0.1:41599","User-Agent":"httr2/1.1.0.9000 r-curl/6.1.0 libcurl/8.5.0","Accept":"*/*","Accept-Encoding":"deflate, gzip, br, zstd"},"origin":"127.0.0.1","id":4}
#>
close(con)