@ -242,19 +242,22 @@ class ReactiveTypeHandlerTests {
@@ -242,19 +242,22 @@ class ReactiveTypeHandlerTests {
// Media type from request
this . servletRequest . addHeader ( "Accept" , "text/event-stream" ) ;
testSseResponse ( true ) ;
testSseResponse ( true , null ) ;
// Media type from "produces" attribute
Set < MediaType > types = Collections . singleton ( MediaType . TEXT_EVENT_STREAM ) ;
this . servletRequest . setAttribute ( HandlerMapping . PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE , types ) ;
testSseResponse ( true ) ;
testSseResponse ( true , null ) ;
// Preset media type // gh-35130
testSseResponse ( true , MediaType . TEXT_EVENT_STREAM ) ;
// No media type preferences
testSseResponse ( false ) ;
testSseResponse ( false , null ) ;
}
private void testSseResponse ( boolean expectSseEmitter ) throws Exception {
ResponseBodyEmitter emitter = handleValue ( Flux . empty ( ) , Flux . class , forClass ( String . class ) ) ;
private void testSseResponse ( boolean expectSseEmitter , @Nullable MediaType contentType ) throws Exception {
ResponseBodyEmitter emitter = handleValue ( Flux . empty ( ) , Flux . class , forClass ( String . class ) , contentType ) ;
Object actual = emitter instanceof SseEmitter ;
assertThat ( actual ) . isEqualTo ( expectSseEmitter ) ;
resetRequest ( ) ;
@ -450,7 +453,7 @@ class ReactiveTypeHandlerTests {
@@ -450,7 +453,7 @@ class ReactiveTypeHandlerTests {
try {
Sinks . Many < String > sink = Sinks . many ( ) . unicast ( ) . onBackpressureBuffer ( ) ;
ResponseBodyEmitter emitter = handler . handleValue ( sink . asFlux ( ) , returnType , mavContainer , this . webRequest ) ;
ResponseBodyEmitter emitter = handler . handleValue ( sink . asFlux ( ) , returnType , null , mavContainer , this . webRequest ) ;
ContextEmitterHandler emitterHandler = new ContextEmitterHandler ( ) ;
emitter . initialize ( emitterHandler ) ;
@ -497,9 +500,15 @@ class ReactiveTypeHandlerTests {
@@ -497,9 +500,15 @@ class ReactiveTypeHandlerTests {
private ResponseBodyEmitter handleValue ( Object returnValue , Class < ? > asyncType ,
ResolvableType genericType ) throws Exception {
return handleValue ( returnValue , asyncType , genericType , null ) ;
}
private ResponseBodyEmitter handleValue ( Object returnValue , Class < ? > asyncType ,
ResolvableType genericType , @Nullable MediaType contentType ) throws Exception {
ModelAndViewContainer mavContainer = new ModelAndViewContainer ( ) ;
MethodParameter returnType = on ( TestController . class ) . resolveReturnType ( asyncType , genericType ) ;
return this . handler . handleValue ( returnValue , returnType , mavContainer , this . webRequest ) ;
return this . handler . handleValue ( returnValue , returnType , contentType , mavContainer , this . webRequest ) ;
}