No description
Find a file
2017-12-09 16:45:40 -05:00
example Fixed #21 2017-12-05 19:19:07 -05:00
test Fixed Unit test failures on Windows 2017-12-07 00:05:43 -05:00
.gitignore added simplesvr sample. 2013-07-04 22:08:49 -04:00
httplib.h Raname refactoring 2017-12-09 16:45:40 -05:00
README.md Updated README 2017-12-05 19:30:13 -05:00

cpp-httplib

A C++11 header-only HTTP library.

The Boost Software License 1.0

It's extremely easy to setup. Just include httplib.h file in your code!

Inspired by Sinatra and express.

Server Example

#include <httplib.h>

int main(void)
{
    using namespace httplib;

    Server svr;

    svr.get("/hi", [](const Request& req, Response& res) {
        res.set_content("Hello World!", "text/plain");
    });

    svr.get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) {
        auto numbers = req.matches[1];
        res.set_content(numbers, "text/plain");
    });

    svr.listen("localhost", 1234);
}

Method Chain

svr.get("/get", [](const auto& req, auto& res) {
        res.set_content("get", "text/plain");
    })
    .post("/post", [](const auto& req, auto& res) {
        res.set_content(req.body(), "text/plain");
    })
    .listen("localhost", 1234);

Static File Server

svr.set_base_dir("./www");

Logging

svr.set_logger([](const auto& req, const auto& res) {
    your_logger(req, res);
});

Error Handler

svr.set_error_handler([](const auto& req, auto& res) {
    const char* fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>";
    char buf[BUFSIZ];
    snprintf(buf, sizeof(buf), fmt, res.status);
    res.set_content(buf, "text/html");
});

multipart/form-data POST data

svr.post("/multipart", [&](const auto& req, auto& res) {
    auto size = req.files.size();
    auto ret = req.has_file("name1"));
    const auto& file = req.get_file_value("name1");
    // file.filename;
    // file.content_type;
    auto body = req.body.substr(file.offset, file.length));
})

Client Example

GET

#include <httplib.h>
#include <iostream>

int main(void)
{
    httplib::Client cli("localhost", 1234);

    auto res = cli.get("/hi");
    if (res && res->status == 200) {
        std::cout << res->body << std::endl;
    }
}

POST

res = cli.post("/post", "text", "text/plain");
res = cli.post("/person", "name=john1&note=coder", "application/x-www-form-urlencoded");

POST with parameters

httplib::Map params;
params["name"] = "john";
params["note"] = "coder";
auto res = cli.post("/post", params);

With Progress Callback

httplib::Client client(url, port);

// prints: 0 / 000 bytes => 50% complete
std::shared_ptr<httplib::Response> res = 
    cli.get("/", [](int64_t len, int64_t total) {
        printf("%lld / %lld bytes => %d%% complete\n", 
            len, total,
            (int)((len/total)*100));
    }
);

progress

This feature was contributed by underscorediscovery.

OpenSSL Support

SSL support is available with CPPHTTPLIB_OPENSSL_SUPPORT. libssl and libcrypto should be linked.

#define CPPHTTPLIB_OPENSSL_SUPPORT

SSLServer svr("./cert.pem", "./key.pem");

SSLClient cli("localhost", 8080);

Copyright (c) 2017 Yuji Hirose. All rights reserved.