Skip to content

MarcoLucidi01/sws

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

91 Commits
 
 
 
 
 
 
 
 

Repository files navigation

sws: Simple Small Static Stupid Whatever Web Server

I was learning about sockets and network programming (yes, Beej's guide) and decided to implement a tiny HEAD GET only http server as exercise.

the idea was to mimic and maybe improve what you can do with the command:

$ python3 -m http.server

it speaks HTTP/1.0 (more or less) and it will accept HTTP/1.1 requests, anything else will be rejected.

features

  • Connection keep-alive
  • range requests (only one byte range is allowed)
  • If-Modified-Since
  • directory listing
  • custom index page file (default index.html)

install / uninstall

to install inside directory /usr/local/bin/ run

$ make install

to uninstall run

$ make uninstall

usage

to serve your current working directory at http://localhost:8080 run

$ sws

to serve directory /foo/bar at http://localhost:8080 run

$ sws -r /foo/bar

to serve directory /foo/bar at http://localhost:6666 using file home.html as index page run

$ sws -r /foo/bar -p 6666 -i home.html

benchmarks

my machine is a i5-4300U @ 1.90GHz with 4GB of RAM running Linux 4.19 (Debian 10)

13 bytes ascii file

$ more hello
Hello World!
$ sws > /dev/null

$ wrk -c 500 -t 10 -d 10s --latency http://localhost:8080/hello
Running 10s test @ http://localhost:8080/hello
  10 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    18.71ms  107.40ms   1.67s    96.72%
    Req/Sec     0.87k   697.31     4.26k    76.36%
  Latency Distribution
     50%    3.11ms
     75%    3.96ms
     90%    5.62ms
     99%  450.05ms
  78317 requests in 10.07s, 16.51MB read
  Socket errors: connect 0, read 0, write 0, timeout 43
Requests/sec:    7774.18
Transfer/sec:    1.64MB

1MB random file

$ head -c $(( 2 ** 20 )) /dev/urandom > foo
$ sws > /dev/null

$ wrk -c 500 -t 10 -d 10s --latency http://localhost:8080/foo
Running 10s test @ http://localhost:8080/foo
  10 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    62.64ms  155.25ms   1.94s    94.20%
    Req/Sec   154.08     66.77   434.00     68.91%
  Latency Distribution
     50%   27.90ms
     75%   45.25ms
     90%   86.70ms
     99%  881.81ms
  15150 requests in 10.09s, 14.80GB read
  Socket errors: connect 0, read 0, write 0, timeout 20
Requests/sec:    1501.31
Transfer/sec:    1.47GB

64 entries directory listing

$ ls Music/Playlist\ Pink\ Floyd/ | wc -l
64
$ sws > /dev/null

$ wrk -c 500 -t 10 -d 10s --latency http://localhost:8080/Music/Playlist%20Pink%20Floyd/
Running 10s test @ http://localhost:8080/Music/Playlist%20Pink%20Floyd/
  10 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    34.22ms  139.70ms   1.84s    95.76%
    Req/Sec   391.74    263.27     1.42k    64.00%
  Latency Distribution
     50%   10.50ms
     75%   11.54ms
     90%   12.81ms
     99%  797.23ms
  34812 requests in 10.10s, 285.65MB read
  Socket errors: connect 0, read 0, write 0, timeout 48
Requests/sec:    3447.72
Transfer/sec:    28.29MB

please don't use this thing in any real world environment! I use it inside my LAN to share files, stream videos and to play around with static websites.

About

Simple Small Static Stupid Whatever Web Server

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published