jetty-9 refactored stats

This commit is contained in:
Greg Wilkins 2012-05-09 14:34:10 +02:00
parent a7154fcb05
commit 775376ac98
6 changed files with 754 additions and 378 deletions

View File

@ -1,212 +0,0 @@
package org.eclipse.jetty.io;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.jetty.util.Callback;
/* ------------------------------------------------------------ */
/** Dispatched IOFuture.
* <p>An implementation of IOFuture that can be extended to implement the
* {@link #dispatch(Runnable)} method so that callbacks can be dispatched.
* By default, the callbacks are called by the thread that called {@link #complete()} or
* {@link #fail(Throwable)}
*/
public class DispatchingIOFuture implements IOFuture
{
private final Object _lock;
private boolean _done;
private boolean _complete;
private Throwable _cause;
private Callback<?> _callback;
private Object _context;
public DispatchingIOFuture()
{
this(null);
}
public DispatchingIOFuture(Object lock)
{
this(false, lock);
}
public DispatchingIOFuture(boolean ready,Object lock)
{
_complete=ready;
_done=ready;
_lock = lock==null?this:lock;
}
public void fail(final Throwable cause)
{
synchronized(_lock)
{
if (_done)
throw new IllegalStateException("complete",cause);
_cause=cause;
_done=true;
if (_callback!=null)
dispatchFailed();
_lock.notifyAll();
}
}
public void complete()
{
synchronized(_lock)
{
if (_done)
throw new IllegalStateException();
_complete=true;
_done=true;
if (_callback!=null)
dispatchCompleted();
_lock.notifyAll();
}
}
protected void cancelled()
{
synchronized(_lock)
{
if (_done)
throw new IllegalStateException();
_complete=false;
_done=true;
_lock.notifyAll();
}
}
@Override
public boolean isDone()
{
synchronized(_lock)
{
return _done;
}
}
@Override
public boolean isComplete() throws ExecutionException
{
synchronized(_lock)
{
if (_done)
{
if (_complete)
return true;
throw new ExecutionException(_cause);
}
return false;
}
}
@Override
public void cancel() throws UnsupportedOperationException
{
throw new UnsupportedOperationException();
}
@Override
public void block() throws InterruptedException, ExecutionException
{
synchronized(_lock)
{
while (!_done)
_lock.wait();
isComplete();
}
}
@Override
public boolean block(long timeout, TimeUnit units) throws InterruptedException, ExecutionException
{
synchronized(_lock)
{
if (!_done)
_lock.wait(units.toMillis(timeout));
return isComplete();
}
}
@Override
public <C> void setCallback(Callback<C> callback, C context)
{
synchronized(_lock)
{
if (_callback!=null)
throw new IllegalStateException();
_callback=callback;
_context=context;
if (_done)
{
if (_complete)
dispatchCompleted();
else
dispatchFailed();
}
}
}
protected void dispatch(Runnable callback)
{
new Thread(callback).start();
}
private void dispatchCompleted()
{
final Callback callback=_callback;
final Object context=_context;
dispatch(new Runnable()
{
@Override
public void run()
{
callback.completed(context);
}
});
}
private void dispatchFailed()
{
final Callback callback=_callback;
final Throwable cause=_cause;
final Object context=_context;
dispatch(new Runnable()
{
@Override
public void run()
{
callback.failed(context, cause);
}
});
}
@Override
public String toString()
{
return String.format("DIOF@%x{%s,%s}",
hashCode(),
_done?(_complete?"R":_cause):"-",
_callback==null?"-":_callback);
}
public static void rethrow(ExecutionException e) throws IOException
{
if (e.getCause() instanceof IOException)
throw (IOException)e.getCause();
throw new RuntimeException(e);
}
}

View File

@ -1,93 +0,0 @@
package org.eclipse.jetty.io;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.util.Callback;
public class DoneIOFuture implements IOFuture
{
private final boolean _ready;
private final Throwable _cause;
public final static DoneIOFuture COMPLETE=new DoneIOFuture();
public DoneIOFuture()
{
this(true,null);
}
public DoneIOFuture(Throwable cause)
{
this(false,cause);
}
private DoneIOFuture(boolean ready, Throwable cause)
{
_ready=ready;
_cause=cause;
}
@Override
public boolean isComplete() throws ExecutionException
{
if (_ready)
return true;
throw new ExecutionException(_cause);
}
@Override
public void cancel() throws UnsupportedOperationException
{
throw new UnsupportedOperationException();
}
@Override
public void block() throws ExecutionException
{
isComplete();
}
@Override
public boolean block(long timeout, TimeUnit units) throws ExecutionException
{
return isComplete();
}
@Override
public <C> void setCallback(final Callback<C> callback, final C context)
{
dispatch(new Runnable()
{
@Override
public void run()
{
if (_ready)
callback.completed(context);
else
callback.failed(context, _cause);
}
});
}
protected void dispatch(Runnable callback)
{
callback.run();
}
@Override
public boolean isDone()
{
return true;
}
@Override
public String toString()
{
return String.format("%s@%x{%s}",
getClass().getSimpleName(),
hashCode(),
_ready?"R":_cause);
}
}

View File

@ -1,73 +0,0 @@
package org.eclipse.jetty.io;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.eclipse.jetty.util.Callback;
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/** Async IO Future interface.
* <p>
* This interface make the future status of an IO operation available via
* polling ({@link #isComplete()}, blocking ({@link #block()} or callback ({@link #setCallback(Callback, Object)}
* <p>
* This interface does not directly support a timeout for blocking. If an IO operation times out, then
* this will be indicated via this interface by an {@link ExecutionException} containing a
* {@link TimeoutException} (or similar).
*/
public interface IOFuture
{
/* ------------------------------------------------------------ */
/** Indicate if this Future is complete.
* If this future has completed by becoming ready, excepting or timeout.
* @return True if this future has completed by becoming ready or excepting.
*/
boolean isDone();
/* ------------------------------------------------------------ */
/** Indicate the readyness of the IO system.
* For input, ready means that there is data
* ready to be consumed. For output ready means that the prior operation
* has completed and another may be initiated.
* @return True if the IO operation is ready.
* @throws ExecutionException If an exception occurs during the IO operation
*/
boolean isComplete() throws ExecutionException;
/* ------------------------------------------------------------ */
/** Cancel the IO operation.
* @throws UnsupportedOperationException If the operation cannot be cancelled.
*/
void cancel() throws UnsupportedOperationException;
/* ------------------------------------------------------------ */
/** Block until complete.
* <p>This call blocks the calling thread until this AsyncIO is ready or
* an exception.
* @throws InterruptedException if interrupted while blocking
* @throws ExecutionException If any exception occurs during the IO operation
*/
void block() throws InterruptedException, ExecutionException;
/* ------------------------------------------------------------ */
/** Block until complete or timeout
* <p>This call blocks the calling thread until this AsyncIO is ready or
* an exception or a timeout. In the case of the timeout, the IO operation is not affected
* and can still continue to completion and this IOFuture is still usable.
* @return true if the IOFuture completed or false if it timedout.
* @throws InterruptedException if interrupted while blocking
* @throws ExecutionException If any exception occurs during the IO operation
*/
boolean block(long timeout, TimeUnit units) throws InterruptedException, ExecutionException;
/* ------------------------------------------------------------ */
/** Set an IOCallback.
* Set an {@link Callback} instance to be called when the IO operation is ready or if
* there is a failure or timeout.
* @param callback
*/
<C> void setCallback(Callback<C> callback, C context);
}

View File

@ -0,0 +1,460 @@
package org.eclipse.jetty.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import javax.servlet.ServletRequest;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.io.ByteBufferPool;
public abstract class AbstractHttpConnector extends AbstractConnector implements HttpConnector
{
private String _integralScheme = HttpScheme.HTTPS.toString();
private int _integralPort = 0;
private String _confidentialScheme = HttpScheme.HTTPS.toString();
private int _confidentialPort = 0;
private boolean _forwarded;
private String _hostHeader;
private String _forwardedHostHeader = HttpHeader.X_FORWARDED_HOST.toString();
private String _forwardedServerHeader = HttpHeader.X_FORWARDED_SERVER.toString();
private String _forwardedForHeader = HttpHeader.X_FORWARDED_FOR.toString();
private String _forwardedProtoHeader = HttpHeader.X_FORWARDED_PROTO.toString();
private String _forwardedCipherSuiteHeader;
private String _forwardedSslSessionIdHeader;
private int _requestHeaderSize;
private int _requestBufferSize;
private int _responseHeaderSize;
private int _responseBufferSize;
private ByteBufferPool _byteBufferPool;
@Override
public int getRequestHeaderSize()
{
return _requestHeaderSize;
}
public void setRequestHeaderSize(int requestHeaderSize)
{
_requestHeaderSize = requestHeaderSize;
}
@Override
public int getRequestBufferSize()
{
return _requestBufferSize;
}
public void setRequestBufferSize(int requestBufferSize)
{
_requestBufferSize = requestBufferSize;
}
@Override
public int getResponseHeaderSize()
{
return _responseHeaderSize;
}
public void setResponseHeaderSize(int responseHeaderSize)
{
_responseHeaderSize = responseHeaderSize;
}
@Override
public int getResponseBufferSize()
{
return _responseBufferSize;
}
public void setResponseBufferSize(int responseBufferSize)
{
_responseBufferSize = responseBufferSize;
}
@Override
public ByteBufferPool getByteBufferPool()
{
return _byteBufferPool;
}
public void setByteBufferPool(ByteBufferPool byteBufferPool)
{
_byteBufferPool = byteBufferPool;
}
/* ------------------------------------------------------------ */
@Override
public void customize(Request request) throws IOException
{
if (isForwarded())
checkForwardedHeaders(request);
}
/* ------------------------------------------------------------ */
protected void checkForwardedHeaders(Request request) throws IOException
{
HttpFields httpFields = request.getConnection().getRequestFields();
// Do SSL first
if (getForwardedCipherSuiteHeader()!=null)
{
String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader());
if (cipher_suite!=null)
request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite);
}
if (getForwardedSslSessionIdHeader()!=null)
{
String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader());
if(ssl_session_id!=null)
{
request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id);
request.setScheme(HttpScheme.HTTPS.toString());
}
}
// Retrieving headers from the request
String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader());
String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader());
String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader());
String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader());
if (_hostHeader != null)
{
// Update host header
httpFields.put(HttpHeader.HOST.toString(),_hostHeader);
request.setServerName(null);
request.setServerPort(-1);
request.getServerName();
}
else if (forwardedHost != null)
{
// Update host header
httpFields.put(HttpHeader.HOST.toString(),forwardedHost);
request.setServerName(null);
request.setServerPort(-1);
request.getServerName();
}
else if (forwardedServer != null)
{
// Use provided server name
request.setServerName(forwardedServer);
}
if (forwardedFor != null)
{
request.setRemoteAddr(new InetSocketAddress(forwardedFor,request.getRemotePort()));
}
if (forwardedProto != null)
{
request.setScheme(forwardedProto);
}
}
/* ------------------------------------------------------------ */
protected String getLeftMostFieldValue(HttpFields fields, String header)
{
if (header == null)
return null;
String headerValue = fields.getStringField(header);
if (headerValue == null)
return null;
int commaIndex = headerValue.indexOf(',');
if (commaIndex == -1)
{
// Single value
return headerValue;
}
// The left-most value is the farthest downstream client
return headerValue.substring(0,commaIndex);
}
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.Connector#getConfidentialPort()
*/
@Override
public int getConfidentialPort()
{
return _confidentialPort;
}
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.Connector#getConfidentialScheme()
*/
@Override
public String getConfidentialScheme()
{
return _confidentialScheme;
}
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server .Request)
*/
@Override
public boolean isIntegral(Request request)
{
return false;
}
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.Connector#getConfidentialPort()
*/
@Override
public int getIntegralPort()
{
return _integralPort;
}
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.Connector#getIntegralScheme()
*/
@Override
public String getIntegralScheme()
{
return _integralScheme;
}
/* ------------------------------------------------------------ */
/*
* @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server.Request)
*/
@Override
public boolean isConfidential(Request request)
{
return _forwarded && request.getScheme().equalsIgnoreCase(HttpScheme.HTTPS.toString());
}
/* ------------------------------------------------------------ */
/**
* @param confidentialPort
* The confidentialPort to set.
*/
public void setConfidentialPort(int confidentialPort)
{
_confidentialPort = confidentialPort;
}
/* ------------------------------------------------------------ */
/**
* @param confidentialScheme
* The confidentialScheme to set.
*/
public void setConfidentialScheme(String confidentialScheme)
{
_confidentialScheme = confidentialScheme;
}
/* ------------------------------------------------------------ */
/**
* @param integralPort
* The integralPort to set.
*/
public void setIntegralPort(int integralPort)
{
_integralPort = integralPort;
}
/* ------------------------------------------------------------ */
/**
* @param integralScheme
* The integralScheme to set.
*/
public void setIntegralScheme(String integralScheme)
{
_integralScheme = integralScheme;
}
/* ------------------------------------------------------------ */
/**
* Is reverse proxy handling on?
*
* @return true if this connector is checking the x-forwarded-for/host/server headers
*/
public boolean isForwarded()
{
return _forwarded;
}
/* ------------------------------------------------------------ */
/**
* Set reverse proxy handling. If set to true, then the X-Forwarded headers (or the headers set in their place) are looked for to set the request protocol,
* host, server and client ip.
*
* @param check
* true if this connector is checking the x-forwarded-for/host/server headers
* @set {@link #setForwardedForHeader(String)}
* @set {@link #setForwardedHostHeader(String)}
* @set {@link #setForwardedProtoHeader(String)}
* @set {@link #setForwardedServerHeader(String)}
*/
public void setForwarded(boolean check)
{
if (check)
LOG.debug("{} is forwarded",this);
_forwarded = check;
}
/* ------------------------------------------------------------ */
public String getHostHeader()
{
return _hostHeader;
}
/* ------------------------------------------------------------ */
/**
* Set a forced valued for the host header to control what is returned by {@link ServletRequest#getServerName()} and {@link ServletRequest#getServerPort()}.
* This value is only used if {@link #isForwarded()} is true.
*
* @param hostHeader
* The value of the host header to force.
*/
public void setHostHeader(String hostHeader)
{
_hostHeader = hostHeader;
}
/* ------------------------------------------------------------ */
/*
*
* @see #setForwarded(boolean)
*/
public String getForwardedHostHeader()
{
return _forwardedHostHeader;
}
/* ------------------------------------------------------------ */
/**
* @param forwardedHostHeader
* The header name for forwarded hosts (default x-forwarded-host)
* @see #setForwarded(boolean)
*/
public void setForwardedHostHeader(String forwardedHostHeader)
{
_forwardedHostHeader = forwardedHostHeader;
}
/* ------------------------------------------------------------ */
/**
* @return the header name for forwarded server.
* @see #setForwarded(boolean)
*/
public String getForwardedServerHeader()
{
return _forwardedServerHeader;
}
/* ------------------------------------------------------------ */
/**
* @param forwardedServerHeader
* The header name for forwarded server (default x-forwarded-server)
* @see #setForwarded(boolean)
*/
public void setForwardedServerHeader(String forwardedServerHeader)
{
_forwardedServerHeader = forwardedServerHeader;
}
/* ------------------------------------------------------------ */
/**
* @see #setForwarded(boolean)
*/
public String getForwardedForHeader()
{
return _forwardedForHeader;
}
/* ------------------------------------------------------------ */
/**
* @param forwardedRemoteAddressHeader
* The header name for forwarded for (default x-forwarded-for)
* @see #setForwarded(boolean)
*/
public void setForwardedForHeader(String forwardedRemoteAddressHeader)
{
_forwardedForHeader = forwardedRemoteAddressHeader;
}
/* ------------------------------------------------------------ */
/**
* Get the forwardedProtoHeader.
*
* @return the forwardedProtoHeader (default X-Forwarded-For)
* @see #setForwarded(boolean)
*/
public String getForwardedProtoHeader()
{
return _forwardedProtoHeader;
}
/* ------------------------------------------------------------ */
/**
* Set the forwardedProtoHeader.
*
* @param forwardedProtoHeader
* the forwardedProtoHeader to set (default X-Forwarded-For)
* @see #setForwarded(boolean)
*/
public void setForwardedProtoHeader(String forwardedProtoHeader)
{
_forwardedProtoHeader = forwardedProtoHeader;
}
/* ------------------------------------------------------------ */
/**
* @return The header name holding a forwarded cipher suite (default null)
*/
public String getForwardedCipherSuiteHeader()
{
return _forwardedCipherSuiteHeader;
}
/* ------------------------------------------------------------ */
/**
* @param forwardedCipherSuite
* The header name holding a forwarded cipher suite (default null)
*/
public void setForwardedCipherSuiteHeader(String forwardedCipherSuite)
{
_forwardedCipherSuiteHeader = forwardedCipherSuite;
}
/* ------------------------------------------------------------ */
/**
* @return The header name holding a forwarded SSL Session ID (default null)
*/
public String getForwardedSslSessionIdHeader()
{
return _forwardedSslSessionIdHeader;
}
/* ------------------------------------------------------------ */
/**
* @param forwardedSslSessionId
* The header name holding a forwarded SSL Session ID (default null)
*/
public void setForwardedSslSessionIdHeader(String forwardedSslSessionId)
{
_forwardedSslSessionIdHeader = forwardedSslSessionId;
}
}

View File

@ -0,0 +1,228 @@
package org.eclipse.jetty.server;
import java.util.concurrent.atomic.AtomicLong;
import org.eclipse.jetty.server.Connector.Statistics;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
import org.eclipse.jetty.util.statistic.CounterStatistic;
import org.eclipse.jetty.util.statistic.SampleStatistic;
class ConnectionStatistics extends AbstractLifeCycle implements Statistics
{
private final AtomicLong _statsStartedAt = new AtomicLong(-1L);
private final CounterStatistic _connectionStats = new CounterStatistic();
private final SampleStatistic _messagesIn = new SampleStatistic();
private final SampleStatistic _messagesOut = new SampleStatistic();
private final SampleStatistic _connectionDurationStats = new SampleStatistic();
/* ------------------------------------------------------------ */
@Override
public int getBytesIn()
{
return -1;
}
/* ------------------------------------------------------------ */
@Override
public int getBytesOut()
{
return -1;
}
/* ------------------------------------------------------------ */
/**
* @return Number of connections accepted by the server since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public int getConnections()
{
return (int)_connectionStats.getTotal();
}
/* ------------------------------------------------------------ */
/**
* @return Maximum duration in milliseconds of an open connection since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public long getConnectionsDurationMax()
{
return _connectionDurationStats.getMax();
}
/* ------------------------------------------------------------ */
/**
* @return Mean duration in milliseconds of open connections since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public double getConnectionsDurationMean()
{
return _connectionDurationStats.getMean();
}
/* ------------------------------------------------------------ */
/**
* @return Standard deviation of duration in milliseconds of open connections since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public double getConnectionsDurationStdDev()
{
return _connectionDurationStats.getStdDev();
}
/* ------------------------------------------------------------ */
/**
* @return Returns the connectionsDurationTotal.
*/
@Override
public long getConnectionsDurationTotal()
{
return _connectionDurationStats.getTotal();
}
/* ------------------------------------------------------------ */
/**
* @return Maximum number of requests per connection since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public int getConnectionsMessagesInMax()
{
return (int)_messagesIn.getMax();
}
/* ------------------------------------------------------------ */
/**
* @return Mean number of requests per connection since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public double getConnectionsMessagesInMean()
{
return _messagesIn.getMean();
}
/* ------------------------------------------------------------ */
/**
* @return Standard deviation of number of requests per connection since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public double getConnectionsMessagesInStdDev()
{
return _messagesIn.getStdDev();
}
/* ------------------------------------------------------------ */
/**
* @return Number of connections currently open that were opened since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public int getConnectionsOpen()
{
return (int)_connectionStats.getCurrent();
}
/* ------------------------------------------------------------ */
/**
* @return Maximum number of connections opened simultaneously since statsReset() called. Undefined if setStatsOn(false).
*/
@Override
public int getConnectionsOpenMax()
{
return (int)_connectionStats.getMax();
}
/* ------------------------------------------------------------ */
/**
* @return Get the number of requests handled by this connector since last call of statsReset(). If setStatsOn(false) then this is undefined.
*/
@Override
public int getMessagesIn()
{
return (int)_messagesIn.getTotal();
}
/* ------------------------------------------------------------ */
/**
* @return Get the number of requests handled by this connector since last call of statsReset(). If setStatsOn(false) then this is undefined.
*/
@Override
public int getMessagesOut()
{
return (int)_messagesIn.getTotal();
}
/* ------------------------------------------------------------ */
/**
* @return True if statistics collection is turned on.
*/
@Override
public boolean getStatsOn()
{
return _statsStartedAt.get() != -1;
}
/* ------------------------------------------------------------ */
/**
* @return Timestamp stats were started at.
*/
@Override
public long getStatsOnMs()
{
long start = _statsStartedAt.get();
return (start != -1)?(System.currentTimeMillis() - start):0;
}
/* ------------------------------------------------------------ */
@Override
public void doStart()
{
statsReset();
_statsStartedAt.set(System.currentTimeMillis());
}
/* ------------------------------------------------------------ */
@Override
public void doStop()
{
}
/* ------------------------------------------------------------ */
/**
* Reset statistics.
*/
@Override
public void statsReset()
{
_messagesIn.reset();
_connectionStats.reset();
_connectionDurationStats.reset();
}
/* ------------------------------------------------------------ */
@Override
public void connectionOpened()
{
if (isStarted())
_connectionStats.increment();
}
/* ------------------------------------------------------------ */
@Override
public void connectionUpgraded(long duration, int msgIn, int msgOut)
{
_messagesIn.set(msgIn);
_messagesOut.set(msgOut);
}
/* ------------------------------------------------------------ */
@Override
public void connectionClosed(long duration, int msgIn, int msgOut)
{
_messagesIn.set(msgIn);
_messagesOut.set(msgOut);
_connectionStats.decrement();
_connectionDurationStats.set(duration);
}
}

View File

@ -0,0 +1,66 @@
package org.eclipse.jetty.server;
import java.io.IOException;
import org.eclipse.jetty.io.EndPoint;
public interface HttpConnector extends Connector
{
int getRequestHeaderSize();
int getRequestBufferSize();
int getResponseHeaderSize();
int getResponseBufferSize();
/* ------------------------------------------------------------ */
/**
* @return The port to use when redirecting a request if a data constraint of integral is
* required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()}
*/
int getIntegralPort();
/* ------------------------------------------------------------ */
/**
* @return The schema to use when redirecting a request if a data constraint of integral is
* required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()}
*/
String getIntegralScheme();
/* ------------------------------------------------------------ */
/**
* @param request A request
* @return true if the request is integral. This normally means the https schema has been used.
*/
boolean isIntegral(Request request);
/* ------------------------------------------------------------ */
/**
* @return The port to use when redirecting a request if a data constraint of confidential is
* required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()}
*/
int getConfidentialPort();
/* ------------------------------------------------------------ */
/**
* @return The schema to use when redirecting a request if a data constraint of confidential is
* required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()}
*/
String getConfidentialScheme();
/* ------------------------------------------------------------ */
/**
* @param request A request
* @return true if the request is confidential. This normally means the https schema has been used.
*/
boolean isConfidential(Request request);
/* ------------------------------------------------------------ */
/** Customize a request for an endpoint.
* Called on every request to allow customization of the request for
* the particular endpoint (eg security properties from a SSL connection).
* @param request
* @throws IOException
*/
void customize(Request request) throws IOException;
}