@@ -7,7 +7,7 @@ use futures::{
7
7
use hyper:: { Response , StatusCode } ;
8
8
use interledger_settlement:: Quantity ;
9
9
use interledger_settlement:: { IdempotentData , IdempotentStore } ;
10
- use log:: trace ;
10
+ use log:: error ;
11
11
use ring:: digest:: { digest, SHA256 } ;
12
12
use tokio:: executor:: spawn;
13
13
use tower_web:: { net:: ConnectionStream , ServiceBuilder } ;
@@ -77,19 +77,23 @@ impl_web! {
77
77
& self ,
78
78
idempotency_key: String ,
79
79
input_hash: [ u8 ; 32 ] ,
80
- ) -> impl Future <Item = ( StatusCode , Bytes ) , Error = String > {
80
+ ) -> impl Future <Item = Option < ( StatusCode , Bytes ) > , Error = String > {
81
81
self . store
82
82
. load_idempotent_data( idempotency_key. clone( ) )
83
83
. map_err( move |_| {
84
- let error_msg = "Couldn't load idempotent data" . to_owned ( ) ;
85
- trace !( "{}" , error_msg) ;
84
+ let error_msg = format! ( "Couldn't load idempotent data for idempotency key {:?}" , idempotency_key ) ;
85
+ error !( "{}" , error_msg) ;
86
86
error_msg
87
87
} )
88
- . and_then( move |ret: IdempotentData | {
89
- if ret. 2 == input_hash {
90
- Ok ( ( ret. 0 , ret. 1 ) )
88
+ . and_then( move |ret: Option <IdempotentData >| {
89
+ if let Some ( ret) = ret {
90
+ if ret. 2 == input_hash {
91
+ Ok ( Some ( ( ret. 0 , ret. 1 ) ) )
92
+ } else {
93
+ Ok ( Some ( ( StatusCode :: from_u16( 409 ) . unwrap( ) , Bytes :: from( & b"Provided idempotency key is tied to other input" [ ..] ) ) ) )
94
+ }
91
95
} else {
92
- Ok ( ( StatusCode :: from_u16 ( 409 ) . unwrap ( ) , Bytes :: from ( & b"Provided idempotency key is tied to other input" [ .. ] ) ) )
96
+ Ok ( None )
93
97
}
94
98
} )
95
99
}
@@ -104,8 +108,8 @@ impl_web! {
104
108
Either :: A (
105
109
self . check_idempotency( idempotency_key. clone( ) , input_hash)
106
110
. map_err( |err| Response :: builder( ) . status( 502 ) . body( err) . unwrap( ) )
107
- . then ( move |ret: Result <( StatusCode , Bytes ) , Response < String > >| {
108
- if let Ok ( ret) = ret {
111
+ . and_then ( move |ret: Option <( StatusCode , Bytes ) >| {
112
+ if let Some ( ret) = ret {
109
113
let resp = Response :: builder( ) . status( ret. 0 ) . body( String :: from_utf8_lossy( & ret. 1 ) . to_string( ) ) . unwrap( ) ;
110
114
if ret. 0 . is_success( ) {
111
115
return Either :: A ( Either :: A ( ok( resp) ) )
0 commit comments