1 1 | // Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
|
2 - | /// Wrapper for event stream messages that may be signed
|
2 + | /// Receiver wrapper that handles SigV4 signed event stream messages
|
3 3 | #[derive(Debug)]
|
4 + | pub struct SigV4Receiver<T, E> {
|
5 + | inner: ::aws_smithy_http::event_stream::Receiver<
|
6 + | crate::sigv4_event_stream::SignedEvent<T>,
|
7 + | crate::sigv4_event_stream::SignedEventError<E>,
|
8 + | >,
|
9 + | initial_signature: ::std::option::Option<crate::sigv4_event_stream::SignatureInfo>,
|
10 + | }
|
11 + |
|
12 + | impl<T, E> SigV4Receiver<T, E> {
|
13 + | pub fn new(
|
14 + | unmarshaller: impl ::aws_smithy_eventstream::frame::UnmarshallMessage<Output = T, Error = E>
|
15 + | + ::std::marker::Send
|
16 + | + ::std::marker::Sync
|
17 + | + 'static,
|
18 + | body: ::aws_smithy_types::body::SdkBody,
|
19 + | ) -> Self {
|
20 + | let sigv4_unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
|
21 + | Self {
|
22 + | inner: ::aws_smithy_http::event_stream::Receiver::new(sigv4_unmarshaller, body),
|
23 + | initial_signature: ::std::option::Option::None,
|
24 + | }
|
25 + | }
|
26 + |
|
27 + | /// Get the signature from the initial message, if it was signed
|
28 + | pub fn initial_signature(
|
29 + | &self,
|
30 + | ) -> ::std::option::Option<&crate::sigv4_event_stream::SignatureInfo> {
|
31 + | self.initial_signature.as_ref()
|
32 + | }
|
33 + |
|
34 + | /// Try to receive an initial message of the given type.
|
35 + | /// Handles SigV4-wrapped messages by extracting the inner message first.
|
36 + | pub async fn try_recv_initial(
|
37 + | &mut self,
|
38 + | message_type: ::aws_smithy_http::event_stream::InitialMessageType,
|
39 + | ) -> ::std::result::Result<
|
40 + | ::std::option::Option<::aws_smithy_types::event_stream::Message>,
|
41 + | ::aws_smithy_runtime_api::client::result::SdkError<
|
42 + | crate::sigv4_event_stream::SignedEventError<E>,
|
43 + | ::aws_smithy_types::event_stream::RawMessage,
|
44 + | >,
|
45 + | >
|
46 + | where
|
47 + | E: std::error::Error + 'static,
|
48 + | {
|
49 + | let result = self
|
50 + | .inner
|
51 + | .try_recv_initial_with_preprocessor(message_type, |message| {
|
52 + | match crate::sigv4_event_stream::extract_signed_message(&message) {
|
53 + | ::std::result::Result::Ok(MaybeSignedMessage::Signed {
|
54 + | message: inner,
|
55 + | signature,
|
56 + | }) => {
|
57 + | ::std::result::Result::Ok((inner, ::std::option::Option::Some(signature)))
|
58 + | }
|
59 + | ::std::result::Result::Ok(MaybeSignedMessage::Unsigned) => {
|
60 + | ::std::result::Result::Ok((message, ::std::option::Option::None))
|
61 + | }
|
62 + | ::std::result::Result::Err(err) => ::std::result::Result::Err(
|
63 + | ::aws_smithy_runtime_api::client::result::ResponseError::builder()
|
64 + | .raw(::aws_smithy_types::event_stream::RawMessage::Decoded(
|
65 + | message,
|
66 + | ))
|
67 + | .source(err)
|
68 + | .build(),
|
69 + | ),
|
70 + | }
|
71 + | })
|
72 + | .await?;
|
73 + | match result {
|
74 + | ::std::option::Option::Some((message, signature)) => {
|
75 + | self.initial_signature = signature;
|
76 + | ::std::result::Result::Ok(::std::option::Option::Some(message))
|
77 + | }
|
78 + | ::std::option::Option::None => ::std::result::Result::Ok(::std::option::Option::None),
|
79 + | }
|
80 + | }
|
81 + |
|
82 + | /// Receive the next event from the stream
|
83 + | /// The SigV4Unmarshaller handles unwrapping, so we just pass through
|
84 + | pub async fn recv(
|
85 + | &mut self,
|
86 + | ) -> ::std::result::Result<
|
87 + | ::std::option::Option<crate::sigv4_event_stream::SignedEvent<T>>,
|
88 + | ::aws_smithy_runtime_api::client::result::SdkError<
|
89 + | crate::sigv4_event_stream::SignedEventError<E>,
|
90 + | ::aws_smithy_types::event_stream::RawMessage,
|
91 + | >,
|
92 + | >
|
93 + | where
|
94 + | E: std::error::Error + 'static,
|
95 + | {
|
96 + | self.inner.recv().await
|
97 + | }
|
98 + | }
|
99 + |
|
100 + | /// Wrapper for event stream messages that may be signed
|
101 + | #[derive(Debug, Clone)]
|
4 102 | pub struct SignedEvent<T> {
|
5 103 | /// The actual event message
|
6 104 | pub message: T,
|
7 105 | /// Signature information if the message was signed
|
8 106 | pub signature: ::std::option::Option<crate::sigv4_event_stream::SignatureInfo>,
|
9 107 | }
|
10 108 |
|
11 109 | /// Error wrapper for signed event stream errors
|
12 110 | #[derive(Debug)]
|
13 111 | pub enum SignedEventError<E> {
|
14 112 | /// Error from the underlying event stream
|
15 113 | Event(E),
|
16 114 | /// Error extracting signed message
|
17 115 | InvalidSignedEvent(crate::sigv4_event_stream::ExtractionError),
|
18 116 | }
|
19 117 |
|
20 118 | impl<E> From<E> for SignedEventError<E> {
|
21 119 | fn from(err: E) -> Self {
|
22 120 | SignedEventError::Event(err)
|
23 121 | }
|
24 122 | }
|
25 123 |
|
26 124 | /// Information extracted from a signed event stream message
|
27 125 | #[non_exhaustive]
|
28 - | #[derive(Debug, Clone)]
|
126 + | #[derive(Debug, Clone, PartialEq)]
|
29 127 | pub struct SignatureInfo {
|
30 128 | /// The chunk signature bytes from the `:chunk-signature` header
|
31 129 | pub chunk_signature: Vec<u8>,
|
32 130 | /// The timestamp from the `:date` header
|
33 131 | pub timestamp: ::std::time::SystemTime,
|
34 132 | }
|
35 133 |
|
36 - | /// Error type for signed message extraction operations
|
37 - | #[non_exhaustive]
|
38 - | #[derive(Debug)]
|
39 - | pub enum ExtractionError {
|
40 - | /// The payload could not be decoded as a valid message
|
41 - | #[non_exhaustive]
|
42 - | InvalidPayload {
|
43 - | error: ::aws_smithy_eventstream::error::Error,
|
44 - | },
|
45 - | /// The timestamp header is missing or has an invalid format
|
46 - | #[non_exhaustive]
|
47 - | InvalidTimestamp,
|
48 - | }
|
49 - |
|
50 134 | /// Unmarshaller wrapper that handles SigV4 signed event stream messages
|
51 135 | #[derive(Debug)]
|
52 136 | pub struct SigV4Unmarshaller<T> {
|
53 137 | inner: T,
|
54 138 | }
|
55 139 |
|
56 140 | impl<T> SigV4Unmarshaller<T> {
|
57 141 | pub fn new(inner: T) -> Self {
|
58 142 | Self { inner }
|
59 143 | }
|
60 144 | }
|
61 145 |
|
62 146 | impl<T> ::aws_smithy_eventstream::frame::UnmarshallMessage for SigV4Unmarshaller<T>
|
63 147 | where
|
64 148 | T: ::aws_smithy_eventstream::frame::UnmarshallMessage,
|
65 149 | {
|
66 150 | type Output = crate::sigv4_event_stream::SignedEvent<T::Output>;
|
67 151 | type Error = crate::sigv4_event_stream::SignedEventError<T::Error>;
|
68 152 |
|
69 153 | fn unmarshall(
|
70 154 | &self,
|
71 155 | message: &::aws_smithy_types::event_stream::Message,
|
72 156 | ) -> ::std::result::Result<
|
73 157 | ::aws_smithy_eventstream::frame::UnmarshalledMessage<Self::Output, Self::Error>,
|
74 158 | ::aws_smithy_eventstream::error::Error,
|
75 159 | > {
|
76 160 | // First, try to extract the signed message
|
77 161 | match crate::sigv4_event_stream::extract_signed_message(message) {
|
78 - | Ok(MaybeSignedMessage::Signed {
|
162 + | ::std::result::Result::Ok(MaybeSignedMessage::Signed {
|
79 163 | message: inner_message,
|
80 164 | signature,
|
81 165 | }) => {
|
82 166 | // Process the inner message with the base unmarshaller
|
83 167 | match self.inner.unmarshall(&inner_message) {
|
84 - | Ok(unmarshalled) => match unmarshalled {
|
168 + | ::std::result::Result::Ok(unmarshalled) => match unmarshalled {
|
85 169 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
|
86 - | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
|
87 - | crate::sigv4_event_stream::SignedEvent {
|
88 - | message: event,
|
89 - | signature: Some(signature),
|
90 - | },
|
91 - | ))
|
170 + | ::std::result::Result::Ok(
|
171 + | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
|
172 + | crate::sigv4_event_stream::SignedEvent {
|
173 + | message: event,
|
174 + | signature: ::std::option::Option::Some(signature),
|
175 + | },
|
176 + | ),
|
177 + | )
|
92 178 | }
|
93 179 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
|
94 - | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
95 - | crate::sigv4_event_stream::SignedEventError::Event(err),
|
96 - | ))
|
180 + | ::std::result::Result::Ok(
|
181 + | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
182 + | crate::sigv4_event_stream::SignedEventError::Event(err),
|
183 + | ),
|
184 + | )
|
97 185 | }
|
98 186 | },
|
99 - | Err(err) => Err(err),
|
187 + | ::std::result::Result::Err(err) => ::std::result::Result::Err(err),
|
100 188 | }
|
101 189 | }
|
102 - | Ok(MaybeSignedMessage::Unsigned) => {
|
190 + | ::std::result::Result::Ok(MaybeSignedMessage::Unsigned) => {
|
103 191 | // Process unsigned message directly
|
104 192 | match self.inner.unmarshall(message) {
|
105 - | Ok(unmarshalled) => match unmarshalled {
|
193 + | ::std::result::Result::Ok(unmarshalled) => match unmarshalled {
|
106 194 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
|
107 - | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
|
108 - | crate::sigv4_event_stream::SignedEvent {
|
109 - | message: event,
|
110 - | signature: None,
|
111 - | },
|
112 - | ))
|
195 + | ::std::result::Result::Ok(
|
196 + | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
|
197 + | crate::sigv4_event_stream::SignedEvent {
|
198 + | message: event,
|
199 + | signature: ::std::option::Option::None,
|
200 + | },
|
201 + | ),
|
202 + | )
|
113 203 | }
|
114 204 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
|
115 - | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
116 - | crate::sigv4_event_stream::SignedEventError::Event(err),
|
117 - | ))
|
205 + | ::std::result::Result::Ok(
|
206 + | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
207 + | crate::sigv4_event_stream::SignedEventError::Event(err),
|
208 + | ),
|
209 + | )
|
118 210 | }
|
119 211 | },
|
120 - | Err(err) => Err(err),
|
212 + | ::std::result::Result::Err(err) => ::std::result::Result::Err(err),
|
121 213 | }
|
122 214 | }
|
123 - | Err(extraction_err) => Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
124 - | crate::sigv4_event_stream::SignedEventError::InvalidSignedEvent(extraction_err),
|
125 - | )),
|
215 + | ::std::result::Result::Err(extraction_err) => ::std::result::Result::Ok(
|
216 + | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
217 + | crate::sigv4_event_stream::SignedEventError::InvalidSignedEvent(extraction_err),
|
218 + | ),
|
219 + | ),
|
126 220 | }
|
127 221 | }
|
128 222 | }
|
129 223 |
|
130 224 | /// Result of extracting a potentially signed message
|
131 225 | #[derive(Debug)]
|
132 226 | pub enum MaybeSignedMessage {
|
133 227 | /// Message was signed and has been extracted
|
134 228 | Signed {
|
135 229 | /// The inner message that was signed
|