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.


---

Reply via email to