use std::net::SocketAddr;
use std::time::Duration;
pub async fn post_status_line(
addr: SocketAddr,
authorization: Option<&str>,
body: &[u8],
) -> String {
use tokio::io::{AsyncReadExt as _, AsyncWriteExt as _};
let credential = authorization.map_or_else(String::new, |v| format!("Authorization: {v}\r\n"));
let mut request = format!(
"POST /mcp HTTP/1.1\r\nHost: {addr}\r\nContent-Type: application/json\r\n\
Accept: application/json, text/event-stream\r\n{credential}\
Content-Length: {}\r\n\r\n",
body.len()
)
.into_bytes();
request.extend_from_slice(body);
let socket = tokio::net::TcpStream::connect(addr)
.await
.expect("connect to the listener");
let (mut reader, mut writer) = socket.into_split();
let sender = tokio::spawn(async move {
let _ = writer.write_all(&request).await;
std::future::pending::<()>().await;
});
let mut line = Vec::new();
let read = async {
let mut byte = [0u8; 1];
while let Ok(1) = reader.read(&mut byte).await {
if byte[0] == b'\n' {
break;
}
line.push(byte[0]);
}
};
tokio::time::timeout(Duration::from_secs(10), read)
.await
.expect("the server must answer");
sender.abort();
String::from_utf8_lossy(&line).trim_end().to_owned()
}