mirror of
https://github.com/yuezk/GlobalProtect-openconnect.git
synced 2025-05-20 07:26:58 -04:00
refactor: rename to gpcommon
This commit is contained in:
59
gpcommon/src/reader.rs
Normal file
59
gpcommon/src/reader.rs
Normal file
@@ -0,0 +1,59 @@
|
||||
use serde::Deserialize;
|
||||
use tokio::io::{self, AsyncReadExt, ReadHalf};
|
||||
use tokio::net::UnixStream;
|
||||
|
||||
pub(crate) struct Reader {
|
||||
stream: ReadHalf<UnixStream>,
|
||||
}
|
||||
|
||||
impl From<ReadHalf<UnixStream>> for Reader {
|
||||
fn from(stream: ReadHalf<UnixStream>) -> Self {
|
||||
Self { stream }
|
||||
}
|
||||
}
|
||||
|
||||
impl Reader {
|
||||
pub async fn read<T: for<'a> Deserialize<'a>>(&mut self) -> Result<T, io::Error> {
|
||||
let mut buffer = [0; 2048];
|
||||
|
||||
match self.stream.read(&mut buffer).await {
|
||||
Ok(0) => Err(io::Error::new(
|
||||
io::ErrorKind::ConnectionAborted,
|
||||
"Peer disconnected",
|
||||
)),
|
||||
Ok(bytes_read) => {
|
||||
let data = serde_json::from_slice::<T>(&buffer[..bytes_read])?;
|
||||
Ok(data)
|
||||
}
|
||||
Err(err) => Err(err),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn read_multiple<T: for<'a> Deserialize<'a>>(&mut self) -> Result<Vec<T>, io::Error> {
|
||||
let mut buffer = [0; 2048];
|
||||
|
||||
match self.stream.read(&mut buffer).await {
|
||||
Ok(0) => Err(io::Error::new(
|
||||
io::ErrorKind::ConnectionAborted,
|
||||
"Peer disconnected",
|
||||
)),
|
||||
Ok(bytes_read) => {
|
||||
let response_str = String::from_utf8_lossy(&buffer[..bytes_read]);
|
||||
let responses: Vec<&str> = response_str.split("\n\n").collect();
|
||||
let responses = responses
|
||||
.iter()
|
||||
.filter_map(|r| {
|
||||
if !r.is_empty() {
|
||||
serde_json::from_str(r).ok()
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect::<Vec<T>>();
|
||||
|
||||
Ok(responses)
|
||||
}
|
||||
Err(err) => Err(err),
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user