Разрешение относительной URI в Java 8, имея дело с ошибкой JDKJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Разрешение относительной URI в Java 8, имея дело с ошибкой JDK

Сообщение Anonymous »

Я в сценарии, где я застрял на Java 8. У меня есть программа, которая создает и разрешает URI, используя java.net.uri . Обычно они всегда будут схемой http , но мы потенциально получим других, с которыми нам нужно обратиться.

Код: Выделить всё

import java.net.URI;

class Scratch {
public static void main(String[] args) throws Exception {
URI base = new URI("https://example.com/");
URI other = new URI("path/to/resource?query=hello");
URI result = base.resolve(other);
System.out.println(result);
}
}
Это решается к правильному URI, как и ожидалось:

https://example.com/path/to/resource?query=hellobr/>
, однако, из-за Jdk-8777020202020202020202020202020202011. Решение относительного URIS различными другими способами.

Код: Выделить всё

import java.net.URI;

class Scratch {
private static final String F = "%-20s %-15s %-35s %-35s%n";
public static void main(String[] args) throws Exception {
System.out.printf(F, "Base", "Resolve part", "Expected", "Actual (if different)");
test("https://a.com", ".", "https://a.com/");
test("https://a.com", "./", "https://a.com/");
test("https://a.com", "./path", "https://a.com/path");
test("https://a.com", "path", "https://a.com/path");
test("https://a.com", "path/", "https://a.com/path/");
test("https://a.com", "./path/", "https://a.com/path/");
test("https://a.com", "../", "https://a.com/../");
test("https://a.com", "../path", "https://a.com/../path");
test("https://a.com", "../path/", "https://a.com/../path/");

System.out.println("\nTrailing slash");
test("https://a.com/", ".", "https://a.com/");
test("https://a.com/", "./", "https://a.com/");
test("https://a.com/", "./path", "https://a.com/path");
test("https://a.com/", "path", "https://a.com/path");
test("https://a.com/", "path/", "https://a.com/path/");
test("https://a.com/", "./path/", "https://a.com/path/");
test("https://a.com/", "../", "https://a.com/../");
test("https://a.com/", "../path", "https://a.com/../path");
test("https://a.com/", "../path/", "https://a.com/../path/");
}

private static void test(String base, String resolve, String expected) throws Exception {
URI baseUri = new URI(base);
URI resolveUri = new URI(resolve);
URI actual = baseUri.resolve(resolveUri);
URI expectedUri = new URI(expected);
String difference = actual.equals(expectedUri) ? "" : actual.toString();
System.out.printf(F, baseUri, resolveUri, expectedUri, difference);
}
}
< /code>
на Java 21, где связанная ошибка «исправлена», и предполагая, что вывод каждого разрешения верен, мы получаем следующий вывод: < /p>
Base                 Resolve part    Expected                            Actual (if different)
https://a.com        .               https://a.com/
https://a.com        ./              https://a.com/
https://a.com        ./path          https://a.com/path
https://a.com        path            https://a.com/path
https://a.com        path/           https://a.com/path/
https://a.com        ./path/         https://a.com/path/
https://a.com        ../             https://a.com/../
https://a.com        ../path         https://a.com/../path
https://a.com        ../path/        https://a.com/../path/

Trailing slash
https://a.com/       .                https://a.com/
https://a.com/       ./              https://a.com/
https://a.com/       ./path          https://a.com/path
https://a.com/       path            https://a.com/path
https://a.com/       path/           https://a.com/path/
https://a.com/       ./path/         https://a.com/path/
https://a.com/       ../             https://a.com/../
https://a.com/       ../path         https://a.com/../path
https://a.com/       ../path/        https://a.com/../path/
< /code>
 java 8 vocation < /h3>
Однако при запуске на Java 8 (1.8.0_322): < /p>
Base                 Resolve part    Expected                            Actual (if different)
https://a.com        .               https://a.com/                      https://a.com
https://a.com        ./              https://a.com/                      https://a.com
https://a.com        ./path          https://a.com/path                  https://a.compath
https://a.com        path            https://a.com/path                  https://a.compath
https://a.com        path/           https://a.com/path/                 https://a.compath/
https://a.com        ./path/         https://a.com/path/                 https://a.compath/
https://a.com        ../             https://a.com/../                   https://a.com../
https://a.com        ../path         https://a.com/../path               https://a.com../path
https://a.com        ../path/        https://a.com/../path/              https://a.com../path/

Trailing slash
https://a.com/       .               https://a.com/
https://a.com/       ./              https://a.com/
https://a.com/       ./path          https://a.com/path
https://a.com/       path            https://a.com/path
https://a.com/       path/           https://a.com/path/
https://a.com/       ./path/         https://a.com/path/
https://a.com/       ../             https://a.com/../
https://a.com/       ../path         https://a.com/../path
https://a.com/       ../path/        https://a.com/../path/
Вы можете видеть, что фактические сильно отличаются для многих резолюций. Это также не полный набор потенциальных входов, только некоторые, чтобы продемонстрировать проблему.
Что делает Python?from urllib.parse import urljoin

FORMAT = "{:20s} {:15s} {:35s} {:35s}"

def main():
print(FORMAT.format("Base", "Resolve part", "Expected", "Actual (if different)"))
test("https://a.com", ".", "https://a.com/")
test("https://a.com", "./", "https://a.com/")
test("https://a.com", "./path", "https://a.com/path")
test("https://a.com", "path", "https://a.com/path")
test("https://a.com", "path/", "https://a.com/path/")
test("https://a.com", "./path/", "https://a.com/path/")
test("https://a.com", "../", "https://a.com/../")
test("https://a.com", "../path", "https://a.com/../path")
test("https://a.com", "../path/", "https://a.com/../path/")

print("\nTrailing slash")
test("https://a.com/", ".", "https://a.com/")
test("https://a.com/", "./", "https://a.com/")
test("https://a.com/", "./path", "https://a.com/path")
test("https://a.com/", "path", "https://a.com/path")
test("https://a.com/", "path/", "https://a.com/path/")
test("https://a.com/", "./path/", "https://a.com/path/")
test("https://a.com/", "../", "https://a.com/../")
test("https://a.com/", "../path", "https://a.com/../path")
test("https://a.com/", "../path/", "https://a.com/../path/")

def test(base, resolve, expected):
base_uri = urljoin(base, "") # Ensure base is a proper URL
resolve_uri = urljoin("", resolve) # Resolve treats empty string as base
actual = urljoin(base_uri, resolve_uri)
difference = "" if actual == expected else actual
print(FORMAT.format(base_uri, resolve_uri, expected, difference))

main()
< /code>
output: < /p>
Base Resolve part Expected Actual (if different)
https://a.com . https://a.com/
https://a.com ./ https://a.com/
https://a.com ./path https://a.com/path
https://a.com path https://a.com/path
https://a.com path/ https://a.com/path/
https://a.com ./path/ https://a.com/path/
https://a.com ../ https://a.com/../ https://a.com/
https://a.com ../path https://a.com/../path https://a.com/path
https://a.com ../path/ https://a.com/../path/ https://a.com/path/

Trailing slash
https://a.com/ . https://a.com/
https://a.com/ ./ https://a.com/
https://a.com/ ./path https://a.com/path
https://a.com/ path https://a.com/path
https://a.com/ path/ https://a.com/path/
https://a.com/ ./path/ https://a.com/path/
https://a.com/ ../ https://a.com/../ https://a.com/
https://a.com/ ../path https://a.com/../path https://a.com/path
https://a.com/ ../path/ https://a.com/../path/ https://a.com/path/
< /code>
создает немного другой выход. Это может быть сделано в разнице RFC между Java и Python или небольшой разницей в том, как работает нормализация, потому что единственные различия связаны с сегментами двойной точки.>

Подробнее здесь: https://stackoverflow.com/questions/793 ... th-jdk-bug
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как указать дело одной буквы, игнорируя дело других букв в корпорации?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как указать дело одной буквы, игнорируя дело других букв в корпорации?
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • PHP, имея дело с латыни с UTF8 [закрыто]
    Anonymous » » в форуме Php
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • SQLALCHEMY Вставьте заявление PRAGMA, имея дело с базой данных PostGRESQL
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • SQLALCHEMY Вставьте заявление PRAGMA, имея дело с базой данных PostGRESQL
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»