aboutsummaryrefslogtreecommitdiff
path: root/elymas
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2014-02-05 01:11:42 +0100
committerDrahflow <drahflow@gmx.de>2014-02-05 01:11:42 +0100
commitf0c68d3ca87822d078cb16a0c65baff0ada4c53f (patch)
treee7c83d8b6098ba4b5b8ed44088901a5e22ee2e6f /elymas
parent71bf585b25e86e1c56a25dd77d9d617de558236e (diff)
Parse URL query strings
Diffstat (limited to 'elymas')
-rw-r--r--elymas/lib/net/alg/http.ey38
-rw-r--r--elymas/lib/net/alg/uri.ey19
-rw-r--r--elymas/loaded.ey1
-rw-r--r--elymas/shared.ey1
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
{