Пример неверного URI согласно RFC 3986 - PullRequest
3 голосов
/ 27 февраля 2012

Для моего модульного теста я хотел бы найти пример недопустимого URI, который не будет соответствовать UriComponentsBuilder#URI_PATTERN регулярное выражение из Spring MVC 3.1.1:

private static final String SCHEME_PATTERN = "([^:/?#]+):";

private static final String HTTP_PATTERN = "(http|https):";

private static final String USERINFO_PATTERN = "([^@/]*)";

private static final String HOST_PATTERN = "([^/?#:]*)";

private static final String PORT_PATTERN = "(\\d*)";

private static final String PATH_PATTERN = "([^?#]*)";

private static final String QUERY_PATTERN = "([^#]*)";

private static final String LAST_PATTERN = "(.*)";

// Regex patterns that matches URIs. See RFC 3986, appendix B
private static final Pattern URI_PATTERN = Pattern.compile(
        "^(" + SCHEME_PATTERN + ")?" + "(//(" + USERINFO_PATTERN + "@)?" + HOST_PATTERN + "(:" + PORT_PATTERN +
                ")?" + ")?" + PATH_PATTERN + "(\\?" + QUERY_PATTERN + ")?" + "(#" + LAST_PATTERN + ")?");

Я изо всех сил пытаюсь найтиодна строка, которая приведет к сбою UriComponentsBuilder.fromUriString() с IllegalArgumentException.Все, что я пробую, проходит проверку на регулярное выражение как действительный URI.

1 Ответ

3 голосов
/ 27 февраля 2012

Я думаю, что все будет соответствовать этому регулярному выражению.Проблема в том, что регулярное выражение не выполняет строго RFC.Скорее это разработано, чтобы быть разрешающим;то есть принять любой старый мусор и сделать все возможное, чтобы разобрать его как URL.

(Однако я отмечаю, что он не справится с задачей анализа не-HTTP URI. Посмотрите наSCHEME_PATTERN ... и плакать.)

Если вы хотите выполнить строгий анализ или проверку URI, вам лучше использовать java.net.URI.Регулярные выражения не являются подходящим инструментом для этой задачи.

...