1 1 | // Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
|
2 - | /// Receiver wrapper that handles SigV4 signed event stream messages
|
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 2 | /// Wrapper for event stream messages that may be signed
|
101 - | #[derive(Debug, Clone)]
|
3 + | #[derive(Debug)]
|
102 4 | pub struct SignedEvent<T> {
|
103 5 | /// The actual event message
|
104 6 | pub message: T,
|
105 7 | /// Signature information if the message was signed
|
106 8 | pub signature: ::std::option::Option<crate::sigv4_event_stream::SignatureInfo>,
|
107 9 | }
|
108 10 |
|
109 11 | /// Error wrapper for signed event stream errors
|
110 12 | #[derive(Debug)]
|
111 13 | pub enum SignedEventError<E> {
|
112 14 | /// Error from the underlying event stream
|
113 15 | Event(E),
|
114 16 | /// Error extracting signed message
|
115 17 | InvalidSignedEvent(crate::sigv4_event_stream::ExtractionError),
|
116 18 | }
|
117 19 |
|
118 20 | impl<E> From<E> for SignedEventError<E> {
|
119 21 | fn from(err: E) -> Self {
|
120 22 | SignedEventError::Event(err)
|
121 23 | }
|
122 24 | }
|
123 25 |
|
124 26 | /// Information extracted from a signed event stream message
|
125 27 | #[non_exhaustive]
|
126 - | #[derive(Debug, Clone, PartialEq)]
|
28 + | #[derive(Debug, Clone)]
|
127 29 | pub struct SignatureInfo {
|
128 30 | /// The chunk signature bytes from the `:chunk-signature` header
|
129 31 | pub chunk_signature: Vec<u8>,
|
130 32 | /// The timestamp from the `:date` header
|
131 33 | pub timestamp: ::std::time::SystemTime,
|
132 34 | }
|
133 35 |
|
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 + |
|
134 50 | /// Unmarshaller wrapper that handles SigV4 signed event stream messages
|
135 51 | #[derive(Debug)]
|
136 52 | pub struct SigV4Unmarshaller<T> {
|
137 53 | inner: T,
|
138 54 | }
|
139 55 |
|
140 56 | impl<T> SigV4Unmarshaller<T> {
|
141 57 | pub fn new(inner: T) -> Self {
|
142 58 | Self { inner }
|
143 59 | }
|
144 60 | }
|
145 61 |
|
146 62 | impl<T> ::aws_smithy_eventstream::frame::UnmarshallMessage for SigV4Unmarshaller<T>
|
147 63 | where
|
148 64 | T: ::aws_smithy_eventstream::frame::UnmarshallMessage,
|
149 65 | {
|
150 66 | type Output = crate::sigv4_event_stream::SignedEvent<T::Output>;
|
151 67 | type Error = crate::sigv4_event_stream::SignedEventError<T::Error>;
|
152 68 |
|
153 69 | fn unmarshall(
|
154 70 | &self,
|
155 71 | message: &::aws_smithy_types::event_stream::Message,
|
156 72 | ) -> ::std::result::Result<
|
157 73 | ::aws_smithy_eventstream::frame::UnmarshalledMessage<Self::Output, Self::Error>,
|
158 74 | ::aws_smithy_eventstream::error::Error,
|
159 75 | > {
|
160 76 | // First, try to extract the signed message
|
161 77 | match crate::sigv4_event_stream::extract_signed_message(message) {
|
162 - | ::std::result::Result::Ok(MaybeSignedMessage::Signed {
|
78 + | Ok(MaybeSignedMessage::Signed {
|
163 79 | message: inner_message,
|
164 80 | signature,
|
165 81 | }) => {
|
166 82 | // Process the inner message with the base unmarshaller
|
167 83 | match self.inner.unmarshall(&inner_message) {
|
168 - | ::std::result::Result::Ok(unmarshalled) => match unmarshalled {
|
84 + | Ok(unmarshalled) => match unmarshalled {
|
169 85 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
|
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 - | )
|
86 + | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
|
87 + | crate::sigv4_event_stream::SignedEvent {
|
88 + | message: event,
|
89 + | signature: Some(signature),
|
90 + | },
|
91 + | ))
|
178 92 | }
|
179 93 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
|
180 - | ::std::result::Result::Ok(
|
181 - | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
182 - | crate::sigv4_event_stream::SignedEventError::Event(err),
|
183 - | ),
|
184 - | )
|
94 + | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
95 + | crate::sigv4_event_stream::SignedEventError::Event(err),
|
96 + | ))
|
185 97 | }
|
186 98 | },
|
187 - | ::std::result::Result::Err(err) => ::std::result::Result::Err(err),
|
99 + | Err(err) => Err(err),
|
188 100 | }
|
189 101 | }
|
190 - | ::std::result::Result::Ok(MaybeSignedMessage::Unsigned) => {
|
102 + | Ok(MaybeSignedMessage::Unsigned) => {
|
191 103 | // Process unsigned message directly
|
192 104 | match self.inner.unmarshall(message) {
|
193 - | ::std::result::Result::Ok(unmarshalled) => match unmarshalled {
|
105 + | Ok(unmarshalled) => match unmarshalled {
|
194 106 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(event) => {
|
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 - | )
|
107 + | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Event(
|
108 + | crate::sigv4_event_stream::SignedEvent {
|
109 + | message: event,
|
110 + | signature: None,
|
111 + | },
|
112 + | ))
|
203 113 | }
|
204 114 | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(err) => {
|
205 - | ::std::result::Result::Ok(
|
206 - | ::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
207 - | crate::sigv4_event_stream::SignedEventError::Event(err),
|
208 - | ),
|
209 - | )
|
115 + | Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
116 + | crate::sigv4_event_stream::SignedEventError::Event(err),
|
117 + | ))
|
210 118 | }
|
211 119 | },
|
212 - | ::std::result::Result::Err(err) => ::std::result::Result::Err(err),
|
120 + | Err(err) => Err(err),
|
213 121 | }
|
214 122 | }
|
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 - | ),
|
123 + | Err(extraction_err) => Ok(::aws_smithy_eventstream::frame::UnmarshalledMessage::Error(
|
124 + | crate::sigv4_event_stream::SignedEventError::InvalidSignedEvent(extraction_err),
|
125 + | )),
|
220 126 | }
|
221 127 | }
|
222 128 | }
|
223 129 |
|
224 130 | /// Result of extracting a potentially signed message
|
225 131 | #[derive(Debug)]
|
226 132 | pub enum MaybeSignedMessage {
|
227 133 | /// Message was signed and has been extracted
|
228 134 | Signed {
|
229 135 | /// The inner message that was signed
|