Я считаю это ошибкой.
RFC1738 говорит, что :
(среди других символов) может быть зарезервировано для специального значения в схеме. Однако схема http
не резервирует ее в части пути
Within the <path> and <searchpart> components, "/", ";", "?" are reserved.
(не :
.)
hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
Итак, http://test.com/xx:yy
является действительным URI. Более новый RFC3968 соглашается:
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
Однако, разумеется, при релятивизации по http://test.com/asdf
результирующий xx:yy
будет абсолютным URI, а не действительным относительным URI:
path-noscheme = segment-nz-nc *( "/" segment )
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"
Так что MakeRelativeUri
является своего рода правом сообщить о наличии проблемы, но на самом деле это должно исправить это автоматически, кодируя :
, действительный в абсолютном URI, в %3A
, допустимо в первом сегменте относительного URI.
Как правило, я бы старался избегать MakeRelativeUri
в пользу корневых URI, которые проще извлечь и у которых нет этой проблемы (/xx:yy
в порядке).