Skip to content

Commit 93e67d8

Browse files
snorpgaul
authored andcommitted
Integrate @snorp changes
This gives parity with Mozilla fork. Fixes #2.
1 parent b167961 commit 93e67d8

2 files changed

Lines changed: 109 additions & 0 deletions

File tree

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@
280280
<artifactId>jetty-servlet</artifactId>
281281
<version>${jetty.version}</version>
282282
</dependency>
283+
<dependency>
284+
<groupId>org.json</groupId>
285+
<artifactId>json</artifactId>
286+
<version>20180813</version>
287+
</dependency>
283288
<dependency>
284289
<groupId>org.slf4j</groupId>
285290
<artifactId>slf4j-api</artifactId>

src/main/java/org/gaul/httpbin/HttpBinHandler.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,24 @@
1616

1717
package org.gaul.httpbin;
1818

19+
import java.io.ByteArrayOutputStream;
1920
import java.io.IOException;
2021
import java.io.InputStream;
2122
import java.io.OutputStream;
2223
import java.io.OutputStreamWriter;
2324
import java.io.Writer;
2425
import java.nio.charset.StandardCharsets;
2526
import java.util.Collections;
27+
import java.util.Enumeration;
2628

29+
import javax.servlet.http.Cookie;
2730
import javax.servlet.http.HttpServletRequest;
2831
import javax.servlet.http.HttpServletResponse;
2932

3033
import org.eclipse.jetty.server.Request;
3134
import org.eclipse.jetty.server.handler.AbstractHandler;
35+
import org.json.JSONException;
36+
import org.json.JSONObject;
3237
import org.slf4j.Logger;
3338
import org.slf4j.LoggerFactory;
3439

@@ -78,6 +83,22 @@ public void handle(String target, Request baseRequest,
7883
servletResponse.setStatus(HttpServletResponse.SC_OK);
7984
baseRequest.setHandled(true);
8085
return;
86+
} else if (uri.equals("/redirect-to")) {
87+
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
88+
redirectTo(servletResponse, request.getParameter("url"));
89+
baseRequest.setHandled(true);
90+
} else if (uri.startsWith("/redirect/")) {
91+
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
92+
93+
int count = Integer.parseInt(uri.substring(
94+
"/redirect/".length())) - 1;
95+
if (count > 0) {
96+
redirectTo(servletResponse, "/redirect/" + count);
97+
} else {
98+
servletResponse.setStatus(HttpServletResponse.SC_OK);
99+
}
100+
101+
baseRequest.setHandled(true);
81102
} else if (method.equals("GET") &&
82103
uri.equals("/response-headers")) {
83104
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
@@ -89,9 +110,92 @@ public void handle(String target, Request baseRequest,
89110
servletResponse.setStatus(HttpServletResponse.SC_OK);
90111
baseRequest.setHandled(true);
91112
return;
113+
} else if (uri.equals("/cookies")) {
114+
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
115+
116+
JSONObject cookies = new JSONObject();
117+
118+
if (request.getCookies() != null) {
119+
for (Cookie cookie : request.getCookies()) {
120+
cookies.put(cookie.getName(), cookie.getValue());
121+
}
122+
}
123+
124+
JSONObject response = new JSONObject();
125+
response.put("cookies", cookies);
126+
127+
respondJSON(servletResponse, os, response);
128+
baseRequest.setHandled(true);
129+
} else if (uri.startsWith("/cookies/set/")) {
130+
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
131+
132+
String[] parts = uri.substring("/cookies/set/".length()).split(
133+
"/");
134+
135+
servletResponse.addHeader("Set-Cookie",
136+
String.format("%s=%s; Path=/", parts[0], parts[1]));
137+
138+
servletResponse.setHeader("Location", "/cookies");
139+
servletResponse.setStatus(
140+
HttpServletResponse.SC_MOVED_TEMPORARILY);
141+
baseRequest.setHandled(true);
142+
} else if (uri.startsWith("/basic-auth")) {
143+
Utils.copy(is, Utils.NULL_OUTPUT_STREAM);
144+
145+
// FIXME: we don't actually check the username/password here
146+
servletResponse.addHeader("WWW-Authenticate",
147+
"Basic realm=\"Fake Realm\"");
148+
servletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
149+
baseRequest.setHandled(true);
150+
} else if (uri.equals("/anything")) {
151+
servletResponse.setStatus(HttpServletResponse.SC_OK);
152+
baseRequest.setHandled(true);
153+
154+
final JSONObject response = new JSONObject();
155+
156+
// Method
157+
response.put("method", method);
158+
159+
// Headers
160+
final JSONObject headers = new JSONObject();
161+
response.put("headers", headers);
162+
163+
for (Enumeration<String> names = request.getHeaderNames();
164+
names.hasMoreElements();) {
165+
final String name = names.nextElement();
166+
headers.put(name, request.getHeader(name));
167+
}
168+
169+
// Body data
170+
final ByteArrayOutputStream data = new ByteArrayOutputStream();
171+
Utils.copy(is, data);
172+
173+
response.put("data", data.toString("UTF-8"));
174+
respondJSON(servletResponse, os, response);
175+
baseRequest.setHandled(true);
92176
}
93177
servletResponse.setStatus(501);
94178
baseRequest.setHandled(true);
179+
} catch (JSONException e) {
180+
servletResponse.setStatus(500);
181+
baseRequest.setHandled(true);
95182
}
96183
}
184+
185+
private static void respondJSON(HttpServletResponse response,
186+
OutputStream os, JSONObject obj) throws IOException {
187+
final byte[] body = obj.toString().getBytes();
188+
189+
response.setContentLength(body.length);
190+
response.setContentType("application/json");
191+
response.setStatus(HttpServletResponse.SC_OK);
192+
os.write(body);
193+
os.flush();
194+
}
195+
196+
private static void redirectTo(HttpServletResponse response,
197+
String location) {
198+
response.setHeader("Location", location);
199+
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
200+
}
97201
}

0 commit comments

Comments
 (0)