Crates.io | clamav-stream |
lib.rs | clamav-stream |
version | 0.1.0 |
source | src |
created_at | 2023-12-29 16:25:37.685851 |
updated_at | 2023-12-29 16:25:37.685851 |
description | Scan and consume byte streams |
homepage | |
repository | https://github.com/kaicoh/clamav-stream |
max_upload_size | |
id | 1083467 |
size | 20,919 |
A ScannedStream
is a wrapper stream holding byte stream. It sends the inner stream to clamav to scan it while passes it through to the consumer.
This library is inspired by the toblux/rust-clamav-client.
Add dependency to your Cargo.toml
.
[dependencies]
clamav_stream = "0.1.0"
Wrap byte stream with ScannedStream and consume it.
There are no deferences between consuming ScannedStream
and its inner stream.
use clamav_stream::ScannedStream;
use bytes::Bytes;
use std::net::TcpStream;
use tokio::fs::File;
use tokio_stream::StreamExt;
use tokio_util::io::ReaderStream;
#[tokio::main]
async fn main() {
let file = File::open("tests/clean.txt").await.unwrap();
let mut input = ReaderStream::new(file);
let addr = "localhost:3310"; // tcp address to clamav server.
let mut stream = ScannedStream::<_, TcpStream>::tcp(&mut input, addr).unwrap();
// The result of consuming ScannedStream is equal to consuming the input stream.
assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 1st"))));
assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 2nd"))));
// ... continue until all contents are consumed ...
assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents last"))));
assert_eq!(stream.next().await, None);
}
An Err is returned after all contents are consumed.
use clamav_stream::{Error, ScannedStream};
use bytes::Bytes;
use std::net::TcpStream;
use tokio::fs::File;
use tokio_stream::StreamExt;
use tokio_util::io::ReaderStream;
#[tokio::main]
async fn main() {
let file = File::open("tests/eicar.txt").await.unwrap();
let mut input = ReaderStream::new(file);
let addr = "localhost:3310"; // tcp address to clamav server.
let mut stream = ScannedStream::<_, TcpStream>::tcp(&mut input, addr).unwrap();
// An Err is returned after all contents are consumed.
assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 1st"))));
assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents 2nd"))));
// ... continue until all contents are consumed ...
assert_eq!(stream.next().await, Some(Ok(Bytes::from("file contents last"))));
assert_eq!(stream.next().await, Some(Err(Error::Scan("message from clamav".into()))));
assert_eq!(stream.next().await, None);
}
This software is released under the MIT License.