001 package railo.runtime.net.http; 002 003 import java.io.IOException; 004 import java.io.OutputStream; 005 import java.io.PrintWriter; 006 import java.io.Serializable; 007 import java.util.Locale; 008 009 import javax.servlet.ServletOutputStream; 010 import javax.servlet.http.Cookie; 011 import javax.servlet.http.HttpServletResponse; 012 import javax.servlet.http.HttpServletResponseWrapper; 013 014 import railo.commons.io.DevNullOutputStream; 015 import railo.commons.lang.Pair; 016 import railo.commons.net.URLEncoder; 017 import railo.runtime.op.Caster; 018 import railo.runtime.type.dt.DateTimeImpl; 019 020 021 022 /** 023 * 024 */ 025 public final class HttpServletResponseWrap extends HttpServletResponseWrapper implements HttpServletResponse,Serializable { 026 027 private Cookie[] cookies=new Cookie[0]; 028 private Pair[] headers=new Pair[0]; 029 private int status=200; 030 private String statusCode="OK"; 031 private String charset="ISO-8859-1"; 032 private int contentLength=-1; 033 private String contentType=null; 034 private Locale locale=Locale.getDefault(); 035 private int bufferSize=-1; 036 private boolean commited; 037 //private byte[] outputDatad; 038 private OutputStream out;//=new DevNullOutputStream(); 039 private boolean outInit=false; 040 private PrintWriter writer; 041 private ServletOutputStreamDummy outputStream; 042 043 044 private static ThreadLocal<Boolean> local=new ThreadLocal<Boolean>(); 045 046 047 public static void set(boolean value) { 048 local.set(Caster.toBoolean(value)); 049 } 050 public static boolean get() { 051 return Caster.toBooleanValue(local.get(),false); 052 } 053 public static void release() { 054 local.set(Boolean.FALSE); 055 } 056 057 /** 058 * Constructor of the class 059 */ 060 public HttpServletResponseWrap(HttpServletResponse rsp) { 061 this(rsp,DevNullOutputStream.DEV_NULL_OUTPUT_STREAM); 062 } 063 064 public HttpServletResponseWrap(HttpServletResponse rsp,OutputStream out) { 065 super(rsp); 066 this.out=out; 067 } 068 069 /** 070 * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) 071 */ 072 public void addCookie(Cookie cookie) { 073 Cookie[] tmp = new Cookie[cookies.length+1]; 074 for(int i=0;i<cookies.length;i++) { 075 tmp[i]=cookies[i]; 076 } 077 tmp[cookies.length]=cookie; 078 cookies=tmp; 079 } 080 081 /** 082 * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String) 083 */ 084 public boolean containsHeader(String key) { 085 return ReqRspUtil.get(headers, key)!=null; 086 } 087 088 /** 089 * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String) 090 */ 091 public String encodeURL(String value) { 092 return URLEncoder.encode(value); 093 } 094 /** 095 * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String) 096 */ 097 public String encodeRedirectURL(String url) { 098 return URLEncoder.encode(url); 099 } 100 /** 101 * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String) 102 */ 103 public String encodeUrl(String value) { 104 return URLEncoder.encode(value); 105 } 106 /** 107 * @see javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String) 108 */ 109 public String encodeRedirectUrl(String value) { 110 return URLEncoder.encode(value); 111 } 112 113 /* (non-Javadoc) 114 * @see javax.servlet.http.HttpServletResponse#sendError(int, java.lang.String) 115 */ 116 public void sendError(int code, String codeText) throws IOException { 117 // TODO impl 118 } 119 /* (non-Javadoc) 120 * @see javax.servlet.http.HttpServletResponse#sendError(int) 121 */ 122 public void sendError(int code) throws IOException { 123 // TODO impl 124 } 125 126 /** 127 * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String) 128 */ 129 public void sendRedirect(String location) throws IOException { 130 addHeader("location",location); 131 } 132 /** 133 * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, long) 134 */ 135 public void setDateHeader(String key, long value) { 136 setHeader(key, new DateTimeImpl(value,false).castToString()); 137 } 138 139 /** 140 * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, long) 141 */ 142 public void addDateHeader(String key, long value) { 143 addHeader(key, new DateTimeImpl(value,false).castToString()); 144 } 145 146 /** 147 * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String) 148 */ 149 public void setHeader(String key, String value) { 150 headers=ReqRspUtil.set(headers, key, value); 151 } 152 153 /** 154 * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, java.lang.String) 155 */ 156 public void addHeader(String key, String value) { 157 headers=ReqRspUtil.add(headers, key, value); 158 } 159 160 /** 161 * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int) 162 */ 163 public void setIntHeader(String key, int value) { 164 setHeader(key, String.valueOf(value)); 165 } 166 167 /** 168 * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int) 169 */ 170 public void addIntHeader(String key, int value) { 171 addHeader(key, String.valueOf(value)); 172 } 173 /** 174 * @see javax.servlet.http.HttpServletResponse#setStatus(int) 175 */ 176 public void setStatus(int status) { 177 this.status=status; 178 } 179 /** 180 * @see javax.servlet.http.HttpServletResponse#setStatus(int, java.lang.String) 181 */ 182 public void setStatus(int status, String statusCode) { 183 setStatus(status); 184 this.statusCode=statusCode; 185 } 186 187 /** 188 * @see javax.servlet.ServletResponse#getCharacterEncoding() 189 */ 190 public String getCharacterEncoding() { 191 return charset; 192 } 193 194 public void setCharacterEncoding(String charset) { 195 this.charset = charset; 196 } 197 198 /* (non-Javadoc) 199 * @see javax.servlet.ServletResponse#getOutputStream() 200 */ 201 public ServletOutputStream getOutputStream() throws IOException { 202 //if(writer!=null) throw new IOException("output already initallised as Writer"); 203 if(outputStream!=null) return outputStream; 204 return outputStream=new ServletOutputStreamDummy(out); 205 } 206 207 public ServletOutputStream getExistingOutputStream() { 208 return outputStream; 209 } 210 211 /* (non-Javadoc) 212 * @see javax.servlet.ServletResponse#getWriter() 213 */ 214 public PrintWriter getWriter() throws IOException { 215 //if(outputStream!=null) throw new IOException("output already initallised as OutputStream"); 216 if(writer!=null) return writer; 217 return writer= new PrintWriter(getOutputStream()); 218 219 } 220 221 public PrintWriter getExistingWriter() { 222 return writer; 223 } 224 225 226 227 228 /* (non-Javadoc) 229 * @see javax.servlet.ServletResponse#setContentLength(int) 230 */ 231 public void setContentLength(int contentLength) { 232 this.contentLength=contentLength; 233 } 234 /* (non-Javadoc) 235 * @see javax.servlet.ServletResponse#setContentType(java.lang.String) 236 */ 237 public void setContentType(String contentType) { 238 this.contentType=contentType; 239 } 240 /** 241 * @see javax.servlet.ServletResponse#setBufferSize(int) 242 */ 243 public void setBufferSize(int size) { 244 this.bufferSize=size; 245 } 246 /** 247 * @see javax.servlet.ServletResponse#getBufferSize() 248 */ 249 public int getBufferSize() { 250 return bufferSize; 251 } 252 /** 253 * @see javax.servlet.ServletResponse#flushBuffer() 254 */ 255 public void flushBuffer() throws IOException { 256 if(writer!=null)writer.flush(); 257 else if(outputStream!=null)outputStream.flush(); 258 commited = true; 259 } 260 /** 261 * @see javax.servlet.ServletResponse#resetBuffer() 262 */ 263 public void resetBuffer() { 264 commited = true; 265 } 266 /** 267 * @see javax.servlet.ServletResponse#isCommitted() 268 */ 269 public boolean isCommitted() { 270 return commited; 271 } 272 /** 273 * @see javax.servlet.ServletResponse#reset() 274 */ 275 public void reset() { 276 commited = true; 277 } 278 /** 279 * @see javax.servlet.ServletResponse#setLocale(java.util.Locale) 280 */ 281 public void setLocale(Locale locale) { 282 this.locale=locale; 283 } 284 /** 285 * @see javax.servlet.ServletResponse#getLocale() 286 */ 287 public Locale getLocale() { 288 return locale; 289 } 290 291 /** 292 * @return the charset 293 */ 294 public String getCharsetEncoding() { 295 return charset; 296 } 297 298 /** 299 * @return the commited 300 */ 301 public boolean isCommited() { 302 return commited; 303 } 304 305 /** 306 * @return the contentLength 307 */ 308 public int getContentLength() { 309 return contentLength; 310 } 311 312 /** 313 * @return the contentType 314 */ 315 public String getContentType() { 316 return contentType; 317 } 318 319 /** 320 * @return the cookies 321 */ 322 public Cookie[] getCookies() { 323 return cookies; 324 } 325 326 /** 327 * @return the headers 328 */ 329 public Pair[] getHeaders() { 330 return headers; 331 } 332 333 /* * 334 * @return the outputData 335 * / 336 public byte[] getOutputData() { 337 return outputData; 338 } 339 340 public void setOutputData(byte[] outputData) { 341 this.outputData=outputData; 342 }*/ 343 344 /** 345 * @return the status 346 */ 347 public int getStatus() { 348 return status; 349 } 350 351 /** 352 * @return the statusCode 353 */ 354 public String getStatusCode() { 355 return statusCode; 356 } 357 358 359 360 }