diff --git a/basis/urls/encoding/encoding-tests.factor b/basis/urls/encoding/encoding-tests.factor index 2217ec8a28..87b1812ef8 100644 --- a/basis/urls/encoding/encoding-tests.factor +++ b/basis/urls/encoding/encoding-tests.factor @@ -21,6 +21,8 @@ USING: urls.encoding tools.test arrays kernel assocs present accessors ; [ H{ { "a" { "b" "c" } } } ] [ "a=b&a=c" query>assoc ] unit-test +[ H{ { "a" { "b" "c" } } } ] [ "a=b;a=c" query>assoc ] unit-test + [ H{ { "text" "hello world" } } ] [ "text=hello+world" query>assoc ] unit-test [ "a=3" ] [ { { "a" 3 } } assoc>query ] unit-test diff --git a/basis/urls/encoding/encoding.factor b/basis/urls/encoding/encoding.factor index 2f89084488..a4519c99b0 100644 --- a/basis/urls/encoding/encoding.factor +++ b/basis/urls/encoding/encoding.factor @@ -76,7 +76,7 @@ PRIVATE> : query>assoc ( query -- assoc ) dup [ - "&" split H{ } clone [ + "&;" split H{ } clone [ [ [ "=" split1 [ dup [ query-decode ] when ] bi@ swap ] dip add-query-param diff --git a/basis/urls/urls-tests.factor b/basis/urls/urls-tests.factor index cac206bf3c..c98802657b 100644 --- a/basis/urls/urls-tests.factor +++ b/basis/urls/urls-tests.factor @@ -10,6 +10,7 @@ arrays kernel assocs present accessors ; { host "www.apple.com" } { port 1234 } { path "/a/path" } + { raw-query "a=b" } { query H{ { "a" "b" } } } { anchor "foo" } } @@ -20,6 +21,7 @@ arrays kernel assocs present accessors ; { protocol "http" } { host "www.apple.com" } { path "/a/path" } + { raw-query "a=b" } { query H{ { "a" "b" } } } { anchor "foo" } } @@ -57,6 +59,7 @@ arrays kernel assocs present accessors ; { T{ url { path "bar" } + { raw-query "a=b" } { query H{ { "a" "b" } } } } "bar?a=b" @@ -210,6 +213,7 @@ urls [ T{ url { protocol "http" } { host "localhost" } + { raw-query "foo=bar" } { query H{ { "foo" "bar" } } } { path "/" } } @@ -220,6 +224,7 @@ urls [ T{ url { protocol "http" } { host "localhost" } + { raw-query "foo=bar" } { query H{ { "foo" "bar" } } } { path "/" } } diff --git a/basis/urls/urls.factor b/basis/urls/urls.factor index 5ebcabede8..fb56e274da 100644 --- a/basis/urls/urls.factor +++ b/basis/urls/urls.factor @@ -8,7 +8,7 @@ strings.parser lexer prettyprint.backend hashtables present peg.ebnf urls.encoding ; IN: urls -TUPLE: url protocol username password host port path query anchor ; +TUPLE: url protocol username password host port path raw-query query anchor ; : ( -- url ) url new ; @@ -47,7 +47,7 @@ protocol = [a-z]+ => [[ url-decode ]] username = [^/:@#?]+ => [[ url-decode ]] password = [^/:@#?]+ => [[ url-decode ]] pathname = [^#?]+ => [[ url-decode ]] -query = [^#]+ => [[ query>assoc ]] +query = [^#]+ => [[ >string ]] anchor = .+ => [[ url-decode ]] hostname = [^/#?]+ => [[ url-decode ]] @@ -80,7 +80,7 @@ M: string >url ] [ f f f f f ] if* ] [ second ] ! pathname - [ third ] ! query + [ third dup query>assoc ] ! query [ fourth ] ! anchor } cleave url boa dup host>> [ [ "/" or ] change-path ] when ;