blob: ff20cead17989533594159678763c3e52efeaffe [file] [log] [blame]
Dave Borowitz9de65952012-08-13 16:09:45 -07001// Copyright 2012 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles;
16
Dave Borowitze8a5e362013-01-14 16:07:26 -080017import static com.google.common.base.Preconditions.checkArgument;
Dave Borowitzd91bdf72013-01-10 20:07:32 -080018import static com.google.common.base.Preconditions.checkNotNull;
Dave Borowitze8a5e362013-01-14 16:07:26 -080019import static com.google.common.base.Preconditions.checkState;
David Pletcherd7bdaf32014-08-27 14:50:32 -070020import static java.nio.charset.StandardCharsets.UTF_8;
Dave Borowitz9de65952012-08-13 16:09:45 -070021
Dave Borowitzfe8fdab2014-11-04 16:19:33 -080022import com.google.common.collect.Iterables;
23import com.google.common.collect.LinkedListMultimap;
24import com.google.common.collect.ListMultimap;
25import com.google.common.net.HttpHeaders;
Dave Borowitze8a5e362013-01-14 16:07:26 -080026import java.io.ByteArrayOutputStream;
27import java.io.IOException;
David Pursehouse784216f2018-11-08 11:24:18 +090028import java.io.OutputStreamWriter;
Dave Borowitz9de65952012-08-13 16:09:45 -070029import java.io.PrintWriter;
Dave Borowitze8a5e362013-01-14 16:07:26 -080030import java.nio.charset.Charset;
Gerrit Code Review5302fc02021-12-22 13:35:06 -080031import java.util.Collection;
Dave Borowitz9de65952012-08-13 16:09:45 -070032import java.util.Locale;
Dave Borowitz9de65952012-08-13 16:09:45 -070033import javax.servlet.ServletOutputStream;
Gerrit Code Review5302fc02021-12-22 13:35:06 -080034import javax.servlet.WriteListener;
Dave Borowitz9de65952012-08-13 16:09:45 -070035import javax.servlet.http.Cookie;
36import javax.servlet.http.HttpServletResponse;
Dave Borowitz3b744b12016-08-19 16:11:10 -040037import org.eclipse.jgit.util.RawParseUtils;
Dave Borowitz9de65952012-08-13 16:09:45 -070038
39/** Simple fake implementation of {@link HttpServletResponse}. */
40public class FakeHttpServletResponse implements HttpServletResponse {
Dave Borowitze8a5e362013-01-14 16:07:26 -080041 private final ByteArrayOutputStream actualBody = new ByteArrayOutputStream();
42 private final ListMultimap<String, String> headers = LinkedListMultimap.create();
Dave Borowitz9de65952012-08-13 16:09:45 -070043
Dave Borowitze8a5e362013-01-14 16:07:26 -080044 private int status = 200;
45 private boolean committed;
46 private ServletOutputStream outputStream;
47 private PrintWriter writer;
Dave Borowitz9de65952012-08-13 16:09:45 -070048
Dave Borowitzcf38c032016-05-02 11:06:23 -040049 public FakeHttpServletResponse() {}
Dave Borowitz9de65952012-08-13 16:09:45 -070050
51 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -080052 public synchronized void flushBuffer() throws IOException {
53 if (outputStream != null) {
54 outputStream.flush();
55 }
56 if (writer != null) {
57 writer.flush();
58 }
Dave Borowitz9de65952012-08-13 16:09:45 -070059 }
60
61 @Override
62 public int getBufferSize() {
63 throw new UnsupportedOperationException();
64 }
65
66 @Override
67 public String getCharacterEncoding() {
68 return UTF_8.name();
69 }
70
71 @Override
72 public String getContentType() {
73 return null;
74 }
75
76 @Override
77 public Locale getLocale() {
78 return Locale.US;
79 }
80
81 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -080082 public synchronized ServletOutputStream getOutputStream() {
83 checkState(writer == null, "getWriter() already called");
84 if (outputStream == null) {
David Pursehouse784216f2018-11-08 11:24:18 +090085 PrintWriter osWriter = newPrintWriter();
Dave Borowitzcf38c032016-05-02 11:06:23 -040086 outputStream =
87 new ServletOutputStream() {
88 @Override
Gerrit Code Review5302fc02021-12-22 13:35:06 -080089 public boolean isReady() {
90 throw new UnsupportedOperationException();
91 }
92
93 @Override
94 public void setWriteListener(WriteListener listener) {
95 throw new UnsupportedOperationException();
96 }
97
98 @Override
Dave Borowitzcf38c032016-05-02 11:06:23 -040099 public void write(int c) throws IOException {
100 osWriter.write(c);
101 osWriter.flush();
102 }
103 };
Dave Borowitze8a5e362013-01-14 16:07:26 -0800104 }
105 return outputStream;
Dave Borowitz9de65952012-08-13 16:09:45 -0700106 }
107
108 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -0800109 public synchronized PrintWriter getWriter() {
110 checkState(outputStream == null, "getOutputStream() already called");
111 if (writer == null) {
David Pursehouse784216f2018-11-08 11:24:18 +0900112 writer = newPrintWriter();
Dave Borowitze8a5e362013-01-14 16:07:26 -0800113 }
114 return writer;
Dave Borowitz9de65952012-08-13 16:09:45 -0700115 }
116
117 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -0800118 public synchronized boolean isCommitted() {
119 return committed;
Dave Borowitz9de65952012-08-13 16:09:45 -0700120 }
121
122 @Override
123 public void reset() {
124 throw new UnsupportedOperationException();
125 }
126
127 @Override
128 public void resetBuffer() {
129 throw new UnsupportedOperationException();
130 }
131
132 @Override
133 public void setBufferSize(int sz) {
134 throw new UnsupportedOperationException();
135 }
136
137 @Override
138 public void setCharacterEncoding(String name) {
Dave Borowitzcf38c032016-05-02 11:06:23 -0400139 checkArgument(UTF_8.equals(Charset.forName(name)), "unsupported charset: %s", name);
Dave Borowitz9de65952012-08-13 16:09:45 -0700140 }
141
142 @Override
143 public void setContentLength(int length) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800144 headers.removeAll(HttpHeaders.CONTENT_LENGTH);
145 headers.put(HttpHeaders.CONTENT_LENGTH, Integer.toString(length));
Dave Borowitz9de65952012-08-13 16:09:45 -0700146 }
147
148 @Override
Gerrit Code Review5302fc02021-12-22 13:35:06 -0800149 public void setContentLengthLong(long length) {
150 throw new UnsupportedOperationException();
151 }
152
153 @Override
Dave Borowitz9de65952012-08-13 16:09:45 -0700154 public void setContentType(String type) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800155 headers.removeAll(HttpHeaders.CONTENT_TYPE);
156 headers.put(HttpHeaders.CONTENT_TYPE, type);
Dave Borowitz9de65952012-08-13 16:09:45 -0700157 }
158
159 @Override
160 public void setLocale(Locale locale) {
161 throw new UnsupportedOperationException();
162 }
163
164 @Override
165 public void addCookie(Cookie cookie) {
166 throw new UnsupportedOperationException();
167 }
168
169 @Override
170 public void addDateHeader(String name, long value) {
171 throw new UnsupportedOperationException();
172 }
173
174 @Override
175 public void addHeader(String name, String value) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800176 headers.put(name, value);
Dave Borowitz9de65952012-08-13 16:09:45 -0700177 }
178
179 @Override
180 public void addIntHeader(String name, int value) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800181 headers.put(name, Integer.toString(value));
Dave Borowitz9de65952012-08-13 16:09:45 -0700182 }
183
184 @Override
185 public boolean containsHeader(String name) {
Dave Borowitz27058932014-12-03 15:44:46 -0800186 return headers.containsKey(name);
Dave Borowitz9de65952012-08-13 16:09:45 -0700187 }
188
189 @Override
190 public String encodeRedirectURL(String url) {
191 throw new UnsupportedOperationException();
192 }
193
194 @Override
195 @Deprecated
196 public String encodeRedirectUrl(String url) {
197 throw new UnsupportedOperationException();
198 }
199
200 @Override
201 public String encodeURL(String url) {
202 throw new UnsupportedOperationException();
203 }
204
205 @Override
206 @Deprecated
207 public String encodeUrl(String url) {
208 throw new UnsupportedOperationException();
209 }
210
211 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -0800212 public synchronized void sendError(int sc) {
Dave Borowitz9de65952012-08-13 16:09:45 -0700213 status = sc;
Dave Borowitze8a5e362013-01-14 16:07:26 -0800214 committed = true;
Dave Borowitz9de65952012-08-13 16:09:45 -0700215 }
216
217 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -0800218 public synchronized void sendError(int sc, String msg) {
Dave Borowitz9de65952012-08-13 16:09:45 -0700219 status = sc;
Dave Borowitze8a5e362013-01-14 16:07:26 -0800220 committed = true;
Dave Borowitz9de65952012-08-13 16:09:45 -0700221 }
222
223 @Override
Dave Borowitz5d5619d2014-04-18 17:01:45 -0700224 public synchronized void sendRedirect(String loc) {
Dave Borowitz9de65952012-08-13 16:09:45 -0700225 status = SC_FOUND;
Dave Borowitz5d5619d2014-04-18 17:01:45 -0700226 setHeader(HttpHeaders.LOCATION, loc);
Dave Borowitze8a5e362013-01-14 16:07:26 -0800227 committed = true;
Dave Borowitz9de65952012-08-13 16:09:45 -0700228 }
229
230 @Override
231 public void setDateHeader(String name, long value) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800232 setHeader(name, Long.toString(value));
Dave Borowitz9de65952012-08-13 16:09:45 -0700233 }
234
235 @Override
236 public void setHeader(String name, String value) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800237 headers.removeAll(name);
238 addHeader(name, value);
Dave Borowitz9de65952012-08-13 16:09:45 -0700239 }
240
241 @Override
242 public void setIntHeader(String name, int value) {
Dave Borowitze8a5e362013-01-14 16:07:26 -0800243 headers.removeAll(name);
244 addIntHeader(name, value);
Dave Borowitz9de65952012-08-13 16:09:45 -0700245 }
246
247 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -0800248 public synchronized void setStatus(int sc) {
Dave Borowitz9de65952012-08-13 16:09:45 -0700249 status = sc;
Dave Borowitze8a5e362013-01-14 16:07:26 -0800250 committed = true;
Dave Borowitz9de65952012-08-13 16:09:45 -0700251 }
252
253 @Override
254 @Deprecated
Dave Borowitze8a5e362013-01-14 16:07:26 -0800255 public synchronized void setStatus(int sc, String msg) {
Dave Borowitz9de65952012-08-13 16:09:45 -0700256 status = sc;
Dave Borowitze8a5e362013-01-14 16:07:26 -0800257 committed = true;
Dave Borowitz9de65952012-08-13 16:09:45 -0700258 }
259
Gerrit Code Review5302fc02021-12-22 13:35:06 -0800260 @Override
Dave Borowitze8a5e362013-01-14 16:07:26 -0800261 public synchronized int getStatus() {
Dave Borowitz9de65952012-08-13 16:09:45 -0700262 return status;
263 }
Dave Borowitze8a5e362013-01-14 16:07:26 -0800264
265 public byte[] getActualBody() {
266 return actualBody.toByteArray();
267 }
268
269 public String getActualBodyString() {
270 return RawParseUtils.decode(getActualBody());
271 }
Dave Borowitzd91bdf72013-01-10 20:07:32 -0800272
Gerrit Code Review5302fc02021-12-22 13:35:06 -0800273 @Override
Dave Borowitzd91bdf72013-01-10 20:07:32 -0800274 public String getHeader(String name) {
275 return Iterables.getFirst(headers.get(checkNotNull(name)), null);
276 }
David Pursehouse784216f2018-11-08 11:24:18 +0900277
Gerrit Code Review5302fc02021-12-22 13:35:06 -0800278 @Override
279 public Collection<String> getHeaders(String name) {
280 throw new UnsupportedOperationException();
281 }
282
283 @Override
284 public Collection<String> getHeaderNames() {
285 throw new UnsupportedOperationException();
286 }
287
David Pursehouse784216f2018-11-08 11:24:18 +0900288 private PrintWriter newPrintWriter() {
289 return new PrintWriter(new OutputStreamWriter(actualBody, UTF_8));
290 }
Dave Borowitz9de65952012-08-13 16:09:45 -0700291}