1616
1717package org .gaul .httpbin ;
1818
19+ import java .io .ByteArrayOutputStream ;
1920import java .io .IOException ;
2021import java .io .InputStream ;
2122import java .io .OutputStream ;
2223import java .io .OutputStreamWriter ;
2324import java .io .Writer ;
2425import java .nio .charset .StandardCharsets ;
2526import java .util .Collections ;
27+ import java .util .Enumeration ;
2628
29+ import javax .servlet .http .Cookie ;
2730import javax .servlet .http .HttpServletRequest ;
2831import javax .servlet .http .HttpServletResponse ;
2932
3033import org .eclipse .jetty .server .Request ;
3134import org .eclipse .jetty .server .handler .AbstractHandler ;
35+ import org .json .JSONException ;
36+ import org .json .JSONObject ;
3237import org .slf4j .Logger ;
3338import 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