Ensure scheme not lowercased if URI variable

Closes gh-33699
This commit is contained in:
rstoyanchev
2024-10-15 20:50:01 +01:00
parent a63cf06496
commit c261ca3102
3 changed files with 26 additions and 8 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.web.util;
import java.util.Locale;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -508,7 +509,8 @@ abstract class RfcUriParser {
}
public InternalParser captureScheme() {
this.scheme = captureComponent("scheme").toLowerCase();
String scheme = captureComponent("scheme");
this.scheme = (!scheme.startsWith("{") ? scheme.toLowerCase(Locale.ROOT) : scheme);
return this;
}
@@ -633,8 +635,11 @@ abstract class RfcUriParser {
return true;
}
else if (c == '}') {
this.openCurlyBracketCount--;
return true;
if (this.openCurlyBracketCount > 0) {
this.openCurlyBracketCount--;
return true;
}
return false;
}
return (this.openCurlyBracketCount > 0);
}

View File

@@ -235,7 +235,7 @@ final class WhatWgUrlParser {
logger.trace("Changing state from " + this.state + " to " + newState + " (cur: " + c + ")");
}
this.state = newState;
this.openCurlyBracketCount = 0;
this.openCurlyBracketCount = (this.buffer.toString().equals("{") ? this.openCurlyBracketCount : 0);
}
private boolean processCurlyBrackets(int c) {
@@ -244,8 +244,11 @@ final class WhatWgUrlParser {
return true;
}
if (c == '}') {
this.openCurlyBracketCount--;
return true;
if (this.openCurlyBracketCount > 0) {
this.openCurlyBracketCount--;
return true;
}
return false;
}
return (this.openCurlyBracketCount > 0 && c != EOF);
}
@@ -756,7 +759,7 @@ final class WhatWgUrlParser {
public void handle(int c, UrlRecord url, WhatWgUrlParser p) {
// If c is an ASCII alpha, append c, lowercased, to buffer, and set state to scheme state.
if (isAsciiAlpha(c)) {
p.append(Character.toLowerCase((char) c));
p.append(p.openCurlyBracketCount == 0 ? Character.toLowerCase((char) c) : c);
p.setState(SCHEME);
}
// EXTRA: if c is '{', append to buffer and continue as SCHEME
@@ -782,7 +785,7 @@ final class WhatWgUrlParser {
public void handle(int c, UrlRecord url, WhatWgUrlParser p) {
// If c is an ASCII alphanumeric, U+002B (+), U+002D (-), or U+002E (.), append c, lowercased, to buffer.
if (isAsciiAlphaNumeric(c) || (c == '+' || c == '-' || c == '.')) {
p.append(Character.toLowerCase((char) c));
p.append(p.openCurlyBracketCount == 0 ? Character.toLowerCase((char) c) : c);
}
// Otherwise, if c is U+003A (:), then:
else if (c == ':') {