You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Add request ID to response headers
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Add parsing test
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Style
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* CHANGELOG
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Fix import
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Panic if ServerRequestIdProviderLayer is not present
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Own value
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Correct docs
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Add order of layer to expect() message
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Remove Box
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Require order of request ID layers
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Revert "Require order of request ID layers"
This reverts commit 147eef2.
* One layer to generate and inject the header
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* HeaderName for header name
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* CHANGELOG
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Remove additional layer
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Remove to_owned
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Add tests, remove unnecessary clone
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* take() ResponsePackage instead
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Update docs
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Update docs
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* cargo fmt
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
* Update CHANGELOG
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
---------
Signed-off-by: Daniele Ahmed <ahmeddan@amazon.de>
Co-authored-by: Daniele Ahmed <ahmeddan@amazon.de>
Copy file name to clipboardExpand all lines: rust-runtime/aws-smithy-http-server/src/request/request_id.rs
+133-9Lines changed: 133 additions & 9 deletions
Original file line number
Diff line number
Diff line change
@@ -12,8 +12,10 @@
12
12
//! A [`ServerRequestId`] is an opaque random identifier generated by the server every time it receives a request.
13
13
//! It uniquely identifies the request within that service instance. It can be used to collate all logs, events and
14
14
//! data related to a single operation.
15
+
//! Use [`ServerRequestIdProviderLayer::new`] to use [`ServerRequestId`] in your handler.
15
16
//!
16
17
//! The [`ServerRequestId`] can be returned to the caller, who can in turn share the [`ServerRequestId`] to help the service owner in troubleshooting issues related to their usage of the service.
18
+
//! Use [`ServerRequestIdProviderLayer::new_with_response_header`] to use [`ServerRequestId`] in your handler and add it to the response headers.
17
19
//!
18
20
//! The [`ServerRequestId`] is not meant to be propagated to downstream dependencies of the service. You should rely on a distributed tracing implementation for correlation purposes (e.g. OpenTelemetry).
19
21
//!
@@ -34,20 +36,24 @@
34
36
//! .operation(handler)
35
37
//! .build().unwrap();
36
38
//!
37
-
//! let app = app.layer(&ServerRequestIdProviderLayer::new()); /* Generate a server request ID */
39
+
//! let app = app
40
+
//! .layer(&ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static("x-request-id"))); /* Generate a server request ID and add it to the response header */
38
41
//!
39
42
//! let bind: std::net::SocketAddr = format!("{}:{}", args.address, args.port)
40
43
//! .parse()
41
44
//! .expect("unable to parse the server bind address and port");
42
45
//! let server = hyper::Server::bind(&bind).serve(app.into_make_service());
43
46
//! ```
44
47
48
+
use std::future::Future;
45
49
use std::{
46
50
fmt::Display,
47
51
task::{Context,Poll},
48
52
};
49
53
54
+
use futures_util::TryFuture;
50
55
use http::request::Parts;
56
+
use http::{header::HeaderName,HeaderValue,Response};
51
57
use thiserror::Error;
52
58
use tower::{Layer,Service};
53
59
use uuid::Uuid;
@@ -74,6 +80,10 @@ impl ServerRequestId {
74
80
pubfnnew() -> Self{
75
81
Self{id:Uuid::new_v4()}
76
82
}
83
+
84
+
pub(crate)fnto_header(&self) -> HeaderValue{
85
+
HeaderValue::from_str(&self.id.to_string()).expect("This string contains only valid ASCII")
86
+
}
77
87
}
78
88
79
89
implDisplayforServerRequestId{
@@ -99,17 +109,28 @@ impl Default for ServerRequestId {
99
109
#[derive(Clone)]
100
110
pubstructServerRequestIdProvider<S>{
101
111
inner:S,
112
+
header_key:Option<HeaderName>,
102
113
}
103
114
104
115
/// A layer that provides services with a unique request ID instance
105
116
#[derive(Debug)]
106
117
#[non_exhaustive]
107
-
pubstructServerRequestIdProviderLayer;
118
+
pubstructServerRequestIdProviderLayer{
119
+
header_key:Option<HeaderName>,
120
+
}
108
121
109
122
implServerRequestIdProviderLayer{
110
-
/// Generate a new unique request ID
123
+
/// Generate a new unique request ID and do not add it as a response header
124
+
/// Use [`ServerRequestIdProviderLayer::new_with_response_header`] to also add it as a response header
111
125
pubfnnew() -> Self{
112
-
Self{}
126
+
Self{header_key:None}
127
+
}
128
+
129
+
/// Generate a new unique request ID and add it as a response header
0 commit comments