#![allow(clippy::large_enum_variant)]
#![allow(dead_code)]
pub mod binary;
pub mod buffer_pool;
mod errors;
pub mod headers;
#[cfg(feature = "mmap-buffers")]
pub mod mmap_buffer;
mod protocol;
pub mod v2;
pub mod grpc_v2 {
tonic::include_proto!("zentinel.agent.v2");
}
pub use errors::AgentProtocolError;
pub use protocol::{
AgentResponse, AuditMetadata, BinaryRequestBodyChunkEvent, BinaryResponseBodyChunkEvent,
BodyMutation, Decision, DetectionSeverity, EventType, GuardrailDetection,
GuardrailInspectEvent, GuardrailInspectionType, GuardrailResponse, HeaderOp,
RequestBodyChunkEvent, RequestCompleteEvent, RequestHeadersEvent, RequestMetadata,
ResponseBodyChunkEvent, ResponseHeadersEvent, TextSpan, WebSocketDecision, WebSocketFrameEvent,
WebSocketOpcode, MAX_MESSAGE_SIZE,
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_body_mutation_types() {
let pass_through = BodyMutation::pass_through(0);
assert!(pass_through.is_pass_through());
assert!(!pass_through.is_drop());
assert_eq!(pass_through.chunk_index, 0);
let drop = BodyMutation::drop_chunk(1);
assert!(!drop.is_pass_through());
assert!(drop.is_drop());
assert_eq!(drop.chunk_index, 1);
let replace = BodyMutation::replace(2, "modified content".to_string());
assert!(!replace.is_pass_through());
assert!(!replace.is_drop());
assert_eq!(replace.chunk_index, 2);
assert_eq!(replace.data, Some("modified content".to_string()));
}
#[test]
fn test_agent_response_streaming() {
let response = AgentResponse::needs_more_data();
assert!(response.needs_more);
assert_eq!(response.decision, Decision::Allow);
let mutation = BodyMutation::replace(0, "new content".to_string());
let response = AgentResponse::default_allow().with_request_body_mutation(mutation.clone());
assert!(!response.needs_more);
assert!(response.request_body_mutation.is_some());
assert_eq!(
response.request_body_mutation.unwrap().data,
Some("new content".to_string())
);
let response = AgentResponse::default_allow().set_needs_more(true);
assert!(response.needs_more);
}
}