#include "TessesFramework/TessesFramework.hpp" #include #include #include #include using namespace Tesses::Framework; using namespace Tesses::Framework::Http; using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::TextStreams; using namespace Tesses::Framework::Threading; std::shared_ptr sse = std::make_shared(); class Johnny : public ServerContextData { public: Johnny() { text = "Steve Ballmer"; } std::string text; ~Johnny() { std::cout << "Destroying" << std::endl; } }; class MyWebServer : public IHttpServer { public: bool Handle(ServerContext &ctx) { std::cout << ctx.path << std::endl; if (ctx.path == "/") { std::shared_ptr fs = std::make_shared("index.html", "rb"); ctx.WithMimeType("text/html").SendStream(fs); return true; } else if (ctx.path == "/mypath.html") { std::string txt = "

Root: " + HttpUtils::HtmlEncode(ctx.GetServerRoot()) + "

"; ctx.WithMimeType("text/html").SendText(txt); return true; } else if (ctx.path == "/getabsolute.html") { std::string path; if (ctx.queryParams.TryGetFirst("path", path)) { std::string txt = "

Path: " + HttpUtils::HtmlEncode(ctx.MakeAbsolute(path)) + "

"; ctx.WithMimeType("text/html").SendText(txt); return true; } } else if (ctx.path == "/streaming.html") { StreamWriter writer(ctx.OpenResponseStream()); writer.WriteLine(""); writer.WriteLine("Streaming"); writer.WriteLine(""); writer.WriteLine("

Streaming

"); writer.WriteLine("
    "); for (size_t i = 0; i < 10000; i++) { writer.WriteLine("
  • " + std::to_string(i) + "
  • "); TF_Sleep(10); } writer.WriteLine("
"); writer.WriteLine(""); writer.WriteLine(""); return true; } else if (ctx.path == "/ssetest.html") { } else if (ctx.path == "/sse") { ctx.SendServerSentEvents(sse); return true; } else if (ctx.path == "/main.js") { std::shared_ptr fs = std::make_shared("main.js", "rb"); ctx.WithMimeType("text/js").SendStream(fs); return true; } else if (ctx.path == "/upload") { ctx.ParseFormData( [](std::string mime, std::string filename, std::string name) -> std::shared_ptr { return std::make_shared(filename, "wb"); }); } else if (ctx.path == "/steve") { Johnny *data = ctx.GetServerContentData("mytag"); data->text = "Demi Lovato"; } return false; } }; class MyOtherWebServer : public IHttpServer { public: bool Handle(ServerContext &ctx) { TF_LOG("IN HANDLE"); if (ctx.path == "/") { std::string name; if (ctx.queryParams.TryGetFirst("name", name)) { std::cout << name << std::endl; TF_LOG(name); ctx.WithMimeType("text/plain") .WithContentDisposition(HttpUtils::Sanitise(name) + ".txt", false) .SendText(name + " is cool."); // do something with q return true; } } else if (ctx.path == "/status") { int64_t num; if (ctx.queryParams.TryGetFirstInt("code", num)) { ctx.statusCode = (StatusCode)num; } ctx.SendErrorPage(true); return true; } else if (ctx.path == "/error") { throw std::runtime_error("This is a error"); } else if (ctx.path == "/error-debug") { ctx.WithDebug(true); throw std::runtime_error( "Platform is " + Tesses::Framework::Platform::Environment::GetPlatform()); } else if (ctx.path == "/mymount/steve") { Johnny *data = ctx.GetServerContentData("mytag"); ctx.SendText(data->text); return true; } else if (ctx.path == "/mypath.html") { std::string txt = "

Root: " + HttpUtils::HtmlEncode(ctx.GetServerRoot()) + "

"; ctx.WithMimeType("text/html").SendText(txt); return true; } return false; } }; int main(int argc, char **argv) { TF_InitWithConsole(); int64_t timer = 0; auto timerHDL = TF_Timer([&timer]() -> void { timer++; sse->SendData("Timer has ticked " + std::to_string(timer) + " times now"); }); std::shared_ptr routeSvr = std::make_shared(); routeSvr->Get("/name/{name}/greeting", [](ServerContext &ctx) -> bool { std::string name; if (ctx.pathArguments.TryGetFirst("name", name)) { ctx.WithMimeType("text/plain").SendText("Hello " + name); } else { ctx.WithMimeType("text/plain").SendText("Please provide a name"); } return true; }); routeSvr->Get("/name/{name}/length", [](ServerContext &ctx) -> bool { std::string name; if (ctx.pathArguments.TryGetFirst("name", name)) { ctx.WithMimeType("text/plain") .SendText("The length of the name is " + std::to_string(name.size())); } else { ctx.WithMimeType("text/plain").SendText("Please provide a name"); } return true; }); std::shared_ptr myo = std::make_shared(); std::shared_ptr mws = std::make_shared(); std::shared_ptr mountable = std::make_shared(myo); mountable->Mount("/mymount/", mws); mountable->Mount("/routeSvr/", routeSvr); HttpServer server(10001, mountable); server.StartAccepting(); TF_RunEventLoop(); std::cout << "Closing server" << std::endl; }