You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2013/10/23 00:26:09 UTC

svn commit: r1534825 - in /sling/trunk/bundles/servlets/post/src: main/java/org/apache/sling/servlets/post/AbstractPostResponse.java test/java/org/apache/sling/servlets/post/JsonResponseTest.java

Author: fmeschbe
Date: Tue Oct 22 22:26:08 2013
New Revision: 1534825

URL: http://svn.apache.org/r1534825
Log:
SLING-3201 Redirect after post not possible

Make sure the Location header is set not only for the
201/CREATED status but also for any of the 3xx stati.

Modified:
    sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/AbstractPostResponse.java
    sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java

Modified: sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/AbstractPostResponse.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/AbstractPostResponse.java?rev=1534825&r1=1534824&r2=1534825&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/AbstractPostResponse.java (original)
+++ sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/AbstractPostResponse.java Tue Oct 22 22:26:08 2013
@@ -317,8 +317,8 @@ public abstract class AbstractPostRespon
                 int statusCode = ((Number) status).intValue();
                 response.setStatus(statusCode);
 
-                // special treatment of 201/CREATED: Requires Location
-                if (statusCode == HttpServletResponse.SC_CREATED) {
+                // special treatment of 201/CREATED and 3xx: Requires Location
+                if (statusCode == HttpServletResponse.SC_CREATED || statusCode / 100 == 3) {
                     response.setHeader("Location", getLocation());
                 }
             }

Modified: sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java?rev=1534825&r1=1534824&r2=1534825&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java (original)
+++ sling/trunk/bundles/servlets/post/src/test/java/org/apache/sling/servlets/post/JsonResponseTest.java Tue Oct 22 22:26:08 2013
@@ -18,6 +18,8 @@
 package org.apache.sling.servlets.post;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -75,6 +77,33 @@ public class JsonResponseTest extends Te
         assertEquals(JSONResponse.RESPONSE_CHARSET, response.getCharacterEncoding());
     }
 
+    public void testSend_201() throws Exception {
+        final String location = "http://example.com/test_location";
+        res.onChange("modified", "argument1");
+        res.setStatus(HttpServletResponse.SC_CREATED, "Created");
+        res.setLocation(location);
+        MockResponseWithHeader response = new MockResponseWithHeader();
+        res.send(response, true);
+        JSONObject result = new JSONObject(response.getOutput().toString());
+        assertProperty(result, HtmlResponse.PN_STATUS_CODE, HttpServletResponse.SC_CREATED);
+        assertEquals(location, response.getHeader("Location"));
+    }
+
+    public void testSend_3xx() throws Exception {
+        final String location = "http://example.com/test_location";
+        res.onChange("modified", "argument1");
+
+        for (int status = 300; status < 308; status++) {
+            res.setStatus(status, "3xx Status");
+            res.setLocation(location);
+            MockResponseWithHeader response = new MockResponseWithHeader();
+            res.send(response, true);
+            JSONObject result = new JSONObject(response.getOutput().toString());
+            assertProperty(result, HtmlResponse.PN_STATUS_CODE, status);
+            assertEquals(location, response.getHeader("Location"));
+        }
+    }
+
     private static <T> T assertProperty(JSONObject obj, String key, Class<T> clazz) throws JSONException {
         assertTrue("JSON object does not have property " + key, obj.has(key));
         return assertInstanceOf(obj.get(key), clazz);
@@ -97,4 +126,23 @@ public class JsonResponseTest extends Te
         }
     }
 
+    private static class MockResponseWithHeader extends MockSlingHttpServletResponse {
+        private final Map<String, Object> headers = new HashMap<String, Object>();
+
+        @Override
+        public void setHeader(String name, String value) {
+            this.headers.put(name, value);
+        }
+
+        public String getHeader(String name) {
+            Object result = this.headers.get(name);
+            if (result instanceof String) {
+                return (String) result;
+            } else if (result instanceof String[]) {
+                return ((String[]) result)[0];
+            } else {
+                return null;
+            }
+        }
+    }
 }