2016-09-01 8 views
3

同様の入力で、URL.RawQueryが正しく埋め込まれているようです。なぜurl.ParseにURL.RawPathが設定されないのですか?

Playground

u, err := url.Parse("https://example.com/foo%2fbar") 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println(u.Path) 
fmt.Println(u.RawPath) 
fmt.Println(u.String(), "\n") 

u, err = url.Parse("https://example.com/foo%25fbar?q=morefoo%25bar") 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println(u.Path) 
fmt.Println(u.RawPath) 
fmt.Println(u.RawQuery) 
fmt.Println(u.String()) 

答えて

2

注意をコメントしています。 でもかまいません。ちょうどのヒントです。そのドキュメントは言う:あなたがエスケープパスを必要とするとき

RawPath string // encoded path hint (Go 1.5 and later only; see EscapedPath method) 

だから、常にURL.EscapedPath()を使用してURL.RawPathフィールドに依存しません。 URL.EscapedPath()のドキュメントは言う:それはu.Pathの有効なエスケープとき

EscapedPathがu.RawPath 返します。

これはあなたのケースです。生のパスは、URLエンコーディング中にエスケープする必要があるバイトを含む場合、無効です。あなたのパスは、パーセントシンボル自体のURLエスケープされたテキストである%25を含んでおり、URLパスの一部であればパーセント記号をエスケープする必要があるため、そのような例です。

はあなたの最初の例では、URLがパスに存在する場合は、エスケープする必要はありませんスラッシュ'/''/'はパスで有効な文字で、セパレータとして扱われる)のテキストをエスケープしている%2fを含んでいました。

この例を参照してください:あなたを("/foo%25fbar"が無効エスケープパスであるため)

Path:  /foo%fbar 
RawPath:  
EscapedPath: /foo%25fbar 
RawQuery: q=morefoo%25bar 
String:  https://example.com/foo%25fbar?q=morefoo%25bar 

RawPath空の文字列ですが、EscapedPath()リターン:

u, err = url.Parse("https://example.com/foo%25fbar?q=morefoo%25bar") 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println("Path:  ", u.Path) 
fmt.Println("RawPath: ", u.RawPath) 
fmt.Println("EscapedPath:", u.EscapedPath()) 
fmt.Println("RawQuery: ", u.RawQuery) 
fmt.Println("String:  ", u.String()) 

出力(Go Playground上でそれを試してみてください)元のエスケープされたパス。

+0

クエリで '%'をエスケープする必要はありませんか?そうでない場合、なぜurl.Encodeはクエリで '%'を '%25'に変更しますか? – Sridhar

+0

@Sridharはい(それがparamの名前または値の一部である場合)。しかし、ここでの質問は、 '%25'が' URL.RawPath'を埋めるのを阻止するのはなぜですか、 '%2f'はそれを妨げません。答えは '%25'は答えに記載されている基準に基づいてパスを無効にするためですが、'%2f'はそうではありません。 – icza

2

ただ、パッケージ仕様一般的に

からfunc(*URL)EscapedPath()

fmt.Println(u.EscapedPath()) //give you expected result 

を使用し、コードではなく、直接u.RawPath を読み取るEscapedPathを呼び出す必要があります。

とソースから

URL.RawPathが生(エスケープ)パスではないことを

// RawPath is a hint as to the encoding of Path to use 
// in url.EscapedPath. If that method already gets the 
// right answer without RawPath, leave it empty. 
// This will help make sure that people don't rely on it in general. 
関連する問題