@@ -127,45 +127,56 @@ impl ContextInternal {
127
127
128
128
pub fn input < T : Deserialize > ( & self ) -> impl Future < Output = ( T , InputMetadata ) > {
129
129
let mut inner_lock = must_lock ! ( self . inner) ;
130
- let input_result =
131
- inner_lock
132
- . vm
133
- . sys_input ( )
134
- . map_err ( ErrorInner :: VM )
135
- . and_then ( |raw_input| {
136
- let headers = http:: HeaderMap :: < String > :: try_from (
137
- & raw_input
138
- . headers
139
- . into_iter ( )
140
- . map ( |h| ( h. key . to_string ( ) , h. value . to_string ( ) ) )
141
- . collect :: < HashMap < String , String > > ( ) ,
142
- )
143
- . map_err ( |e| ErrorInner :: Deserialization {
144
- syscall : "input_headers" ,
145
- err : e. into ( ) ,
146
- } ) ?;
130
+ let input_result = inner_lock
131
+ . vm
132
+ . sys_input ( )
133
+ . map_err ( ErrorInner :: VM )
134
+ . map ( |raw_input| {
135
+ let headers = http:: HeaderMap :: < String > :: try_from (
136
+ & raw_input
137
+ . headers
138
+ . into_iter ( )
139
+ . map ( |h| ( h. key . to_string ( ) , h. value . to_string ( ) ) )
140
+ . collect :: < HashMap < String , String > > ( ) ,
141
+ )
142
+ . map_err ( |e| {
143
+ TerminalError :: new_with_code ( 400 , format ! ( "Cannot decode headers: {e:?}" ) )
144
+ } ) ?;
147
145
148
- Ok ( (
149
- T :: deserialize ( & mut ( raw_input. input . into ( ) ) ) . map_err ( |e| {
150
- ErrorInner :: Deserialization {
151
- syscall : "input" ,
152
- err : e . into ( ) ,
153
- }
154
- } ) ?,
155
- InputMetadata {
156
- invocation_id : raw_input. invocation_id ,
157
- random_seed : raw_input. random_seed ,
158
- key : raw_input. key ,
159
- headers,
160
- } ,
161
- ) )
162
- } ) ;
146
+ Ok :: < _ , TerminalError > ( (
147
+ T :: deserialize ( & mut ( raw_input. input . into ( ) ) ) . map_err ( |e| {
148
+ TerminalError :: new_with_code (
149
+ 400 ,
150
+ format ! ( "Cannot decode input payload: {e:?}" ) ,
151
+ )
152
+ } ) ?,
153
+ InputMetadata {
154
+ invocation_id : raw_input. invocation_id ,
155
+ random_seed : raw_input. random_seed ,
156
+ key : raw_input. key ,
157
+ headers,
158
+ } ,
159
+ ) )
160
+ } ) ;
163
161
164
162
match input_result {
165
- Ok ( i ) => {
163
+ Ok ( Ok ( i ) ) => {
166
164
drop ( inner_lock) ;
167
165
return Either :: Left ( ready ( i) ) ;
168
166
}
167
+ Ok ( Err ( err) ) => {
168
+ let error_inner = ErrorInner :: Deserialization {
169
+ syscall : "input" ,
170
+ err : err. 0 . clone ( ) . into ( ) ,
171
+ } ;
172
+ let _ = inner_lock
173
+ . vm
174
+ . sys_write_output ( NonEmptyValue :: Failure ( err. into ( ) ) ) ;
175
+ let _ = inner_lock. vm . sys_end ( ) ;
176
+ // This causes the trap, plus logs the error
177
+ inner_lock. handler_state . mark_error ( error_inner. into ( ) ) ;
178
+ drop ( inner_lock) ;
179
+ }
169
180
Err ( e) => {
170
181
inner_lock. fail ( e. into ( ) ) ;
171
182
drop ( inner_lock) ;
0 commit comments