@@ -126,7 +126,7 @@ use std::collections::{BTreeMap, HashMap};
126
126
use std:: fmt:: { Debug , Formatter } ;
127
127
use std:: future:: ready;
128
128
use std:: pin:: Pin ;
129
-
129
+ use std :: time :: SystemTime ;
130
130
use async_trait:: async_trait;
131
131
use bytes:: Bytes ;
132
132
use chrono:: { DateTime , FixedOffset , Utc } ;
@@ -1485,6 +1485,17 @@ async fn finalise_response(context: &mut WebmachineContext, resource: &(dyn Reso
1485
1485
resource. finish_request ( context) ;
1486
1486
resource. finalise_response ( context) ;
1487
1487
1488
+ if let Ok ( duration) = context. start_time . elapsed ( ) {
1489
+ context. response . add_header ( "Server-Timing" , vec ! [ HeaderValue {
1490
+ value: "response" . to_string( ) ,
1491
+ params: hashmap!{
1492
+ "desc" . to_string( ) => "Total Response Time" . to_string( ) ,
1493
+ "dur" . to_string( ) => format!( "{:?}" , duration)
1494
+ } ,
1495
+ quote: true
1496
+ } ] )
1497
+ }
1498
+
1488
1499
let body_size = context. response . body . as_ref ( ) . map ( |bytes| bytes. len ( ) ) . unwrap_or_default ( ) ;
1489
1500
debug ! ( status = context. response. status, headers = ?context. response. headers, body_size, "Final response" ) ;
1490
1501
}
@@ -1518,10 +1529,12 @@ impl WebmachineDispatcher {
1518
1529
}
1519
1530
1520
1531
async fn context_from_http_request ( & self , req : Request < Incoming > ) -> WebmachineContext {
1532
+ let now = SystemTime :: now ( ) ;
1521
1533
let request = request_from_http_request ( req) . await ;
1522
1534
WebmachineContext {
1523
1535
request,
1524
1536
response : WebmachineResponse :: default ( ) ,
1537
+ start_time : now,
1525
1538
.. WebmachineContext :: default ( )
1526
1539
}
1527
1540
}
0 commit comments