sacloud / libsacloud

[Deprecated] Library for SAKURA Cloud API with Go
Apache License 2.0
18 stars 13 forks source link

MACAddressをフィルタに指定すると"./"が付与される #657

Closed yamamoto-febc closed 3 years ago

yamamoto-febc commented 3 years ago

sacloud.InterfaceOpのFindに以下のようなフィルタを指定するとMACAddressの先頭に./が付与されて適切にフィルタされない。

condition.Filter[search.Key("MACAddress")] = search.AndEqual(req.MACAddresses...)

JSON.Marshalのタイミングで付与されている?

yamamoto-febc commented 3 years ago

該当箇所: https://github.com/sacloud/libsacloud/blob/f571c61cd8c43b759144b72e3c24cd61046dd3a7/v2/helper/service/iface/find_request.go#L52

yamamoto-febc commented 3 years ago

最小構成での発生を確認。

func main() {
    caller := api.NewCaller(&api.CallerOptions{
        AccessToken:          os.Getenv("SAKURACLOUD_ACCESS_TOKEN"),
        AccessTokenSecret:    os.Getenv("SAKURACLOUD_ACCESS_TOKEN_SECRET"),
        UserAgent:            "usacloud-golang-playground",
        TraceHTTP: true,
    })

    op := sacloud.NewInterfaceOp(caller)
    results, err := op.Find(context.Background(), "is1a", &sacloud.FindCondition{
        Filter: search.Filter{
            search.Key("MACAddress"): search.AndEqual("AA:AA:AA:AA:AA:AA"),
        },
    })
    fmt.Println(results, err)
}
yamamoto-febc commented 3 years ago

パラメータからquery stringへの変換を行う際に以下のようにしているのが原因の模様。

https://github.com/sacloud/libsacloud/blob/f571c61cd8c43b759144b72e3c24cd61046dd3a7/v2/sacloud/search/filter.go#L80-L86

yamamoto-febc commented 3 years ago

(&url.URL{Path: p}).String()ではなくurl.PathEscapeを使えば解決できそう(スペースも%20にエスケープされる)。

func Example() {
    fmt.Println((&url.URL{Path: "00:00:5E:00:53:00"}).String())
    fmt.Println(url.PathEscape("00:00:5E:00:53:00"))
    fmt.Println(url.PathEscape("with space"))
    // Output:
    // ./00:00:5E:00:53:00
    // 00:00:5E:00:53:00
    // with%20space
}