Interface Request
- All Superinterfaces:
Attributes
,Content.Source
- All Known Subinterfaces:
ServerUpgradeRequest
,ServerUpgradeRequest
- All Known Implementing Classes:
ContextRequest
,ErrorHandler.ErrorRequest
,GzipRequest
,HeaderWrappingRequest
,HttpChannelState.ChannelRequest
,Request.Wrapper
,Rule.Handler
,Rule.HttpURIHandler
,SecureRequestCustomizer.SecureRequest
,SecureRequestCustomizer.SecureRequestWithTLSData
,ServerUpgradeRequestDelegate
,ServerUpgradeRequestImpl
,ServletContextRequest
,StatisticsHandler.MinimumDataRateHandler.MinimumDataRateRequest
The representation of an HTTP request, for any protocol version (HTTP/1.1, HTTP/2, HTTP/3).
The typical idiom to read request content is the following:
public boolean handle(Request request, Response response, Callback callback)
{
// Reject requests not appropriate for this handler.
if (!request.getHttpURI().getPath().startsWith("/yourPath"))
return false;
while (true)
{
Content.Chunk chunk = request.read();
if (chunk == null)
{
// The chunk is not currently available, demand to be called back.
request.demand(() -> handle(request, response, callback));
return true;
}
if (Content.Chunk.isError(chunk))
{
Throwable failure = error.getCause();
// Handle errors.
// If the chunk is not last, then the error can be ignored and reading can be tried again.
// Otherwise, if the chunk is last, or we do not wish to ignore a non-last error, then
// mark the handling as complete, either generating a custom
// response and succeeding the callback, or failing the callback.
callback.failed(failure);
return true;
}
if (chunk instanceof Trailers trailers)
{
HttpFields fields = trailers.getTrailers();
// Handle trailers.
// Generate a response.
// Mark the handling as complete.
callback.succeeded();
return true;
}
// Normal chunk, process it.
processChunk(chunk);
// Release the content after processing.
chunk.release();
// Reached end-of-file?
if (chunk.isLast())
{
// Generate a response.
// Mark the handling as complete.
callback.succeeded();
return true;
}
}
}
-
Nested Class Summary
Nested ClassesModifier and TypeInterfaceDescriptionstatic interface
A minimal Authentication interface, primarily used for logging.static interface
A handler for an HTTP request and response.static class
A wrapper forRequest
instances.Nested classes/interfaces inherited from interface org.eclipse.jetty.util.Attributes
Attributes.Layer, Attributes.Lazy, Attributes.Mapped
-
Field Summary
FieldsFields inherited from interface org.eclipse.jetty.util.Attributes
NULL
-
Method Summary
Modifier and TypeMethodDescriptionvoid
addFailureListener
(Consumer<Throwable> onFailure) Adds a listener for asynchronous hard errors.void
addHttpStreamWrapper
(Function<HttpStream, HttpStream> wrapper) void
addIdleTimeoutListener
(Predicate<TimeoutException> onIdleTimeout) Adds a listener for idle timeouts.static <T extends Request.Wrapper>
Tstatic InputStream
asInputStream
(Request request) static Request
asReadOnly
(Request request) Returns a copy of the request that throwsUnsupportedOperationException
from all mutative methods.boolean
Consume any available content.void
Demands to invoke the given demand callback parameter when a chunk of content is available.static Fields
extractQueryParameters
(Request request) static Fields
extractQueryParameters
(Request request, Charset charset) static <T extends Request.Wrapper,
R>
Rstatic Request.AuthenticationState
getAuthenticationState
(Request request) long
Get the nanoTime at which the request arrived to a connector, obtained viaSystem.nanoTime()
.static long
getContentBytesRead
(Request request) static String
getContextPath
(Request request) Returns the context path of this Request.static List<HttpCookie>
getCookies
(Request request) long
Get the nanoTime at which the request headers were parsed, obtained viaSystem.nanoTime()
.getId()
an ID unique within the lifetime scope of theConnectionMetaData.getId()
).static String
getLocalAddr
(Request request) getLocales
(Request request) static int
getLocalPort
(Request request) static Fields
getParameters
(Request request) static String
getPathInContext
(Request request) Returns the canonically encoded path of the URI, scoped to the current context.static String
getRemoteAddr
(Request request) static int
getRemotePort
(Request request) static String
getServerName
(Request request) static int
getServerPort
(Request request) getSession
(boolean create) Get aSession
associated with the request.static long
getTimeStamp
(Request request) Get the millisecond timestamp at which the request was created, obtained withSystem.currentTimeMillis()
.boolean
isSecure()
static HttpURI
newHttpURIFrom
(Request request, String newEncodedPathInContext) Creates a newHttpURI
from the given Request's HttpURI and the given path in context.default void
push
(MetaData.Request resource) Pushes the givenresource
to the client.read()
Reads a chunk of content.static void
setAuthenticationState
(Request request, Request.AuthenticationState state) static String
toRedirectURI
(Request request, String location) Common point to generate a proper "Location" header for redirects.static Request
Methods inherited from interface org.eclipse.jetty.util.Attributes
asAttributeMap, clearAttributes, getAttribute, getAttributeNameSet, removeAttribute, setAttribute
Methods inherited from interface org.eclipse.jetty.io.Content.Source
fail, fail, getLength, rewind
-
Field Details
-
CACHE_ATTRIBUTE
-
COOKIE_ATTRIBUTE
-
DEFAULT_LOCALES
-
-
Method Details
-
getId
String getId()an ID unique within the lifetime scope of theConnectionMetaData.getId()
). This may be a protocol ID (e.g. HTTP/2 stream ID) or it may be unrelated to the protocol.- See Also:
-
getComponents
Components getComponents()- Returns:
- the
Components
to be used with this request.
-
getConnectionMetaData
ConnectionMetaData getConnectionMetaData()- Returns:
- the
ConnectionMetaData
associated to this request
-
getMethod
String getMethod()- Returns:
- the HTTP method of this request
-
getHttpURI
HttpURI getHttpURI()- Returns:
- the HTTP URI of this request
- See Also:
-
getContext
Context getContext()- Returns:
- the
Context
associated with thisRequest
-
getContextPath
Returns the context path of this Request.
This is equivalent to
request.getContext().getContextPath()
.- Parameters:
request
- The request to get the context path from.- Returns:
- The contextPath of the request.
- See Also:
-
getPathInContext
Returns the canonically encoded path of the URI, scoped to the current context.
For example, when the request has a
Context
withcontextPath=/ctx
and the request'sHttpURI
canonical path iscanonicalPath=/ctx/foo
, thenpathInContext=/foo
.- Returns:
- The part of the canonically encoded path of the URI after any context path prefix has been removed.
- See Also:
-
getHeaders
HttpFields getHeaders()- Returns:
- the HTTP headers of this request
-
demand
Demands to invoke the given demand callback parameter when a chunk of content is available.
See how to use this method idiomatically.
Implementations guarantee that calls to this method are safely reentrant so that stack overflows are avoided in the case of mutual recursion between the execution of the
Runnable
callback and a call to this method. Invocations of the passedRunnable
are serialized and a callback fordemand
call is not invoked until any previousdemand
callback has returned. Thus theRunnable
should not block waiting for a callback of a future demand call.The demand callback may be invoked spuriously: a subsequent call to
Content.Source.read()
may returnnull
.Calling this method establishes a pending demand, which is fulfilled when the demand callback is invoked.
Calling this method when there is already a pending demand results in an
IllegalStateException
to be thrown.If the invocation of the demand callback throws an exception, then
Content.Source.fail(Throwable)
is called.- Specified by:
demand
in interfaceContent.Source
- Parameters:
demandCallback
- the demand callback to invoke when there is a content chunk available. In addition to the invocation guarantees ofContent.Source.demand(Runnable)
, this implementation serializes the invocation of theRunnable
with invocations of anyResponse.write(boolean, ByteBuffer, Callback)
Callback
invocations.- See Also:
-
getTrailers
HttpFields getTrailers()- Returns:
- the HTTP trailers of this request, or
null
if they are not present
-
getTimeStamp
Get the millisecond timestamp at which the request was created, obtained with
System.currentTimeMillis()
. This method should be used for wall clock time, rather thangetHeadersNanoTime()
, which is appropriate for measuring latencies.- Returns:
- The timestamp that the request was received/created in milliseconds
-
getBeginNanoTime
long getBeginNanoTime()Get the nanoTime at which the request arrived to a connector, obtained via
System.nanoTime()
. This method can be used when measuring latencies.- Returns:
- The nanoTime at which the request was received/created in nanoseconds
-
getHeadersNanoTime
long getHeadersNanoTime()Get the nanoTime at which the request headers were parsed, obtained via
System.nanoTime()
. This method can be used when measuring latencies.- Returns:
- The nanoTime at which the request was ready in nanoseconds
-
isSecure
boolean isSecure() -
read
Content.Chunk read()Reads a chunk of content.
See how to use this method idiomatically.
The returned chunk could be:
null
, to signal that there isn't a chunk of content available- an
Content.Chunk
instance with non nullContent.Chunk.getFailure()
, to signal that there was a failure trying to produce a chunk of content, or that the content production has beenfailed
externally - a
Content.Chunk
instance, containing the chunk of content.
Once a read returns an
Content.Chunk
instance with non-nullContent.Chunk.getFailure()
then if the failure islast
further reads will continue to return the same failure chunk instance, otherwise furtherread()
operations may return different non-failure chunks.Once a read returns a
last chunk
, further reads will continue to return a last chunk (although the instance may be different).The content reader code must ultimately arrange for a call to
Retainable.release()
on the returnedContent.Chunk
.Additionally, prior to the ultimate call to
Retainable.release()
, the reader code may make additional calls toRetainable.retain()
, that must ultimately be matched by a correspondent number of calls toRetainable.release()
.Concurrent reads from different threads are not recommended, as they are inherently in a race condition.
Reads performed outside the invocation context of a
demand callback
are allowed. However, reads performed with a pending demand are inherently in a race condition (the thread that reads with the thread that invokes the demand callback).In addition, the returned
Content.Chunk
may be aTrailers
instance, in case of request content trailers.- Specified by:
read
in interfaceContent.Source
- Returns:
- a chunk of content, possibly a failure instance, or
null
- See Also:
-
consumeAvailable
boolean consumeAvailable()Consume any available content. This bypasses any request wrappers to process the content inread()
and reads directly from theHttpStream
. This reads until there is no content currently available, or it reaches EOF. TheHttpConfiguration.setMaxUnconsumedRequestContentReads(int)
configuration can be used to configure how many reads will be attempted by this method.- Returns:
- true if the content was fully consumed.
-
push
Pushes the given
resource
to the client.- Parameters:
resource
- the resource to push- Throws:
UnsupportedOperationException
- if the push functionality is not supported- See Also:
-
addIdleTimeoutListener
Adds a listener for idle timeouts.
The listener is a predicate function that should return
true
to indicate that the idle timeout should be handled by the container as a hard failure (seeaddFailureListener(Consumer)
); orfalse
to ignore that specific timeout and for another timeout to occur after another idle period.Any pending
demand(Runnable)
orResponse.write(boolean, ByteBuffer, Callback)
operations are not affected by this call. Applications need to be mindful of any such pending operations if attempting to make new operations.Listeners are processed in sequence, and the first that returns
true
stops the processing of subsequent listeners, which are therefore not invoked.- Parameters:
onIdleTimeout
- the predicate function- See Also:
-
addFailureListener
Adds a listener for asynchronous hard errors.
When a listener is called, the effects of the error will already have taken place:
- Pending
demand(Runnable)
will be woken up. - Calls to
read()
will return theThrowable
. - Pending and new
Response.write(boolean, ByteBuffer, Callback)
calls will be failed by callingCallback.failed(Throwable)
on the callback passed towrite(...)
. - Any call to
Callback.succeeded()
on the callback passed toRequest.Handler.handle(Request, Response, Callback)
will effectively be a call toCallback.failed(Throwable)
with the notifiedThrowable
.
Listeners are processed in sequence. When all listeners are invoked then
Callback.failed(Throwable)
will be called on the callback passed toRequest.Handler.handle(Request, Response, Callback)
.- Parameters:
onFailure
- the consumer function- See Also:
- Pending
-
getTunnelSupport
TunnelSupport getTunnelSupport() -
addHttpStreamWrapper
-
getSession
Get a
Session
associated with the request. Sessions may not be supported by a given configuration, in which casenull
will be returned.- Parameters:
create
- True if the session should be created for the request.- Returns:
- The session associated with the request or
null
.
-
asReadOnly
Returns a copy of the request that throwsUnsupportedOperationException
from all mutative methods.- Returns:
- a copy of the request
-
getLocalAddr
-
getLocalPort
-
getRemoteAddr
-
getRemotePort
-
getServerName
-
getServerPort
-
getLocales
-
asInputStream
-
extractQueryParameters
-
extractQueryParameters
-
getParameters
- Throws:
Exception
-
getCookies
-
toRedirectURI
Common point to generate a proper "Location" header for redirects.- Parameters:
request
- the request the redirect should be based on (needed when relative locations are provided, so that server name, scheme, port can be built out properly)location
- the location URL to redirect to (can be a relative path)- Returns:
- the full redirect "Location" URL (including scheme, host, port, path, etc...)
-
as
-
get
-
unWrap
-
getContentBytesRead
-
newHttpURIFrom
Creates a new
HttpURI
from the given Request's HttpURI and the given path in context.For example, for
contextPath=/ctx
,request.httpURI=http://host/ctx/path?a=b
, andnewPathInContext=/newPath
, the returned HttpURI ishttp://host/ctx/newPath?a=b
.- Parameters:
request
- The request to base the new HttpURI on.newEncodedPathInContext
- The new path in context for the new HttpURI- Returns:
- A new immutable HttpURI with the path in context replaced, but query string and path parameters retained.
-
getAuthenticationState
- Parameters:
request
- The request to enquire.- Returns:
- the minimal
Request.AuthenticationState
of the request, or null if no authentication in process.
-
setAuthenticationState
- Parameters:
request
- The request to enquire.state
- theRequest.AuthenticationState
of the request, or null if no authentication in process.
-