Class BeforeFinallyHttpOperator

java.lang.Object
io.servicetalk.http.utils.BeforeFinallyHttpOperator
All Implemented Interfaces:
SingleOperator<StreamingHttpResponse,StreamingHttpResponse>, Function<SingleSource.Subscriber<? super StreamingHttpResponse>,SingleSource.Subscriber<? super StreamingHttpResponse>>

public final class BeforeFinallyHttpOperator extends Object implements SingleOperator<StreamingHttpResponse,StreamingHttpResponse>
Helper operator for signaling the end of an HTTP Request/Response cycle.

StreamingHttpRequest and StreamingHttpResponse are nested sources (Single of meta-data containing a payload Publisher), which makes it non-trivial to get a single signal at the end of this Request/Response cycle. One needs to consider and coordinate between the multitude of outcomes: cancel/success/error across both sources.

This operator ensures that the provided callback is triggered just once whenever the sources reach a terminal state across both sources.

Example usage tracking the begin and end of a request:

     // coarse grained, any terminal signal calls the provided `Runnable`
     return requester.request(strategy, request)
                     .beforeOnSubscribe(__ -> tracker.requestStarted())
                     .liftSync(new BeforeFinallyHttpOperator(tracker::requestFinished));

     // fine grained, `tracker` implements `TerminalSignalConsumer`, terminal signal indicated by the callback method
     return requester.request(strategy, request)
                     .beforeOnSubscribe(__ -> tracker.requestStarted())
                     .liftSync(new BeforeFinallyHttpOperator(tracker));