проблемная зона
Мне нужно определить, является ли конкретный сегмент пути допустимым для RFC2396 . В спецификации сказано:
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
escaped = "%" hex hex
hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
"a" | "b" | "c" | "d" | "e" | "f"
Так, например, /foo
является допустимым сегментом пути, но /fo?o
не из-за не экранированного ?
. Чтобы исправить приведенный выше пример, сегмент пути должен быть записан как /fo%3Fo
.
Спецификация, однако, определяет только действительность URI, которые поступают на сервер (подумайте: напечатано в строке URL).
На самом деле мне нужно проверить, является ли неэкранированный сегмент пути действительным. Продолжая приведенный выше пример, /fo?o
будет допустимым ресурсом, так как ?
- это то, что вы получаете при удалении %3F
.
Это также означает, что URL http://foo.com/first/sec%2fond
будет преобразован в два неэкранированных сегмента пути, /first
и /sec/ond
, и последний должен рассматриваться не только как один сегмент, а не как два отдельных но также синтаксически допустимы (как неэкранированный сегмент пути).
Вопросы
- правильно ли я понимаю спецификацию?
- Кто-нибудь может предложить валидатор Java для неэкранированных сегментов пути?
- Кто-нибудь может предложить нетривиальный случай неудачи?
- как насчет символов выше U + 00FF, их нельзя использовать в сегментах пути? Я думал, что они поддерживаются, по крайней мере, в доменных именах.
РЕДАКТИРОВАТЬ: как правильно указал Майк, RFC3986 устарел RFC2396. В любом случае, я считаю, что новый RFC обрабатывает больше случаев, чем старый (и не делает некоторые сегменты пути нелегитимными), поэтому применяются те же вопросы.