@@ -348,6 +348,10 @@ impl RawSeekPayload {
348
348
pub ( crate ) fn decode < D : for < ' a > Deserialize < ' a > > ( & self ) -> AppResult < D > {
349
349
decode_seek ( & self . 0 ) . map_err ( |_| bad_request ( "invalid seek parameter" ) )
350
350
}
351
+
352
+ pub ( crate ) fn is_empty ( & self ) -> bool {
353
+ self . 0 . is_empty ( )
354
+ }
351
355
}
352
356
353
357
/// Function to check if the request is blocked.
@@ -547,8 +551,8 @@ macro_rules! seek {
547
551
impl $name {
548
552
pub fn decode( & self , page: & Page ) -> AppResult <Option <[ <$name Payload >] >> {
549
553
let encoded = match page {
550
- Page :: Seek ( encoded) => encoded,
551
- Page :: SeekBackward ( encoded) => encoded,
554
+ Page :: Seek ( encoded) if !encoded . is_empty ( ) => encoded,
555
+ Page :: SeekBackward ( encoded) if !encoded . is_empty ( ) => encoded,
552
556
_ => return Ok ( None ) ,
553
557
} ;
554
558
@@ -780,6 +784,24 @@ mod tests {
780
784
assert_eq ! ( response. status( ) , StatusCode :: BAD_REQUEST ) ;
781
785
}
782
786
787
+ // empty string
788
+ {
789
+ let seek = Seek :: Id ;
790
+ let pagination = PaginationOptions :: builder ( )
791
+ . enable_seek ( true )
792
+ . gather ( & mock ( "seek=" ) )
793
+ . unwrap ( ) ;
794
+ assert_eq ! ( seek. decode( & pagination. page) . unwrap( ) , None ) ;
795
+
796
+ // for backward
797
+ let seek = Seek :: Id ;
798
+ let pagination = PaginationOptions :: builder ( )
799
+ . enable_seek_backward ( true )
800
+ . gather ( & mock ( "seek=-" ) )
801
+ . unwrap ( ) ;
802
+ assert_eq ! ( seek. decode( & pagination. page) . unwrap( ) , None ) ;
803
+ }
804
+
783
805
// Ensures it still encodes compactly with a field struct
784
806
#[ derive( Debug , Default , Serialize , PartialEq ) ]
785
807
struct NewTuple (
0 commit comments