actix_request_hook/
observer.rs

1//! [`Observer`] trait and function implementations.
2use std::time::Duration;
3
4use actix_web::dev::ServiceRequest;
5use actix_web::http::StatusCode;
6use actix_web::web::BytesMut;
7use uuid::Uuid;
8
9/// Request start arguments container
10///
11/// # Properties
12///
13/// * `req` - borrowed ServiceRequest.
14/// * `request_id` - unique identifier of a request, identifies connection between request start and end.
15/// * `uri` - uri of request.
16/// * `method` - http method of request.
17pub struct RequestStartData<'l> {
18    pub req: &'l ServiceRequest,
19    pub request_id: Uuid,
20    pub uri: String,
21    pub method: String,
22    pub body: BytesMut,
23}
24
25/// Request end arguments container
26///
27/// # Properties
28///
29/// * `request_id` - unique identifier of a request, identifies connection between request start and end.
30/// * `elapsed` - elapsed time between request start and end hook.
31/// * `uri` - uri of request.
32/// * `method` - http method of request.
33/// * `status` - http status code of response.
34pub struct RequestEndData {
35    pub request_id: Uuid,
36    pub elapsed: Duration,
37    pub uri: String,
38    pub method: String,
39    pub status: StatusCode,
40}
41
42/// An Observer is notified before a request is passed for processing, and after processing into a response.
43/// Use case could be logging before and after request:
44/// ```
45/// use actix_request_hook::observer::{Observer, RequestEndData, RequestStartData};
46/// struct RequestLogger;
47///
48/// impl Observer for RequestLogger {
49///     fn on_request_started(&self, data: RequestStartData) {
50///         println!("[start - {}] {} {}", data.request_id.to_string(), data.method, data.uri);
51///     }
52///
53///     fn on_request_ended(&self, data: RequestEndData) {
54///         let time_elapsed_millis = data.elapsed.as_millis();
55///         println!("[end - {}] {} {} ended with {} after {}ms", data.request_id.to_string(), data.method, data.uri, data.status, time_elapsed_millis);
56///     }
57/// }
58///
59/// ```
60pub trait Observer {
61    /// Fired before handler call. See [RequestStartData] for available arguments.
62    fn on_request_started(&self, data: RequestStartData);
63
64    /// Fired after handler call. See [RequestEndData] for available arguments.
65    fn on_request_ended(&self, data: RequestEndData);
66}