Server Test

Server Test

rev. 4086b1854579bc6eae24dce129090ceaa6b97f5e

Files changed:

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_input.rs

@@ -1,1 +20,15 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5         -
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
    7         -
        crate::sigv4_event_stream::SignedEventError<
    8         -
            ::aws_smithy_http::event_stream::MessageStreamError,
    9         -
        >,
           5  +
    crate::sigv4_event_stream::SigV4Receiver<
           6  +
        crate::model::Events,
           7  +
        ::aws_smithy_http::event_stream::MessageStreamError,
   10      8   
    >,
   11      9   
    ::aws_smithy_cbor::decode::DeserializeError,
   12     10   
> {
   13     11   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
   14         -
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   15     12   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   16         -
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   17         -
        unmarshaller,
   18         -
        body,
   19         -
    ))
          13  +
    let receiver = crate::sigv4_event_stream::SigV4Receiver::new(unmarshaller, body);
          14  +
    Ok(receiver)
   20     15   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_initial_data_input.rs

@@ -1,1 +20,15 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5         -
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
    7         -
        crate::sigv4_event_stream::SignedEventError<
    8         -
            ::aws_smithy_http::event_stream::MessageStreamError,
    9         -
        >,
           5  +
    crate::sigv4_event_stream::SigV4Receiver<
           6  +
        crate::model::Events,
           7  +
        ::aws_smithy_http::event_stream::MessageStreamError,
   10      8   
    >,
   11      9   
    ::aws_smithy_cbor::decode::DeserializeError,
   12     10   
> {
   13     11   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
   14         -
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   15     12   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   16         -
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   17         -
        unmarshaller,
   18         -
        body,
   19         -
    ))
          13  +
    let receiver = crate::sigv4_event_stream::SigV4Receiver::new(unmarshaller, body);
          14  +
    Ok(receiver)
   20     15   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_initial_response_input.rs

@@ -1,1 +20,15 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5         -
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
    7         -
        crate::sigv4_event_stream::SignedEventError<
    8         -
            ::aws_smithy_http::event_stream::MessageStreamError,
    9         -
        >,
           5  +
    crate::sigv4_event_stream::SigV4Receiver<
           6  +
        crate::model::Events,
           7  +
        ::aws_smithy_http::event_stream::MessageStreamError,
   10      8   
    >,
   11      9   
    ::aws_smithy_cbor::decode::DeserializeError,
   12     10   
> {
   13     11   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
   14         -
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   15     12   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   16         -
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   17         -
        unmarshaller,
   18         -
        body,
   19         -
    ))
          13  +
    let receiver = crate::sigv4_event_stream::SigV4Receiver::new(unmarshaller, body);
          14  +
    Ok(receiver)
   20     15   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/protocol_serde/shape_streaming_operation_with_optional_data_input.rs

@@ -1,1 +20,15 @@
    1      1   
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
    2      2   
pub fn de_events_payload(
    3      3   
    body: &mut ::aws_smithy_types::body::SdkBody,
    4      4   
) -> std::result::Result<
    5         -
    ::aws_smithy_http::event_stream::Receiver<
    6         -
        crate::sigv4_event_stream::SignedEvent<crate::model::Events>,
    7         -
        crate::sigv4_event_stream::SignedEventError<
    8         -
            ::aws_smithy_http::event_stream::MessageStreamError,
    9         -
        >,
           5  +
    crate::sigv4_event_stream::SigV4Receiver<
           6  +
        crate::model::Events,
           7  +
        ::aws_smithy_http::event_stream::MessageStreamError,
   10      8   
    >,
   11      9   
    ::aws_smithy_cbor::decode::DeserializeError,
   12     10   
> {
   13     11   
    let unmarshaller = crate::event_stream_serde::EventsUnmarshaller::new();
   14         -
    let unmarshaller = crate::sigv4_event_stream::SigV4Unmarshaller::new(unmarshaller);
   15     12   
    let body = std::mem::replace(body, ::aws_smithy_types::body::SdkBody::taken());
   16         -
    Ok(::aws_smithy_http::event_stream::Receiver::new(
   17         -
        unmarshaller,
   18         -
        body,
   19         -
    ))
          13  +
    let receiver = crate::sigv4_event_stream::SigV4Receiver::new(unmarshaller, body);
          14  +
    Ok(receiver)
   20     15   
}

tmp-codegen-diff/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen/src/sigv4_event_stream.rs

@@ -1,1 +155,249 @@
    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
@@ -166,260 +0,325 @@
  186    280   
        .map_err(|err| crate::sigv4_event_stream::ExtractionError::InvalidPayload { error: err })?;
  187    281   
  188    282   
    Ok(MaybeSignedMessage::Signed {
  189    283   
        message: inner_message,
  190    284   
        signature: crate::sigv4_event_stream::SignatureInfo {
  191    285   
            chunk_signature,
  192    286   
            timestamp,
  193    287   
        },
  194    288   
    })
  195    289   
}
         290  +
         291  +
/// Error type for signed message extraction operations
         292  +
#[non_exhaustive]
         293  +
#[derive(Debug)]
         294  +
pub enum ExtractionError {
         295  +
    /// The payload could not be decoded as a valid message
         296  +
    #[non_exhaustive]
         297  +
    InvalidPayload {
         298  +
        error: ::aws_smithy_eventstream::error::Error,
         299  +
    },
         300  +
    /// The timestamp header is missing or has an invalid format
         301  +
    #[non_exhaustive]
         302  +
    InvalidTimestamp,
         303  +
}
         304  +
         305  +
impl ::std::fmt::Display for ExtractionError {
         306  +
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         307  +
        match self {
         308  +
            ExtractionError::InvalidPayload { error } => {
         309  +
                write!(f, "invalid payload: {}", error)
         310  +
            }
         311  +
            ExtractionError::InvalidTimestamp => {
         312  +
                write!(f, "invalid or missing timestamp header")
         313  +
            }
         314  +
        }
         315  +
    }
         316  +
}
         317  +
         318  +
impl ::std::error::Error for ExtractionError {
         319  +
    fn source(&self) -> ::std::option::Option<&(dyn ::std::error::Error + 'static)> {
         320  +
        match self {
         321  +
            ExtractionError::InvalidPayload { error } => ::std::option::Option::Some(error),
         322  +
            ExtractionError::InvalidTimestamp => ::std::option::Option::None,
         323  +
        }
         324  +
    }
         325  +
}