为什么 url.Parse 不填充 URL.RawPath?

Sri*_*har 5 url escaping go

虽然输入类似,但 URL.RawQuery 似乎已正确填充。

操场

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())
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

请注意,这URL.RawPath不是原始(转义)路径。它可能是,但并非总是如此。这只是一个提示。它的文档说:

RawPath    string // encoded path hint (Go 1.5 and later only; see EscapedPath method)
Run Code Online (Sandbox Code Playgroud)

因此,当您需要转义路径时,请始终使用URL.EscapedPath()而不是依赖URL.RawPath字段。Doc ofURL.EscapedPath()说:

EscapedPathu.Path的有效转义时,它返回u.RawPath

这是你的情况。如果原始路径包含在 URL 编码期间需要转义的字节,则该原始路径无效。您的路径就是这样一个示例,因为它包含%25哪个是百分比符号本身的 URL 转义文本,'%'如果 URL 路径的一部分,则需要对百分比符号进行转义。

您包含的第一个示例%2f是斜杠的 URL 转义文本'/',如果存在于路径中,则不需要对其进行转义('/'是路径中的有效字符并被视为分隔符)。

看这个例子:

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())
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

Path:        /foo%fbar
RawPath:     
EscapedPath: /foo%25fbar
RawQuery:    q=morefoo%25bar
String:      https://example.com/foo%25fbar?q=morefoo%25bar
Run Code Online (Sandbox Code Playgroud)

RawPath是空字符串(因为"/foo%25fbar"是无效的转义路径),但EscapedPath()返回原始转义路径。