From 8480e8287fdf3aa933ad7b82457b3e67ab0bfa0b Mon Sep 17 00:00:00 2001 From: Nathan Lasseter Date: Mon, 21 Oct 2013 20:14:27 +0100 Subject: First commit --- .gitignore | 2 ++ Makefile | 10 ++++++++++ Readme.textile | 9 +++++++++ server.d | 26 ++++++++++++++++++++++++++ serverutils.d | 17 +++++++++++++++++ 5 files changed, 64 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 Readme.textile create mode 100644 server.d create mode 100644 serverutils.d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c46439 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +server diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b741505 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +TARGET=server +PREQS=server.o serverutils.o + +all: ${TARGET} + +${TARGET}: ${PREQS} + dmd -of$@ $^ + +%.o: %.d + dmd -c $< diff --git a/Readme.textile b/Readme.textile new file mode 100644 index 0000000..b47c8ca --- /dev/null +++ b/Readme.textile @@ -0,0 +1,9 @@ +h1. servd + +h2. Lightweight low-config no-frills webserver + +servd is a very non-featureful webserver. It doesn't yet even do the web part. + +It roots itself in the directory it is called from. + +Call it with a port. It only listens locally. diff --git a/server.d b/server.d new file mode 100644 index 0000000..640271c --- /dev/null +++ b/server.d @@ -0,0 +1,26 @@ +import std.socket, std.stdio, + std.conv, std.file, + std.string; +import serverutils; + +void main(string[] args) { + if (args.length != 2) return; + auto sock = new TcpSocket(); + sock.bind(new InternetAddress("127.0.0.1", to!ushort(args[1]))); + sock.listen(1000); + while (true) { + auto level = 0; + auto pair = sock.accept(); + char[255] filename; + auto len = pair.receive(filename); + auto file = filename[0 .. len]; + file = strip(file); + if (inRoot(file)) { + pair.send(readText(file)); + } else { + pair.send("ERROR: Client left root!\n"); + } + pair.shutdown(SocketShutdown.BOTH); + pair.close(); + } +} diff --git a/serverutils.d b/serverutils.d new file mode 100644 index 0000000..d5b9836 --- /dev/null +++ b/serverutils.d @@ -0,0 +1,17 @@ +bool inRoot(char[] path) { + auto level = 0; + if (path[0] == '/') return false; + while (path.length > 0) { + if (path[0] == '/') { + level++; + path = path[1..$]; + } else if (path[0] == '.' && path[1] == '.' && path[2] == '/') { + level--; + path = path[3..$]; + } else { + path = path[1..$]; + } + if (level < 0) return false; + } + return true; +} -- cgit v1.2.1