Skip to content

Commit 2ed5396

Browse files
streams fixes (#22)
1 parent e2dca90 commit 2ed5396

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

edge-function/src/helpers.rs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use crate::world::bindings::wasi::http::types::{Fields, OutgoingBody, OutgoingResponse};
1+
use crate::world::bindings::wasi::http::types::{
2+
Fields, IncomingRequest, OutgoingBody, OutgoingResponse,
3+
};
4+
5+
use crate::world::bindings::wasi::io::streams::StreamError;
26

37
use crate::world::bindings::exports::wasi::http::incoming_handler::ResponseOutparam;
48
use std::collections::HashMap;
@@ -49,9 +53,7 @@ impl ResponseBuilder {
4953
ResponseOutparam::set(resp, Ok(resp_tx));
5054
let stream = body.write().unwrap();
5155
if let Some(body_content) = self.body_content {
52-
stream
53-
.blocking_write_and_flush(body_content.as_bytes())
54-
.unwrap();
56+
let _ = stream.write(body_content.as_bytes());
5557
}
5658
drop(stream);
5759
let _ = OutgoingBody::finish(body, None);
@@ -71,3 +73,38 @@ pub fn parse_headers(headers: &Fields) -> HashMap<String, Vec<String>> {
7173

7274
output
7375
}
76+
77+
pub fn parse_body(req: IncomingRequest) -> Result<Vec<u8>, String> {
78+
let mut request_body = Vec::new();
79+
let stream = match req.consume() {
80+
Ok(stream) => stream,
81+
Err(_) => {
82+
return Err("Failed to consume request stream".to_string());
83+
}
84+
};
85+
let stream = match stream.stream() {
86+
Ok(stream) => stream,
87+
Err(_) => {
88+
return Err("Failed to get request stream".to_string());
89+
}
90+
};
91+
92+
loop {
93+
match stream.read(4096) {
94+
Ok(chunk) => {
95+
if chunk.is_empty() {
96+
break;
97+
}
98+
request_body.extend_from_slice(&chunk);
99+
}
100+
Err(StreamError::Closed) => {
101+
// Stream is closed, we can stop reading
102+
break;
103+
}
104+
Err(e) => {
105+
return Err(format!("Failed to read from request stream: {e}"));
106+
}
107+
}
108+
}
109+
Ok(request_body)
110+
}

edge-function/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ impl Guest for Component {
2323
}
2424
};
2525

26+
let _ = helpers::parse_body(req);
27+
2628
//let example = waki::Client::new()
2729
// .get("https://example.com")
2830
// .send()

0 commit comments

Comments
 (0)