in rust-runtime/aws-smithy-client/src/dvr/record.rs [74:134]
fn record_body(
body: &mut SdkBody,
event_id: ConnectionId,
direction: Direction,
event_bus: Arc<Mutex<Vec<Event>>>,
) -> JoinHandle<()> {
let (sender, output_body) = hyper::Body::channel();
let real_body = std::mem::replace(body, SdkBody::from(output_body));
tokio::spawn(async move {
let mut real_body = real_body;
let mut sender = sender;
loop {
let data = real_body.data().await;
match data {
Some(Ok(data)) => {
event_bus.lock().unwrap().push(Event {
connection_id: event_id,
action: Action::Data {
data: BodyData::from(data.clone()),
direction,
},
});
// This happens if the real connection is closed during recording.
// Need to think more carefully if this is the correct thing to log in this
// case.
if sender.send_data(data).await.is_err() {
event_bus.lock().unwrap().push(Event {
connection_id: event_id,
action: Action::Eof {
direction: direction.opposite(),
ok: false,
},
})
};
}
None => {
event_bus.lock().unwrap().push(Event {
connection_id: event_id,
action: Action::Eof {
ok: true,
direction,
},
});
drop(sender);
break;
}
Some(Err(_err)) => {
event_bus.lock().unwrap().push(Event {
connection_id: event_id,
action: Action::Eof {
ok: false,
direction,
},
});
sender.abort();
break;
}
}
}
})
}