[ https://issues.apache.org/jira/browse/FLINK-8000?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16242098#comment-16242098 ]
ASF GitHub Bot commented on FLINK-8000: --------------------------------------- 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. > Sort REST handler URLs in RestServerEndpoint > -------------------------------------------- > > Key: FLINK-8000 > URL: https://issues.apache.org/jira/browse/FLINK-8000 > Project: Flink > Issue Type: Improvement > Components: REST > Affects Versions: 1.4.0 > Reporter: Till Rohrmann > Assignee: Till Rohrmann > Priority: Minor > Labels: flip-6 > > In order to make the {{RestServerEndpoint}} more easily extendable, we should > automatically sort the returned list of rest handler when calling > {{RestServerEndpoint#initializeHandlers}}. That way the order in which the > handlers are added to the list is independent of the actual registration > order. This is, for example, important for the static file server which > always needs to be registered last. > I propose to add a special {{String}} {{Comparator}} which considers the > charactor {{':'}} to be the character with the largest value. That way we > should get always the following sort order: > - URLs without path parameters have precedence over similar URLs where parts > are replaced by path parameters (e.g. {{/jobs/overview}}, {{/jobs/:jobid}} > and {{/jobs/:jobid/config}}, {{/jobs/:jobid/vertices/:vertexId}}) > - Prefixes are sorted before URLs containing the prefix (e.g. {{/jobs}}, > {{/jobs/overview}}) -- This message was sent by Atlassian JIRA (v6.4.14#64029)