use std::io::{Read, Write};
use crate::error::Result;
use crate::session::Session;
pub(crate) const READ_BUF: usize = 16 * 1024;
pub(crate) fn serve_blocking<S: Read + Write>(stream: &mut S, session: &mut Session) -> Result<()> {
serve_blocking_prefed(stream, session, &[])
}
pub(crate) fn serve_blocking_prefed<S: Read + Write>(
stream: &mut S,
session: &mut Session,
initial: &[u8],
) -> Result<()> {
let mut buf = [0u8; READ_BUF];
let mut pending = initial;
loop {
let received = if !pending.is_empty() {
let r = session.received(pending);
pending = &[];
r
} else {
let n = stream.read(&mut buf)?;
if n == 0 {
break; }
session.received(&buf[..n])
};
if let Ok(out) = session.to_send()
&& !out.is_empty()
{
stream.write_all(&out)?;
stream.flush()?;
}
received?;
if session.wants_close() {
break;
}
}
Ok(())
}