@@ -349,11 +349,9 @@ public void handleReturnTypeLastModified() throws Exception {
349
349
350
350
processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
351
351
352
- assertTrue (mavContainer .isRequestHandled ());
353
- assertEquals (HttpStatus .NOT_MODIFIED .value (), servletResponse .getStatus ());
352
+ assertResponseNotModified ();
354
353
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .LAST_MODIFIED ).size ());
355
354
assertEquals (dateFormat .format (oneMinuteAgo ), servletResponse .getHeader (HttpHeaders .LAST_MODIFIED ));
356
- assertEquals (0 , servletResponse .getContentAsByteArray ().length );
357
355
}
358
356
359
357
@ Test
@@ -370,11 +368,9 @@ public void handleReturnTypeEtag() throws Exception {
370
368
371
369
processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
372
370
373
- assertTrue (mavContainer .isRequestHandled ());
374
- assertEquals (HttpStatus .NOT_MODIFIED .value (), servletResponse .getStatus ());
371
+ assertResponseNotModified ();
375
372
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
376
373
assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
377
- assertEquals (0 , servletResponse .getContentAsByteArray ().length );
378
374
}
379
375
380
376
@ Test
@@ -395,13 +391,11 @@ public void handleReturnTypeETagAndLastModified() throws Exception {
395
391
396
392
processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
397
393
398
- assertTrue (mavContainer .isRequestHandled ());
399
- assertEquals (HttpStatus .NOT_MODIFIED .value (), servletResponse .getStatus ());
394
+ assertResponseNotModified ();
400
395
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .LAST_MODIFIED ).size ());
401
396
assertEquals (dateFormat .format (oneMinuteAgo ), servletResponse .getHeader (HttpHeaders .LAST_MODIFIED ));
402
397
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
403
398
assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
404
- assertEquals (0 , servletResponse .getContentAsByteArray ().length );
405
399
}
406
400
407
401
@ Test
@@ -420,12 +414,16 @@ public void handleReturnTypeNotModified() throws Exception {
420
414
421
415
processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
422
416
423
- assertTrue (mavContainer .isRequestHandled ());
424
- assertEquals (HttpStatus .NOT_MODIFIED .value (), servletResponse .getStatus ());
417
+ assertResponseNotModified ();
425
418
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .LAST_MODIFIED ).size ());
426
419
assertEquals (dateFormat .format (oneMinuteAgo ), servletResponse .getHeader (HttpHeaders .LAST_MODIFIED ));
427
420
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
428
421
assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
422
+ }
423
+
424
+ private void assertResponseNotModified () {
425
+ assertTrue (mavContainer .isRequestHandled ());
426
+ assertEquals (HttpStatus .NOT_MODIFIED .value (), servletResponse .getStatus ());
429
427
assertEquals (0 , servletResponse .getContentAsByteArray ().length );
430
428
}
431
429
@@ -472,15 +470,81 @@ public void handleReturnTypePostRequestWithIfNotModified() throws Exception {
472
470
given (messageConverter .getSupportedMediaTypes ()).willReturn (Collections .singletonList (MediaType .TEXT_PLAIN ));
473
471
given (messageConverter .canWrite (String .class , MediaType .TEXT_PLAIN )).willReturn (true );
474
472
473
+ processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
474
+
475
+ assertResponseOkWithBody ("body" );
476
+ assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
477
+ assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
478
+ }
479
+
480
+ // SPR-13626
481
+ @ Test
482
+ public void handleReturnTypeGetIfNoneMatchWildcard () throws Exception {
483
+ String wildcardValue = "*" ;
484
+ String etagValue = "\" some-etag\" " ;
485
+ servletRequest .addHeader (HttpHeaders .IF_NONE_MATCH , wildcardValue );
486
+ HttpHeaders responseHeaders = new HttpHeaders ();
487
+ responseHeaders .set (HttpHeaders .ETAG , etagValue );
488
+ ResponseEntity <String > returnValue = new ResponseEntity <String >("body" , responseHeaders , HttpStatus .OK );
489
+
490
+ given (messageConverter .canWrite (String .class , null )).willReturn (true );
491
+ given (messageConverter .getSupportedMediaTypes ()).willReturn (Collections .singletonList (MediaType .TEXT_PLAIN ));
492
+ given (messageConverter .canWrite (String .class , MediaType .TEXT_PLAIN )).willReturn (true );
475
493
476
494
processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
477
495
478
- assertTrue (mavContainer .isRequestHandled ());
479
- assertEquals (HttpStatus .OK .value (), servletResponse .getStatus ());
496
+ assertResponseOkWithBody ("body" );
480
497
assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
481
498
assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
499
+ }
500
+
501
+ // SPR-13626
502
+ @ Test
503
+ public void handleReturnTypeIfNoneMatchIfMatch () throws Exception {
504
+ String etagValue = "\" some-etag\" " ;
505
+ servletRequest .addHeader (HttpHeaders .IF_NONE_MATCH , etagValue );
506
+ servletRequest .addHeader (HttpHeaders .IF_MATCH , "ifmatch" );
507
+ HttpHeaders responseHeaders = new HttpHeaders ();
508
+ responseHeaders .set (HttpHeaders .ETAG , etagValue );
509
+ ResponseEntity <String > returnValue = new ResponseEntity <String >("body" , responseHeaders , HttpStatus .OK );
510
+
511
+ given (messageConverter .canWrite (String .class , null )).willReturn (true );
512
+ given (messageConverter .getSupportedMediaTypes ()).willReturn (Collections .singletonList (MediaType .TEXT_PLAIN ));
513
+ given (messageConverter .canWrite (String .class , MediaType .TEXT_PLAIN )).willReturn (true );
514
+
515
+ processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
516
+
517
+ assertResponseOkWithBody ("body" );
518
+ assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
519
+ assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
520
+ }
521
+
522
+ // SPR-13626
523
+ @ Test
524
+ public void handleReturnTypeIfNoneMatchIfUnmodifiedSince () throws Exception {
525
+ String etagValue = "\" some-etag\" " ;
526
+ servletRequest .addHeader (HttpHeaders .IF_NONE_MATCH , etagValue );
527
+ servletRequest .addHeader (HttpHeaders .IF_UNMODIFIED_SINCE , dateFormat .format (new Date ().getTime ()));
528
+ HttpHeaders responseHeaders = new HttpHeaders ();
529
+ responseHeaders .set (HttpHeaders .ETAG , etagValue );
530
+ ResponseEntity <String > returnValue = new ResponseEntity <String >("body" , responseHeaders , HttpStatus .OK );
531
+
532
+ given (messageConverter .canWrite (String .class , null )).willReturn (true );
533
+ given (messageConverter .getSupportedMediaTypes ()).willReturn (Collections .singletonList (MediaType .TEXT_PLAIN ));
534
+ given (messageConverter .canWrite (String .class , MediaType .TEXT_PLAIN )).willReturn (true );
535
+
536
+ processor .handleReturnValue (returnValue , returnTypeResponseEntity , mavContainer , webRequest );
537
+
538
+ assertResponseOkWithBody ("body" );
539
+ assertEquals (1 , servletResponse .getHeaderValues (HttpHeaders .ETAG ).size ());
540
+ assertEquals (etagValue , servletResponse .getHeader (HttpHeaders .ETAG ));
541
+ }
542
+
543
+ private void assertResponseOkWithBody (String body ) throws Exception {
544
+ assertTrue (mavContainer .isRequestHandled ());
545
+ assertEquals (HttpStatus .OK .value (), servletResponse .getStatus ());
482
546
ArgumentCaptor <HttpOutputMessage > outputMessage = ArgumentCaptor .forClass (HttpOutputMessage .class );
483
- verify (messageConverter ).write (eq ("body" ), eq (MediaType .TEXT_PLAIN ), outputMessage .capture ());
547
+ verify (messageConverter ).write (eq ("body" ), eq (MediaType .TEXT_PLAIN ), outputMessage .capture ());
484
548
}
485
549
486
550
@ SuppressWarnings ("unused" )
0 commit comments