2

問題領域

特定のパス セグメントが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

これはまた、URLhttp://foo.com/first/sec%2fondが 2 つのエスケープされていないパス セグメント/firstおよびに解決されることを意味し、後者は 2 つの別々のセグメントではなく1 つ/sec/ondのセグメントとして扱われる必要があるだけでなく、構文的にも有効です (エスケープされていないパス セグメントとして)。

質問

  • 仕様を正しく理解していますか?
  • エスケープされていないパスセグメントのJavaバリデーターを提案できる人はいますか?
  • 誰かが自明ではない失敗例を提案できますか?
  • U+00FF より上の文字はパス セグメントで使用できませんか? 少なくともドメイン名ではサポートされていると思いました。

編集: マイクが正しく指摘したように、RFC3986 は RFC2396 を廃止しました。とにかく、新しい RFC は古いものよりも多くのケースを処理する (そして、一部のパス セグメントを不当にしない) と信じているため、同じ質問が適用されます。

4

2 に答える 2

2

私はあなたと同じように仕様を解釈します。つまりsec%2Fond、単一のパス セグメントです。(しかし、そのようなセグメントを含む URI を作成した人は、厳しく処罰されるべきです!)

あなたが取り組んでいる問題は、エスケープ解除プロセスがロッシーであることです。エスケープされた URI からエスケープされていない URI に往復しStringて元のエスケープされた URI に戻ることはできません。これを回避する方法はありません。「役立つ」処理によってその重要な情報が破棄される前に、エスケープされた URI を取得する必要があります。

非 ASCII 文字の処理の詳細については §2.1 を読むことができますが、RFC 2396 のエスケープ規則は、URI 文字列が文字エンコードされた後のオクテット文字列 (バイト) に適用されると理解しています。文字エンコーディングの実行方法は、スキームによって指定できます。一般的な方法はありません。

于 2011-03-30T17:10:48.933 に答える
2

たとえば、/foo は有効なパス セグメントですが、/fo?o は ? がエスケープされていないため有効ではありません。上記の例を修正するには、パス セグメントを /fo%3Fo と記述する必要があります。

正しい

これは、URL http://foo.com/first/sec%2fondが 2 つのエスケープされていないパス セグメント /first と /sec/ond に解決されることも意味します。 2 つの別々のものですが、構文的にも有効です (エスケープされていないパス セグメントとして)。

正しい。ただし、これを誤解する多くの実装があります。

U+00FF より上の文字はパス セグメントで使用できませんか? 少なくともドメイン名ではサポートされていると思いました。

URI エスケープ (% hex hex) はバイトをエンコードします。コードポイントではありません。URL のエンコーディングを知る必要があります。たとえば、エンコーディングが UTF-8 の場合、コードポイント U+1234 は としてエンコードされ%E1%88%B4ます。

ドメイン名ではパーセント エスケープは許可されていません。国際ドメイン名については、RFC 3492を参照してください。

于 2011-03-30T17:11:40.757 に答える