Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit 60f09a8

Browse files
author
Adam Lindenthal
committed
Merge pull request #171 from sfuhrm/link-fixes
JERSEY-2879: Link HTTP Header: Fix for comma separated multiple header values
2 parents ef82324 + 306340d commit 60f09a8

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import java.util.Locale;
6060
import java.util.Map;
6161
import java.util.Set;
62+
import java.util.StringTokenizer;
6263

6364
import javax.ws.rs.ProcessingException;
6465
import javax.ws.rs.core.Cookie;
@@ -653,8 +654,29 @@ public Set<Link> getLinks() {
653654

654655
try {
655656
Set<Link> result = new HashSet<Link>(links.size());
656-
for (String l : links) {
657-
result.add(Link.valueOf(l));
657+
StringBuilder linkString;
658+
for (String link : links) {
659+
linkString = new StringBuilder();
660+
StringTokenizer st = new StringTokenizer(link, "<>,", true);
661+
boolean linkOpen = false;
662+
while (st.hasMoreTokens()) {
663+
String n = st.nextToken();
664+
if (n.equals("<")) {
665+
linkOpen = true;
666+
} else if (n.equals(">")) {
667+
linkOpen = false;
668+
} else if (!linkOpen && n.equals(",")) {
669+
result.add(Link.valueOf(linkString.toString().trim()));
670+
linkString = new StringBuilder();
671+
continue; // don't add the ","
672+
}
673+
674+
linkString.append(n);
675+
}
676+
677+
if (linkString.length() > 0) {
678+
result.add(Link.valueOf(linkString.toString().trim()));
679+
}
658680
}
659681
return result;
660682
} catch (IllegalArgumentException e) {

core-common/src/test/java/org/glassfish/jersey/message/internal/InboundMessageContextTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,49 @@ public void testGetLinks() {
195195
assertTrue(r.getLinks().contains(link2));
196196
}
197197

198+
@Test
199+
public void testGetLinksWithCommaInUri() {
200+
InboundMessageContext r = createInboundMessageContext();
201+
Link link1 = Link.fromUri("http://example.org/app/foo,bar").param("produces", "application/json").param("method",
202+
"GET").rel("self").build();
203+
r.header("Link", link1.toString());
204+
assertEquals(1, r.getLinks().size());
205+
assertTrue(r.getLinks().contains(link1));
206+
}
207+
208+
@Test
209+
public void testGetLinksWithMultipleLinksInOneHeaderAndCommaInUri() {
210+
InboundMessageContext r = createInboundMessageContext();
211+
Link link1 = Link.fromUri("https://example.org/one/api/groups?foo,page=2").rel("next").build();
212+
Link link2 = Link.fromUri("https://example.org/one/api/groups?bar,page=39").rel("last").build();
213+
r.header("Link", "<https://example.org/one/api/groups?foo,page=2>; rel=\"next\", <https://example.org/one/api/groups?bar,page=39>; rel=\"last\"");
214+
assertEquals(2, r.getLinks().size());
215+
assertTrue(r.getLinks().contains(link1));
216+
assertTrue(r.getLinks().contains(link2));
217+
}
218+
219+
@Test
220+
public void testGetLinksWithMultipleLinksInOneHeader() {
221+
InboundMessageContext r = createInboundMessageContext();
222+
Link link1 = Link.fromUri("https://example.org/one/api/groups?page=2").rel("next").build();
223+
Link link2 = Link.fromUri("https://example.org/one/api/groups?page=39").rel("last").build();
224+
r.header("Link", "<https://example.org/one/api/groups?page=2>; rel=\"next\", <https://example.org/one/api/groups?page=39>; rel=\"last\"");
225+
assertEquals(2, r.getLinks().size());
226+
assertTrue(r.getLinks().contains(link1));
227+
assertTrue(r.getLinks().contains(link2));
228+
}
229+
230+
@Test
231+
public void testGetLinksWithMultipleLinksInOneHeaderWithLtInValue() {
232+
InboundMessageContext r = createInboundMessageContext();
233+
Link link1 = Link.fromUri("https://example.org/one/api/groups?page=2").rel("next").param("foo", "<bar>").build();
234+
Link link2 = Link.fromUri("https://example.org/one/api/groups?page=39").rel("last").param("bar", "<<foo").build();
235+
r.header("Link", "<https://example.org/one/api/groups?page=2>; rel=\"next\"; foo=\"<bar>\", <https://example.org/one/api/groups?page=39>; rel=\"last\"; bar=\"<<foo\"");
236+
assertEquals(2, r.getLinks().size());
237+
assertTrue(r.getLinks().contains(link1));
238+
assertTrue(r.getLinks().contains(link2));
239+
}
240+
198241
@Test
199242
public void testGetLink() {
200243
InboundMessageContext r = createInboundMessageContext();

0 commit comments

Comments
 (0)