• Stars
    star
    648
  • Rank 69,480 (Top 2 %)
  • Language
    Shell
  • License
    MIT License
  • Created almost 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A purely bash web server, no socat, netcat, etc...

Bash-web-server

A purely bash web server, no socat, netcat, etc...

Requirement

  • bash 5.2 (The patch will be included in bash5.2 - Alpha release already contains the patch)
  • if bash version is under 5.2, patched loadable accept builtin (http://git.savannah.gnu.org/cgit/bash.git/tree/examples/loadables/accept.c) is needed, you have to apply accept.patch to your loadable accept.c file which is existed in bash source code, and than build and install the loadable accept builtin into BASH_LOADABLE_PATH specified in bash-server.sh

How to

The port can be set by the env var: HTTP_PORT

The path to accept (Directory) can be set by using: BASH_LOADABLE_PATH

Server Methods:

  • serveHtml (needs DOCUMENT_ROOT envvars) - This will serve the static files
  • script file - The script need a file as first argument which will be source. The file will need a function named runner, which will be run on each request

Basic authentication can be enabled by env var: NEED_AUTH, accounts and passwords are stored in users.csv

Problems...

Well there's a little problem... since accept doesn't close the connection (Or i'm doing something wrong), the connection will go into TIME_WAIT. This means that we need to wait the time the connection will be closed, after that we can reopen a connection. I will have a look at the source code and probably provide some options, like a bind-address and a close when the FD is closed.

UPDATE:

Accept has been patched by me. Now we can handle multiple request at the same time, without waiting the TIME_WAIT.

To use the new accept, you will need to compile the accept from this repo, a pull request will be send to bash, but it will take some time.

Now we can run multiple connection on the same time, since the connection is running in a subshell.

Busion

Busion is used to source some functions from other repositorys instead of copy/paste (https://github.com/dzove855/busion)

TODO

  • Implement logging and provide a logging format like httpd
  • Implement multi processing (this will be a huge step, but we need to patch accept)
  • Implement urlencode/decode to provide readable get data
  • Implement content-type detection - Use mime type like nginx
  • Add basic auth
  • Add cookie handler
  • Add session handler