Skip to content

wsjcpp/wsjcpp-light-web-server

Repository files navigation

wsjcpp-light-web-server

Build Status Github Stars Github Stars Github Forks

Integrate to your project

Include this files:

  • src.wsjcpp/wsjcpp_core/wsjcpp_core.h
  • src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp
  • src.wsjcpp/nlohmann_json/json.hpp
  • src/wsjcpp_light_web_http_request.h
  • src/wsjcpp_light_web_http_request.cpp
  • src/wsjcpp_light_web_http_response.h
  • src/wsjcpp_light_web_http_response.cpp
  • src/wsjcpp_light_web_http_handler_rewrite_folder.h
  • src/wsjcpp_light_web_http_handler_rewrite_folder.cpp
  • src/wsjcpp_light_web_http_handler_web_folder.h
  • src/wsjcpp_light_web_http_handler_web_folder.cpp
  • src/wsjcpp_light_web_server.h
  • src/wsjcpp_light_web_server.cpp

Integrate via wsjcpp

$ wsjcpp install https://github.com/wsjcpp/wsjcpp-light-web-server:master

Fast generate handler:

$ wsjcpp generate WsjcppLightWebHttpHandler SomePage

So will be generated sample class 'LightWebHttpHandlerSomePage' with TODO

Examples

Example for simular rewrute_rules

Simpular apache:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.html

Contains base handler:

WsjcppLightWebHttpHandlerRewriteFolder(sPrefixPath, sDirPath)

Where

Specific: if file will be not found in web folder so will be returned file index.html

Will be good for single-web-app (like angular)

Example init, add handler and start server

#include <wsjcpp_light_web_http_handler_rewrite_folder.h>

... 
WsjcppLightWebServer httpServer;
httpServer.setPort(1234);
httpServer.setMaxWorkers(1);
httpServer.addHandler((WsjcppLightWebHttpHandlerBase *)new WsjcppLightWebHttpHandlerRewriteFolder("/app1/", "./web"));
httpServer.startSync(); // this method will be hold current thread, if you with you can call just start/stop command

After compile and start will be available on http://localhost:1234/app1/

Example simple web folder

Contains base handler:

WsjcppLightWebHttpHandlerWebFolder(sPrefixPath, sDirPath)

Where

Specific: if file does not exists wil be returned 404 not found

Example init, add handler and start server

#include <wsjcpp_light_web_http_handler_web_folder.h>

... 
WsjcppLightWebServer httpServer;
httpServer.setPort(1234);
httpServer.setMaxWorkers(1);
httpServer.addHandler((WsjcppLightWebHttpHandlerBase *)new WsjcppLightWebHttpHandlerWebFolder("/app2/", "./web"));
httpServer.startSync(); // this method will be hold current thread, if you with you can call just start/stop command

After compile and start will be available on http://localhost:1234/app2/

Example custom handler

Define class:

header-file http_handler_custom.h:

#ifndef HTTP_HANDLER_CUSTOM_H
#define HTTP_HANDLER_CUSTOM_H

#include <wsjcpp_light_web_server.h>

class HttpHandlerCustom : WsjcppLightWebHttpHandlerBase {
    public:
        HttpHandlerCustom();
        virtual bool canHandle(const std::string &sWorkerId, WsjcppLightWebHttpRequest *pRequest);
        virtual bool handle(const std::string &sWorkerId, WsjcppLightWebHttpRequest *pRequest);

    private:
        std::string TAG;
};
#endif // HTTP_HANDLER_CUSTOM_H

source-file http_handler_custom.cpp:

#include <wsjcpp_core.h>
#include "http_handler_custom.h"

// ----------------------------------------------------------------------

HttpHandlerCustom::HttpHandlerCustom()
: WsjcppLightWebHttpHandlerBase("custom") {
    TAG = "HttpHandlerCustom";
}

// ----------------------------------------------------------------------

bool HttpHandlerCustom::canHandle(const std::string &sWorkerId, WsjcppLightWebHttpRequest *pRequest) {
    std::string _tag = TAG + "-" + sWorkerId;
    std::string sRequestPath = pRequest->getRequestPath();

    if (sRequestPath == "/custom/" || sRequestPath == "/custom") {
        return true;    
    }
    if (sRequestPath == "/custom1/" || sRequestPath == "/custom1") {
        return true;    
    }
    return false;
}

// ----------------------------------------------------------------------

bool HttpHandlerCustom::handle(const std::string &sWorkerId, WsjcppLightWebHttpRequest *pRequest) {
    std::string _tag = TAG + "-" + sWorkerId;
    std::string sRequestPath = pRequest->getRequestPath();
    // WsjcppLog::warn(_tag, sRequestPath);
    
    WsjcppLightWebHttpResponse resp(pRequest->getSockFd());
    if (sRequestPath == "/custom" || sRequestPath == "/custom/") {
        resp.cacheSec(60).ok().sendText(
            "<h1>This is custom</h1>"
        );
    } else if (sRequestPath == "/custom1" || sRequestPath == "/custom1/") {
        resp.cacheSec(60).ok().sendText(
            "<h1>But this is custom1</h1>"
        );
    } else {
        resp.noCache().ok().sendText(
            "<h1>Unknown</h1>"
        );
    }
    return true;
}

Example init, add handler and start server order is important! Server will call canHandle & handle in same order as addHandler called

WsjcppLightWebServer httpServer;
httpServer.setPort(1234);
httpServer.setMaxWorkers(1);
httpServer.addHandler((WsjcppLightWebHttpHandlerBase *)new HttpHandlerCustom());
httpServer.addHandler((WsjcppLightWebHttpHandlerBase *)new WsjcppLightWebHttpHandlerRewriteFolder("/", "./web"));
httpServer.startSync(); // this method will be hold current thread, if you with you can call just start/stop command