Mercurial Hosting > luan
diff src/org/eclipse/jetty/server/Response.java @ 813:f8f7cb485c25
remove UserIdentity
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 08 Sep 2016 22:01:33 -0600 |
parents | 09d518d313b7 |
children | 8e9db0bbf4f9 |
line wrap: on
line diff
--- a/src/org/eclipse/jetty/server/Response.java Thu Sep 08 21:44:37 2016 -0600 +++ b/src/org/eclipse/jetty/server/Response.java Thu Sep 08 22:01:33 2016 -0600 @@ -61,1158 +61,1157 @@ */ public class Response implements HttpServletResponse { - private static final Logger LOG = Log.getLogger(Response.class); + private static final Logger LOG = Log.getLogger(Response.class); - - public static final int - NONE=0, - STREAM=1, - WRITER=2; + + public static final int + NONE=0, + STREAM=1, + WRITER=2; - /** - * If a header name starts with this string, the header (stripped of the prefix) - * can be set during include using only {@link #setHeader(String, String)} or - * {@link #addHeader(String, String)}. - */ - public final static String SET_INCLUDE_HEADER_PREFIX = "org.eclipse.jetty.server.include."; + /** + * If a header name starts with this string, the header (stripped of the prefix) + * can be set during include using only {@link #setHeader(String, String)} or + * {@link #addHeader(String, String)}. + */ + public final static String SET_INCLUDE_HEADER_PREFIX = "org.eclipse.jetty.server.include."; - /** - * If this string is found within the comment of a cookie added with {@link #addCookie(Cookie)}, then the cookie - * will be set as HTTP ONLY. - */ - public final static String HTTP_ONLY_COMMENT="__HTTP_ONLY__"; - - - /* ------------------------------------------------------------ */ - public static Response getResponse(HttpServletResponse response) - { - if (response instanceof Response) - return (Response)response; + /** + * If this string is found within the comment of a cookie added with {@link #addCookie(Cookie)}, then the cookie + * will be set as HTTP ONLY. + */ + public final static String HTTP_ONLY_COMMENT="__HTTP_ONLY__"; + + + /* ------------------------------------------------------------ */ + public static Response getResponse(HttpServletResponse response) + { + if (response instanceof Response) + return (Response)response; - return AbstractHttpConnection.getCurrentConnection().getResponse(); - } - - private final AbstractHttpConnection _connection; - private int _status=SC_OK; - private String _reason; - private Locale _locale; - private String _mimeType; - private CachedBuffer _cachedMimeType; - private String _characterEncoding; - private boolean _explicitEncoding; - private String _contentType; - private volatile int _outputState; - private PrintWriter _writer; + return AbstractHttpConnection.getCurrentConnection().getResponse(); + } + + private final AbstractHttpConnection _connection; + private int _status=SC_OK; + private String _reason; + private Locale _locale; + private String _mimeType; + private CachedBuffer _cachedMimeType; + private String _characterEncoding; + private boolean _explicitEncoding; + private String _contentType; + private volatile int _outputState; + private PrintWriter _writer; - /* ------------------------------------------------------------ */ - /** - * - */ - public Response(AbstractHttpConnection connection) - { - _connection=connection; - } + /* ------------------------------------------------------------ */ + /** + * + */ + public Response(AbstractHttpConnection connection) + { + _connection=connection; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#reset() - */ - protected void recycle() - { - _status=SC_OK; - _reason=null; - _locale=null; - _mimeType=null; - _cachedMimeType=null; - _characterEncoding=null; - _explicitEncoding=false; - _contentType=null; - _writer=null; - _outputState=NONE; - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#reset() + */ + protected void recycle() + { + _status=SC_OK; + _reason=null; + _locale=null; + _mimeType=null; + _cachedMimeType=null; + _characterEncoding=null; + _explicitEncoding=false; + _contentType=null; + _writer=null; + _outputState=NONE; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) - */ - public void addCookie(HttpCookie cookie) - { - _connection.getResponseFields().addSetCookie(cookie); - } - - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) - */ - public void addCookie(Cookie cookie) - { - String comment=cookie.getComment(); - boolean http_only=false; - - if (comment!=null) - { - int i=comment.indexOf(HTTP_ONLY_COMMENT); - if (i>=0) - { - http_only=true; - comment=comment.replace(HTTP_ONLY_COMMENT,"").trim(); - if (comment.length()==0) - comment=null; - } - } - _connection.getResponseFields().addSetCookie(cookie.getName(), - cookie.getValue(), - cookie.getDomain(), - cookie.getPath(), - cookie.getMaxAge(), - comment, - cookie.getSecure(), - http_only || cookie.isHttpOnly(), - cookie.getVersion()); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) + */ + public void addCookie(HttpCookie cookie) + { + _connection.getResponseFields().addSetCookie(cookie); + } + + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) + */ + public void addCookie(Cookie cookie) + { + String comment=cookie.getComment(); + boolean http_only=false; + + if (comment!=null) + { + int i=comment.indexOf(HTTP_ONLY_COMMENT); + if (i>=0) + { + http_only=true; + comment=comment.replace(HTTP_ONLY_COMMENT,"").trim(); + if (comment.length()==0) + comment=null; + } + } + _connection.getResponseFields().addSetCookie(cookie.getName(), + cookie.getValue(), + cookie.getDomain(), + cookie.getPath(), + cookie.getMaxAge(), + comment, + cookie.getSecure(), + http_only || cookie.isHttpOnly(), + cookie.getVersion()); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String) - */ - public boolean containsHeader(String name) - { - return _connection.getResponseFields().containsKey(name); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String) + */ + public boolean containsHeader(String name) + { + return _connection.getResponseFields().containsKey(name); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String) - */ - public String encodeURL(String url) - { + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String) + */ + public String encodeURL(String url) + { throw new UnsupportedOperationException(); - } + } - /* ------------------------------------------------------------ */ - /** - * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String) - */ - public String encodeRedirectURL(String url) - { - return encodeURL(url); - } + /* ------------------------------------------------------------ */ + /** + * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String) + */ + public String encodeRedirectURL(String url) + { + return encodeURL(url); + } - /* ------------------------------------------------------------ */ - @Deprecated - public String encodeUrl(String url) - { - return encodeURL(url); - } + /* ------------------------------------------------------------ */ + @Deprecated + public String encodeUrl(String url) + { + return encodeURL(url); + } - /* ------------------------------------------------------------ */ - @Deprecated - public String encodeRedirectUrl(String url) - { - return encodeRedirectURL(url); - } + /* ------------------------------------------------------------ */ + @Deprecated + public String encodeRedirectUrl(String url) + { + return encodeRedirectURL(url); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#sendError(int, java.lang.String) - */ - public void sendError(int code, String message) throws IOException - { - if (_connection.isIncluding()) - return; + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#sendError(int, java.lang.String) + */ + public void sendError(int code, String message) throws IOException + { + if (_connection.isIncluding()) + return; - if (isCommitted()) - LOG.warn("Committed before "+code+" "+message); + if (isCommitted()) + LOG.warn("Committed before "+code+" "+message); - resetBuffer(); - _characterEncoding=null; - setHeader(HttpHeaders.EXPIRES,null); - setHeader(HttpHeaders.LAST_MODIFIED,null); - setHeader(HttpHeaders.CACHE_CONTROL,null); - setHeader(HttpHeaders.CONTENT_TYPE,null); - setHeader(HttpHeaders.CONTENT_LENGTH,null); + resetBuffer(); + _characterEncoding=null; + setHeader(HttpHeaders.EXPIRES,null); + setHeader(HttpHeaders.LAST_MODIFIED,null); + setHeader(HttpHeaders.CACHE_CONTROL,null); + setHeader(HttpHeaders.CONTENT_TYPE,null); + setHeader(HttpHeaders.CONTENT_LENGTH,null); - _outputState=NONE; - setStatus(code,message); + _outputState=NONE; + setStatus(code,message); - if (message==null) - message=HttpStatus.getMessage(code); + if (message==null) + message=HttpStatus.getMessage(code); - // If we are allowed to have a body - if (code!=SC_NO_CONTENT && - code!=SC_NOT_MODIFIED && - code!=SC_PARTIAL_CONTENT && - code>=SC_OK) - { - Request request = _connection.getRequest(); + // If we are allowed to have a body + if (code!=SC_NO_CONTENT && + code!=SC_NOT_MODIFIED && + code!=SC_PARTIAL_CONTENT && + code>=SC_OK) + { + Request request = _connection.getRequest(); - ErrorHandler error_handler = null; - ContextHandler.Context context = request.getContext(); - if (context!=null) - error_handler=context.getContextHandler().getErrorHandler(); - if (error_handler==null) - error_handler = _connection.getConnector().getServer().getBean(ErrorHandler.class); - if (error_handler!=null) - { - request.setAttribute(RequestDispatcher.ERROR_STATUS_CODE,new Integer(code)); - request.setAttribute(RequestDispatcher.ERROR_MESSAGE, message); - request.setAttribute(RequestDispatcher.ERROR_REQUEST_URI, request.getRequestURI()); - request.setAttribute(RequestDispatcher.ERROR_SERVLET_NAME,request.getServletName()); - error_handler.handle(null,_connection.getRequest(),_connection.getRequest(),this ); - } - else - { - setHeader(HttpHeaders.CACHE_CONTROL, "must-revalidate,no-cache,no-store"); - setContentType(MimeTypes.TEXT_HTML_8859_1); - ByteArrayISO8859Writer writer= new ByteArrayISO8859Writer(2048); - if (message != null) - { - message= StringUtil.replace(message, "&", "&"); - message= StringUtil.replace(message, "<", "<"); - message= StringUtil.replace(message, ">", ">"); - } - String uri= request.getRequestURI(); - if (uri!=null) - { - uri= StringUtil.replace(uri, "&", "&"); - uri= StringUtil.replace(uri, "<", "<"); - uri= StringUtil.replace(uri, ">", ">"); - } + ErrorHandler error_handler = null; + ContextHandler.Context context = request.getContext(); + if (context!=null) + error_handler=context.getContextHandler().getErrorHandler(); + if (error_handler==null) + error_handler = _connection.getConnector().getServer().getBean(ErrorHandler.class); + if (error_handler!=null) + { + request.setAttribute(RequestDispatcher.ERROR_STATUS_CODE,new Integer(code)); + request.setAttribute(RequestDispatcher.ERROR_MESSAGE, message); + request.setAttribute(RequestDispatcher.ERROR_REQUEST_URI, request.getRequestURI()); + error_handler.handle(null,_connection.getRequest(),_connection.getRequest(),this ); + } + else + { + setHeader(HttpHeaders.CACHE_CONTROL, "must-revalidate,no-cache,no-store"); + setContentType(MimeTypes.TEXT_HTML_8859_1); + ByteArrayISO8859Writer writer= new ByteArrayISO8859Writer(2048); + if (message != null) + { + message= StringUtil.replace(message, "&", "&"); + message= StringUtil.replace(message, "<", "<"); + message= StringUtil.replace(message, ">", ">"); + } + String uri= request.getRequestURI(); + if (uri!=null) + { + uri= StringUtil.replace(uri, "&", "&"); + uri= StringUtil.replace(uri, "<", "<"); + uri= StringUtil.replace(uri, ">", ">"); + } - writer.write("<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=ISO-8859-1\"/>\n"); - writer.write("<title>Error "); - writer.write(Integer.toString(code)); - writer.write(' '); - if (message==null) - message=HttpStatus.getMessage(code); - writer.write(message); - writer.write("</title>\n</head>\n<body>\n<h2>HTTP ERROR: "); - writer.write(Integer.toString(code)); - writer.write("</h2>\n<p>Problem accessing "); - writer.write(uri); - writer.write(". Reason:\n<pre> "); - writer.write(message); - writer.write("</pre>"); - writer.write("</p>\n<hr /><i><small>Powered by Jetty://</small></i>"); + writer.write("<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=ISO-8859-1\"/>\n"); + writer.write("<title>Error "); + writer.write(Integer.toString(code)); + writer.write(' '); + if (message==null) + message=HttpStatus.getMessage(code); + writer.write(message); + writer.write("</title>\n</head>\n<body>\n<h2>HTTP ERROR: "); + writer.write(Integer.toString(code)); + writer.write("</h2>\n<p>Problem accessing "); + writer.write(uri); + writer.write(". Reason:\n<pre> "); + writer.write(message); + writer.write("</pre>"); + writer.write("</p>\n<hr /><i><small>Powered by Jetty://</small></i>"); - for (int i= 0; i < 20; i++) - writer.write("\n "); - writer.write("\n</body>\n</html>\n"); + for (int i= 0; i < 20; i++) + writer.write("\n "); + writer.write("\n</body>\n</html>\n"); - writer.flush(); - setContentLength(writer.size()); - writer.writeTo(getOutputStream()); - writer.destroy(); - } - } - else if (code!=SC_PARTIAL_CONTENT) - { - _connection.getRequestFields().remove(HttpHeaders.CONTENT_TYPE_BUFFER); - _connection.getRequestFields().remove(HttpHeaders.CONTENT_LENGTH_BUFFER); - _characterEncoding=null; - _mimeType=null; - _cachedMimeType=null; - } + writer.flush(); + setContentLength(writer.size()); + writer.writeTo(getOutputStream()); + writer.destroy(); + } + } + else if (code!=SC_PARTIAL_CONTENT) + { + _connection.getRequestFields().remove(HttpHeaders.CONTENT_TYPE_BUFFER); + _connection.getRequestFields().remove(HttpHeaders.CONTENT_LENGTH_BUFFER); + _characterEncoding=null; + _mimeType=null; + _cachedMimeType=null; + } - complete(); - } + complete(); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#sendError(int) - */ - public void sendError(int sc) throws IOException - { - if (sc==102) - sendProcessing(); - else - sendError(sc,null); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#sendError(int) + */ + public void sendError(int sc) throws IOException + { + if (sc==102) + sendProcessing(); + else + sendError(sc,null); + } - /* ------------------------------------------------------------ */ - /* Send a 102-Processing response. - * If the connection is a HTTP connection, the version is 1.1 and the - * request has a Expect header starting with 102, then a 102 response is - * sent. This indicates that the request still be processed and real response - * can still be sent. This method is called by sendError if it is passed 102. - * @see javax.servlet.http.HttpServletResponse#sendError(int) - */ - public void sendProcessing() throws IOException - { - if (_connection.isExpecting102Processing() && !isCommitted()) - ((HttpGenerator)_connection.getGenerator()).send1xx(HttpStatus.PROCESSING_102); - } + /* ------------------------------------------------------------ */ + /* Send a 102-Processing response. + * If the connection is a HTTP connection, the version is 1.1 and the + * request has a Expect header starting with 102, then a 102 response is + * sent. This indicates that the request still be processed and real response + * can still be sent. This method is called by sendError if it is passed 102. + * @see javax.servlet.http.HttpServletResponse#sendError(int) + */ + public void sendProcessing() throws IOException + { + if (_connection.isExpecting102Processing() && !isCommitted()) + ((HttpGenerator)_connection.getGenerator()).send1xx(HttpStatus.PROCESSING_102); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String) - */ - public void sendRedirect(String location) throws IOException - { - if (_connection.isIncluding()) - return; + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String) + */ + public void sendRedirect(String location) throws IOException + { + if (_connection.isIncluding()) + return; - if (location==null) - throw new IllegalArgumentException(); + if (location==null) + throw new IllegalArgumentException(); - if (!URIUtil.hasScheme(location)) - { - StringBuilder buf = _connection.getRequest().getRootURL(); - if (location.startsWith("/")) - buf.append(location); - else - { - String path=_connection.getRequest().getRequestURI(); - String parent=(path.endsWith("/"))?path:URIUtil.parentPath(path); - location=URIUtil.addPaths(parent,location); - if(location==null) - throw new IllegalStateException("path cannot be above root"); - if (!location.startsWith("/")) - buf.append('/'); - buf.append(location); - } + if (!URIUtil.hasScheme(location)) + { + StringBuilder buf = _connection.getRequest().getRootURL(); + if (location.startsWith("/")) + buf.append(location); + else + { + String path=_connection.getRequest().getRequestURI(); + String parent=(path.endsWith("/"))?path:URIUtil.parentPath(path); + location=URIUtil.addPaths(parent,location); + if(location==null) + throw new IllegalStateException("path cannot be above root"); + if (!location.startsWith("/")) + buf.append('/'); + buf.append(location); + } - location=buf.toString(); - HttpURI uri = new HttpURI(location); - String path=uri.getDecodedPath(); - String canonical=URIUtil.canonicalPath(path); - if (canonical==null) - throw new IllegalArgumentException(); - if (!canonical.equals(path)) - { - buf = _connection.getRequest().getRootURL(); - buf.append(URIUtil.encodePath(canonical)); - String param=uri.getParam(); - if (param!=null) - { - buf.append(';'); - buf.append(param); - } - String query=uri.getQuery(); - if (query!=null) - { - buf.append('?'); - buf.append(query); - } - String fragment=uri.getFragment(); - if (fragment!=null) - { - buf.append('#'); - buf.append(fragment); - } - location=buf.toString(); - } - } - - resetBuffer(); - setHeader(HttpHeaders.LOCATION,location); - setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); - complete(); + location=buf.toString(); + HttpURI uri = new HttpURI(location); + String path=uri.getDecodedPath(); + String canonical=URIUtil.canonicalPath(path); + if (canonical==null) + throw new IllegalArgumentException(); + if (!canonical.equals(path)) + { + buf = _connection.getRequest().getRootURL(); + buf.append(URIUtil.encodePath(canonical)); + String param=uri.getParam(); + if (param!=null) + { + buf.append(';'); + buf.append(param); + } + String query=uri.getQuery(); + if (query!=null) + { + buf.append('?'); + buf.append(query); + } + String fragment=uri.getFragment(); + if (fragment!=null) + { + buf.append('#'); + buf.append(fragment); + } + location=buf.toString(); + } + } + + resetBuffer(); + setHeader(HttpHeaders.LOCATION,location); + setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); + complete(); - } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, long) - */ - public void setDateHeader(String name, long date) - { - if (!_connection.isIncluding()) - _connection.getResponseFields().putDateField(name, date); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, long) + */ + public void setDateHeader(String name, long date) + { + if (!_connection.isIncluding()) + _connection.getResponseFields().putDateField(name, date); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, long) - */ - public void addDateHeader(String name, long date) - { - if (!_connection.isIncluding()) - _connection.getResponseFields().addDateField(name, date); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, long) + */ + public void addDateHeader(String name, long date) + { + if (!_connection.isIncluding()) + _connection.getResponseFields().addDateField(name, date); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String) - */ - public void setHeader(String name, String value) - { - if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) - setContentType(value); - else - { - if (_connection.isIncluding()) - { - if (name.startsWith(SET_INCLUDE_HEADER_PREFIX)) - name=name.substring(SET_INCLUDE_HEADER_PREFIX.length()); - else - return; - } - _connection.getResponseFields().put(name, value); - if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) - { - if (value==null) - _connection._generator.setContentLength(-1); - else - _connection._generator.setContentLength(Long.parseLong(value)); - } - } - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String) + */ + public void setHeader(String name, String value) + { + if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) + setContentType(value); + else + { + if (_connection.isIncluding()) + { + if (name.startsWith(SET_INCLUDE_HEADER_PREFIX)) + name=name.substring(SET_INCLUDE_HEADER_PREFIX.length()); + else + return; + } + _connection.getResponseFields().put(name, value); + if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) + { + if (value==null) + _connection._generator.setContentLength(-1); + else + _connection._generator.setContentLength(Long.parseLong(value)); + } + } + } - /* ------------------------------------------------------------ */ - public Collection<String> getHeaderNames() - { - final HttpFields fields=_connection.getResponseFields(); - return fields.getFieldNamesCollection(); - } - - /* ------------------------------------------------------------ */ - /* - */ - public String getHeader(String name) - { - return _connection.getResponseFields().getStringField(name); - } + /* ------------------------------------------------------------ */ + public Collection<String> getHeaderNames() + { + final HttpFields fields=_connection.getResponseFields(); + return fields.getFieldNamesCollection(); + } + + /* ------------------------------------------------------------ */ + /* + */ + public String getHeader(String name) + { + return _connection.getResponseFields().getStringField(name); + } - /* ------------------------------------------------------------ */ - /* - */ - public Collection<String> getHeaders(String name) - { - final HttpFields fields=_connection.getResponseFields(); - Collection<String> i = fields.getValuesCollection(name); - if (i==null) - return Collections.EMPTY_LIST; - return i; - } + /* ------------------------------------------------------------ */ + /* + */ + public Collection<String> getHeaders(String name) + { + final HttpFields fields=_connection.getResponseFields(); + Collection<String> i = fields.getValuesCollection(name); + if (i==null) + return Collections.EMPTY_LIST; + return i; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, java.lang.String) - */ - public void addHeader(String name, String value) - { + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, java.lang.String) + */ + public void addHeader(String name, String value) + { - if (_connection.isIncluding()) - { - if (name.startsWith(SET_INCLUDE_HEADER_PREFIX)) - name=name.substring(SET_INCLUDE_HEADER_PREFIX.length()); - else - return; - } + if (_connection.isIncluding()) + { + if (name.startsWith(SET_INCLUDE_HEADER_PREFIX)) + name=name.substring(SET_INCLUDE_HEADER_PREFIX.length()); + else + return; + } - if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) - { - setContentType(value); - return; - } - - _connection.getResponseFields().add(name, value); - if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) - _connection._generator.setContentLength(Long.parseLong(value)); - } + if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) + { + setContentType(value); + return; + } + + _connection.getResponseFields().add(name, value); + if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) + _connection._generator.setContentLength(Long.parseLong(value)); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int) - */ - public void setIntHeader(String name, int value) - { - if (!_connection.isIncluding()) - { - _connection.getResponseFields().putLongField(name, value); - if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) - _connection._generator.setContentLength(value); - } - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int) + */ + public void setIntHeader(String name, int value) + { + if (!_connection.isIncluding()) + { + _connection.getResponseFields().putLongField(name, value); + if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) + _connection._generator.setContentLength(value); + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int) - */ - public void addIntHeader(String name, int value) - { - if (!_connection.isIncluding()) - { - _connection.getResponseFields().addLongField(name, value); - if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) - _connection._generator.setContentLength(value); - } - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int) + */ + public void addIntHeader(String name, int value) + { + if (!_connection.isIncluding()) + { + _connection.getResponseFields().addLongField(name, value); + if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) + _connection._generator.setContentLength(value); + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#setStatus(int) - */ - public void setStatus(int sc) - { - setStatus(sc,null); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#setStatus(int) + */ + public void setStatus(int sc) + { + setStatus(sc,null); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.http.HttpServletResponse#setStatus(int, java.lang.String) - */ - public void setStatus(int sc, String sm) - { - if (sc<=0) - throw new IllegalArgumentException(); - if (!_connection.isIncluding()) - { - _status=sc; - _reason=sm; - } - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.http.HttpServletResponse#setStatus(int, java.lang.String) + */ + public void setStatus(int sc, String sm) + { + if (sc<=0) + throw new IllegalArgumentException(); + if (!_connection.isIncluding()) + { + _status=sc; + _reason=sm; + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#getCharacterEncoding() - */ - public String getCharacterEncoding() - { - if (_characterEncoding==null) - _characterEncoding=StringUtil.__ISO_8859_1; - return _characterEncoding; - } - - /* ------------------------------------------------------------ */ - String getSetCharacterEncoding() - { - return _characterEncoding; - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#getCharacterEncoding() + */ + public String getCharacterEncoding() + { + if (_characterEncoding==null) + _characterEncoding=StringUtil.__ISO_8859_1; + return _characterEncoding; + } + + /* ------------------------------------------------------------ */ + String getSetCharacterEncoding() + { + return _characterEncoding; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#getContentType() - */ - public String getContentType() - { - return _contentType; - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#getContentType() + */ + public String getContentType() + { + return _contentType; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#getOutputStream() - */ - public ServletOutputStream getOutputStream() throws IOException - { - if (_outputState!=NONE && _outputState!=STREAM) - throw new IllegalStateException("WRITER"); + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#getOutputStream() + */ + public ServletOutputStream getOutputStream() throws IOException + { + if (_outputState!=NONE && _outputState!=STREAM) + throw new IllegalStateException("WRITER"); - ServletOutputStream out = _connection.getOutputStream(); - _outputState=STREAM; - return out; - } + ServletOutputStream out = _connection.getOutputStream(); + _outputState=STREAM; + return out; + } - /* ------------------------------------------------------------ */ - public boolean isWriting() - { - return _outputState==WRITER; - } + /* ------------------------------------------------------------ */ + public boolean isWriting() + { + return _outputState==WRITER; + } - /* ------------------------------------------------------------ */ - public boolean isOutputing() - { - return _outputState!=NONE; - } + /* ------------------------------------------------------------ */ + public boolean isOutputing() + { + return _outputState!=NONE; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#getWriter() - */ - public PrintWriter getWriter() throws IOException - { - if (_outputState!=NONE && _outputState!=WRITER) - throw new IllegalStateException("STREAM"); + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#getWriter() + */ + public PrintWriter getWriter() throws IOException + { + if (_outputState!=NONE && _outputState!=WRITER) + throw new IllegalStateException("STREAM"); - /* if there is no writer yet */ - if (_writer==null) - { - /* get encoding from Content-Type header */ - String encoding = _characterEncoding; + /* if there is no writer yet */ + if (_writer==null) + { + /* get encoding from Content-Type header */ + String encoding = _characterEncoding; - if (encoding==null) - { - /* implementation of educated defaults */ - if(_cachedMimeType != null) - encoding = MimeTypes.getCharsetFromContentType(_cachedMimeType); + if (encoding==null) + { + /* implementation of educated defaults */ + if(_cachedMimeType != null) + encoding = MimeTypes.getCharsetFromContentType(_cachedMimeType); - if (encoding==null) - encoding = StringUtil.__ISO_8859_1; + if (encoding==null) + encoding = StringUtil.__ISO_8859_1; - setCharacterEncoding(encoding); - } + setCharacterEncoding(encoding); + } - /* construct Writer using correct encoding */ - _writer = _connection.getPrintWriter(encoding); - } - _outputState=WRITER; - return _writer; - } + /* construct Writer using correct encoding */ + _writer = _connection.getPrintWriter(encoding); + } + _outputState=WRITER; + return _writer; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#setCharacterEncoding(java.lang.String) - */ - public void setCharacterEncoding(String encoding) - { - if (_connection.isIncluding()) - return; + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#setCharacterEncoding(java.lang.String) + */ + public void setCharacterEncoding(String encoding) + { + if (_connection.isIncluding()) + return; - if (this._outputState==0 && !isCommitted()) - { - _explicitEncoding=true; + if (this._outputState==0 && !isCommitted()) + { + _explicitEncoding=true; - if (encoding==null) - { - // Clear any encoding. - if (_characterEncoding!=null) - { - _characterEncoding=null; - if (_cachedMimeType!=null) - _contentType=_cachedMimeType.toString(); - else if (_mimeType!=null) - _contentType=_mimeType; - else - _contentType=null; + if (encoding==null) + { + // Clear any encoding. + if (_characterEncoding!=null) + { + _characterEncoding=null; + if (_cachedMimeType!=null) + _contentType=_cachedMimeType.toString(); + else if (_mimeType!=null) + _contentType=_mimeType; + else + _contentType=null; - if (_contentType==null) - _connection.getResponseFields().remove(HttpHeaders.CONTENT_TYPE_BUFFER); - else - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else - { - // No, so just add this one to the mimetype - _characterEncoding=encoding; - if (_contentType!=null) - { - int i0=_contentType.indexOf(';'); - if (i0<0) - { - _contentType=null; - if(_cachedMimeType!=null) - { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); - if (content_type!=null) - { - _contentType=content_type.toString(); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); - } - } + if (_contentType==null) + _connection.getResponseFields().remove(HttpHeaders.CONTENT_TYPE_BUFFER); + else + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else + { + // No, so just add this one to the mimetype + _characterEncoding=encoding; + if (_contentType!=null) + { + int i0=_contentType.indexOf(';'); + if (i0<0) + { + _contentType=null; + if(_cachedMimeType!=null) + { + CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + if (content_type!=null) + { + _contentType=content_type.toString(); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); + } + } - if (_contentType==null) - { - _contentType = _mimeType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else - { - int i1=_contentType.indexOf("charset=",i0); - if (i1<0) - { - _contentType = _contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - } - else - { - int i8=i1+8; - int i2=_contentType.indexOf(" ",i8); - if (i2<0) - _contentType=_contentType.substring(0,i8)+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - else - _contentType=_contentType.substring(0,i8)+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= ")+_contentType.substring(i2); - } - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - } - } - } + if (_contentType==null) + { + _contentType = _mimeType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else + { + int i1=_contentType.indexOf("charset=",i0); + if (i1<0) + { + _contentType = _contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + } + else + { + int i8=i1+8; + int i2=_contentType.indexOf(" ",i8); + if (i2<0) + _contentType=_contentType.substring(0,i8)+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + else + _contentType=_contentType.substring(0,i8)+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= ")+_contentType.substring(i2); + } + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + } + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#setContentLength(int) - */ - public void setContentLength(int len) - { - // Protect from setting after committed as default handling - // of a servlet HEAD request ALWAYS sets _content length, even - // if the getHandling committed the response! - if (isCommitted() || _connection.isIncluding()) - return; - _connection._generator.setContentLength(len); - if (len>0) - { - _connection.getResponseFields().putLongField(HttpHeaders.CONTENT_LENGTH, len); - if (_connection._generator.isAllContentWritten()) - { - if (_outputState==WRITER) - _writer.close(); - else if (_outputState==STREAM) - { - try - { - getOutputStream().close(); - } - catch(IOException e) - { - throw new RuntimeException(e); - } - } - } - } - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#setContentLength(int) + */ + public void setContentLength(int len) + { + // Protect from setting after committed as default handling + // of a servlet HEAD request ALWAYS sets _content length, even + // if the getHandling committed the response! + if (isCommitted() || _connection.isIncluding()) + return; + _connection._generator.setContentLength(len); + if (len>0) + { + _connection.getResponseFields().putLongField(HttpHeaders.CONTENT_LENGTH, len); + if (_connection._generator.isAllContentWritten()) + { + if (_outputState==WRITER) + _writer.close(); + else if (_outputState==STREAM) + { + try + { + getOutputStream().close(); + } + catch(IOException e) + { + throw new RuntimeException(e); + } + } + } + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#setContentLength(int) - */ - public void setLongContentLength(long len) - { - // Protect from setting after committed as default handling - // of a servlet HEAD request ALWAYS sets _content length, even - // if the getHandling committed the response! - if (isCommitted() || _connection.isIncluding()) - return; - _connection._generator.setContentLength(len); - _connection.getResponseFields().putLongField(HttpHeaders.CONTENT_LENGTH, len); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#setContentLength(int) + */ + public void setLongContentLength(long len) + { + // Protect from setting after committed as default handling + // of a servlet HEAD request ALWAYS sets _content length, even + // if the getHandling committed the response! + if (isCommitted() || _connection.isIncluding()) + return; + _connection._generator.setContentLength(len); + _connection.getResponseFields().putLongField(HttpHeaders.CONTENT_LENGTH, len); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#setContentType(java.lang.String) - */ - public void setContentType(String contentType) - { - if (isCommitted() || _connection.isIncluding()) - return; + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#setContentType(java.lang.String) + */ + public void setContentType(String contentType) + { + if (isCommitted() || _connection.isIncluding()) + return; - // Yes this method is horribly complex.... but there are lots of special cases and - // as this method is called on every request, it is worth trying to save string creation. - // + // Yes this method is horribly complex.... but there are lots of special cases and + // as this method is called on every request, it is worth trying to save string creation. + // - if (contentType==null) - { - if (_locale==null) - _characterEncoding=null; - _mimeType=null; - _cachedMimeType=null; - _contentType=null; - _connection.getResponseFields().remove(HttpHeaders.CONTENT_TYPE_BUFFER); - } - else - { - // Look for encoding in contentType - int i0=contentType.indexOf(';'); + if (contentType==null) + { + if (_locale==null) + _characterEncoding=null; + _mimeType=null; + _cachedMimeType=null; + _contentType=null; + _connection.getResponseFields().remove(HttpHeaders.CONTENT_TYPE_BUFFER); + } + else + { + // Look for encoding in contentType + int i0=contentType.indexOf(';'); - if (i0>0) - { - // we have content type parameters + if (i0>0) + { + // we have content type parameters - // Extract params off mimetype - _mimeType=contentType.substring(0,i0).trim(); - _cachedMimeType=MimeTypes.CACHE.get(_mimeType); + // Extract params off mimetype + _mimeType=contentType.substring(0,i0).trim(); + _cachedMimeType=MimeTypes.CACHE.get(_mimeType); - // Look for charset - int i1=contentType.indexOf("charset=",i0+1); - if (i1>=0) - { - _explicitEncoding=true; - int i8=i1+8; - int i2 = contentType.indexOf(' ',i8); + // Look for charset + int i1=contentType.indexOf("charset=",i0+1); + if (i1>=0) + { + _explicitEncoding=true; + int i8=i1+8; + int i2 = contentType.indexOf(' ',i8); - if (_outputState==WRITER) - { - // strip the charset and ignore; - if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) - { - if (_cachedMimeType!=null) - { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); - if (content_type!=null) - { - _contentType=content_type.toString(); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); - } - else - { - _contentType=_mimeType+";charset="+_characterEncoding; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else - { - _contentType=_mimeType+";charset="+_characterEncoding; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else if (i2<0) - { - _contentType=contentType.substring(0,i1)+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - else - { - _contentType=contentType.substring(0,i1)+contentType.substring(i2)+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) - { - // The params are just the char encoding - _cachedMimeType=MimeTypes.CACHE.get(_mimeType); - _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); + if (_outputState==WRITER) + { + // strip the charset and ignore; + if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) + { + if (_cachedMimeType!=null) + { + CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + if (content_type!=null) + { + _contentType=content_type.toString(); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); + } + else + { + _contentType=_mimeType+";charset="+_characterEncoding; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else + { + _contentType=_mimeType+";charset="+_characterEncoding; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else if (i2<0) + { + _contentType=contentType.substring(0,i1)+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + else + { + _contentType=contentType.substring(0,i1)+contentType.substring(i2)+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) + { + // The params are just the char encoding + _cachedMimeType=MimeTypes.CACHE.get(_mimeType); + _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); - if (_cachedMimeType!=null) - { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); - if (content_type!=null) - { - _contentType=content_type.toString(); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); - } - else - { - _contentType=contentType; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else - { - _contentType=contentType; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else if (i2>0) - { - _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8,i2)); - _contentType=contentType; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - else - { - _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); - _contentType=contentType; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else // No encoding in the params. - { - _cachedMimeType=null; - _contentType=_characterEncoding==null?contentType:contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else // No params at all - { - _mimeType=contentType; - _cachedMimeType=MimeTypes.CACHE.get(_mimeType); + if (_cachedMimeType!=null) + { + CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + if (content_type!=null) + { + _contentType=content_type.toString(); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); + } + else + { + _contentType=contentType; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else + { + _contentType=contentType; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else if (i2>0) + { + _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8,i2)); + _contentType=contentType; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + else + { + _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); + _contentType=contentType; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else // No encoding in the params. + { + _cachedMimeType=null; + _contentType=_characterEncoding==null?contentType:contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else // No params at all + { + _mimeType=contentType; + _cachedMimeType=MimeTypes.CACHE.get(_mimeType); - if (_characterEncoding!=null) - { - if (_cachedMimeType!=null) - { - CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); - if (content_type!=null) - { - _contentType=content_type.toString(); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); - } - else - { - _contentType=_mimeType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else - { - _contentType=contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - else if (_cachedMimeType!=null) - { - _contentType=_cachedMimeType.toString(); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_cachedMimeType); - } - else - { - _contentType=contentType; - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - } - } + if (_characterEncoding!=null) + { + if (_cachedMimeType!=null) + { + CachedBuffer content_type = _cachedMimeType.getAssociate(_characterEncoding); + if (content_type!=null) + { + _contentType=content_type.toString(); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,content_type); + } + else + { + _contentType=_mimeType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else + { + _contentType=contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + else if (_cachedMimeType!=null) + { + _contentType=_cachedMimeType.toString(); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_cachedMimeType); + } + else + { + _contentType=contentType; + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#setBufferSize(int) - */ - public void setBufferSize(int size) - { - if (isCommitted() || getContentCount()>0) - throw new IllegalStateException("Committed or content written"); - _connection.getGenerator().increaseContentBufferSize(size); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#setBufferSize(int) + */ + public void setBufferSize(int size) + { + if (isCommitted() || getContentCount()>0) + throw new IllegalStateException("Committed or content written"); + _connection.getGenerator().increaseContentBufferSize(size); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#getBufferSize() - */ - public int getBufferSize() - { - return _connection.getGenerator().getContentBufferSize(); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#getBufferSize() + */ + public int getBufferSize() + { + return _connection.getGenerator().getContentBufferSize(); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#flushBuffer() - */ - public void flushBuffer() throws IOException - { - _connection.flushResponse(); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#flushBuffer() + */ + public void flushBuffer() throws IOException + { + _connection.flushResponse(); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#reset() - */ - public void reset() - { - resetBuffer(); - fwdReset(); - _status=200; - _reason=null; - - HttpFields response_fields=_connection.getResponseFields(); - - response_fields.clear(); - String connection=_connection.getRequestFields().getStringField(HttpHeaders.CONNECTION_BUFFER); - if (connection!=null) - { - String[] values = connection.split(","); - for (int i=0;values!=null && i<values.length;i++) - { - CachedBuffer cb = HttpHeaderValues.CACHE.get(values[0].trim()); + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#reset() + */ + public void reset() + { + resetBuffer(); + fwdReset(); + _status=200; + _reason=null; + + HttpFields response_fields=_connection.getResponseFields(); + + response_fields.clear(); + String connection=_connection.getRequestFields().getStringField(HttpHeaders.CONNECTION_BUFFER); + if (connection!=null) + { + String[] values = connection.split(","); + for (int i=0;values!=null && i<values.length;i++) + { + CachedBuffer cb = HttpHeaderValues.CACHE.get(values[0].trim()); - if (cb!=null) - { - switch(cb.getOrdinal()) - { - case HttpHeaderValues.CLOSE_ORDINAL: - response_fields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.CLOSE_BUFFER); - break; + if (cb!=null) + { + switch(cb.getOrdinal()) + { + case HttpHeaderValues.CLOSE_ORDINAL: + response_fields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.CLOSE_BUFFER); + break; - case HttpHeaderValues.KEEP_ALIVE_ORDINAL: - if (HttpVersions.HTTP_1_0.equalsIgnoreCase(_connection.getRequest().getProtocol())) - response_fields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.KEEP_ALIVE); - break; - case HttpHeaderValues.TE_ORDINAL: - response_fields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.TE); - break; - } - } - } - } - } - + case HttpHeaderValues.KEEP_ALIVE_ORDINAL: + if (HttpVersions.HTTP_1_0.equalsIgnoreCase(_connection.getRequest().getProtocol())) + response_fields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.KEEP_ALIVE); + break; + case HttpHeaderValues.TE_ORDINAL: + response_fields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.TE); + break; + } + } + } + } + } + - public void reset(boolean preserveCookies) - { - if (!preserveCookies) - reset(); - else - { - HttpFields response_fields=_connection.getResponseFields(); + public void reset(boolean preserveCookies) + { + if (!preserveCookies) + reset(); + else + { + HttpFields response_fields=_connection.getResponseFields(); - ArrayList<String> cookieValues = new ArrayList<String>(5); - Enumeration<String> vals = response_fields.getValues(HttpHeaders.SET_COOKIE); - while (vals.hasMoreElements()) - cookieValues.add((String)vals.nextElement()); + ArrayList<String> cookieValues = new ArrayList<String>(5); + Enumeration<String> vals = response_fields.getValues(HttpHeaders.SET_COOKIE); + while (vals.hasMoreElements()) + cookieValues.add((String)vals.nextElement()); - reset(); + reset(); - for (String v:cookieValues) - response_fields.add(HttpHeaders.SET_COOKIE, v); - } - } - - - - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#reset() - */ - public void fwdReset() - { - resetBuffer(); + for (String v:cookieValues) + response_fields.add(HttpHeaders.SET_COOKIE, v); + } + } + + + + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#reset() + */ + public void fwdReset() + { + resetBuffer(); - _writer=null; - _outputState=NONE; - } + _writer=null; + _outputState=NONE; + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#resetBuffer() - */ - public void resetBuffer() - { - if (isCommitted()) - throw new IllegalStateException("Committed"); - _connection.getGenerator().resetBuffer(); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#resetBuffer() + */ + public void resetBuffer() + { + if (isCommitted()) + throw new IllegalStateException("Committed"); + _connection.getGenerator().resetBuffer(); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#isCommitted() - */ - public boolean isCommitted() - { - return _connection.isResponseCommitted(); - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#isCommitted() + */ + public boolean isCommitted() + { + return _connection.isResponseCommitted(); + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#setLocale(java.util.Locale) - */ - public void setLocale(Locale locale) - { - if (locale == null || isCommitted() ||_connection.isIncluding()) - return; + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#setLocale(java.util.Locale) + */ + public void setLocale(Locale locale) + { + if (locale == null || isCommitted() ||_connection.isIncluding()) + return; - _locale = locale; - _connection.getResponseFields().put(HttpHeaders.CONTENT_LANGUAGE_BUFFER,locale.toString().replace('_','-')); + _locale = locale; + _connection.getResponseFields().put(HttpHeaders.CONTENT_LANGUAGE_BUFFER,locale.toString().replace('_','-')); - if (_explicitEncoding || _outputState!=0 ) - return; + if (_explicitEncoding || _outputState!=0 ) + return; - if (_connection.getRequest().getContext()==null) - return; + if (_connection.getRequest().getContext()==null) + return; - String charset = _connection.getRequest().getContext().getContextHandler().getLocaleEncoding(locale); + String charset = _connection.getRequest().getContext().getContextHandler().getLocaleEncoding(locale); - if (charset!=null && charset.length()>0) - { - _characterEncoding=charset; + if (charset!=null && charset.length()>0) + { + _characterEncoding=charset; - /* get current MIME type from Content-Type header */ - String type=getContentType(); - if (type!=null) - { - _characterEncoding=charset; - int semi=type.indexOf(';'); - if (semi<0) - { - _mimeType=type; - _contentType= type += ";charset="+charset; - } - else - { - _mimeType=type.substring(0,semi); - _contentType= _mimeType += ";charset="+charset; - } + /* get current MIME type from Content-Type header */ + String type=getContentType(); + if (type!=null) + { + _characterEncoding=charset; + int semi=type.indexOf(';'); + if (semi<0) + { + _mimeType=type; + _contentType= type += ";charset="+charset; + } + else + { + _mimeType=type.substring(0,semi); + _contentType= _mimeType += ";charset="+charset; + } - _cachedMimeType=MimeTypes.CACHE.get(_mimeType); - _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); - } - } - } + _cachedMimeType=MimeTypes.CACHE.get(_mimeType); + _connection.getResponseFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,_contentType); + } + } + } - /* ------------------------------------------------------------ */ - /* - * @see javax.servlet.ServletResponse#getLocale() - */ - public Locale getLocale() - { - if (_locale==null) - return Locale.getDefault(); - return _locale; - } + /* ------------------------------------------------------------ */ + /* + * @see javax.servlet.ServletResponse#getLocale() + */ + public Locale getLocale() + { + if (_locale==null) + return Locale.getDefault(); + return _locale; + } - /* ------------------------------------------------------------ */ - /** - * @return The HTTP status code that has been set for this request. This will be <code>200<code> - * ({@link HttpServletResponse#SC_OK}), unless explicitly set through one of the <code>setStatus</code> methods. - */ - public int getStatus() - { - return _status; - } + /* ------------------------------------------------------------ */ + /** + * @return The HTTP status code that has been set for this request. This will be <code>200<code> + * ({@link HttpServletResponse#SC_OK}), unless explicitly set through one of the <code>setStatus</code> methods. + */ + public int getStatus() + { + return _status; + } - /* ------------------------------------------------------------ */ - /** - * @return The reason associated with the current {@link #getStatus() status}. This will be <code>null</code>, - * unless one of the <code>setStatus</code> methods have been called. - */ - public String getReason() - { - return _reason; - } + /* ------------------------------------------------------------ */ + /** + * @return The reason associated with the current {@link #getStatus() status}. This will be <code>null</code>, + * unless one of the <code>setStatus</code> methods have been called. + */ + public String getReason() + { + return _reason; + } - /* ------------------------------------------------------------ */ - /** - */ - public void complete() - throws IOException - { - _connection.completeResponse(); - } + /* ------------------------------------------------------------ */ + /** + */ + public void complete() + throws IOException + { + _connection.completeResponse(); + } - /* ------------------------------------------------------------- */ - /** - * @return the number of bytes actually written in response body - */ - public long getContentCount() - { - if (_connection==null || _connection.getGenerator()==null) - return -1; - return _connection.getGenerator().getContentWritten(); - } + /* ------------------------------------------------------------- */ + /** + * @return the number of bytes actually written in response body + */ + public long getContentCount() + { + if (_connection==null || _connection.getGenerator()==null) + return -1; + return _connection.getGenerator().getContentWritten(); + } - /* ------------------------------------------------------------ */ - public HttpFields getHttpFields() - { - return _connection.getResponseFields(); - } + /* ------------------------------------------------------------ */ + public HttpFields getHttpFields() + { + return _connection.getResponseFields(); + } - /* ------------------------------------------------------------ */ - @Override - public String toString() - { - return "HTTP/1.1 "+_status+" "+ (_reason==null?"":_reason) +System.getProperty("line.separator")+ - _connection.getResponseFields().toString(); - } - - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - private static class NullOutput extends ServletOutputStream - { - @Override - public void write(int b) throws IOException - { - } + /* ------------------------------------------------------------ */ + @Override + public String toString() + { + return "HTTP/1.1 "+_status+" "+ (_reason==null?"":_reason) +System.getProperty("line.separator")+ + _connection.getResponseFields().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 print(String s) throws IOException + { + } - @Override - public void println(String s) throws IOException - { - } + @Override + public void println(String s) throws IOException + { + } - @Override - public void write(byte[] b, int off, int len) throws IOException - { - } + @Override + public void write(byte[] b, int off, int len) throws IOException + { + } - } + } }