[java-support] 13/15: Unit tests and bug fixes.

Scott Cantor cantor.2 at osu.edu
Mon Apr 18 20:50:09 UTC 2022


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch dev/JSPT-111
in repository java-support.

View the commit online:
http://git.shibboleth.net/view/?p=java-support.git;a=commit;h=3df82f96413c6fa02ba0de544e8f34d303dd87b7

commit 3df82f96413c6fa02ba0de544e8f34d303dd87b7
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Sun Sep 19 19:04:34 2021 -0400

    Unit tests and bug fixes.
---
 .../support/ddf/RemotedHttpServletResponse.java    |  53 ++++----
 .../support/ddf/RemotedHttpServletRequestTest.java |   1 -
 .../ddf/RemotedHttpServletResponseTest.java        | 141 +++++++++++++++++++++
 3 files changed, 172 insertions(+), 23 deletions(-)

diff --git a/src/main/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponse.java b/src/main/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponse.java
index d77a04e..4749548 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponse.java
+++ b/src/main/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponse.java
@@ -19,7 +19,6 @@ package net.shibboleth.utilities.java.support.ddf;
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.net.HttpCookie;
 import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
 import java.time.Instant;
@@ -68,6 +67,7 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
      */
     public RemotedHttpServletResponse(final DDF ddf) {
         obj = Constraint.isNotNull(ddf, "DDF cannot be null");
+        obj.structure();
         bufferSize = 1024;
     }
     
@@ -171,16 +171,27 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
 
     /** {@inheritDoc} */
     public void addCookie(final Cookie cookie) {
-        // Use HttpCookie class to generate the header.
         // The C++ side already manages SameSite independently, so we'll likely continue that.
-        final HttpCookie helper = new HttpCookie(cookie.getName(), cookie.getValue());
-        helper.setDomain(cookie.getDomain());
-        helper.setHttpOnly(cookie.isHttpOnly());
-        helper.setMaxAge(cookie.getMaxAge());
-        helper.setPath(cookie.getPath());
-        helper.setSecure(cookie.getSecure());
-        helper.setVersion(cookie.getVersion());
-        addHeader("Cookie", helper.toString());
+        final StringBuffer buffer = new StringBuffer(cookie.getName()).append('=');
+        if (cookie.getValue() != null) {
+            buffer.append(cookie.getValue());
+        }
+        if (cookie.getMaxAge() >= 0) {
+            buffer.append("; MaxAge=").append(cookie.getMaxAge());
+        }
+        if (cookie.getPath() != null) {
+            buffer.append("; ").append("Path=").append(cookie.getPath());
+        }
+        if (cookie.getDomain() != null) {
+            buffer.append("; ").append("Domain=").append(cookie.getDomain());
+        }
+        if (cookie.getSecure()) {
+            buffer.append("; Secure");
+        }
+        if (cookie.isHttpOnly()) {
+            buffer.append("; HttpOnly");
+        }
+        addHeader("Set-Cookie", buffer.toString());
     }
 
     /** {@inheritDoc} */
@@ -229,11 +240,7 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
             throw new IllegalStateException("Response already committed");
         }
 
-        if (!obj.isstruct()) {
-            obj.structure();
-        } else {
-            obj.getmember("response").remove();
-        }
+        obj.getmember("response").remove();
         obj.addmember("redirect").unsafe_string(location);
         committed = true;
         outputStream = null;
@@ -276,9 +283,6 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
 
     /** {@inheritDoc} */
     public void setStatus(final int sc) {
-        if (!obj.isstruct()) {
-            obj.structure();
-        }
         obj.addmember("response.status").integer(sc);
     }
 
@@ -302,7 +306,10 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
                     .filter(ddf -> name.equalsIgnoreCase(ddf.name()))
                     .findFirst();
         if (header.isPresent()) {
-            return header.orElseThrow().string();
+            if (header.orElseThrow().isstring()) {
+                return header.orElseThrow().string();
+            }
+            return header.orElseThrow().integer().toString();
         }
         
         return null;
@@ -354,11 +361,12 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
         if (committed) {
             throw new IllegalStateException("Response already committed");
         }
+        
         final DDF headers = obj.getmember("headers");
-        if (!headers.islist()) {
-            headers.list();
+        if (headers.islist()) {
+            return headers;
         }
-        return headers;
+        return obj.addmember("headers").list();
     }
 
     /** Wrapper allowing use of containers of arrays. */
@@ -431,6 +439,7 @@ public class RemotedHttpServletResponse implements HttpServletResponse {
             final StringBuffer sink = new StringBuffer();
             bufferList.forEach(b -> b.flush(sink));
             obj.addmember("response.data").unsafe_string(sink.toString());
+            committed = true;
         }
 
         @Override
diff --git a/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletRequestTest.java b/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletRequestTest.java
index c0c03c1..2fccdc9 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletRequestTest.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletRequestTest.java
@@ -20,7 +20,6 @@ package net.shibboleth.utilities.java.support.ddf;
 import static org.testng.Assert.*;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
 
 import javax.servlet.http.Cookie;
diff --git a/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponseTest.java b/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponseTest.java
new file mode 100644
index 0000000..ab29db0
--- /dev/null
+++ b/src/test/java/net/shibboleth/utilities/java/support/ddf/RemotedHttpServletResponseTest.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.utilities.java.support.ddf;
+
+import static org.testng.Assert.*;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.time.Instant;
+import java.util.Set;
+
+import javax.servlet.http.Cookie;
+
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * Unit test for {@link RemotedHttpServletResponse}.
+ */
+public class RemotedHttpServletResponseTest {
+    
+    private DDF obj;
+    private RemotedHttpServletResponse resp;
+    
+    @BeforeMethod
+    public void setUp() {
+        obj = new DDF();
+        resp = new RemotedHttpServletResponse(obj);
+    }
+    
+    @Test
+    public void testBasics() throws IOException {
+        
+        resp.setContentType("text/xml");
+        resp.setHeader("Cache-Control", "private");
+        resp.addHeader("foo", "foo");
+        resp.setHeader("Foo", "bar");
+        resp.addDateHeader("Foo", Instant.now().toEpochMilli());
+        resp.addIntHeader("Bar", 42);
+        resp.setContentLength(42);
+        
+        final Cookie cookie = new Cookie("cookie1", "value1");
+        cookie.setSecure(true);
+        cookie.setHttpOnly(true);
+        cookie.setPath("/idp");
+        resp.addCookie(cookie);
+        
+        assertEquals(resp.getContentType(), "text/xml");
+        assertEquals((Set<String>) resp.getHeaderNames(), Set.of("Content-Type", "Cache-Control", "Foo", "Bar", "Content-Length", "Set-Cookie"));
+        assertTrue(resp.getHeaders("foo").contains("bar"));
+        assertEquals(resp.getHeader("Bar"), "42");
+        
+        final DDF headers = obj.getmember("headers");
+        assertTrue(headers.islist());
+        final DDF cheader = headers.asList().stream().filter(ddf -> "Set-Cookie".equalsIgnoreCase(ddf.name())).findFirst().orElseThrow();
+        assertEquals(cheader.string(), "cookie1=value1; Path=/idp; Secure; HttpOnly");
+    }
+
+    @Test
+    public void testRedirect() throws IOException {
+        resp.sendRedirect("http://localhost");
+
+        assertTrue(resp.isCommitted());
+        assertEquals(obj.getmember("redirect").string(), "http://localhost");
+        
+        try {
+            resp.getOutputStream();
+            fail("Response should have been committed.");
+        } catch (final IllegalStateException e) {
+            
+        }
+    }
+    
+    @Test
+    public void testResponseStream() throws IOException {
+        resp.setBufferSize(3);
+        resp.setStatus(200);
+        try (final OutputStream os = resp.getOutputStream()) {
+            os.write("zorkmid".getBytes());
+        }
+        
+        assertTrue(resp.isCommitted());
+        assertEquals(obj.getmember("response.status").integer(), Integer.valueOf(200));
+        assertEquals(obj.getmember("response.data").string(), "zorkmid");
+    }
+    
+    @Test
+    public void testResponseStream2() throws IOException {
+        resp.setBufferSize(3);
+        resp.setStatus(200);
+        try (final OutputStream os = resp.getOutputStream()) {
+            os.write("zorkmid☯️".getBytes("ISO-8859-1"));
+        }
+        
+        assertTrue(resp.isCommitted());
+        assertEquals(obj.getmember("response.status").integer(), Integer.valueOf(200));
+        assertEquals(obj.getmember("response.data").string().getBytes("ISO-8859-1"), "zorkmid☯️".getBytes("ISO-8859-1"));
+    }
+    
+    @Test
+    public void testWriter() throws IOException {
+        resp.setBufferSize(3);
+        resp.setStatus(200);
+        try (final PrintWriter pw = resp.getWriter()) {
+            pw.print("zorkmid");
+        }
+        
+        assertTrue(resp.isCommitted());
+        assertEquals(obj.getmember("response.status").integer(), Integer.valueOf(200));
+        assertEquals(obj.getmember("response.data").string(), "zorkmid");
+    }
+
+    @Test(enabled=false)
+    public void testWriter2() throws IOException {
+        resp.setBufferSize(3);
+        resp.setStatus(200);
+        try (final PrintWriter pw = resp.getWriter()) {
+            pw.print("zorkmid☯️");
+        }
+        
+        assertTrue(resp.isCommitted());
+        assertEquals(obj.getmember("response.status").integer(), Integer.valueOf(200));
+        assertEquals(obj.getmember("response.data").string(), "zorkmid☯️");
+    }
+}
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list