diff options
| author | Drahflow <drahflow@gmx.de> | 2014-02-05 01:11:42 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2014-02-05 01:11:42 +0100 |
| commit | f0c68d3ca87822d078cb16a0c65baff0ada4c53f (patch) | |
| tree | e7c83d8b6098ba4b5b8ed44088901a5e22ee2e6f | |
| parent | 71bf585b25e86e1c56a25dd77d9d617de558236e (diff) | |
Parse URL query strings
| -rw-r--r-- | elymas/lib/net/alg/http.ey | 38 | ||||
| -rw-r--r-- | elymas/lib/net/alg/uri.ey | 19 | ||||
| -rw-r--r-- | elymas/loaded.ey | 1 | ||||
| -rw-r--r-- | elymas/shared.ey | 1 |
4 files changed, 57 insertions, 2 deletions
diff --git a/elymas/lib/net/alg/http.ey b/elymas/lib/net/alg/http.ey index 6f7fe56..1238bcf 100644 --- a/elymas/lib/net/alg/http.ey +++ b/elymas/lib/net/alg/http.ey @@ -3,7 +3,7 @@ net .alg .bufferedEpollServer "^" via < - { "request unconfigured (of httpServer)" die } /request deffst + { "request unconfigured (of rawHttpServer)" die } /request deffst { = }' /set deffst { scope keys }' /setters deffst @@ -12,7 +12,7 @@ } /installSetters deffst > _ ==settings "::" via - { -1010 deffst = }' ::installSetters # TODO: def??? should overwrite existing values + { -10 deffst }' ::installSetters { ":" via "" ==url "" ==method < { defvst }' /put deffst > ==headers < @@ -41,6 +41,40 @@ } ^accept { ^run } /run deffst +> } /rawHttpServer net .alg .deff + +{ < + net .alg .rawHttpServer "^" via ^settings "::" via + + < + { "request unconfigured (of httpServer)" die } /request deffst + + { = }' /set deffst + { scope keys }' /setters deffst + { _ ^settings .installSetters =*install + setters { _ { set }_ -01 install }" each + } /installSetters deffst + > _ ==settings "::" via + + { -10 deffst }' ::installSetters + + { _ ==req ":" via + < { defvst }' > ==args { net .alg .uri .percentEncoding .|consume -30*20*1* }_ =*setArg + :url _ ==url + "^([^?]*)\\?(.*)$" regex { + =url "&" str .split { _ ==arg + "^([^=]*)=(.*)$" regex not { "" arg } rep + setArg + } each + } rep + + url args + < req keys { _ { : }_ -01 deffst }' each # TODO: this forwarding logic seems ugly, find a better way to forward activity levels + ==args { }_ =url + > ::request + } ^request + + { ^run } /run deffst > } /httpServer net .alg .deff # vim: syn=elymas diff --git a/elymas/lib/net/alg/uri.ey b/elymas/lib/net/alg/uri.ey new file mode 100644 index 0000000..3d8ce23 --- /dev/null +++ b/elymas/lib/net/alg/uri.ey @@ -0,0 +1,19 @@ +# provide helper function for URI coding +< + < + { _ 37 eq { -- { { decode }_ } } { unencoded } ? * } ==:unencoded + { { 48 sub txt .consume .hexDigitsReverse } -20*10* 16 mul add unencoded } =*:decode + + { # ==s + [ unencoded -102 { -01 * } each -- ] str .fromArray + } /consume deffd + + [ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~" { } each ] ==:unencodedChars + + { # ==s + [ -01 { _ unencodedChars neq all { 37 -01 _ 16 div -01 16 mod "0123456789ABCDEF" -20*10* } rep } each ] str .fromArray + } /produce deffd + > /percentEncoding defv +> /uri net .alg .defv + +# vim: syn=elymas diff --git a/elymas/loaded.ey b/elymas/loaded.ey index 2a48af1..f3538c5 100644 --- a/elymas/loaded.ey +++ b/elymas/loaded.ey @@ -10,6 +10,7 @@ "lib/net/alg.ey" "lib/net/alg/server.ey" "lib/net/alg/http.ey" + "lib/net/alg/uri.ey" ] { _ dump include }' each { diff --git a/elymas/shared.ey b/elymas/shared.ey index 73b0a12..06b4e9d 100644 --- a/elymas/shared.ey +++ b/elymas/shared.ey @@ -11,6 +11,7 @@ "lib/net/alg.ey" "lib/net/alg/server.ey" "lib/net/alg/http.ey" + "lib/net/alg/uri.ey" ] { _ dump include }' each { |
