001 package org.shiftone.jrat.http;
002
003 import org.shiftone.jrat.util.log.Logger;
004
005 import java.io.IOException;
006 import java.io.OutputStream;
007 import java.io.OutputStreamWriter;
008 import java.io.Writer;
009
010 /**
011 * @author jeff@shiftone.org (Jeff Drost)
012 */
013 public class Response {
014
015 private static final Logger LOG = Logger.getLogger(Response.class);
016 private final OutputStream outputStream;
017 private final Writer writer;
018 private final ResponseWriter responseWriter = new ResponseWriter();
019 private final ResponseOutputStream responseOutputStream = new ResponseOutputStream();
020 private boolean committed = false;
021 private Status status = Status.OK;
022 private String contentType;
023
024
025 public Response(OutputStream outputStream) {
026 this.outputStream = outputStream;
027 this.writer = new OutputStreamWriter(outputStream);
028
029 }
030
031 public Writer getWriter() {
032 return responseWriter;
033 }
034
035
036 public OutputStream getOutputStream() {
037 return responseOutputStream;
038 }
039
040 public void setStatus(Status status) {
041 this.status = status;
042 }
043
044 public void setContentType(String contentType) {
045 this.contentType = contentType;
046 }
047
048 public void flush() throws IOException {
049 commit();
050 writer.flush();
051 }
052
053 private void writeHeaders() throws IOException {
054
055 String statusLine = "HTTP/1.1 " + status.getCode() + " " + status.getMessage();
056 LOG.info(statusLine);
057
058 writer.write(statusLine + "\n");
059 writer.write("Content-Type: " + contentType + "\n");
060 writer.write("Cache-Control: no-store, no-cache, must-revalidate\n"); // normal
061 writer.write("Cache-Control: post-check=0, pre-check=0"); // IE
062 writer.write("Pragma: no-cache\n"); // good luck
063 writer.write("Expires: Sat, 6 May 1995 12:00:00 GMT\n"); // more lock
064
065 writer.write("\n");
066 writer.flush();
067
068 }
069
070 private void commit() throws IOException {
071
072 if (!committed) {
073 writeHeaders();
074 committed = true;
075 }
076 }
077
078 private class ResponseOutputStream extends OutputStream {
079
080 public void write(int b) throws IOException {
081 commit();
082 outputStream.write(b);
083 }
084
085 public void write(byte b[]) throws IOException {
086 commit();
087 outputStream.write(b);
088 }
089
090 public void write(byte b[], int off, int len) throws IOException {
091 commit();
092 outputStream.write(b, off, len);
093 }
094
095 public void flush() throws IOException {
096 commit();
097 outputStream.flush();
098 }
099
100 public void close() throws IOException {
101 commit();
102 outputStream.close();
103 }
104 }
105
106 private class ResponseWriter extends Writer {
107
108
109 public void write(char cbuf[], int off, int len) throws IOException {
110 commit();
111 writer.write(cbuf, off, len);
112 }
113
114 public void flush() throws IOException {
115 commit();
116 writer.flush();
117 }
118
119 public void close() throws IOException {
120 commit();
121 writer.close();
122 }
123
124 public void write(int c) throws IOException {
125 commit();
126 super.write(c);
127 }
128
129 public void write(char cbuf[]) throws IOException {
130 commit();
131 super.write(cbuf);
132 }
133
134 public void write(String str) throws IOException {
135 commit();
136 super.write(str);
137 }
138
139 public void write(String str, int off, int len) throws IOException {
140 commit();
141 super.write(str, off, len);
142 }
143 }
144
145 }