aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/application/UriPattern.java16
-rw-r--r--jdisc_core/src/test/java/com/yahoo/jdisc/application/UriPatternTestCase.java9
2 files changed, 24 insertions, 1 deletions
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/application/UriPattern.java b/jdisc_core/src/main/java/com/yahoo/jdisc/application/UriPattern.java
index 53d276b3fb6..016a2fd796a 100644
--- a/jdisc_core/src/main/java/com/yahoo/jdisc/application/UriPattern.java
+++ b/jdisc_core/src/main/java/com/yahoo/jdisc/application/UriPattern.java
@@ -95,7 +95,7 @@ public class UriPattern implements Comparable<UriPattern> {
*/
public Match match(URI uri) {
// Performance optimization: match in order of increasing cost and decreasing discriminating power.
- if (port > 0 && port != uri.getPort())
+ if (port > 0 && port != portOrSchemeDefault(uri))
return null;
String uriPath = nonNullOrBlank(uri.getRawPath());
@@ -172,6 +172,20 @@ public class UriPattern implements Comparable<UriPattern> {
return Integer.parseInt(str);
}
+ private static int portOrSchemeDefault(URI uri) {
+ return uri.getPort() != -1 ? uri.getPort()
+ : schemeDefaultPort(uri.getScheme());
+ }
+
+ private static int schemeDefaultPort(String scheme) {
+ if (scheme == null) return -1;
+ switch (scheme) {
+ case "http": return 80;
+ case "https": return 443;
+ default: return -1;
+ }
+ }
+
private static String normalizeScheme(String scheme) {
if (scheme.equals("https")) return "http"; // handle 'https' in bindings and uris as 'http'
return scheme;
diff --git a/jdisc_core/src/test/java/com/yahoo/jdisc/application/UriPatternTestCase.java b/jdisc_core/src/test/java/com/yahoo/jdisc/application/UriPatternTestCase.java
index 0ea82508f06..c7d0b9ff6d2 100644
--- a/jdisc_core/src/test/java/com/yahoo/jdisc/application/UriPatternTestCase.java
+++ b/jdisc_core/src/test/java/com/yahoo/jdisc/application/UriPatternTestCase.java
@@ -263,6 +263,15 @@ public class UriPatternTestCase {
}
@Test
+ public void requireThatUrisWithImplicitPortFromSchemeMatchesBindingWithExplicitPort() {
+ UriPattern httpPattern = new UriPattern("http://host:80/path");
+ assertMatch(httpPattern, "http://host/path", NO_GROUPS);
+
+ UriPattern httpsPattern = new UriPattern("https://host:443/path");
+ assertMatch(httpsPattern, "https://host/path", NO_GROUPS);
+ }
+
+ @Test
public void requireThatHttpsSchemeIsHandledAsHttp() {
UriPattern httpPattern = new UriPattern("http://host:80/path");
assertMatch(httpPattern, "https://host:80/path", NO_GROUPS);