Является ли Java URI.resolve несовместимым с RFC 3986, когда относительный URI содержит пустой путь?

Я считаю, что определение и реализация метода Java URI.resolve несовместимы сRFC 3986 раздел 5.2.2, Я понимаю, что Java API определяет, как работает этот метод, и если бы он был изменен сейчас, он сломал бы существующие приложения, но мой вопрос заключается в следующем:Кто-нибудь может подтвердить мое понимание того, что этот метод несовместим с RFC 3986?

Я использую пример из этого вопроса:java.net.URI разрешает только строку запроса, который я здесь скопирую:

Я пытаюсь создать URI, используя JDK java.net.URI. Я хочу добавить к абсолютному объекту URI, запрос (в строке). В примере:

URI base = new URI("http://example.com/something/more/long");
String queryString = "query=http://local:282/rand&action=aaaa";
URI query = new URI(null, null, null, queryString, null);
URI result = base.resolve(query);

Теория (или то, что я думаю) заключается в том, что решимость должна вернуться:

http://example.com/something/more/long?query=http://local:282/rand&action=aaaa

Но то, что я получил, это:

http://example.com/something/more/?query=http://local:282/rand&action=aaaa

Мое пониманиеRFC 3986 раздел 5.2.2 в том случае, если путь относительного URI пуст, то должен использоваться весь путь базового URI:

        if (R.path == "") then
           T.path = Base.path;
           if defined(R.query) then
              T.query = R.query;
           else
              T.query = Base.query;
           endif;

и только если указан путь, относительный путь должен быть объединен с базовым путем:

        else
           if (R.path starts-with "/") then
              T.path = remove_dot_segments(R.path);
           else
              T.path = merge(Base.path, R.path);
              T.path = remove_dot_segments(T.path);
           endif;
           T.query = R.query;
        endif;

но реализация Java всегда выполняет слияние, даже если путь пуст:

    String cp = (child.path == null) ? "" : child.path;
    if ((cp.length() > 0) && (cp.charAt(0) == '/')) {
      // 5.2 (5): Child path is absolute
      ru.path = child.path;
    } else {
      // 5.2 (6): Resolve relative path
      ru.path = resolvePath(base.path, cp, base.isAbsolute());
    }

Если мое чтение верно, чтобы получить такое поведение из псевдокода RFC, вы могли бы поставить точку в качестве пути в относительном URI перед строкой запроса, что из моего опыта использования относительных URI в качестве ссылок на веб-страницах - это то, что я ожидал :

transform(Base="http://example.com/something/more/long", R=".?query")
    => T="http://example.com/something/more/?query"

Но я ожидаю, что на веб-странице будет ссылка на страницу "http://example.com/something/more/long"to"? запрос "будет идти к"http://example.com/something/more/long?query"не"http://example.com/something/more/?query"- другими словами, в соответствии с RFC, но не с реализацией Java.

Является ли мое чтение RFC правильным и метод Java несовместимым с ним, или я что-то упустил?

Ответы на вопрос(2)

Ваш ответ на вопрос