@ -152,10 +152,13 @@ abstract class AbstractResponseBodySubscriber implements Subscriber<DataBuffer>
@@ -152,10 +152,13 @@ abstract class AbstractResponseBodySubscriber implements Subscriber<DataBuffer>
* UNSUBSCRIBED
* |
* v
* REQUESTED < - - - > RECEIVED
* | |
* v v
* COMPLETED
* REQUESTED - - - - - - - - - - - - - - - - - - - > RECEIVED
* ^ ^
* | |
* - - - - - - - - - WRITING < - - - - -
* |
* v
* COMPLETED
* < / pre >
* Refer to the individual states for more information .
* /
@ -206,36 +209,41 @@ abstract class AbstractResponseBodySubscriber implements Subscriber<DataBuffer>
@@ -206,36 +209,41 @@ abstract class AbstractResponseBodySubscriber implements Subscriber<DataBuffer>
/ * *
* State that gets entered after a buffer has been
* { @linkplain Subscriber # onNext ( Object ) received } . Responds to
* { @code onWritePossible } by writing the current buffer , and if it can be
* written completely , changes state to either { @link # REQUESTED } if the
* subscription has not been completed ; or { @link # COMPLETED } if it has .
* { @code onWritePossible } by writing the current buffer and changes
* the state to { @link # WRITING } . If it can be written completely ,
* changes the state to either { @link # REQUESTED } if the subscription
* has not been completed ; or { @link # COMPLETED } if it has . If it cannot
* be written completely the state will be changed to { @link # RECEIVED } .
* /
RECEIVED {
@Override
void onWritePossible ( AbstractResponseBodySubscriber subscriber ) {
DataBuffer dataBuffer = subscriber . currentBuffer ;
try {
boolean writeCompleted = subscriber . write ( dataBuffer ) ;
if ( writeCompleted ) {
if ( dataBuffer instanceof FlushingDataBuffer ) {
subscriber . flush ( ) ;
}
subscriber . releaseBuffer ( ) ;
boolean subscriptionCompleted = subscriber . subscriptionCompleted ;
if ( ! subscriptionCompleted ) {
if ( subscriber . changeState ( this , REQUESTED ) ) {
if ( subscriber . changeState ( this , WRITING ) ) {
DataBuffer dataBuffer = subscriber . currentBuffer ;
try {
boolean writeCompleted = subscriber . write ( dataBuffer ) ;
if ( writeCompleted ) {
if ( dataBuffer instanceof FlushingDataBuffer ) {
subscriber . flush ( ) ;
}
subscriber . releaseBuffer ( ) ;
boolean subscriptionCompleted = subscriber . subscriptionCompleted ;
if ( ! subscriptionCompleted ) {
subscriber . changeState ( WRITING , REQUESTED ) ;
subscriber . subscription . request ( 1 ) ;
}
}
else {
if ( subscriber . changeState ( this , COMPLETED ) ) {
else {
subscriber . changeState ( WRITING , COMPLETED ) ;
subscriber . close ( ) ;
}
}
else {
subscriber . changeState ( WRITING , RECEIVED ) ;
}
}
catch ( IOException ex ) {
subscriber . onError ( ex ) ;
}
}
catch ( IOException ex ) {
subscriber . onError ( ex ) ;
}
}
@ -244,6 +252,16 @@ abstract class AbstractResponseBodySubscriber implements Subscriber<DataBuffer>
@@ -244,6 +252,16 @@ abstract class AbstractResponseBodySubscriber implements Subscriber<DataBuffer>
subscriber . subscriptionCompleted = true ;
}
} ,
/ * *
* State that gets entered after a writing of the current buffer has been
* { @code onWritePossible started } .
* /
WRITING {
@Override
void onComplete ( AbstractResponseBodySubscriber subscriber ) {
subscriber . subscriptionCompleted = true ;
}
} ,
/ * *
* The terminal completed state . Does not respond to any events .
* /