Skip to content

RipcordSoftware/libhttpserver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

87e8f67 · Oct 10, 2018
Nov 29, 2016
Feb 21, 2017
Mar 12, 2015
May 11, 2015
Oct 10, 2018
Mar 12, 2015
Feb 26, 2015
Oct 10, 2018
Feb 2, 2017
Nov 27, 2015

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

About

A simple, easy to use C++ 11 based HTTP web server

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published