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.

Releases

No releases published

Packages

No packages published