Class HttpSender
- All Implemented Interfaces:
EventListener
,AsyncContentProvider.Listener
- Direct Known Subclasses:
HttpSenderOverHTTP
HttpSender
abstracts the algorithm to send HTTP requests, so that subclasses only implement
the transport-specific code to send requests over the wire, implementing
sendHeaders(HttpExchange, HttpContent, Callback)
and
sendContent(HttpExchange, HttpContent, Callback)
.
HttpSender
governs two state machines.
The request state machine is updated by HttpSender
as the various steps of sending a request
are executed, see RequestState
.
At any point in time, a user thread may abort the request, which may (if the request has not been
completely sent yet) move the request state machine to RequestState#FAILURE
.
The request state machine guarantees that the request steps are executed (by I/O threads) only if
the request has not been failed already.
The sender state machine is updated by HttpSender
from three sources: deferred content notifications
(via onContent()
), 100-continue notifications (via proceed(HttpExchange, Throwable)
)
and normal request send (via sendContent(HttpExchange, HttpContent, Callback)
).
This state machine must guarantee that the request sending is never executed concurrently: only one of
those sources may trigger the call to sendContent(HttpExchange, HttpContent, Callback)
.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate class
private class
private class
private static enum
The request statesHttpSender
goes through when sending a request.private static enum
The sender statesHttpSender
goes through when sending a request. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final HttpChannel
private final Callback
private HttpContent
private final IteratingCallback
private Throwable
private final Callback
protected static final Logger
private final AtomicReference
<HttpSender.RequestState> private final AtomicReference
<HttpSender.SenderState> -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionboolean
abort
(HttpExchange exchange, Throwable failure) private void
anyToFailure
(Throwable failure) protected boolean
beginToHeaders
(HttpExchange exchange) protected void
dispose()
private void
executeAbort
(HttpExchange exchange, Throwable failure) protected boolean
expects100Continue
(Request request) protected HttpChannel
protected HttpExchange
protected boolean
headersToCommit
(HttpExchange exchange) private void
illegalSenderState
(HttpSender.SenderState current) boolean
isFailed()
void
Callback method invoked when content is availablevoid
proceed
(HttpExchange exchange, Throwable failure) protected boolean
queuedToBegin
(HttpExchange exchange) protected void
reset()
void
send
(HttpExchange exchange) protected abstract void
sendContent
(HttpExchange exchange, HttpContent content, Callback callback) Implementations should send the content at theHttpContent
cursor position over the wire.protected abstract void
sendHeaders
(HttpExchange exchange, HttpContent content, Callback callback) Implementations should send the HTTP headers over the wire, possibly with some content, in a single write, and notify the givencallback
of the result of this operation.protected boolean
someToContent
(HttpExchange exchange, ByteBuffer content) protected boolean
someToSuccess
(HttpExchange exchange) private void
terminateRequest
(HttpExchange exchange) private void
terminateRequest
(HttpExchange exchange, Throwable failure, Result result) toString()
private boolean
private boolean
-
Field Details
-
LOG
-
requestState
-
senderState
-
commitCallback
-
contentCallback
-
lastCallback
-
channel
-
-
failure
-
-
Constructor Details
-
HttpSender
-
-
Method Details
-
getHttpChannel
-
getHttpExchange
-
isFailed
public boolean isFailed() -
onContent
public void onContent()Description copied from interface:AsyncContentProvider.Listener
Callback method invoked when content is available- Specified by:
onContent
in interfaceAsyncContentProvider.Listener
-
send
-
expects100Continue
-
queuedToBegin
-
beginToHeaders
-
headersToCommit
-
someToContent
-
someToSuccess
-
anyToFailure
-
executeAbort
-
terminateRequest
-
terminateRequest
-
sendHeaders
Implementations should send the HTTP headers over the wire, possibly with some content, in a single write, and notify the givencallback
of the result of this operation.If there is more content to send, then
sendContent(HttpExchange, HttpContent, Callback)
will be invoked.- Parameters:
exchange
- the exchange to sendcontent
- the content to sendcallback
- the callback to notify
-
sendContent
Implementations should send the content at theHttpContent
cursor position over the wire.The
HttpContent
cursor is advanced by HttpSender at the right time, and if more content needs to be sent, this method is invoked again; subclasses need only to send the content at theHttpContent
cursor position.This method is invoked one last time when
HttpContent.isConsumed()
is true and therefore there is no actual content to send. This is done to allow subclasses to write "terminal" bytes (such as the terminal chunk when the transfer encoding is chunked) if their protocol needs to.- Parameters:
exchange
- the exchange to sendcontent
- the content to sendcallback
- the callback to notify
-
reset
protected void reset() -
dispose
protected void dispose() -
proceed
-
abort
-
updateRequestState
-
updateSenderState
-
illegalSenderState
-
toString
-