Является ли 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 несовместимым с ним, или я что-то упустил?