1 package com.bradmcevoy.http;
2
3 import java.io.IOException;
4 import java.util.Date;
5 import java.util.List;
6
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9
10 public abstract class AbstractResponse implements Response {
11
12 private static final Logger log = LoggerFactory.getLogger(AbstractResponse.class);
13 protected Long contentLength;
14
15 public AbstractResponse() {
16 }
17
18 public void setResponseHeader(Response.Header header, String value) {
19
20 setNonStandardHeader(header.code, value);
21 }
22
23 public String getResponseHeader(Response.Header header) {
24 return getNonStandardHeader(header.code);
25 }
26
27 public void setContentEncodingHeader(ContentEncoding encoding) {
28 setResponseHeader(Response.Header.CONTENT_ENCODING, encoding.code);
29 }
30
31 public Long getContentLength() {
32 return contentLength;
33 }
34
35 public void setDateHeader(Date date) {
36 setAnyDateHeader(Header.DATE, date);
37 }
38
39
40
41
42
43 public void setContentRangeHeader(long start, long finish, Long totalLength) {
44 String l = totalLength == null ? "*" : totalLength.toString();
45
46 String s = null;
47 if (finish > -1) {
48 s = "bytes " + start + "-" + finish + "/" + l;
49 } else {
50 long wrotetill = totalLength.longValue() - 1;
51
52 s = "bytes " + start + "-" + wrotetill + "/" + l;
53 }
54
55
56 setResponseHeader(Header.CONTENT_RANGE, s);
57 }
58
59 public void setContentLengthHeader(Long totalLength) {
60 String s = totalLength == null ? "" : totalLength.toString();
61 setResponseHeader(Header.CONTENT_LENGTH, s);
62 this.contentLength = totalLength;
63
64 }
65
66 public void setContentTypeHeader(String type) {
67 setResponseHeader(Header.CONTENT_TYPE, type);
68 }
69
70 public String getContentTypeHeader() {
71 return getResponseHeader(Header.CONTENT_TYPE);
72 }
73
74 public void setCacheControlMaxAgeHeader(Long delta) {
75 if (delta != null) {
76 setResponseHeader(Header.CACHE_CONTROL, CacheControlResponse.MAX_AGE.code + "=" + delta);
77 } else {
78 setResponseHeader(Header.CACHE_CONTROL, CacheControlResponse.NO_CACHE.code);
79 }
80 }
81
82 public void setCacheControlPrivateMaxAgeHeader(Long delta) {
83 if (delta != null) {
84 setResponseHeader(Header.CACHE_CONTROL, CacheControlResponse.PRIVATE.code + " " + CacheControlResponse.MAX_AGE.code + "=" + delta);
85 } else {
86 setResponseHeader(Header.CACHE_CONTROL, CacheControlResponse.PRIVATE.code);
87 }
88 }
89
90 public void setExpiresHeader(Date expiresAt) {
91 if (expiresAt == null) {
92 setResponseHeader(Header.EXPIRES, null);
93 } else {
94 setAnyDateHeader(Header.EXPIRES, expiresAt);
95 }
96 }
97
98 public void setEtag(String uniqueId) {
99 setResponseHeader(Header.ETAG, uniqueId);
100 }
101
102 public void setLastModifiedHeader(Date date) {
103 setAnyDateHeader(Header.LAST_MODIFIED, date);
104 }
105
106 public void setCacheControlNoCacheHeader() {
107 setResponseHeader(Header.CACHE_CONTROL, CacheControlResponse.NO_CACHE.code);
108 }
109
110 public void setLocationHeader(String redirectUrl) {
111 setResponseHeader(Header.LOCATION, redirectUrl);
112 }
113
114 public void setAllowHeader(List<String> methodsAllowed) {
115 if (methodsAllowed == null || methodsAllowed.size() == 0) {
116 return;
117 }
118 StringBuilder sb = null;
119 for (String m : methodsAllowed) {
120 if (sb == null) {
121 sb = new StringBuilder();
122 } else {
123 sb.append(",");
124 }
125 sb.append(m);
126 }
127 setResponseHeader(Header.ALLOW, sb.toString());
128 }
129
130 public void setLockTokenHeader(String s) {
131 setResponseHeader(Header.LOCK_TOKEN, s);
132 }
133
134 public void setDavHeader(String supportedLevels) {
135 setResponseHeader(Header.DAV, supportedLevels);
136 }
137
138 public void setVaryHeader(String value) {
139 setResponseHeader(Header.VARY, value);
140 }
141
142 public void close() {
143 }
144
145 public void sendRedirect(String url) {
146 if (log.isTraceEnabled()) {
147 log.trace("sendRedirect: " + url);
148 }
149 setStatus(Response.Status.SC_MOVED_TEMPORARILY);
150 setLocationHeader(url);
151 }
152
153 public void write(String s) {
154 try {
155 this.getOutputStream().write(s.getBytes());
156 } catch (IOException ex) {
157 log.warn("Exception writing to output. Probably client closed connection", ex);
158 }
159 }
160
161 protected void setAnyDateHeader(Header name, Date date) {
162 if (date == null) {
163 return;
164 }
165 String fmt = DateUtils.formatForHeader(date);
166 setResponseHeader(name, fmt);
167
168 }
169 }