📄 response.java
字号:
//========================================================================//$Id: Response.java,v 1.8 2005/11/25 21:01:45 gregwilkins Exp $//Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.//------------------------------------------------------------------------//Licensed under the Apache License, Version 2.0 (the "License");//you may not use this file except in compliance with the License.//You may obtain a copy of the License at//http://www.apache.org/licenses/LICENSE-2.0//Unless required by applicable law or agreed to in writing, software//distributed under the License is distributed on an "AS IS" BASIS,//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.//See the License for the specific language governing permissions and//limitations under the License.//========================================================================package org.mortbay.jetty;import java.io.IOException;import java.io.PrintWriter;import java.util.Collections;import java.util.Enumeration;import java.util.Locale;import javax.servlet.ServletOutputStream;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.mortbay.io.BufferCache.CachedBuffer;import org.mortbay.jetty.handler.ContextHandler;import org.mortbay.jetty.handler.ErrorHandler;import org.mortbay.jetty.servlet.ServletHandler;import org.mortbay.log.Log;import org.mortbay.util.ByteArrayISO8859Writer;import org.mortbay.util.IO;import org.mortbay.util.QuotedStringTokenizer;import org.mortbay.util.StringUtil;import org.mortbay.util.URIUtil;/* ------------------------------------------------------------ *//** Response. * <p> * Implements {@link javax.servlet.HttpServletResponse} from the {@link javax.servlet} package. * </p> * * @author gregw * */public class Response implements HttpServletResponse{ public static final int DISABLED=-1, NONE=0, STREAM=1, WRITER=2; private static PrintWriter __nullPrintWriter; private static ServletOutputStream __nullServletOut; static { try{ __nullPrintWriter = new PrintWriter(IO.getNullWriter()); __nullServletOut = new NullOutput(); } catch (Exception e) { Log.warn(e); } } private HttpConnection _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 int _outputState; private PrintWriter _writer; /* ------------------------------------------------------------ */ /** * */ public Response(HttpConnection 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; _outputState=NONE; _writer=null; } /* ------------------------------------------------------------ */ /* * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) */ public void addCookie(Cookie cookie) { _connection.getResponseFields().addSetCookie(cookie); } /* ------------------------------------------------------------ */ /* * @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) { Request request=_connection.getRequest(); SessionManager sessionManager = request.getSessionManager(); if (sessionManager==null) return url; String sessionURLPrefix = sessionManager.getSessionURLPrefix(); if (sessionURLPrefix==null) return url; // should not encode if cookies in evidence if (url==null || request==null || request.isRequestedSessionIdFromCookie()) { int prefix=url.indexOf(sessionURLPrefix); if (prefix!=-1) { int suffix=url.indexOf("?",prefix); if (suffix<0) suffix=url.indexOf("#",prefix); if (suffix<=prefix) return url.substring(0,prefix); return url.substring(0,prefix)+url.substring(suffix); } return url; } // get session; HttpSession session=request.getSession(false); // no session if (session == null) return url; // invalid session if (!sessionManager.isValid(session)) return url; String id=sessionManager.getNodeId(session); // TODO Check host and port are for this server // Already encoded int prefix=url.indexOf(sessionURLPrefix); if (prefix!=-1) { int suffix=url.indexOf("?",prefix); if (suffix<0) suffix=url.indexOf("#",prefix); if (suffix<=prefix) return url.substring(0,prefix+sessionURLPrefix.length())+id; return url.substring(0,prefix+sessionURLPrefix.length())+id+ url.substring(suffix); } // edit the session int suffix=url.indexOf('?'); if (suffix<0) suffix=url.indexOf('#'); if (suffix<0) return url+sessionURLPrefix+id; return url.substring(0,suffix)+ sessionURLPrefix+id+url.substring(suffix); } /* ------------------------------------------------------------ */ /* * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String) */ public String encodeRedirectURL(String url) { return encodeURL(url); } /* ------------------------------------------------------------ */ /* * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String) */ public String encodeUrl(String url) { return encodeURL(url); } /* ------------------------------------------------------------ */ /* * @see javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String) */ public String encodeRedirectUrl(String url) { return encodeURL(url); } /* ------------------------------------------------------------ */ /* * @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); 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); if (message==null) message=HttpGenerator.getReason(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(); ErrorHandler error_handler = null; ContextHandler.SContext context = request.getContext(); if (context!=null) error_handler=context.getContextHandler().getErrorHandler(); if (error_handler!=null) { // TODO - probably should reset these after the request? request.setAttribute(ServletHandler.__J_S_ERROR_STATUS_CODE,new Integer(code)); request.setAttribute(ServletHandler.__J_S_ERROR_MESSAGE, message); request.setAttribute(ServletHandler.__J_S_ERROR_REQUEST_URI, request.getRequestURI()); request.setAttribute(ServletHandler.__J_S_ERROR_SERVLET_NAME,request.getServletName()); error_handler.handle(null,_connection.getRequest(),this, Handler.ERROR); } 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=HttpGenerator.getReason(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"); 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(); } /* ------------------------------------------------------------ */ /* * @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 { Generator g = _connection.getGenerator(); if (g instanceof HttpGenerator) { HttpGenerator generator = (HttpGenerator)g; String expect = _connection.getRequest().getHeader(HttpHeaders.EXPECT); if (expect!=null && expect.startsWith("102") && generator.getVersion()>=HttpVersions.HTTP_1_1_ORDINAL) { boolean was_persistent=generator.isPersistent(); generator.setResponse(HttpStatus.ORDINAL_102_Processing,null); generator.completeHeader(null,true); generator.setPersistent(true); generator.complete(); generator.flush(); generator.reset(false); generator.setPersistent(was_persistent); } } } /* ------------------------------------------------------------ */ /* * @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 (!URIUtil.hasScheme(location)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -