Compare commits

..

No commits in common. "b5320a169de9d24cdfbc07ccd1514db2a91b9566" and "7e40fd14e015dccac60ab7638c0f7bf39bb63f49" have entirely different histories.

5 changed files with 20 additions and 116 deletions

View file

@ -15,7 +15,6 @@ We have some guides and general documentation in the [docs](docs/) directory. Am
- [HTTP Router](docs/router.md)
- [Template engine](docs/template.md)
- [Script integrations](docs/util.md)
- [HTTP request API](docs/http.md)
- [List of security fixes](docs/sec-fixes/)
## Dependencies

View file

@ -1,43 +0,0 @@
# HTTP - the proto, the API
very work in progress file.
---
## GET/POST parameters
- `${get_data["param"]}`
- `${post_data["param"]}`
Case-insensitive. If K/V pairs aren't used (but a string is provided, just without `=`) then
it can be accessed through `${get_data}` / `${post_data}` (array element 0).
### Arrays
HTTP does arrays through concatenating multiple parameters with the same name. In our case, values
are passed to a secondary array, and a reference to it is left for application use.
```
GET asdf/?a=1&a=2&a=3&b=1
```
will result in:
```
declare -A get_data=([b]="1" [a]="[array]" )
```
To get the value set out of an array, call `http_array <param_name> <output_name>`. For instance:
```
#!/bin/bash
if ! http_array a array; then
echo "Not an array"
return
fi
for (( i=0; i<${#array[@]}; i++ )) {
echo "a[$i]=${array[i]}"
}
```

View file

@ -71,58 +71,3 @@ function url_decode() {
function worker_add() {
:
}
# internal function
# common GET/POST application/x-www-form-urlencoded parser
#
# _param_parse(input, destination_ref)
_param_parse() {
[[ ! "$1" || ! "$2" ]] && return 1
local -n ref="$2"
local i name value
while read -d'&' i; do
name="${i%%=*}"
if [[ "$name" ]]; then
value="${i#*=}"
if [[ "${ref["$name"]}" ]]; then # array mode
if [[ ! "${http_array_refs["$name"]}" ]]; then
http_array_refs["$name"]=_param_$RANDOM
local -n arr="${http_array_refs["$name"]}"
arr=("${ref["$name"]}")
ref["$name"]="[array]"
else
local -n arr="${http_array_refs["$name"]}"
fi
arr+=("$(url_decode "$value")")
else
ref["$name"]="$(url_decode "$value")"
fi
fi
done <<< "$1"
}
# Safely receive a reference to a HTTP urlencoded array
#
# http_array(name, out_ref)
http_array() {
[[ ! "$1" || ! "$2" ]] && return 1
if [[ ! "${http_array_refs[$1]}" ]]; then
declare -ga $2
local -n ref=$2
if [[ "${post_data[$1]}" ]]; then
ref=("${post_data[$1]}")
elif [[ "${get_data[$1]}" ]]; then
ref=("${get_data[$1]}")
else
return 1
fi
else
declare -gn $2=${http_array_refs[$1]}
fi
}

View file

@ -23,7 +23,6 @@ declare -A cookies # cookies!
declare -A get_data # all GET params
declare -A post_data # all POST params
declare -A params # parsed router data
declare -A http_array_refs # references to GET/POST arrays
r[status]=210 # Mommy always said that I was special
r[req_headers]=''
@ -45,7 +44,16 @@ if [[ "${param,,}" =~ ^(get|post|patch|put|delete|meow) ]]; then # TODO: OPTIONS
r[url]="$(sed -E 's/^ *//;s/HTTP\/[0-9]+\.[0-9]+//;s/ //g;s/\/*\r//g;s/\/\/*/\//g' <<< "$param")"
unset IFS
_param_parse "${r[url]#*\?}&" get_data
if [[ "${r[url]}" == *'?'* ]]; then
while read -d'&' i; do
name="${i%%=*}"
if [[ "$name" ]]; then
value="${i#*=}"
get_data[$name]="$(url_decode "$value")"
fi
done <<< "${r[url]#*\?}&"
fi
else
exit 1 # TODO: throw 400 here
fi
@ -264,7 +272,12 @@ if [[ "${r[post]}" == true ]] && [[ "${r[status]}" == 200 || "${r[status]}" ==
if [[ "${r[payload_type]}" == "urlencoded" ]]; then
unset IFS
_param_parse "${data}&" post_data
while read -r -d'&' i; do
name="${i%%=*}"
value="${i#*=}"
post_data[$name]="$(url_decode "$value")"
echo post_data[$name]="$value" >/dev/stderr
done <<< "${data}&"
else
# this is fine?
post_data[0]="${data%\&}"

View file

@ -30,26 +30,19 @@ EOF
match="nyaa"
}
server_get_array() {
server_get_random() {
prepare() {
cat <<"EOF" > app/webroot/meow.shs
#!/bin/bash
http_array meow ref
echo "${ref[1]}"
echo "${get_data[meow]}"
EOF
}
tst() {
curl -s "localhost:1337/meow.shs?meow=nyaa&meow=second+element&meow=meow"
curl -s "localhost:1337/meow.shs?meow=nyaa"
}
match="second element"
}
server_post_array() {
tst() {
curl -s "localhost:1337/meow.shs" -d 'meow=nyaa&meow=second+element&meow=meow'
}
match="nyaa"
}
server_post_param() {
@ -209,9 +202,6 @@ subtest_list=(
server_get_param
server_post_param
server_get_array
server_post_array
# currently functionally equivalent
server_patch_dummy
server_put_dummy