Github user zentol commented on a diff in the pull request:
https://github.com/apache/flink/pull/4958#discussion_r149382049
--- Diff:
flink-runtime/src/main/java/org/apache/flink/runtime/rest/RestServerEndpoint.java
---
@@ -268,4 +287,69 @@ private static void registerHandler(Router router,
Tuple2<RestHandlerSpecificati
throw new RuntimeException("Unsupported http
method: " + specificationHandler.f0.getHttpMethod() + '.');
}
}
+
+ /**
+ * Comparator for Rest URLs.
+ *
+ * <p>The comparator orders the Rest URLs such that URLs with path
parameters are ordered behind
+ * those without parameters. E.g.:
+ * /jobs
+ * /jobs/overview
+ * /jobs/:jobid
+ * /jobs/:jobid/config
+ * /:*
+ *
+ * <p>IMPORTANT: This comparator is highly specific to how Netty path
parameter are encoded. Namely
+ * via a preceding ':' character.
+ */
+ static final class RestHandlerUrlComparator implements
Comparator<Tuple2<RestHandlerSpecification, ChannelInboundHandler>>,
Serializable {
+
+ private static final long serialVersionUID =
2388466767835547926L;
+
+ private static final Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsensitiveOrderComparator();
+
+ static final RestHandlerUrlComparator INSTANCE = new
RestHandlerUrlComparator();
+
+ @Override
+ public int compare(
+ Tuple2<RestHandlerSpecification,
ChannelInboundHandler> o1,
+ Tuple2<RestHandlerSpecification,
ChannelInboundHandler> o2) {
+ return
CASE_INSENSITIVE_ORDER.compare(o1.f0.getTargetRestEndpointURL(),
o2.f0.getTargetRestEndpointURL());
+ }
+
+ static final class CaseInsensitiveOrderComparator implements
Comparator<String>, Serializable {
+ private static final long serialVersionUID =
8550835445193437027L;
+
+ @Override
+ public int compare(String s1, String s2) {
+ int n1 = s1.length();
+ int n2 = s2.length();
+ int min = Math.min(n1, n2);
+ for (int i = 0; i < min; i++) {
+ char c1 = s1.charAt(i);
+ char c2 = s2.charAt(i);
+ if (c1 != c2) {
+ c1 = Character.toUpperCase(c1);
+ c2 = Character.toUpperCase(c2);
+ if (c1 != c2) {
+ c1 =
Character.toLowerCase(c1);
--- End diff --
Found another note in `String#regionMatches`:
```
// Unfortunately, conversion to uppercase does not work properly
// for the Georgian alphabet, which has strange rules about case
// conversion. So we need to make one last check before
// exiting.
```
TIL, +1 to merge.
---