MIHL: Minimal Httpd Library

Minimal Httpd Library (MIHL)


Currently, still under development.
This is then  highly experimental,
not stable,
and provided only as reference.


A Simple Example

Programming Model


API Description


Eclipse Based code




MIHL is a C library that helps to implement an HTTP embedded server. It is designed to be small and to provide only a minimal set of functionalities. Typically, MIHL can be used in an embedded device where a Web-based interface is useful (configuration, status, etc.). MIHL C library can be compiled for both Linux (x86, PowerPC, ARM) and XP. MIHDL does not use threads, but rather use non blocking sockets I/O.

A Simple Example

This very simple example should help to have a good high-level overview of a minimal HTTP server built using this library.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "mihl.h"
int http_root( mhil_cnx_t *cnx, char const *tag, char const *host, void *param ) {
    mihl_add( cnx, "<html>" );
    mihl_add( cnx, "<body>" );
    mihl_add( cnx, "This is a test HTML page for MIHL.<br>" );
    mihl_add( cnx, "<br>Here is a JPEG Image:<br>" );
    mihl_add( cnx, "<img style='width: 70px; height: 72px;' alt='' src='image.jpg'><br><br>" );
    mihl_add( cnx, "<a href='nextpage.html'>Next Page<a>" );
    mihl_add( cnx, "</body>" );
    mihl_add( cnx, "</html>" );
    mihl_send( cnx, NULL,
        "Content-type: text/html\r\n" );
    return 0;
int http_nextpage( mihl_cnx_t *cnx, char const *tag, char const *host, void *param ) {
    mihl_add( cnx, "<html>" );
    mihl_add( cnx, "<body>" );
    mihl_add( cnx, "This is another page...<br>" );
    mihl_add( cnx, "<a href=''>Previous Page<a>" );
    mihl_add( cnx, "</body>" );
    mihl_add( cnx, "</html>" );
    mihl_send( cnx,
        "Content-type: text/html\r\n" );
    return 0;
int main( int argc, char *argv[] ) {
    mihl_ctx_t *ctx = mihl_init( NULL, 8080, 8, 
    mihl_handle_get( ctx, "/", http_root, NULL );
    mihl_handle_file( ctx, "/image.jpg", "image.jpg", "image/jpeg", 0 );
    mihl_handle_get( ctx, "/nextpage.html", http_nextpage, NULL );
    for (;;) {
        int status = mihl_server( ctx );
        if ( status == -2 )
    return 0;

Programming Model

MIHL uses non-blocking Socket and a single-thread model. You have to call a function (mihl_server) on a regular interval, in order to manage new connections, existent connections and timed out connections. You install C handler functions to build pages for specifics URL (such as “/”, “/mypage.html” and so forth).

Only a C API to the library is currently provided. The library can be build only for Linux, there is no plan to support Window$ platforms.


Doxygen generated documentation for the library is available on the left pane.


Please note that only about 25% is done so far, the documentation is still a work in progress.

API Description





mihl_ctx_t *mihl_init( char const *bind_addr, int port, int maxnb_cnx, unsigned log_level )

Library initializations: start waiting for HTTP connections.


int mihl_end( mihl_ctx_t *ctx )

End the server, close all connections and release all resources.


int mihl_server( mihl_ctx_t *ctx )

Manage new connections, existent connections,
and connections timeout.


int mihl_info( mihl_ctx_t *ctx , int maxnb_cnxinfos, mihl_cnxinfo_t *infos )

Return information about existent connections.


int mihl_add( mihl_cnx_t *cnx, char const *fmt, ... )

Build HTML page for a given HTTP URL.


int mihl_send( mihl_cnx_t *cnx, char const *fmt_header, ... )

Send an HTML page build with calls to mihl_add.


int mihl_handle_file(mihl_ctx_t *ctx,
    char const *tag, char const *filename,
    char const *content_type, int close_connection )

Install a file handler function (GET).


int mihl_handle_get(mihl_ctx_t *ctx ,
    char const *tag, mihl_pf_handle_get_t *pf, void *param )

Install a GET handler function.


int mihl_handle_post(mihl_ctx_t *ctx,
    char const *tag, mihl_pf_handle_post_t *pf, void *param )

Install a POST handler function.


Several examples (C code) are provided to demonstrate and to test the use of the library:




Simple use of GET.
Display a page with a JPEG image and a link to a 2nd page. The 2nd page contains a link to the 1st page.
A custom handler is installed to handle non existent pages.
Demonstrate also how to deal with a simple Basic Authentication.


Demonstrate how to use GET/POST.


Demonstrate the use of Ajax (using the excellent prototype.js)..

Eclipse + Makefile Based code

All the code for this project is developed using Eclipse/CDT (Eclipse 3.X + CDT 4.X), and should be preferably compiled using this IDE.
This said, you can also download  the project with SVN and compile it using the Makefiles (the Eclipses projects are all Makefile based).


The easiest way to proceed is to use the SVN plugin within Eclipse: subclipse.

You can also SVN the code, and then import the projects from Eclipse.

Or you can forget Eclipse, and just us the makefile.

Please note the following regarding the code:

·        This is C code, not C++ code. Actually, the code is gnu99 (iso99 + gnu extensions).

·        If you want to build the documentation (generated using Doxygen), you’ll need to have doxygen and graphviz installed. I suggest installing doxywizard as well, but you might try eclox as well.


This project is released under the BSD license: see here for details.


Developed and tested using Fedora 7, then Fedor 8 and now Fedora 9. The code is used on both X86 and ARM9 platforms.

Full source code

svn co https://mihl.svn.sourceforge.net/svnroot/mihl

Anonymous SVN access

Browse SVN repository

Project Statistics

Usage Statistics For mihl


Olivier Singla

Pages created:
Dec 2006

Pages last revised:
May 26th 2008

SourceForge.net Logo



Generated on Mon May 26 18:05:52 2008 for mihl by  doxygen 1.5.6