📄 servletunithttpresponse.java
字号:
package com.meterware.servletunit;/********************************************************************************************************************* $Id: ServletUnitHttpResponse.java,v 1.22 2006/03/24 19:59:12 russgold Exp $** Copyright (c) 2000-2004,2006, Russell Gold** Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated* documentation files (the "Software"), to deal in the Software without restriction, including without limitation* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and* to permit persons to whom the Software is furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in all copies or substantial portions* of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER* DEALINGS IN THE SOFTWARE.********************************************************************************************************************/import com.meterware.httpunit.HttpUnitUtils;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.util.*;import java.text.SimpleDateFormat;import javax.servlet.ServletOutputStream;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletResponse;class ServletUnitHttpResponse implements HttpServletResponse { // rfc1123-date is "Sun, 06 Nov 1994 08:49:37 GMT" private static final String RFC1123_DATE_SPEC = "EEE, dd MMM yyyy hh:mm:ss z"; private boolean _committed; private Locale _locale = Locale.getDefault(); private static final Hashtable ENCODING_MAP = new Hashtable(); /** * @deprecated Use encodeURL(String url) */ public String encodeUrl( String url ) { return encodeURL( url ); } /** * Adds the specified cookie to the response. It can be called * multiple times to set more than one cookie. */ public void addCookie( Cookie cookie ) { _cookies.addElement( cookie ); } /** * Checks whether the response message header has a field with * the specified name. */ public boolean containsHeader( String name ) { return _headers.containsKey( name.toUpperCase() ); } /** * @deprecated Use encodeRedirectURL(String url) **/ public String encodeRedirectUrl( String url ) { return encodeRedirectURL( url ); } /** * Encodes the specified URL by including the session ID in it, * or, if encoding is not needed, returns the URL unchanged. * The implementation of this method should include the logic to * determine whether the session ID needs to be encoded in the URL. * For example, if the browser supports cookies, or session * tracking is turned off, URL encoding is unnecessary. **/ public String encodeURL( String url ) { return url; } /** * Encodes the specified URL for use in the * <code>sendRedirect</code> method or, if encoding is not needed, * returns the URL unchanged. The implementation of this method * should include the logic to determine whether the session ID * needs to be encoded in the URL. Because the rules for making * this determination differ from those used to decide whether to * encode a normal link, this method is seperate from the * <code>encodeUrl</code> method. **/ public String encodeRedirectURL( String url ) { return url; } /** * Sends a temporary redirect response to the client using the * specified redirect location URL. The URL must be absolute (for * example, <code><em>https://hostname/path/file.html</em></code>). * Relative URLs are not permitted here. */ public void sendRedirect( String location ) throws IOException { setStatus( HttpServletResponse.SC_MOVED_TEMPORARILY ); setHeader( "Location", location ); } /** * Sends an error response to the client using the specified status * code and descriptive message. If setStatus has previously been * called, it is reset to the error status code. The message is * sent as the body of an HTML page, which is returned to the user * to describe the problem. The page is sent with a default HTML * header; the message is enclosed in simple body tags * (<body></body>). **/ public void sendError( int sc ) throws IOException { sendError( sc, "" ); } /** * Sends an error response to the client using the specified status * code and descriptive message. If setStatus has previously been * called, it is reset to the error status code. The message is * sent as the body of an HTML page, which is returned to the user * to describe the problem. The page is sent with a default HTML * header; the message is enclosed in simple body tags * (<body></body>). **/ public void sendError(int sc, String msg) throws IOException { setStatus( sc ); _statusMessage = msg; _writer = null; _servletStream = null; setContentType( "text/html" ); getWriter().println( "<html><head><title>" + msg + "</title></head><body>" + msg + "</body></html>" ); } /** * Sets the status code for this response. This method is used to * set the return status code when there is no error (for example, * for the status codes SC_OK or SC_MOVED_TEMPORARILY). If there * is an error, the <code>sendError</code> method should be used * instead. **/ public void setStatus( int sc ) { _status = sc; } /** * @deprecated As of version 2.1, due to ambiguous meaning of the message parameter. * To set a status code use setStatus(int), to send an error with a description * use sendError(int, String). Sets the status code and message for this response. **/ public void setStatus( int sc, String msg ) { setStatus( sc ); } /** * Adds a field to the response header with the given name and value. * If the field had already been set, the new value overwrites the * previous one. The <code>containsHeader</code> method can be * used to test for the presence of a header before setting its * value. **/ public void setHeader( String name, String value ) { ArrayList values = new ArrayList(); values.add( value ); synchronized (_headers) { _headers.put( name.toUpperCase(), values ); } } /** * Adds a field to the response header with the given name and * integer value. If the field had already been set, the new value * overwrites the previous one. The <code>containsHeader</code> * method can be used to test for the presence of a header before * setting its value. **/ public void setIntHeader( String name, int value ) { setHeader( name, asHeaderValue( value ) ); } private String asHeaderValue( int value ) { return Integer.toString( value ); } /** * Adds a field to the response header with the given name and * date-valued field. The date is specified in terms of * milliseconds since the epoch. If the date field had already * been set, the new value overwrites the previous one. The * <code>containsHeader</code> method can be used to test for the * presence of a header before setting its value. **/ public void setDateHeader( String name, long date ) { setHeader( name, asDateHeaderValue( date ) ); } private String asDateHeaderValue( long date ) { Date value = new Date( date ); SimpleDateFormat formatter = new SimpleDateFormat( RFC1123_DATE_SPEC, Locale.US ); formatter.setTimeZone( TimeZone.getTimeZone( "Greenwich Mean Time" ) ); return formatter.format( value ); } /** * Returns the name of the character set encoding used for * the MIME body sent by this response. **/ public String getCharacterEncoding() { return _encoding == null ? HttpUnitUtils.DEFAULT_CHARACTER_SET : _encoding; } /** * Sets the content type of the response the server sends to * the client. The content type may include the type of character * encoding used, for example, <code>text/html; charset=ISO-8859-4</code>. * * <p>You can only use this method once, and you should call it * before you obtain a <code>PrintWriter</code> or * {@link ServletOutputStream} object to return a response. **/ public void setContentType( String type ) { String[] typeAndEncoding = HttpUnitUtils.parseContentTypeHeader( type ); _contentType = typeAndEncoding[0]; if (typeAndEncoding[1] != null) _encoding = typeAndEncoding[1]; } /** * Returns a {@link ServletOutputStream} suitable for writing binary * data in the response. The servlet engine does not encode the * binary data. * * @exception IllegalStateException if you have already called the <code>getWriter</code> method **/ public ServletOutputStream getOutputStream() throws IOException { if (_writer != null) throw new IllegalStateException( "Tried to create output stream; writer already exists" ); if (_servletStream == null) { _outputStream = new ByteArrayOutputStream(); _servletStream = new ServletUnitOutputStream( _outputStream ); } return _servletStream; } /** * Returns a <code>PrintWriter</code> object that you * can use to send character text to the client. * The character encoding used is the one specified * in the <code>charset=</code> property of the * {@link #setContentType} method, which you must call * <i>before</i> you call this method. * * <p>If necessary, the MIME type of the response is * modified to reflect the character encoding used. * * <p> You cannot use this method if you have already * called {@link #getOutputStream} for this * <code>ServletResponse</code> object. * * @exception UnsupportedEncodingException if the character encoding specified in * <code>setContentType</code> cannot be * used * * @exception IllegalStateException if the <code>getOutputStream</code> * method has already been called for this * response object; in that case, you can't * use this method * **/ public PrintWriter getWriter() throws UnsupportedEncodingException { if (_servletStream != null) throw new IllegalStateException( "Tried to create writer; output stream already exists" ); if (_writer == null) { _outputStream = new ByteArrayOutputStream(); _writer = new PrintWriter( new OutputStreamWriter( _outputStream, getCharacterEncoding() ) ); } return _writer; } /** * Sets the length of the content the server returns
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -