001/** 002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com). 003 * <p> 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * <p> 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * <p> 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package io.jboot.test.web; 017 018import com.jfinal.core.JFinal; 019import io.jboot.test.MockProxy; 020 021import javax.servlet.ServletOutputStream; 022import javax.servlet.WriteListener; 023import javax.servlet.http.Cookie; 024import javax.servlet.http.HttpServletResponse; 025import javax.servlet.http.HttpServletResponseWrapper; 026import java.io.*; 027import java.util.*; 028 029public class MockHttpServletResponse extends HttpServletResponseWrapper { 030 031 protected String contentString; 032 protected ByteArrayOutputStream stream = new ByteArrayOutputStream(); 033 034 protected PrintWriter writer; 035 protected Map<String, String> headers = new HashMap<>(); 036 protected Set<Cookie> cookies = new HashSet<>(); 037 038 protected int status = 200; 039 protected String statusMessage = "OK"; 040 protected Locale locale; 041 protected String contentType; 042 protected String characterEncoding = JFinal.me().getConstants().getEncoding(); 043 044 045 public MockHttpServletResponse() { 046 super(MockProxy.create(HttpServletResponse.class)); 047 } 048 049 public MockHttpServletResponse(ByteArrayOutputStream stream) { 050 super(MockProxy.create(HttpServletResponse.class)); 051 this.stream = stream; 052 } 053 054 public MockHttpServletResponse(HttpServletResponse response) { 055 super(response); 056 } 057 058 public MockHttpServletResponse(HttpServletResponse response, ByteArrayOutputStream stream) { 059 super(response); 060 this.stream = stream; 061 } 062 063 @Override 064 public void addCookie(Cookie cookie) { 065 cookies.add(cookie); 066 } 067 068 public Set<Cookie> getCookies() { 069 return cookies; 070 } 071 072 073 @Override 074 public void addDateHeader(String key, long value) { 075 headers.put(key, "" + value); 076 } 077 078 @Override 079 public void addHeader(String key, String value) { 080 headers.put(key, value); 081 } 082 083 @Override 084 public void addIntHeader(String key, int value) { 085 headers.put(key, "" + value); 086 } 087 088 @Override 089 public boolean containsHeader(String key) { 090 return headers.containsKey(key); 091 } 092 093 @Override 094 public void sendError(int status) throws IOException { 095 this.setStatus(status); 096 } 097 098 @Override 099 public void sendError(int status, String statusMessage) throws IOException { 100 this.setStatus(status, statusMessage); 101 } 102 103 @Override 104 public void sendRedirect(String value) throws IOException { 105 if (status == 200) { 106 setStatus(302); 107 } 108 headers.put("Location", value); 109 } 110 111 @Override 112 public void setDateHeader(String key, long value) { 113 headers.put(key, "" + value); 114 } 115 116 @Override 117 public void setHeader(String key, String value) { 118 headers.put(key, value); 119 } 120 121 @Override 122 public void setIntHeader(String key, int value) { 123 headers.put(key, "" + value); 124 } 125 126 @Override 127 public void setStatus(int status) { 128 this.status = status; 129 } 130 131 @Override 132 public void setStatus(int status, String statusMessage) { 133 this.status = status; 134 this.statusMessage = statusMessage; 135 } 136 137 @Override 138 public void flushBuffer() throws IOException { 139 getWriter().flush(); 140 } 141 142 @Override 143 public int getBufferSize() { 144 return stream.size(); 145 } 146 147 @Override 148 public String getCharacterEncoding() { 149 return characterEncoding; 150 } 151 152 @Override 153 public String getContentType() { 154 return contentType; 155 } 156 157 @Override 158 public Locale getLocale() { 159 return locale; 160 } 161 162 @Override 163 public ServletOutputStream getOutputStream() throws IOException { 164 return new ServletOutputStream() { 165 166 @Override 167 public void write(int arg0) throws IOException { 168 stream.write(arg0); 169 } 170 171 @Override 172 public boolean isReady() { 173 return false; 174 } 175 176 @Override 177 public void setWriteListener(WriteListener writeListener) { 178 } 179 }; 180 } 181 182 @Override 183 public PrintWriter getWriter() throws IOException { 184 if (writer == null) { 185 writer = new PrintWriter(new OutputStreamWriter(stream, characterEncoding)); 186 } 187 return writer; 188 } 189 190 @Override 191 public void reset() { 192 stream.reset(); 193 } 194 195 @Override 196 public void resetBuffer() { 197 stream.reset(); 198 } 199 200 201 @Override 202 public void setCharacterEncoding(String characterEncoding) { 203 this.characterEncoding = characterEncoding; 204 } 205 206 @Override 207 public void setContentType(String contentType) { 208 this.contentType = contentType; 209 } 210 211 @Override 212 public void setLocale(Locale locale) { 213 this.locale = locale; 214 } 215 216 @Override 217 public int getStatus() { 218 return status; 219 } 220 221 public String getStatusMessage() { 222 return statusMessage; 223 } 224 225 public String getContentString() { 226 if (contentString == null) { 227 try { 228 getWriter().flush(); 229 contentString = stream.toString(characterEncoding); 230 } catch (IOException e) { 231 throw new RuntimeException(e); 232 } 233 } 234 return contentString; 235 } 236 237 @Override 238 public String getHeader(String key) { 239 return headers.get(key); 240 } 241 242 @Override 243 public Collection<String> getHeaderNames() { 244 return headers.keySet(); 245 } 246 247 @Override 248 public boolean isCommitted() { 249 return false; 250 } 251 252}