git clone cchttpd


cchttpd - a very simple http server which supports only GET


cchttpd [ -d ] [ -v ] [ -vv ] [ -u username ] [ -g groupname ] [ -h dir ] [ -ip address ] [ -p port ] [ -t timeout ] [ -log logfile ] [ -- URI = script ... ]


Cchttpd is a very simple and lightweight http server for your website whose root is located at dir. It only supports the GET method with possibly a single range. It waits requests on the standard input and reponds on the standard output. It can be used with inetd(8) in order to respond to network requests. Suppose that you have installed cchttpd in /usr/bin and that the root of your website is /var/www. Just put in your inetd.conf the following.

http stream tcp nowait nobody /usr/bin/cchttpd cchttpd /var/www

Make sure that your /etc/service(5) file contains a line about http.

http    80/tcp       # WorldWideWeb HTTP

When the client requests a resource correspoding to a directory on the server, cchttpd will send back the listing of the directory ignoring all files that it cannot open and files beginning with a '.'. If cchttpd cannot open the directory at all, whatever the reason is, it responds with error 404, Not Found.


Cchttpd can also be used as a stand-alone server. Here is how it works. On every incoming connexion cchttpd forks so that each client (or connexion) is handled by a separate process. Cchttpd is not intended to be used for big websites. But, even for a personal website hosted on your personal computer at your home where your ISP gives you a ridiculous upload, the retrieval of a large file (say a few MB) can take time. And during this retrieval time you do not want your website to be off, hence the fork stuff.



Daemonize cchttpd.

-v, -vv

Increase the verbosity of cchttpd. By default all errors and informations on the functionning of cchttpdare logged. With -v all informations concerning the connexions are logged. With -vv a lot of stuff is logged mainly for debugging purpose.

-u username

This option, along with -g, can be used for privilege dropdown, username must be a valid user of the system, for example user nobody.

-g groupname

This option, along with -u, can be used for privilege dropdown, groupname must be a valid group of the system, for example group nogroup.

-h dir

Set the root dir of your website to be dir.

-t timeout

Set the timeout for incomming connection to timeout. It must be an integer between 0 and 3600 representing seconds. A timeout of 0 indicates no timeout. By default the timeout is 5 seconds.

-ip address

Listen for incoming connexions on the local IP address address.

-p port

Listen for incoming connexions on port port.

-log logfile

All log messages of cchttpd wil go to logfile. By default all log messages go to stderr.


Some webpages need to be generated when requested by a client. Cchttpd allows this kind of webpages. Every time a client requests URI, cchttpd executes script which must send the content of the page onto standard output. Script must also send the HTTP headers via standard output. It is strongly recommended that the HTTP headers look like

HTTP/1.1 200 OK
Server: cchttpd
Content-Type: mime/type
Content-Length: size
Connection: close

[ real content here]

where mime/type must be a valid MIME type and size must be the actual size in bytes of the content you want to send. Also do not forget that new lines must be encoded with \r\n. Note that script does not have any information about the IP address or the URI requested by the client that caused script to be executed. Cchttpd does not support any POST method. Standard input and standard error for script are redirected to /dev/null.


inetd(8),services(5), RFC2616(


Written by Guillaume Quintin (