-
Notifications
You must be signed in to change notification settings - Fork 1.7k
wasi-http: can we call the blocking_write_and_flush method of the OutgoingRequest body multiple times? #9653
Description
My scenario is simple: I want to send a request with a large body, but the blocking_write_and_flush method can only write 4096 bytes at a time. Naturally, I decided to call this method multiple times to write the entire body:
let req = OutgoingRequest::new(...);
let outgoing_body = req.body().unwarp();
let request_body = outgoing_body.write().unwarp();
let chunks = buf.chunks(4096);
for chunk in chunks {
request_body.blocking_write_and_flush(chunk).expect("writing response");
}
OutgoingBody::finish(outgoing_body, None).unwarp();However, I found that the program gets stuck forever on the second call to blocking_write_and_flush. After debugging, I found that it actually gets stuck during the ready check in the second call:
wasmtime/crates/wasi-http/src/body.rs
Lines 662 to 669 in 5af8930
| impl Subscribe for BodyWriteStream { | |
| async fn ready(&mut self) { | |
| // Attempt to perform a reservation for a send. If there's capacity in | |
| // the channel or it's already closed then this will return immediately. | |
| // If the channel is full this will block until capacity opens up. | |
| let _ = self.writer.reserve().await; | |
| } | |
| } |
wasmtime/crates/wasi-http/src/body.rs
Line 472 in 5af8930
| let (body_sender, body_receiver) = mpsc::channel(2); |
At this point, the writer has no capacity left, but my writing process hasn't finished, so the reader hasn't started consuming the data (?).
For my issue, I could stop using this method and instead combine check-write, subscribe, write, and flush manually to solve it. However, I'm curious whether we are inclined to allow or not allow this behavior. Because the current behavior is strange—the program doesn't report an error, it just hangs indefinitely.