Class HttpReceiver
- java.lang.Object
-
- org.eclipse.jetty.client.HttpReceiver
-
- Direct Known Subclasses:
HttpReceiverOverFCGI
,HttpReceiverOverHTTP
public abstract class HttpReceiver extends java.lang.Object
HttpReceiver
provides the abstract code to implement the various steps of the receive of HTTP responses.HttpReceiver
maintains a state machine that is updated when the steps of receiving a response are executed.Subclasses must handle the transport-specific details, for example how to read from the raw socket and how to parse the bytes read from the socket. Then they have to call the methods defined in this class in the following order:
responseBegin(HttpExchange)
, when the HTTP response data containing the HTTP status code is availableresponseHeader(HttpExchange, HttpField)
, when an HTTP field is availableresponseHeaders(HttpExchange)
, when all HTTP headers are availableresponseContent(HttpExchange, ByteBuffer, Callback)
, when HTTP content is availableresponseSuccess(HttpExchange)
, when the response is successful
responseFailure(Throwable)
to indicate that the response has failed (for example, because of I/O exceptions). At any time, user threads may abort the response which will causeresponseFailure(Throwable)
to be invoked.The state machine maintained by this class ensures that the response steps are not executed by an I/O thread if the response has already been failed.
- See Also:
HttpSender
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
HttpReceiver.ContentListeners
Wraps a list of content listeners, notifies them about content events and tracks individual listener demand to produce a global demand for content.private class
HttpReceiver.Decoder
Implements the decoding of content, producing decoded buffers only if there is demand for content.private static class
HttpReceiver.DecodeResult
private static class
HttpReceiver.ResponseState
The request statesHttpReceiver
goes through when receiving a response.
-
Field Summary
Fields Modifier and Type Field Description private HttpChannel
channel
private HttpReceiver.ContentListeners
contentListeners
private HttpReceiver.Decoder
decoder
private long
demand
private java.lang.Throwable
failure
protected static Logger
LOG
private java.util.concurrent.atomic.AtomicReference<HttpReceiver.ResponseState>
responseState
private boolean
stalled
-
Constructor Summary
Constructors Modifier Constructor Description protected
HttpReceiver(HttpChannel channel)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
abort(HttpExchange exchange, java.lang.Throwable failure)
private void
cleanup()
private boolean
decodeResponseContent(java.nio.ByteBuffer buffer, Callback callback)
protected long
demand()
(package private) void
demand(long n)
private long
demand(java.util.function.LongUnaryOperator operator)
protected void
dispose()
Disposes the state of this HttpReceiver.protected HttpChannel
getHttpChannel()
protected HttpDestination
getHttpDestination()
protected HttpExchange
getHttpExchange()
protected boolean
hasDemandOrStall()
boolean
isFailed()
private boolean
plainResponseContent(HttpExchange exchange, java.nio.ByteBuffer buffer, Callback callback)
protected void
receive()
protected void
reset()
Resets the state of this HttpReceiver.protected boolean
responseBegin(HttpExchange exchange)
Method to be invoked when the response status code is available.protected boolean
responseContent(HttpExchange exchange, java.nio.ByteBuffer buffer, Callback callback)
Method to be invoked when response HTTP content is available.protected boolean
responseFailure(java.lang.Throwable failure)
Method to be invoked when the response is failed.protected boolean
responseHeader(HttpExchange exchange, HttpField field)
Method to be invoked when a response HTTP header is available.protected boolean
responseHeaders(HttpExchange exchange)
Method to be invoked after all response HTTP headers are available.protected boolean
responseSuccess(HttpExchange exchange)
Method to be invoked when the response is successful.protected void
storeCookie(java.net.URI uri, HttpField field)
private void
terminateResponse(HttpExchange exchange)
private void
terminateResponse(HttpExchange exchange, Result result)
java.lang.String
toString()
private boolean
updateResponseState(HttpReceiver.ResponseState from, HttpReceiver.ResponseState to)
private boolean
updateResponseState(HttpReceiver.ResponseState from1, HttpReceiver.ResponseState from2, HttpReceiver.ResponseState to)
-
-
-
Field Detail
-
LOG
protected static final Logger LOG
-
responseState
private final java.util.concurrent.atomic.AtomicReference<HttpReceiver.ResponseState> responseState
-
channel
private final HttpChannel channel
-
contentListeners
private HttpReceiver.ContentListeners contentListeners
-
decoder
private HttpReceiver.Decoder decoder
-
failure
private java.lang.Throwable failure
-
demand
private long demand
-
stalled
private boolean stalled
-
-
Constructor Detail
-
HttpReceiver
protected HttpReceiver(HttpChannel channel)
-
-
Method Detail
-
getHttpChannel
protected HttpChannel getHttpChannel()
-
demand
void demand(long n)
-
demand
protected long demand()
-
demand
private long demand(java.util.function.LongUnaryOperator operator)
-
hasDemandOrStall
protected boolean hasDemandOrStall()
-
getHttpExchange
protected HttpExchange getHttpExchange()
-
getHttpDestination
protected HttpDestination getHttpDestination()
-
isFailed
public boolean isFailed()
-
receive
protected void receive()
-
responseBegin
protected boolean responseBegin(HttpExchange exchange)
Method to be invoked when the response status code is available.Subclasses must have set the response status code on the
Response
object of theHttpExchange
prior invoking this method.This method takes case of notifying
Response.BeginListener
s.- Parameters:
exchange
- the HTTP exchange- Returns:
- whether the processing should continue
-
responseHeader
protected boolean responseHeader(HttpExchange exchange, HttpField field)
Method to be invoked when a response HTTP header is available.Subclasses must not have added the header to the
Response
object of theHttpExchange
prior invoking this method.This method takes case of notifying
Response.HeaderListener
s and storing cookies.- Parameters:
exchange
- the HTTP exchangefield
- the response HTTP field- Returns:
- whether the processing should continue
-
storeCookie
protected void storeCookie(java.net.URI uri, HttpField field)
-
responseHeaders
protected boolean responseHeaders(HttpExchange exchange)
Method to be invoked after all response HTTP headers are available.This method takes case of notifying
Response.HeadersListener
s.- Parameters:
exchange
- the HTTP exchange- Returns:
- whether the processing should continue
-
responseContent
protected boolean responseContent(HttpExchange exchange, java.nio.ByteBuffer buffer, Callback callback)
Method to be invoked when response HTTP content is available.This method takes case of decoding the content, if necessary, and notifying
Response.ContentListener
s.- Parameters:
exchange
- the HTTP exchangebuffer
- the response HTTP content buffercallback
- the callback- Returns:
- whether the processing should continue
-
plainResponseContent
private boolean plainResponseContent(HttpExchange exchange, java.nio.ByteBuffer buffer, Callback callback)
-
decodeResponseContent
private boolean decodeResponseContent(java.nio.ByteBuffer buffer, Callback callback)
-
responseSuccess
protected boolean responseSuccess(HttpExchange exchange)
Method to be invoked when the response is successful.This method takes case of notifying
Response.SuccessListener
s and possiblyResponse.CompleteListener
s (if the exchange is completed).- Parameters:
exchange
- the HTTP exchange- Returns:
- whether the response was processed as successful
-
responseFailure
protected boolean responseFailure(java.lang.Throwable failure)
Method to be invoked when the response is failed.This method takes care of notifying
Response.FailureListener
s.- Parameters:
failure
- the response failure- Returns:
- whether the response was processed as failed
-
terminateResponse
private void terminateResponse(HttpExchange exchange)
-
terminateResponse
private void terminateResponse(HttpExchange exchange, Result result)
-
reset
protected void reset()
Resets the state of this HttpReceiver.Subclasses should override (but remember to call
super
) to reset their own state.Either this method or
dispose()
is called.
-
dispose
protected void dispose()
Disposes the state of this HttpReceiver.Subclasses should override (but remember to call
super
) to dispose their own state.Either this method or
reset()
is called.
-
cleanup
private void cleanup()
-
abort
public boolean abort(HttpExchange exchange, java.lang.Throwable failure)
-
updateResponseState
private boolean updateResponseState(HttpReceiver.ResponseState from1, HttpReceiver.ResponseState from2, HttpReceiver.ResponseState to)
-
updateResponseState
private boolean updateResponseState(HttpReceiver.ResponseState from, HttpReceiver.ResponseState to)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
-