From be7fce3be4a3d3da76d58922477ee0adb532c0ef Mon Sep 17 00:00:00 2001 From: deeleel Date: Wed, 15 Dec 2021 19:19:22 +0300 Subject: [PATCH 1/6] first commit --- file_with_data.txt | 4 ++++ shellweb | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 file_with_data.txt diff --git a/file_with_data.txt b/file_with_data.txt new file mode 100644 index 0000000..2a3a307 --- /dev/null +++ b/file_with_data.txt @@ -0,0 +1,4 @@ +{"id": 1, +"email": "michael.lawson@reqres.in", +"first_name": "Michael", +"last_name": "Lawson"} \ No newline at end of file diff --git a/shellweb b/shellweb index 0840a6e..66a8ffa 100755 --- a/shellweb +++ b/shellweb @@ -5,6 +5,7 @@ set -e verbose=false auth_enabled=false proxy_mode=false +content_range=(false 0 0 0) nc=$(command -v nc.openbsd || command -v nc || { echo nc not found; exit 1; }) if [ `id -u` = 0 ]; then @@ -203,6 +204,10 @@ sendfile() { printf "Content-Type: %s\r\n" "$ct" printf "Content-Length: %u\r\n" "$sz" printf "Date: %s\r\n" "$(env LC_ALL=en_US.UTF-8 date)" + if [[ ${content_range[0]} == 'true' ]]; then + printf "Content-Range: ${content_range[1]}-${content_range[2]}/${content_range[3]}\r\n" + printf "$(cat $root/tmp.txt)" + fi printf "\r\n" cat <&3 exec 3<&- @@ -337,6 +342,21 @@ proxy() { fi done | $nc ${proxy_spec%%:*} $proxy_port >&p } + +range_handle() { + touch "$root/tmp.txt" + + content_range[0]='true' + content_range[1]=$start + content_range[2]=$end + content_range[3]=$(stat --printf="%s" $(pwd)/file_with_data.txt) + + if [[ "$1" -ge 0 && "$2" -le ${content_range[3]} ]]; then + dd if="$(pwd)/file_with_data.txt" of="$root/tmp.txt" ibs=1 skip=$1 count=$2 2> /dev/null + else + senderr 400 + fi +} NC_SERVER=$nc @@ -371,6 +391,11 @@ while true; do elif [[ $header == "connection:" && $v2 == $(printf "close\r") ]]; then keep_conn=false + + elif [[ $header == "range:" ]]; then + start=$(echo "$v3" | awk -F '-' '{print $1}') + end=$(echo "$v3" | awk -F '-' '{print $2}' | sed 's/[^0-9]*//g') + range_handle "$start" "$end" || senderr 400 elif [[ $header = $(printf "\r\n") && -z $v2 ]]; then # empty line (end of headers) From 66f2d50cd11e6151b06f1e102e2368dd0f26abba Mon Sep 17 00:00:00 2001 From: deeleel Date: Thu, 17 Mar 2022 18:40:36 +0300 Subject: [PATCH 2/6] fixes --- shellweb | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/shellweb b/shellweb index 66a8ffa..ab65886 100755 --- a/shellweb +++ b/shellweb @@ -194,6 +194,9 @@ cgi() { # It's okay to call this routine even after senderr(), see $sent sendfile() { + if [[ ${content_range[0]} == 'true' ]]; then + range_handle_verify + fi $sent && return 0 test -d "$1" && return exec 3<"$root/$1" || { senderr 500; return 0; } @@ -205,12 +208,14 @@ sendfile() { printf "Content-Length: %u\r\n" "$sz" printf "Date: %s\r\n" "$(env LC_ALL=en_US.UTF-8 date)" if [[ ${content_range[0]} == 'true' ]]; then - printf "Content-Range: ${content_range[1]}-${content_range[2]}/${content_range[3]}\r\n" - printf "$(cat $root/tmp.txt)" + printf "Content-Range: bytes ${content_range[1]}-${content_range[2]}/${content_range[3]}\r\n" + printf "\r\n" + range_sendfile "$root/$1" + else + printf "\r\n" + cat <&3 + exec 3<&- fi - printf "\r\n" - cat <&3 - exec 3<&- } html_escape() { @@ -343,21 +348,18 @@ proxy() { done | $nc ${proxy_spec%%:*} $proxy_port >&p } -range_handle() { - touch "$root/tmp.txt" - - content_range[0]='true' - content_range[1]=$start - content_range[2]=$end - content_range[3]=$(stat --printf="%s" $(pwd)/file_with_data.txt) - - if [[ "$1" -ge 0 && "$2" -le ${content_range[3]} ]]; then - dd if="$(pwd)/file_with_data.txt" of="$root/tmp.txt" ibs=1 skip=$1 count=$2 2> /dev/null +range_handle_verify() { + content_range[3]=$(stat --printf="%s" "$root/$file") + if [[ ${content_range[3]} -ne 0 && ${content_range[1]} -ge 0 && ${content_range[2]} -le ${content_range[3]} ]]; then + return 0 else senderr 400 fi } - + +range_sendfile() { + dd if="$root/$file" ibs=1 skip=${content_range[1]} count=${content_range[2]} 2> /dev/null +} NC_SERVER=$nc if $verbose; then @@ -393,9 +395,9 @@ while true; do keep_conn=false elif [[ $header == "range:" ]]; then - start=$(echo "$v3" | awk -F '-' '{print $1}') - end=$(echo "$v3" | awk -F '-' '{print $2}' | sed 's/[^0-9]*//g') - range_handle "$start" "$end" || senderr 400 + content_range[0]='true' + content_range[1]=$(echo "$v3" | awk -F '-' '{print $1}') + content_range[2]=$(echo "$v3" | awk -F '-' '{print $2}' | sed 's/[^0-9]*//g') elif [[ $header = $(printf "\r\n") && -z $v2 ]]; then # empty line (end of headers) From a8b3c6dbe485980aa388c2f9c0f7a83db41fc2f1 Mon Sep 17 00:00:00 2001 From: deeleel Date: Thu, 17 Mar 2022 19:05:11 +0300 Subject: [PATCH 3/6] fixes --- shellweb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shellweb b/shellweb index ab65886..7e3de77 100755 --- a/shellweb +++ b/shellweb @@ -357,8 +357,8 @@ range_handle_verify() { fi } -range_sendfile() { - dd if="$root/$file" ibs=1 skip=${content_range[1]} count=${content_range[2]} 2> /dev/null +range_sendfile(){ + dd if="$1" ibs=1 skip=${content_range[1]} count=${content_range[2]} 2> /dev/null } NC_SERVER=$nc From 0b8273c9dcec7f8b732a9f892c10321ed56cc8ee Mon Sep 17 00:00:00 2001 From: deeleel Date: Thu, 17 Mar 2022 19:11:39 +0300 Subject: [PATCH 4/6] delete test-file --- file_with_data.txt | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 file_with_data.txt diff --git a/file_with_data.txt b/file_with_data.txt deleted file mode 100644 index 2a3a307..0000000 --- a/file_with_data.txt +++ /dev/null @@ -1,4 +0,0 @@ -{"id": 1, -"email": "michael.lawson@reqres.in", -"first_name": "Michael", -"last_name": "Lawson"} \ No newline at end of file From b749323913942f938140d450cc8bec2bdd85a6d5 Mon Sep 17 00:00:00 2001 From: deeleel Date: Thu, 17 Mar 2022 19:13:39 +0300 Subject: [PATCH 5/6] fixes --- shellweb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shellweb b/shellweb index 7e3de77..7f2f691 100755 --- a/shellweb +++ b/shellweb @@ -195,7 +195,7 @@ cgi() { # It's okay to call this routine even after senderr(), see $sent sendfile() { if [[ ${content_range[0]} == 'true' ]]; then - range_handle_verify + range_handle_verify "$root/$1" fi $sent && return 0 test -d "$1" && return @@ -349,7 +349,7 @@ proxy() { } range_handle_verify() { - content_range[3]=$(stat --printf="%s" "$root/$file") + content_range[3]=$(stat --printf="%s" "$1") if [[ ${content_range[3]} -ne 0 && ${content_range[1]} -ge 0 && ${content_range[2]} -le ${content_range[3]} ]]; then return 0 else From 1574433a1216d270d57392d68e09a9ff85b05295 Mon Sep 17 00:00:00 2001 From: deeleel Date: Thu, 17 Mar 2022 19:21:18 +0300 Subject: [PATCH 6/6] edit TODO --- TODO | 1 - 1 file changed, 1 deletion(-) diff --git a/TODO b/TODO index 3a20320..6bb0215 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,4 @@ * More unit tests - * Content-Range support * Reverse proxy mode * If-Modified-Since support * Content-Disposition