Skip to content

RipcordSoftware/libhttpserver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status Coverage Status License

libhttpserver

An HTTP web server implemented in C++ 11 and based on Boost::Asio.

Features:

  • Handles HTTP 1.0 and 1.1 clients
  • Handles chunked POST/PUT requests
  • Supports chunked responses
  • Supports GZIP responses
  • Low memory overhead streaming response API with helpers for strings and files
  • Utilizes HTTP keep-alive up to a configured request limit

Build Status

OS Architecture Status
Debian 8.6 i386 debian-8.6-i386
Debian 8.6 amd64 debian-8.6-amd64
Ubuntu 14.04 amd64 ubutu-14.04-amd64
Ubuntu 16.04 amd64 ubuntu-16.04-amd64
CentOS 6.8 amd64 centos-6.8-amd64
CentOS 7.3 amd64 centos-7.3-amd64
Fedora 25 amd64 fedora-25-amd64
FreeBSD 11 amd64 freebsd-11-amd64

Examples

The simplist possible web server:

#include "libhttpserver.h"
using rs::httpserver;

int main() {
  auto server = HttpServer::Create("0.0.0.0", 1080);
  auto func = [](socket_ptr socket, request_ptr request, response_ptr response) {
    response->setContentType("text/html").Send("<html><body><h1>Hello from libhttpserver</h1></body></html>");
  };
  server->Start(func);
}

Respond from the filesystem:

#include "libhttpserver.h"
using rs::httpserver;

int main() {
  // the server will listen on all IPs on port 1080
  auto server = HttpServer::Create("0.0.0.0", 1080);
  
  // a lambda function which handles the request
  auto func = [](socket_ptr socket, request_ptr request, response_ptr response) {
    // get the request uri
    auto uri = request->getUri();
    
    if (uri == "/") {
      // the uri was just /, redirect to /index.html
      response->Redirect("/index.html");
    } else {
      // use the uri file extension to determine the content type
      auto contentType = MimeTypes::GetType(uri);
      
      // we only respond if we got a content type
      if (contentType) {
        // the content files are in the www sub-directory
        uri = "www" + uri;
        
        // open a stream on the file
        FileStream stream(uri);
        if (stream) {
          // respond with the contents of the file
          response->setContentType(contentType.get()).Send(stream);
        }
    }
  };
  
  // starts the server and blocks
  server->Start(func);
}

The example above assumes the web content is in the sub-directory www. If the content type could not be found or the file does not exist then the server will respond with a 404 Not Found.

You can extend the Content/MIME type mapping as follows:

rs::httpserver::MimeTypes::AddType(".bz2", "application/x-bzip2", false);

See src/httpserver/main.cpp for a working file based web server impl with last-modified/etag support.

Building

You will need:

  • GCC 4.8 or clang 3.5 or higher
  • GNU Make
  • Boost 1.53 or higher
  • ZLib 1.2.7 or higher
  • Doxygen (for the docs)

To build the binaries on Linux:

 $ make

To build and run the tests:

 $ make test

To build the documentation:

 $ make docs

On OSX or BSD add CC=clang CXX=clang++ to the command line, e.g. make CC=clang CXX=clang++.

Linking

Apart from including the libhttpserver.h you will need to configure your application to link against the following libraries:

  • libhttpserver (!)
  • boost_filesystem
  • boost_thread
  • boost_date_time
  • boost_system
  • zlib
  • pthreads

Releases

No releases published

Packages

No packages published