[java-support] 13/21: Unit tests and bug fixes.
Scott Cantor
cantor.2 at osu.edu
Thu Jun 2 14:39:00 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=6bbe1b1f6762d7d36e45f28081ccb30834bdaeb0
commit 6bbe1b1f6762d7d36e45f28081ccb30834bdaeb0
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