From efde43a5117aac7deea66acef1fb846075844eb3 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 15 Feb 2023 10:26:29 +0100 Subject: [PATCH] #1902 - Fix link header parsing for multiple links and unquoted attribute values. Fixed the regular expression to parse link header values to properly consider the comma to end an unquoted attribute value, too. Couple of additional unit tests, too. --- src/main/java/org/springframework/hateoas/Links.java | 9 ++++----- .../java/org/springframework/hateoas/LinksUnitTest.java | 9 ++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/Links.java b/src/main/java/org/springframework/hateoas/Links.java index 7c2b99b1..f0c57021 100644 --- a/src/main/java/org/springframework/hateoas/Links.java +++ b/src/main/java/org/springframework/hateoas/Links.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Supplier; -import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collector; import java.util.stream.Collectors; @@ -45,7 +44,7 @@ import com.fasterxml.jackson.annotation.JsonValue; public class Links implements Iterable { public static final Links NONE = new Links(Collections.emptyList()); - private static final Pattern LINK_HEADER_PATTERN = Pattern.compile("(<[^>]*>(;\\s*\\w+=\"?[^\"]*\"?)+)"); + private static final Pattern LINK_HEADER_PATTERN = Pattern.compile("(<[^>]*>(;\\s*\\w+=\"?[^\",]*\"?)+)"); private final List links; @@ -91,12 +90,12 @@ public class Links implements Iterable { return NONE; } - Matcher matcher = LINK_HEADER_PATTERN.matcher(source); - List links = new ArrayList<>(); + var links = new ArrayList(); + var matcher = LINK_HEADER_PATTERN.matcher(source); while (matcher.find()) { - Link link = Link.valueOf(matcher.group()); + var link = Link.valueOf(matcher.group()); if (link != null) { links.add(link); diff --git a/src/test/java/org/springframework/hateoas/LinksUnitTest.java b/src/test/java/org/springframework/hateoas/LinksUnitTest.java index 79c9d503..5864e000 100755 --- a/src/test/java/org/springframework/hateoas/LinksUnitTest.java +++ b/src/test/java/org/springframework/hateoas/LinksUnitTest.java @@ -55,10 +55,13 @@ class LinksUnitTest { Link.of("/somethingElse", "bar").withHreflang("de")); // #1899 - static final String FIVE = ";rel=boo"; + static final String FIVE = ";rel=boo"; static final String SIX = "; rel=bee"; - static final String LINKS3 = StringUtils.collectionToCommaDelimitedString(Arrays.asList(FIVE, SIX)); - static final Links reference3 = Links.of(Link.of("/somethingElse", "boo"), Link.of("/somethingElse", "bee")); + static final String SEVEN = ";rel=beeboo;title=sometitle"; + static final String LINKS3 = StringUtils.collectionToCommaDelimitedString(Arrays.asList(FIVE, SIX, SEVEN)); + static final Links reference3 = Links.of(Link.of("/somethingElse?foo=one,two", "boo"), // + Link.of("/somethingElse", "bee"), + Link.of("/somethingElse", "beeboo").withTitle("sometitle")); @Test void parsesLinkHeaderLinks() {