From 414b8be261390d019cdafc7b63c67c9840ce10e3 Mon Sep 17 00:00:00 2001 From: Thayol Date: Wed, 23 Jul 2025 01:37:37 +0200 Subject: [PATCH] reinvent the wheel --- README.md | 15 ++++++++ cgiinfo.html | 17 +++++++++ httpd.conf | 4 +++ index.htm | 7 ++++ index.sh | 8 +++++ interpreter.server_core_internal | 60 ++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+) create mode 100644 README.md create mode 100644 cgiinfo.html create mode 100644 httpd.conf create mode 100644 index.htm create mode 100644 index.sh create mode 100755 interpreter.server_core_internal diff --git a/README.md b/README.md new file mode 100644 index 0000000..cafbc79 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Busybox HTTPD SH Server + +A simple HTML templating SH solution that runs with just `httpd` and `sh` from `busybox`. + +*(Note: Alpine Linux now splits Busybox into multiple packages: apk add busybox-extras)* + +## Quickstart + +Run the command: + +```sh +busybox httpd -vv -fp 8080 +``` + +And then open `http://localhost:8080` in your browser. diff --git a/cgiinfo.html b/cgiinfo.html new file mode 100644 index 0000000..ce07c6a --- /dev/null +++ b/cgiinfo.html @@ -0,0 +1,17 @@ + +

CGI running on

+

+

+

+

+ + + Hide env dump +
+ + Show env dump + diff --git a/httpd.conf b/httpd.conf new file mode 100644 index 0000000..1d47133 --- /dev/null +++ b/httpd.conf @@ -0,0 +1,4 @@ +I:index.htm +*.server_core_internal:/dev/null +*.html:./interpreter.server_core_internal +*.sh:/bin/sh diff --git a/index.htm b/index.htm new file mode 100644 index 0000000..b8d3716 --- /dev/null +++ b/index.htm @@ -0,0 +1,7 @@ + + + + + + + diff --git a/index.sh b/index.sh new file mode 100644 index 0000000..45adc7c --- /dev/null +++ b/index.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +echo "Content-Type: text/html" +echo "" + +echo "

Busybox HTTPD SH Server

" +echo "

For total control, scripts like this (/index.sh) can be written.

" +echo "

A demo of a more template-like page is at cgiinfo.html

" diff --git a/interpreter.server_core_internal b/interpreter.server_core_internal new file mode 100755 index 0000000..097f55f --- /dev/null +++ b/interpreter.server_core_internal @@ -0,0 +1,60 @@ +#!/bin/sh + +server_core_internal_file="${1:-index.html}" + +echo "Content-Type: text/html" +echo "" + +server_core_internal_built_script="" +server_core_internal_unit_separator="$(printf '\x1F')" +server_core_internal_i=1 +while IFS= read -r server_core_internal_line; do + server_core_internal_line=$(echo "$server_core_internal_line" | sed -E 's///g; s///g') + if [ -n "$(echo "$server_core_internal_line" | grep '^/$server_core_internal_unit_separator/g") + server_core_internal_need_newline=0 + + if [ -z "$(echo "$server_core_internal_parts" | grep "$server_core_internal_unit_separator")" ]; then + server_core_internal_need_newline=1 + fi + + OLD_IFS="$IFS" + IFS="$server_core_internal_unit_separator" + for server_core_internal_part in $server_core_internal_parts; do + if [ "$(expr "$server_core_internal_i" % 2)" -eq 0 ]; then + server_core_internal_built_script=$(printf '%s\n%s\n' "$server_core_internal_built_script" "$server_core_internal_part") + server_core_internal_need_newline=0 + else + if [ -n "$(echo "$server_core_internal_part" | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')" ]; then + server_core_internal_built_script=$(printf '%s\n%s\n' "$server_core_internal_built_script" "printf '%s' '$server_core_internal_part'") + if [ "$server_core_internal_need_newline" -eq 0 ]; then + server_core_internal_need_newline=1 + fi + fi + fi + server_core_internal_i=$(expr "$server_core_internal_i" + 1) + done + + if [ -n "$(echo "$server_core_internal_line" | grep '%-->$')" ]; then + server_core_internal_i=$(expr "$server_core_internal_i" + 1) + fi + + if [ -n "$(echo "$server_core_internal_line" | grep '