]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-17150 fix SSF-39
authorPierre <pierre.guillot@sonarsource.com>
Fri, 5 Aug 2022 08:21:39 +0000 (10:21 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 8 Aug 2022 20:03:03 +0000 (20:03 +0000)
server/sonar-auth-common/src/main/java/org/sonar/auth/OAuthRestClient.java

index a200c4e147f0e8fb2951d473a95676c0c253d32c..4e3d6eeb9943ca0a4daafeb36638f269e4afb1eb 100644 (file)
@@ -31,15 +31,13 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import static java.lang.String.format;
 
 public class OAuthRestClient {
 
+  public static final String REL_NEXT = "rel=\"next\"";
   private static final int DEFAULT_PAGE_SIZE = 100;
-  private static final Pattern NEXT_LINK_PATTERN = Pattern.compile(".*<(.*)>; rel=\"next\"");
 
   private OAuthRestClient() {
     // Only static method
@@ -87,18 +85,24 @@ public class OAuthRestClient {
   }
 
   private static Optional<String> readNextEndPoint(Response response) {
-    Optional<String> link = response.getHeaders().entrySet().stream()
+    Optional<String> linksHeader = response.getHeaders().entrySet().stream()
       .filter(e -> "Link".equalsIgnoreCase(e.getKey()))
       .map(Map.Entry::getValue)
       .findAny();
-    if (link.isEmpty() || link.get().isEmpty() || !link.get().contains("rel=\"next\"")) {
+
+    if (linksHeader.isEmpty()) {
       return Optional.empty();
     }
-    Matcher nextLinkMatcher = NEXT_LINK_PATTERN.matcher(link.get());
-    if (!nextLinkMatcher.find()) {
-      return Optional.empty();
+
+    String[] links = linksHeader.get().split(",");
+    for (String link : links) {
+      String trimmedLink = link.trim();
+      if (trimmedLink.contains(REL_NEXT) && trimmedLink.contains("<") && trimmedLink.contains(">")) {
+        String nextUrl = trimmedLink.substring(trimmedLink.indexOf("<") + 1, trimmedLink.indexOf(">"));
+        return Optional.of(nextUrl);
+      }
     }
-    return Optional.of(nextLinkMatcher.group(1));
+    return Optional.empty();
   }
 
   private static IllegalStateException unexpectedResponseCode(String requestUrl, Response response) throws IOException {