Very small HTTP/1.1 server requiring inetd or tcpsvd
Go to file
Neale Pickett 0b4f892169 More README expansion 2014-03-11 18:03:43 +00:00
contrib Log directory indexes, add webfs script 2012-11-07 19:23:28 -07:00
.gitignore Quit needing CFLAGS 2012-10-30 19:10:55 -06:00
CHANGES Fix 0.9 not detected with query_string 2013-02-14 16:39:14 -07:00
COPYING Import upstream 1.10 2011-08-16 14:36:11 -06:00
Makefile Quit needing CFLAGS 2012-10-30 19:10:55 -06:00
README More README expansion 2014-03-11 18:03:43 +00:00
README.SSL Log on 304 2012-12-09 15:12:14 -07:00
TODO Bump version 2012-10-30 15:46:39 -05:00
break-fnord.sh Document known bugs 2012-04-30 12:52:53 -06:00
eris.c Fix 0.9 not detected with query_string 2013-02-14 16:39:14 -07:00
fuzz.sh add a fuzzer 2012-02-24 21:09:33 -07:00
mime.c Make it easier to Debianize 2012-10-30 17:45:19 -06:00
mime.h Make it easier to Debianize 2012-10-30 17:45:19 -06:00
strings.c Make it easier to Debianize 2012-10-30 17:45:19 -06:00
strings.h Make it easier to Debianize 2012-10-30 17:45:19 -06:00
test.sh Fix 0.9 not detected with query_string 2013-02-14 16:39:14 -07:00
timerfc.c Make it easier to Debianize 2012-10-30 17:45:19 -06:00
timerfc.h Make it easier to Debianize 2012-10-30 17:45:19 -06:00

README

About
=====

Eris is an HTTP/1.1 web server with CGI.
It is very fast,
uses very little memory,
and has a tiny codebase which has been audited at least twice by gray-hat hackers.
It relies on an external program,
such as tcpserver or netcat,
to handle networking,
and expects to be run once for every connection.
This may sound horrible,
but it's actually pretty quick,
especially since this architecture makes it trivial to use the
`sendfile` call in Linux
(added in 2003 as a reaction to Apache losing to IIS in benchmarks),
which sends an open file directly to a socket,
without having to context switch into userspace.

It conforms to the parts of HTTP/1.1 that appear to be important to clients.
I have not found any HTTP/1.1 clients which have trouble with Eris,
including curl, which breaks with fnord (the reason I began work on Eris).

Eris HTTPD is a part of [Dirtbags Capture The Flag](http://dirtbags.net/ctf/).
After many patches against [fnord 1.10](http://www.fefe.de/),
I decided to fork fnord into a new project.
Fnord's author approved of the fork.


Differences with fnord
======================

Significant differences between eris and fnord are:

* command-line arguments instead of compile-time defines
* eliminated use of libowfat
* no build dependency of dietlibc
* elimination of "old style symlink handling"
* elimination of user switching (you can use tcpserver -[ug])
* elimination of chroot code (you can use chroot)
* several bugfixes (sent to the fnord mail list)
* ignores Accept header (fnord also ignores it, but claims not to)

Usage
=====

Start with:

	tcpserver -v -RHl localhost -u 1234 -g 1234 0 80 ./eris

There are many other ways to start eris.
For example, you can run an HTTPS server using tcpsvd and sslio.

You just need something that launches eris with stdin and stdout connected to the client.


Logging
-------

Will log to stderr in the form

	127.0.0.1 200 23 localhost Links_(0.96;_Unix) none /index.html

where 127.0.0.1 is the client IP, 200 is the HTTP exit code,
23 is the size of the content that was served (or 0 for unsuccessful exit codes),
localhost is the Host: header (the virtual host),
the next token is the user agent with spaces replaced by underscores,
the next token (none) is the Referer HTTP header or "none" if none was given,
and the rest of each line is the decoded requested URL.


Features
--------

eris does simple virtual hosting.  If the `Host:` HTTP header is there,
eris will try to chdir to a directory of that name, i.e. if the client
asks for "/" on host "www.fefe.de", eris will look for
"www.fefe.de/index.html".  Eris will also try the directory "default"
if no specific directory for the virtual host was there.

eris implements el-cheapo HTTP ranges (only byte ranges and only of the
form x-y, not multiple ranges).

eris implements content type matching and Accepts: parsing, but the
content type table is compiled in, i.e. to change it, you have to change
the source code.  Shouldn't be a problem because you _have_ the source
code ;)

eris will change dots at the start of file or directory names to colons
in the query before trying to answer them.

eris understands and implements keep-alive connections.

eris will use sendfile on Linux to enable zero-copy TCP.

If eris is given the -c option, it will regard files
whose names end with ".cgi" as CGI programs and try to execute them.
CGI programs starting with "nph-" will be handled as no-parse-header
CGIs.
Please see <http://hoohoo.ncsa.uiuc.edu/cgi/interface.html> for the CGI specification.


About The Name
==============

[Eris](http://en.wikipedia.org/wiki/Eris_(dwarf_planet%29)
is the most massive (heaviest) dwarf planet in the solar system.
It's heavier than Pluto!

Its discovery is what spurred astronomers to finally define the word "planet",
which resulted in Pluto being classified a dwarf planet.
Otherwise, we would have to count Eris as a tenth planet.