#include "TessesFramework/TessesFramework.hpp" #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; 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) + "
  • "); } writer.WriteLine("
"); writer.WriteLine(""); writer.WriteLine(""); 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 == "/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(); 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; }