Tidy up reading the Response body bytes

This commit is contained in:
Brian Carroll 2022-07-17 16:24:46 +01:00
parent 8cf7752514
commit b84aac098e
No known key found for this signature in database
GPG Key ID: 9CF4E3BF9C4722C7

View File

@ -128,17 +128,38 @@ pub extern "C" fn roc_fx_putLine(line: &RocStr) {
println!("{}", string); println!("{}", string);
} }
const BODY_MAX_BYTES: usize = 10 * 1024 * 1024;
#[no_mangle] #[no_mangle]
pub extern "C" fn roc_fx_sendRequest(roc_request: &glue::Request) -> glue::Response { pub extern "C" fn roc_fx_sendRequest(roc_request: &glue::Request) -> glue::Response {
use std::io::Read;
let url = roc_request.url.as_str(); let url = roc_request.url.as_str();
match ureq::get(url).call() { match ureq::get(url).call() {
Ok(response) => { Ok(response) => {
let statusCode = response.status(); let statusCode = response.status();
let mut buffer: Vec<u8> = vec![]; let len: usize = response
let mut reader = response.into_reader(); .header("Content-Length")
reader.read(&mut buffer).expect("can't read response"); .and_then(|val| val.parse::<usize>().ok())
let body = RocList::from_slice(&buffer); .map(|val| val.max(BODY_MAX_BYTES))
.unwrap_or(BODY_MAX_BYTES);
let mut bytes: Vec<u8> = Vec::with_capacity(len);
match response
.into_reader()
.take(len as u64)
.read_to_end(&mut bytes)
{
Ok(_read_bytes) => {}
Err(_) => {
// Not totally accurate, but let's deal with this later when we do async
return glue::Response::NetworkError;
}
}
// Note: we could skip a full memcpy if we had `RocList::from_iter`.
let body = RocList::from_slice(&bytes);
let metadata = Metadata { let metadata = Metadata {
headers: RocList::empty(), headers: RocList::empty(),