@@ -32,13 +32,6 @@ impl From<Offset> for params::Offset {
3232impl FromStr for Offset {
3333 type Err = ParseIntError ;
3434 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
35- // issue559: Disable ':' support for now: simply parse as i64 as
36- // previously (it was u64 previously but i64's close enough)
37- let result = Offset {
38- timestamp : None ,
39- offset : s. parse :: < u64 > ( ) ?,
40- } ;
41- /*
4235 let result = match s. chars ( ) . position ( |c| c == ':' ) {
4336 None => Offset {
4437 timestamp : None ,
@@ -55,7 +48,6 @@ impl FromStr for Offset {
5548 }
5649 }
5750 } ;
58- */
5951 Ok ( result)
6052 }
6153}
@@ -201,36 +193,34 @@ impl FromRequest for BsoQueryParams {
201193 None ,
202194 )
203195 } ) ?;
204- // issue559: Dead code (timestamp always None)
205- /*
206- if params.sort != Sorting::Index {
207- if let Some(timestamp) = params.offset.as_ref().and_then(|offset| offset.timestamp)
208- {
209- let bound = timestamp.as_i64();
210- if let Some(newer) = params.newer {
211- if bound < newer.as_i64() {
212- return Err(ValidationErrorKind::FromDetails(
213- format!("Invalid Offset {} {}", bound, newer.as_i64()),
214- RequestErrorLocation::QueryString,
215- Some("newer".to_owned()),
216- None,
217- )
218- .into());
219- }
220- } else if let Some(older) = params.older {
221- if bound > older.as_i64() {
222- return Err(ValidationErrorKind::FromDetails(
223- "Invalid Offset".to_owned(),
224- RequestErrorLocation::QueryString,
225- Some("older".to_owned()),
226- None,
227- )
228- .into());
229- }
196+
197+ if params. sort != Sorting :: Index
198+ && let Some ( timestamp) = params. offset . as_ref ( ) . and_then ( |offset| offset. timestamp )
199+ {
200+ let bound = timestamp. as_i64 ( ) ;
201+ if let Some ( newer) = params. newer {
202+ if bound < newer. as_i64 ( ) {
203+ return Err ( ValidationErrorKind :: FromDetails (
204+ format ! ( "Invalid Offset {} {}" , bound, newer. as_i64( ) ) ,
205+ RequestErrorLocation :: QueryString ,
206+ Some ( "newer" . to_owned ( ) ) ,
207+ None ,
208+ )
209+ . into ( ) ) ;
230210 }
211+ } else if let Some ( older) = params. older
212+ && bound > older. as_i64 ( )
213+ {
214+ return Err ( ValidationErrorKind :: FromDetails (
215+ "Invalid Offset" . to_owned ( ) ,
216+ RequestErrorLocation :: QueryString ,
217+ Some ( "older" . to_owned ( ) ) ,
218+ None ,
219+ )
220+ . into ( ) ) ;
231221 }
232222 }
233- */
223+
234224 Ok ( params)
235225 } )
236226 }
@@ -288,19 +278,60 @@ mod tests {
288278 assert ! ( result. full) ;
289279 }
290280
281+ #[ test]
282+ fn test_offset_bound_below_newer ( ) {
283+ let state = make_state ( ) ;
284+ let req = TestRequest :: with_uri ( "/?sort=newest&newer=2.22&offset=1111:1" )
285+ . data ( state)
286+ . to_http_request ( ) ;
287+ let result = block_on ( BsoQueryParams :: extract ( & req) ) ;
288+ assert ! ( result. is_err( ) ) ;
289+ let resp: HttpResponse = result. err ( ) . unwrap ( ) . into ( ) ;
290+ assert_eq ! ( resp. status( ) , 400 ) ;
291+ }
292+
293+ #[ test]
294+ fn test_offset_bound_above_older ( ) {
295+ let state = make_state ( ) ;
296+ let req = TestRequest :: with_uri ( "/?sort=newest&older=2.22&offset=5858:1" )
297+ . data ( state)
298+ . to_http_request ( ) ;
299+ let result = block_on ( BsoQueryParams :: extract ( & req) ) ;
300+ assert ! ( result. is_err( ) ) ;
301+ let resp: HttpResponse = result. err ( ) . unwrap ( ) . into ( ) ;
302+ assert_eq ! ( resp. status( ) , 400 ) ;
303+ }
304+
305+ #[ test]
306+ fn test_offset_bound_within_range ( ) {
307+ let state = make_state ( ) ;
308+ let req = TestRequest :: with_uri ( "/?sort=newest&newer=1.23&older=5.43&offset=3838:1" )
309+ . data ( state)
310+ . to_http_request ( ) ;
311+ let result = block_on ( BsoQueryParams :: extract ( & req) ) ;
312+ assert ! ( result. is_ok( ) ) ;
313+ }
314+
315+ #[ test]
316+ fn test_bound_validation_skipped_for_index_sort ( ) {
317+ let state = make_state ( ) ;
318+ let req = TestRequest :: with_uri ( "/?sort=index&newer=2.22&offset=1111:1" )
319+ . data ( state)
320+ . to_http_request ( ) ;
321+ let result = block_on ( BsoQueryParams :: extract ( & req) ) ;
322+ assert ! ( result. is_ok( ) ) ;
323+ }
324+
291325 #[ actix_rt:: test]
292326 async fn test_offset ( ) {
293327 let sample_offset = params:: Offset {
294328 timestamp : Some ( SyncTimestamp :: default ( ) ) ,
295329 offset : 1234 ,
296330 } ;
297331
298- let test_offset = Offset {
299- timestamp : None ,
300- offset : sample_offset. offset ,
301- } ;
302-
303332 let offset_str = sample_offset. to_string ( ) ;
304- assert ! ( test_offset == Offset :: from_str( & offset_str) . unwrap( ) )
333+ let parsed = Offset :: from_str ( & offset_str) . unwrap ( ) ;
334+ assert_eq ! ( parsed. offset, sample_offset. offset) ;
335+ assert_eq ! ( parsed. timestamp, sample_offset. timestamp, ) ;
305336 }
306337}
0 commit comments