diff --git a/http/query/query.go b/http/query/query.go index 0df5a34..7e86e21 100644 --- a/http/query/query.go +++ b/http/query/query.go @@ -36,16 +36,15 @@ func New(query string) (*Query, error) { for i, length := 0, len(query); i < length; i++ { separator := query[i] == '&' || query[i] == ';' || query[i] == '?' - if separator || i == length-1 { - if onKey { + last := i == length-1 + + if separator || last { + if onKey && !last { keyStart = i + 1 continue } - if i == length-1 && !separator { - if query[i] == '=' { - continue - } + if last && !separator && !onKey { valEnd = i } @@ -54,9 +53,13 @@ func New(query string) (*Query, error) { return nil, err } - valStr, err := url.QueryUnescape(query[valStart : valEnd+1]) - if err != nil { - return nil, err + var valStr string + + if valEnd > 0 { + valStr, err = url.QueryUnescape(query[valStart : valEnd+1]) + if err != nil { + return nil, err + } } q.Params[strings.ToLower(keyStr)] = valStr @@ -74,12 +77,14 @@ func New(query string) (*Query, error) { } } + valEnd = 0 onKey = true keyStart = i + 1 } else if query[i] == '=' { onKey = false valStart = i + 1 + valEnd = 0 } else if onKey { keyEnd = i } else { diff --git a/http/query/query_test.go b/http/query/query_test.go index 1119cdf..357fbd7 100644 --- a/http/query/query_test.go +++ b/http/query/query_test.go @@ -26,6 +26,7 @@ var ( url.Values{"info_hash": {testInfoHash}, "peer_id": {testPeerID}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "compact": {"0"}, "no_peer_id": {"1"}, "key": {"peerKey"}, "trackerid": {"trackerId"}}, url.Values{"info_hash": {testInfoHash}, "peer_id": {"%3Ckey%3A+0x90%3E"}, "port": {"6881"}, "downloaded": {"1234"}, "left": {"4321"}, "compact": {"0"}, "no_peer_id": {"1"}, "key": {"peerKey"}, "trackerid": {"trackerId"}}, url.Values{"info_hash": {testInfoHash}, "peer_id": {"%3Ckey%3A+0x90%3E"}, "compact": {"1"}}, + url.Values{"info_hash": {""}, "peer_id": {""}, "compact": {""}}, } InvalidQueries = []string{