jetty-9 moved more fields out of HttpChannel
This commit is contained in:
parent
2a66567a5b
commit
78a529fc9d
|
@ -129,7 +129,7 @@ public class Dispatcher implements RequestDispatcher
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
baseRequest.setDispatcherType(DispatcherType.INCLUDE);
|
baseRequest.setDispatcherType(DispatcherType.INCLUDE);
|
||||||
baseRequest.getHttpChannel().include();
|
baseRequest.getResponse().include();
|
||||||
if (_named!=null)
|
if (_named!=null)
|
||||||
_contextHandler.handle(_named,baseRequest, (HttpServletRequest)request, (HttpServletResponse)response);
|
_contextHandler.handle(_named,baseRequest, (HttpServletRequest)request, (HttpServletResponse)response);
|
||||||
else
|
else
|
||||||
|
@ -171,7 +171,7 @@ public class Dispatcher implements RequestDispatcher
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
baseRequest.setAttributes(old_attr);
|
baseRequest.setAttributes(old_attr);
|
||||||
baseRequest.getHttpChannel().included();
|
baseRequest.getResponse().included();
|
||||||
baseRequest.setParameters(old_params);
|
baseRequest.setParameters(old_params);
|
||||||
baseRequest.setDispatcherType(old_type);
|
baseRequest.setDispatcherType(old_type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,18 +72,12 @@ public abstract class HttpChannel
|
||||||
private final ChannelEventHandler _handler = new ChannelEventHandler();
|
private final ChannelEventHandler _handler = new ChannelEventHandler();
|
||||||
private final HttpChannelState _state;
|
private final HttpChannelState _state;
|
||||||
|
|
||||||
private final HttpFields _requestFields;
|
|
||||||
private final Request _request;
|
private final Request _request;
|
||||||
private final HttpInput _in;
|
private final HttpInput _in;
|
||||||
|
|
||||||
private final HttpFields _responseFields;
|
|
||||||
private final Response _response;
|
private final Response _response;
|
||||||
private final Output _out;
|
|
||||||
private HttpWriter _writer;
|
|
||||||
private PrintWriter _printWriter;
|
|
||||||
|
|
||||||
private int _requests;
|
private int _requests;
|
||||||
private int _include;
|
|
||||||
|
|
||||||
private HttpVersion _version = HttpVersion.HTTP_1_1;
|
private HttpVersion _version = HttpVersion.HTTP_1_1;
|
||||||
|
|
||||||
|
@ -99,13 +93,10 @@ public abstract class HttpChannel
|
||||||
_server = server;
|
_server = server;
|
||||||
_connection = connection;
|
_connection = connection;
|
||||||
_uri = new HttpURI(URIUtil.__CHARSET);
|
_uri = new HttpURI(URIUtil.__CHARSET);
|
||||||
_requestFields = new HttpFields();
|
|
||||||
_responseFields = new HttpFields();
|
|
||||||
_state = new HttpChannelState(this);
|
_state = new HttpChannelState(this);
|
||||||
_request = new Request(this);
|
_request = new Request(this);
|
||||||
_response = new Response(this);
|
_response = new Response(this,new Output());
|
||||||
_in=input;
|
_in=input;
|
||||||
_out=new Output();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
@ -146,25 +137,7 @@ public abstract class HttpChannel
|
||||||
{
|
{
|
||||||
return _server;
|
return _server;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/**
|
|
||||||
* @return Returns the requestFields.
|
|
||||||
*/
|
|
||||||
public HttpFields getRequestFields()
|
|
||||||
{
|
|
||||||
return _requestFields;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/**
|
|
||||||
* @return Returns the responseFields.
|
|
||||||
*/
|
|
||||||
public HttpFields getResponseFields()
|
|
||||||
{
|
|
||||||
return _responseFields;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/**
|
/**
|
||||||
* @return Returns the request.
|
* @return Returns the request.
|
||||||
|
@ -232,52 +205,6 @@ public abstract class HttpChannel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/**
|
|
||||||
* @return The output stream for this connection. The stream will be created if it does not already exist.
|
|
||||||
*/
|
|
||||||
public HttpOutput getOutputStream()
|
|
||||||
{
|
|
||||||
return _out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/**
|
|
||||||
* @param charset the character set for the PrintWriter
|
|
||||||
* @return A {@link PrintWriter} wrapping the {@link #getOutputStream output stream}. The writer is created if it
|
|
||||||
* does not already exist.
|
|
||||||
*/
|
|
||||||
public PrintWriter getPrintWriter(String charset)
|
|
||||||
{
|
|
||||||
getOutputStream();
|
|
||||||
if (_writer==null)
|
|
||||||
{
|
|
||||||
_writer=new HttpWriter(_out);
|
|
||||||
if (_server.isUncheckedPrintWriter())
|
|
||||||
_printWriter=new UncheckedPrintWriter(_writer);
|
|
||||||
else
|
|
||||||
_printWriter = new PrintWriter(_writer)
|
|
||||||
{
|
|
||||||
public void close()
|
|
||||||
{
|
|
||||||
synchronized (lock)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
catch (IOException e)
|
|
||||||
{
|
|
||||||
setError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
_writer.setCharacterEncoding(charset);
|
|
||||||
return _printWriter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public void reset()
|
public void reset()
|
||||||
|
@ -285,12 +212,9 @@ public abstract class HttpChannel
|
||||||
_expect=false;
|
_expect=false;
|
||||||
_expect100Continue=false;
|
_expect100Continue=false;
|
||||||
_expect102Processing=false;
|
_expect102Processing=false;
|
||||||
_requestFields.clear();
|
|
||||||
_request.recycle();
|
_request.recycle();
|
||||||
_responseFields.clear();
|
|
||||||
_response.recycle();
|
_response.recycle();
|
||||||
_uri.clear();
|
_uri.clear();
|
||||||
_out.reset();
|
|
||||||
_in.recycle(); // TODO done here or in connection?
|
_in.recycle(); // TODO done here or in connection?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,7 +244,7 @@ public abstract class HttpChannel
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_request.setHandled(false);
|
_request.setHandled(false);
|
||||||
_out.reopen();
|
_response.getHttpOutput().reopen();
|
||||||
|
|
||||||
if (_state.isInitial())
|
if (_state.isInitial())
|
||||||
{
|
{
|
||||||
|
@ -429,7 +353,7 @@ public abstract class HttpChannel
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_response.setStatus(status,reason);
|
_response.setStatus(status,reason);
|
||||||
_responseFields.add(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
|
_response.getHttpFields().add(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
|
||||||
|
|
||||||
ByteBuffer buffer=null;
|
ByteBuffer buffer=null;
|
||||||
if (content!=null)
|
if (content!=null)
|
||||||
|
@ -456,25 +380,6 @@ public abstract class HttpChannel
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
public boolean isIncluding()
|
|
||||||
{
|
|
||||||
return _include>0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
public void include()
|
|
||||||
{
|
|
||||||
_include++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
public void included()
|
|
||||||
{
|
|
||||||
_include--;
|
|
||||||
_out.reopen();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public boolean isSuspended()
|
public boolean isSuspended()
|
||||||
{
|
{
|
||||||
|
@ -599,7 +504,7 @@ public abstract class HttpChannel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (name!=null)
|
if (name!=null)
|
||||||
_requestFields.add(name, value);
|
_request.getHttpFields().add(name, value);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,19 +518,19 @@ public abstract class HttpChannel
|
||||||
break;
|
break;
|
||||||
case HTTP_1_0:
|
case HTTP_1_0:
|
||||||
if (persistent)
|
if (persistent)
|
||||||
_responseFields.add(HttpHeader.CONNECTION,HttpHeaderValue.KEEP_ALIVE);
|
_response.getHttpFields().add(HttpHeader.CONNECTION,HttpHeaderValue.KEEP_ALIVE);
|
||||||
|
|
||||||
if (_server.getSendDateHeader())
|
if (_server.getSendDateHeader())
|
||||||
_responseFields.putDateField(HttpHeader.DATE.toString(),_request.getTimeStamp());
|
_response.getHttpFields().putDateField(HttpHeader.DATE.toString(),_request.getTimeStamp());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_1_1:
|
case HTTP_1_1:
|
||||||
|
|
||||||
if (!persistent)
|
if (!persistent)
|
||||||
_responseFields.add(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
|
_response.getHttpFields().add(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
|
||||||
|
|
||||||
if (_server.getSendDateHeader())
|
if (_server.getSendDateHeader())
|
||||||
_responseFields.putDateField(HttpHeader.DATE.toString(),_request.getTimeStamp());
|
_response.getHttpFields().putDateField(HttpHeader.DATE.toString(),_request.getTimeStamp());
|
||||||
|
|
||||||
if (!_host)
|
if (!_host)
|
||||||
{
|
{
|
||||||
|
@ -690,7 +595,7 @@ public abstract class HttpChannel
|
||||||
if (_expect100Continue)
|
if (_expect100Continue)
|
||||||
{
|
{
|
||||||
_expect100Continue=false;
|
_expect100Continue=false;
|
||||||
getResponseFields().put(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
|
_response.getHttpFields().put(HttpHeader.CONNECTION,HttpHeaderValue.CLOSE);
|
||||||
}
|
}
|
||||||
return _response.commit();
|
return _response.commit();
|
||||||
}
|
}
|
||||||
|
@ -723,8 +628,7 @@ public abstract class HttpChannel
|
||||||
{
|
{
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new IOException("Closed");
|
throw new IOException("Closed");
|
||||||
PrintWriter writer=getPrintWriter(null);
|
write(s.getBytes(_response.getCharacterEncoding()));
|
||||||
writer.print(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -743,19 +647,19 @@ public abstract class HttpChannel
|
||||||
HttpContent httpContent = (HttpContent) content;
|
HttpContent httpContent = (HttpContent) content;
|
||||||
String contentType = httpContent.getContentType();
|
String contentType = httpContent.getContentType();
|
||||||
if (contentType != null)
|
if (contentType != null)
|
||||||
_responseFields.put(HttpHeader.CONTENT_TYPE, contentType);
|
_response.getHttpFields().put(HttpHeader.CONTENT_TYPE, contentType);
|
||||||
|
|
||||||
if (httpContent.getContentLength() > 0)
|
if (httpContent.getContentLength() > 0)
|
||||||
_responseFields.putLongField(HttpHeader.CONTENT_LENGTH, httpContent.getContentLength());
|
_response.getHttpFields().putLongField(HttpHeader.CONTENT_LENGTH, httpContent.getContentLength());
|
||||||
|
|
||||||
String lm = httpContent.getLastModified();
|
String lm = httpContent.getLastModified();
|
||||||
if (lm != null)
|
if (lm != null)
|
||||||
_responseFields.put(HttpHeader.LAST_MODIFIED, lm);
|
_response.getHttpFields().put(HttpHeader.LAST_MODIFIED, lm);
|
||||||
else if (httpContent.getResource()!=null)
|
else if (httpContent.getResource()!=null)
|
||||||
{
|
{
|
||||||
long lml=httpContent.getResource().lastModified();
|
long lml=httpContent.getResource().lastModified();
|
||||||
if (lml!=-1)
|
if (lml!=-1)
|
||||||
_responseFields.putDateField(HttpHeader.LAST_MODIFIED, lml);
|
_response.getHttpFields().putDateField(HttpHeader.LAST_MODIFIED, lml);
|
||||||
}
|
}
|
||||||
|
|
||||||
content = httpContent.getDirectBuffer();
|
content = httpContent.getDirectBuffer();
|
||||||
|
@ -767,7 +671,7 @@ public abstract class HttpChannel
|
||||||
else if (content instanceof Resource)
|
else if (content instanceof Resource)
|
||||||
{
|
{
|
||||||
resource=(Resource)content;
|
resource=(Resource)content;
|
||||||
_responseFields.putDateField(HttpHeader.LAST_MODIFIED, resource.lastModified());
|
_response.getHttpFields().putDateField(HttpHeader.LAST_MODIFIED, resource.lastModified());
|
||||||
content=resource.getInputStream();
|
content=resource.getInputStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ public class HttpConfiguration extends AggregateLifeCycle
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
protected void checkForwardedHeaders(Request request) throws IOException
|
protected void checkForwardedHeaders(Request request) throws IOException
|
||||||
{
|
{
|
||||||
HttpFields httpFields = request.getHttpChannel().getRequestFields();
|
HttpFields httpFields = request.getHttpFields();
|
||||||
|
|
||||||
// Do SSL first
|
// Do SSL first
|
||||||
if (getForwardedCipherSuiteHeader()!=null)
|
if (getForwardedCipherSuiteHeader()!=null)
|
||||||
|
|
|
@ -41,10 +41,11 @@ public class HttpWriter extends Writer
|
||||||
int _surrogate;
|
int _surrogate;
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public HttpWriter(HttpOutput out)
|
public HttpWriter(HttpOutput out, String encoding)
|
||||||
{
|
{
|
||||||
_out=out;
|
_out=out;
|
||||||
_surrogate=0; // AS lastUTF16CodePoint
|
_surrogate=0; // AS lastUTF16CodePoint
|
||||||
|
setCharacterEncoding(encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
|
@ -115,7 +115,7 @@ public class Request implements HttpServletRequest
|
||||||
private static final int __NONE = 0, _STREAM = 1, __READER = 2;
|
private static final int __NONE = 0, _STREAM = 1, __READER = 2;
|
||||||
|
|
||||||
private final HttpChannel _channel;
|
private final HttpChannel _channel;
|
||||||
private HttpFields _fields;
|
private final HttpFields _fields=new HttpFields();
|
||||||
private final HttpChannelState _state;
|
private final HttpChannelState _state;
|
||||||
|
|
||||||
private final List<ServletRequestAttributeListener> _requestAttributeListeners=new ArrayList<>();
|
private final List<ServletRequestAttributeListener> _requestAttributeListeners=new ArrayList<>();
|
||||||
|
@ -168,9 +168,14 @@ public class Request implements HttpServletRequest
|
||||||
{
|
{
|
||||||
_channel = channel;
|
_channel = channel;
|
||||||
_state=channel.getState();
|
_state=channel.getState();
|
||||||
_fields=_channel.getRequestFields();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public HttpFields getHttpFields()
|
||||||
|
{
|
||||||
|
return _fields;
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public void addEventListener(final EventListener listener)
|
public void addEventListener(final EventListener listener)
|
||||||
{
|
{
|
||||||
|
@ -1434,6 +1439,7 @@ public class Request implements HttpServletRequest
|
||||||
_savedNewSessions=null;
|
_savedNewSessions=null;
|
||||||
_multiPartInputStream = null;
|
_multiPartInputStream = null;
|
||||||
_remote=null;
|
_remote=null;
|
||||||
|
_fields.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import javax.servlet.RequestDispatcher;
|
import javax.servlet.RequestDispatcher;
|
||||||
import javax.servlet.ServletOutputStream;
|
import javax.servlet.ServletOutputStream;
|
||||||
|
@ -71,8 +72,10 @@ public class Response implements HttpServletResponse
|
||||||
public final static String HTTP_ONLY_COMMENT="__HTTP_ONLY__";
|
public final static String HTTP_ONLY_COMMENT="__HTTP_ONLY__";
|
||||||
|
|
||||||
private final HttpChannel _channel;
|
private final HttpChannel _channel;
|
||||||
private final HttpFields _fields;
|
private final HttpOutput _out;
|
||||||
|
private final HttpFields _fields=new HttpFields();
|
||||||
private final AtomicBoolean _committed = new AtomicBoolean(false);
|
private final AtomicBoolean _committed = new AtomicBoolean(false);
|
||||||
|
private final AtomicInteger _include = new AtomicInteger();
|
||||||
private int _status=HttpStatus.NOT_SET_000;
|
private int _status=HttpStatus.NOT_SET_000;
|
||||||
private String _reason;
|
private String _reason;
|
||||||
private Locale _locale;
|
private Locale _locale;
|
||||||
|
@ -87,10 +90,10 @@ public class Response implements HttpServletResponse
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public Response(HttpChannel channel)
|
public Response(HttpChannel channel, HttpOutput out)
|
||||||
{
|
{
|
||||||
_channel=channel;
|
_channel=channel;
|
||||||
_fields=channel.getResponseFields();
|
_out=out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
@ -115,8 +118,35 @@ public class Response implements HttpServletResponse
|
||||||
_outputState=OutputState.NONE;
|
_outputState=OutputState.NONE;
|
||||||
_contentLength=-1;
|
_contentLength=-1;
|
||||||
_committed.set(false);
|
_committed.set(false);
|
||||||
|
_out.reset();
|
||||||
|
_fields.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public HttpOutput getHttpOutput()
|
||||||
|
{
|
||||||
|
return _out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public boolean isIncluding()
|
||||||
|
{
|
||||||
|
return _include.get()>0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public void include()
|
||||||
|
{
|
||||||
|
_include.incrementAndGet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
public void included()
|
||||||
|
{
|
||||||
|
_include.decrementAndGet();
|
||||||
|
_out.reopen();
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/*
|
/*
|
||||||
* @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie)
|
* @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie)
|
||||||
|
@ -300,8 +330,8 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void sendError(int code, String message) throws IOException
|
public void sendError(int code, String message) throws IOException
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (isCommitted())
|
if (isCommitted())
|
||||||
LOG.warn("Committed before "+code+" "+message);
|
LOG.warn("Committed before "+code+" "+message);
|
||||||
|
@ -386,8 +416,8 @@ public class Response implements HttpServletResponse
|
||||||
}
|
}
|
||||||
else if (code!=SC_PARTIAL_CONTENT)
|
else if (code!=SC_PARTIAL_CONTENT)
|
||||||
{
|
{
|
||||||
_channel.getRequestFields().remove(HttpHeader.CONTENT_TYPE);
|
_channel.getRequest().getHttpFields().remove(HttpHeader.CONTENT_TYPE);
|
||||||
_channel.getRequestFields().remove(HttpHeader.CONTENT_LENGTH);
|
_channel.getRequest().getHttpFields().remove(HttpHeader.CONTENT_LENGTH);
|
||||||
_characterEncoding=null;
|
_characterEncoding=null;
|
||||||
_mimeType=null;
|
_mimeType=null;
|
||||||
}
|
}
|
||||||
|
@ -429,7 +459,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void sendRedirect(String location) throws IOException
|
public void sendRedirect(String location) throws IOException
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (location==null)
|
if (location==null)
|
||||||
|
@ -490,7 +520,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void setDateHeader(String name, long date)
|
public void setDateHeader(String name, long date)
|
||||||
{
|
{
|
||||||
if (!_channel.isIncluding())
|
if (!isIncluding())
|
||||||
_fields.putDateField(name, date);
|
_fields.putDateField(name, date);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,7 +531,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void addDateHeader(String name, long date)
|
public void addDateHeader(String name, long date)
|
||||||
{
|
{
|
||||||
if (!_channel.isIncluding())
|
if (!isIncluding())
|
||||||
_fields.addDateField(name, date);
|
_fields.addDateField(name, date);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -515,7 +545,7 @@ public class Response implements HttpServletResponse
|
||||||
setContentType(value);
|
setContentType(value);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_fields.put(name, value);
|
_fields.put(name, value);
|
||||||
|
@ -540,7 +570,7 @@ public class Response implements HttpServletResponse
|
||||||
setContentType(value);
|
setContentType(value);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
{
|
{
|
||||||
if (name.startsWith(SET_INCLUDE_HEADER_PREFIX))
|
if (name.startsWith(SET_INCLUDE_HEADER_PREFIX))
|
||||||
name=name.substring(SET_INCLUDE_HEADER_PREFIX.length());
|
name=name.substring(SET_INCLUDE_HEADER_PREFIX.length());
|
||||||
|
@ -595,7 +625,7 @@ public class Response implements HttpServletResponse
|
||||||
*/
|
*/
|
||||||
public void addHeader(HttpHeader name, String value)
|
public void addHeader(HttpHeader name, String value)
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_fields.add(name, value);
|
_fields.add(name, value);
|
||||||
|
@ -615,7 +645,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void addHeader(String name, String value)
|
public void addHeader(String name, String value)
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
{
|
{
|
||||||
if (name.startsWith(SET_INCLUDE_HEADER_PREFIX))
|
if (name.startsWith(SET_INCLUDE_HEADER_PREFIX))
|
||||||
name=name.substring(SET_INCLUDE_HEADER_PREFIX.length());
|
name=name.substring(SET_INCLUDE_HEADER_PREFIX.length());
|
||||||
|
@ -640,7 +670,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void setIntHeader(String name, int value)
|
public void setIntHeader(String name, int value)
|
||||||
{
|
{
|
||||||
if (!_channel.isIncluding())
|
if (!isIncluding())
|
||||||
{
|
{
|
||||||
_fields.putLongField(name, value);
|
_fields.putLongField(name, value);
|
||||||
if (HttpHeader.CONTENT_LENGTH.is(name))
|
if (HttpHeader.CONTENT_LENGTH.is(name))
|
||||||
|
@ -655,7 +685,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void addIntHeader(String name, int value)
|
public void addIntHeader(String name, int value)
|
||||||
{
|
{
|
||||||
if (!_channel.isIncluding())
|
if (!isIncluding())
|
||||||
{
|
{
|
||||||
_fields.add(name, Integer.toString(value));
|
_fields.add(name, Integer.toString(value));
|
||||||
if (HttpHeader.CONTENT_LENGTH.is(name))
|
if (HttpHeader.CONTENT_LENGTH.is(name))
|
||||||
|
@ -682,7 +712,7 @@ public class Response implements HttpServletResponse
|
||||||
{
|
{
|
||||||
if (sc<=0)
|
if (sc<=0)
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
if (!_channel.isIncluding())
|
if (!isIncluding())
|
||||||
{
|
{
|
||||||
_status=sc;
|
_status=sc;
|
||||||
_reason=sm;
|
_reason=sm;
|
||||||
|
@ -726,10 +756,8 @@ public class Response implements HttpServletResponse
|
||||||
{
|
{
|
||||||
if (_outputState==OutputState.WRITER)
|
if (_outputState==OutputState.WRITER)
|
||||||
throw new IllegalStateException("WRITER");
|
throw new IllegalStateException("WRITER");
|
||||||
|
|
||||||
ServletOutputStream out = _channel.getOutputStream();
|
|
||||||
_outputState=OutputState.STREAM;
|
_outputState=OutputState.STREAM;
|
||||||
return out;
|
return _out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
@ -770,7 +798,24 @@ public class Response implements HttpServletResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
/* construct Writer using correct encoding */
|
/* construct Writer using correct encoding */
|
||||||
_writer = _channel.getPrintWriter(encoding);
|
// TODO switch on encoding here
|
||||||
|
_writer = new PrintWriter(new HttpWriter(_out,encoding))
|
||||||
|
{
|
||||||
|
public void close()
|
||||||
|
{
|
||||||
|
synchronized (lock)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
setError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
_outputState=OutputState.WRITER;
|
_outputState=OutputState.WRITER;
|
||||||
return _writer;
|
return _writer;
|
||||||
|
@ -788,10 +833,10 @@ public class Response implements HttpServletResponse
|
||||||
// Protect from setting after committed as default handling
|
// Protect from setting after committed as default handling
|
||||||
// of a servlet HEAD request ALWAYS sets _content length, even
|
// of a servlet HEAD request ALWAYS sets _content length, even
|
||||||
// if the getHandling committed the response!
|
// if the getHandling committed the response!
|
||||||
if (isCommitted() || _channel.isIncluding())
|
if (isCommitted() || isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
long written=_channel.getOutputStream().getWritten();
|
long written=_out.getWritten();
|
||||||
if (written>len)
|
if (written>len)
|
||||||
throw new IllegalArgumentException("setContent("+len+") when already written "+written);
|
throw new IllegalArgumentException("setContent("+len+") when already written "+written);
|
||||||
|
|
||||||
|
@ -841,7 +886,7 @@ public class Response implements HttpServletResponse
|
||||||
// Protect from setting after committed as default handling
|
// Protect from setting after committed as default handling
|
||||||
// of a servlet HEAD request ALWAYS sets _content length, even
|
// of a servlet HEAD request ALWAYS sets _content length, even
|
||||||
// if the getHandling committed the response!
|
// if the getHandling committed the response!
|
||||||
if (isCommitted() || _channel.isIncluding())
|
if (isCommitted() || isIncluding())
|
||||||
return;
|
return;
|
||||||
_contentLength=len;
|
_contentLength=len;
|
||||||
_fields.putLongField(HttpHeader.CONTENT_LENGTH.toString(), len);
|
_fields.putLongField(HttpHeader.CONTENT_LENGTH.toString(), len);
|
||||||
|
@ -854,7 +899,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void setCharacterEncoding(String encoding)
|
public void setCharacterEncoding(String encoding)
|
||||||
{
|
{
|
||||||
if (_channel.isIncluding())
|
if (isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_outputState==OutputState.NONE && !isCommitted())
|
if (_outputState==OutputState.NONE && !isCommitted())
|
||||||
|
@ -905,7 +950,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void setContentType(String contentType)
|
public void setContentType(String contentType)
|
||||||
{
|
{
|
||||||
if (isCommitted() || _channel.isIncluding())
|
if (isCommitted() || isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (contentType==null)
|
if (contentType==null)
|
||||||
|
@ -1002,7 +1047,7 @@ public class Response implements HttpServletResponse
|
||||||
HttpFields response_fields=_fields;
|
HttpFields response_fields=_fields;
|
||||||
|
|
||||||
response_fields.clear();
|
response_fields.clear();
|
||||||
String connection=_channel.getRequestFields().getStringField(HttpHeader.CONNECTION);
|
String connection=_channel.getRequest().getHttpFields().getStringField(HttpHeader.CONNECTION);
|
||||||
if (connection!=null)
|
if (connection!=null)
|
||||||
{
|
{
|
||||||
String[] values = connection.split(",");
|
String[] values = connection.split(",");
|
||||||
|
@ -1057,7 +1102,7 @@ public class Response implements HttpServletResponse
|
||||||
{
|
{
|
||||||
case STREAM:
|
case STREAM:
|
||||||
case WRITER:
|
case WRITER:
|
||||||
_channel.getOutputStream().reset();
|
_out.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
_channel.resetBuffer();
|
_channel.resetBuffer();
|
||||||
|
@ -1092,7 +1137,7 @@ public class Response implements HttpServletResponse
|
||||||
@Override
|
@Override
|
||||||
public void setLocale(Locale locale)
|
public void setLocale(Locale locale)
|
||||||
{
|
{
|
||||||
if (locale == null || isCommitted() ||_channel.isIncluding())
|
if (locale == null || isCommitted() ||isIncluding())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_locale = locale;
|
_locale = locale;
|
||||||
|
@ -1161,7 +1206,7 @@ public class Response implements HttpServletResponse
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
public long getContentCount()
|
public long getContentCount()
|
||||||
{
|
{
|
||||||
return _channel.getOutputStream().getWritten();
|
return _out.getWritten();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
@ -1171,31 +1216,4 @@ public class Response implements HttpServletResponse
|
||||||
return "HTTP/1.1 "+_status+" "+ (_reason==null?"":_reason) +System.getProperty("line.separator")+
|
return "HTTP/1.1 "+_status+" "+ (_reason==null?"":_reason) +System.getProperty("line.separator")+
|
||||||
_fields.toString();
|
_fields.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
private static class NullOutput extends ServletOutputStream
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void write(int b) throws IOException
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void print(String s) throws IOException
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void println(String s) throws IOException
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(byte[] b, int off, int len) throws IOException
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,7 +78,6 @@ public class Server extends HandlerWrapper implements Attributes
|
||||||
private boolean _stopAtShutdown;
|
private boolean _stopAtShutdown;
|
||||||
private boolean _dumpAfterStart=false;
|
private boolean _dumpAfterStart=false;
|
||||||
private boolean _dumpBeforeStop=false;
|
private boolean _dumpBeforeStop=false;
|
||||||
private boolean _uncheckedPrintWriter=false;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
@ -627,18 +626,6 @@ public class Server extends HandlerWrapper implements Attributes
|
||||||
dump(out,indent,TypeUtil.asList(getHandlers()),getBeans(),_connectors);
|
dump(out,indent,TypeUtil.asList(getHandlers()),getBeans(),_connectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
public boolean isUncheckedPrintWriter()
|
|
||||||
{
|
|
||||||
return _uncheckedPrintWriter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
public void setUncheckedPrintWriter(boolean unchecked)
|
|
||||||
{
|
|
||||||
_uncheckedPrintWriter=unchecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/* A handler that can be gracefully shutdown.
|
/* A handler that can be gracefully shutdown.
|
||||||
* Called by doStop if a {@link #setGracefulShutdown} period is set.
|
* Called by doStop if a {@link #setGracefulShutdown} period is set.
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.junit.Test;
|
||||||
|
|
||||||
public class HttpWriterTest
|
public class HttpWriterTest
|
||||||
{
|
{
|
||||||
private HttpWriter _writer;
|
private HttpOutput _httpOut;
|
||||||
private ByteBuffer _bytes;
|
private ByteBuffer _bytes;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@ -107,14 +107,13 @@ public class HttpWriterTest
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
HttpOutput httpOut = new HttpOutput(channel);
|
_httpOut = new HttpOutput(channel);
|
||||||
_writer = new HttpWriter(httpOut);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSimpleUTF8() throws Exception
|
public void testSimpleUTF8() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
_writer.write("Now is the time");
|
_writer.write("Now is the time");
|
||||||
assertArrayEquals("Now is the time".getBytes(StringUtil.__UTF8),BufferUtil.toArray(_bytes));
|
assertArrayEquals("Now is the time".getBytes(StringUtil.__UTF8),BufferUtil.toArray(_bytes));
|
||||||
}
|
}
|
||||||
|
@ -122,7 +121,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testUTF8() throws Exception
|
public void testUTF8() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
_writer.write("How now \uFF22rown cow");
|
_writer.write("How now \uFF22rown cow");
|
||||||
assertArrayEquals("How now \uFF22rown cow".getBytes(StringUtil.__UTF8),BufferUtil.toArray(_bytes));
|
assertArrayEquals("How now \uFF22rown cow".getBytes(StringUtil.__UTF8),BufferUtil.toArray(_bytes));
|
||||||
}
|
}
|
||||||
|
@ -130,7 +129,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testNotCESU8() throws Exception
|
public void testNotCESU8() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
String data="xxx\uD801\uDC00xxx";
|
String data="xxx\uD801\uDC00xxx";
|
||||||
_writer.write(data);
|
_writer.write(data);
|
||||||
assertEquals("787878F0909080787878",TypeUtil.toHexString(BufferUtil.toArray(_bytes)));
|
assertEquals("787878F0909080787878",TypeUtil.toHexString(BufferUtil.toArray(_bytes)));
|
||||||
|
@ -146,7 +145,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testMultiByteOverflowUTF8() throws Exception
|
public void testMultiByteOverflowUTF8() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
final String singleByteStr = "a";
|
final String singleByteStr = "a";
|
||||||
final String multiByteDuplicateStr = "\uFF22";
|
final String multiByteDuplicateStr = "\uFF22";
|
||||||
int remainSize = 1;
|
int remainSize = 1;
|
||||||
|
@ -173,7 +172,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testISO8859() throws Exception
|
public void testISO8859() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__ISO_8859_1);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__ISO_8859_1);
|
||||||
_writer.write("How now \uFF22rown cow");
|
_writer.write("How now \uFF22rown cow");
|
||||||
assertEquals("How now ?rown cow",new String(BufferUtil.toArray(_bytes),StringUtil.__ISO_8859_1));
|
assertEquals("How now ?rown cow",new String(BufferUtil.toArray(_bytes),StringUtil.__ISO_8859_1));
|
||||||
}
|
}
|
||||||
|
@ -182,7 +181,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testUTF16x2() throws Exception
|
public void testUTF16x2() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
|
|
||||||
String source = "\uD842\uDF9F";
|
String source = "\uD842\uDF9F";
|
||||||
|
|
||||||
|
@ -205,7 +204,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testMultiByteOverflowUTF16x2() throws Exception
|
public void testMultiByteOverflowUTF16x2() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
|
|
||||||
final String singleByteStr = "a";
|
final String singleByteStr = "a";
|
||||||
int remainSize = 1;
|
int remainSize = 1;
|
||||||
|
@ -243,7 +242,7 @@ public class HttpWriterTest
|
||||||
@Test
|
@Test
|
||||||
public void testMultiByteOverflowUTF16x2_2() throws Exception
|
public void testMultiByteOverflowUTF16x2_2() throws Exception
|
||||||
{
|
{
|
||||||
_writer.setCharacterEncoding(StringUtil.__UTF8);
|
HttpWriter _writer = new HttpWriter(_httpOut,StringUtil.__UTF8);
|
||||||
|
|
||||||
final String singleByteStr = "a";
|
final String singleByteStr = "a";
|
||||||
int remainSize = 1;
|
int remainSize = 1;
|
||||||
|
|
|
@ -651,8 +651,8 @@ public class ResponseTest
|
||||||
|
|
||||||
private Response newResponse()
|
private Response newResponse()
|
||||||
{
|
{
|
||||||
_channel.getOutputStream().reset();
|
_channel.getResponse().getHttpOutput().reset();
|
||||||
Response response = new Response(_channel);
|
Response response = new Response(_channel,_channel.getResponse().getHttpOutput());
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -360,36 +360,6 @@ public class ContextHandlerTest
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testUncheckedPrintWriter() throws Exception
|
|
||||||
{
|
|
||||||
Server server = new Server();
|
|
||||||
server.setUncheckedPrintWriter(true);
|
|
||||||
LocalConnector connector = new LocalConnector(server);
|
|
||||||
server.setConnectors(new Connector[] { connector });
|
|
||||||
ContextHandler context = new ContextHandler("/");
|
|
||||||
WriterHandler handler = new WriterHandler();
|
|
||||||
context.setHandler(handler);
|
|
||||||
server.setHandler(context);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
server.start();
|
|
||||||
|
|
||||||
String response = connector.getResponses("GET / HTTP/1.1\n" + "Host: www.example.com.\nConnection:close\n\n");
|
|
||||||
|
|
||||||
Assert.assertTrue(response.indexOf("Goodbye")>0);
|
|
||||||
Assert.assertTrue(response.indexOf("dead")<0);
|
|
||||||
Thread.sleep(100);
|
|
||||||
Assert.assertTrue(handler.error);
|
|
||||||
Assert.assertTrue(handler.throwable!=null);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
server.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkWildcardHost(boolean succeed, Server server, String[] contextHosts, String[] requestHosts) throws Exception
|
private void checkWildcardHost(boolean succeed, Server server, String[] contextHosts, String[] requestHosts) throws Exception
|
||||||
{
|
{
|
||||||
LocalConnector connector = (LocalConnector)server.getConnectors()[0];
|
LocalConnector connector = (LocalConnector)server.getConnectors()[0];
|
||||||
|
|
Loading…
Reference in New Issue