diff --git a/mongoose b/mongoose index 03d8465..6349024 160000 --- a/mongoose +++ b/mongoose @@ -1 +1 @@ -Subproject commit 03d846529d4baf96675858849000219dae91c072 +Subproject commit 63490249ba5a2301f9c710d22ee819c0de060e66 diff --git a/src/DynamicObjects.cc b/src/DynamicObjects.cc index 10a3366..d4ce00f 100644 --- a/src/DynamicObjects.cc +++ b/src/DynamicObjects.cc @@ -10,7 +10,7 @@ std::string DynamicObjects::render_object_list() for (auto& it : this->m_thevec){ output += u8"
  • \n"; - output += u8"get_baseurl() + it.get_filename() + u8"\">"; //we could include baseurl here? + output += u8"get_baseurl() + u8"files/"+ it.get_filename() + u8"\">"; //we could include baseurl here? output += it.get_filename(); output += u8" "; output += it.get_pretty_sized(); diff --git a/src/Routerin.H b/src/Routerin.H index f7548ff..5ade409 100644 --- a/src/Routerin.H +++ b/src/Routerin.H @@ -9,6 +9,8 @@ class DynamicObjects; +int event_route_wrap(struct mg_connection *conn, mg_event ev); + class Routerin { public: @@ -29,25 +31,32 @@ public: +/*enum mg_result { MG_FALSE, MG_TRUE, MG_MORE };*/ +//enum mg_event { + //MG_POLL = 100, // Callback return value is ignored + //MG_CONNECT, // If callback returns MG_FALSE, connect fails + //MG_AUTH, // If callback returns MG_FALSE, authentication fails + //MG_REQUEST, // If callback returns MG_FALSE, Mongoose continues with req + //MG_REPLY, // If callback returns MG_FALSE, Mongoose closes connection + //MG_CLOSE, // Connection is closed, callback return value is ignored + //MG_WS_HANDSHAKE, // New websocket connection, handshake request + //MG_HTTP_ERROR // If callback returns MG_FALSE, Mongoose continues with err +//}; - static int event_route(struct mg_event *event) + + int event_route(struct mg_connection *conn, enum mg_event event) { // Foohash fh; - Routerin *rouri = Routerin::get_instance(); - switch (event->type) { - case MG_REQUEST_BEGIN: - return rouri->event_request_route(event); - case MG_THREAD_BEGIN: - return rouri->event_newthread_route(event); - case MG_REQUEST_END: - return rouri->event_requend_route(event); - case MG_HTTP_ERROR: - case MG_EVENT_LOG: - case MG_THREAD_END: + switch (event) { + case MG_REQUEST: + return event_request_route(conn); + case MG_AUTH: + return MG_TRUE; default: - return rouri->event_fallback_route(event); + return event_fallback_route(event, conn); } } + std::string const & get_baseurl()const{return baseurl;} void set_baseurl(std::string baseurl); @@ -66,17 +75,21 @@ private: std::string file_path; std::string json_path; - bool hasInstance = false; +// bool hasInstance = false; - int event_request_route ( struct mg_event *event); - int event_newthread_route ( struct mg_event *event); - int event_fallback_route ( struct mg_event *event); - int event_requend_route ( struct mg_event *event); + int event_request_route ( struct mg_connection *conn); +// int event_newthread_route ( struct mg_event *event); + int event_fallback_route ( enum mg_event event, struct mg_connection *conn ); +// int event_requend_route ( struct mg_event *event); - int rq_static(char const * const restrstr , struct mg_event *event); - int rq_file(char const * const reststr , struct mg_event *event); - int rq_date(char const * const reststr , struct mg_event *event); - int rq_upload(char const * const reststr , struct mg_event *event); - int rq_render_mainpage(struct mg_event *event); + int rq_static(char const * const restrstr , struct mg_connection *conn); + int rq_file(char const * const reststr , struct mg_connection *conn); + int rq_date(char const * const reststr , struct mg_connection *conn); + int rq_upload(char const * const reststr , struct mg_connection *conn); + int rq_render_mainpage(struct mg_connection *conn); + + int handle_upload(struct mg_connection *conn); }; + + diff --git a/src/Routerin.cc b/src/Routerin.cc index b723c34..97a12a0 100644 --- a/src/Routerin.cc +++ b/src/Routerin.cc @@ -70,13 +70,21 @@ void Routerin::start() _dyn_obs = new DynamicObjects(this); } -int Routerin::event_request_route(struct mg_event *event){ + +int event_route_wrap(struct mg_connection *conn, mg_event ev) +{ + Routerin *rouri = Routerin::get_instance(); + return rouri->event_route(conn,ev); +} + + +int Routerin::event_request_route(struct mg_connection *conn){ const RouterOp *blub=0; Foohash fh; const char *reqstr=0; char *tmpstr = 0,*pntrstr=0; int retval=-1; - reqstr=event->request_info->uri; + reqstr=conn->uri; if (reqstr){ tmpstr = strdup(reqstr); std::cerr << "starting with str as " @@ -93,26 +101,26 @@ int Routerin::event_request_route(struct mg_event *event){ std::cerr << "me has blub!!" <op){ case RouterOpCode::FILES: - retval = rq_file(pntrstr ,event); + retval = rq_file(pntrstr ,conn); break; case RouterOpCode::DATE: - retval = rq_date(pntrstr, event); + retval = rq_date(pntrstr, conn); break; case RouterOpCode::UPLOAD: - retval = rq_upload(pntrstr, event); + retval = rq_upload(pntrstr, conn); break; case RouterOpCode::STATIC: std::cerr << "(/static/ given)"; - retval = rq_static((pntrstr),event); + retval = rq_static((pntrstr),conn); break; default: std::cerr << "fallback "; - retval = rq_static("illegalurl.htm",event); + retval = rq_static("illegalurl.htm",conn); }; }else{ std::cerr << "no blub! in " << __LINE__ << endl; //retval = rq_static("illegalurl.htm",event); - retval = rq_render_mainpage(event); + retval = rq_render_mainpage(conn); } } @@ -121,7 +129,7 @@ int Routerin::event_request_route(struct mg_event *event){ return retval; } else { std::cerr << "event request without uri? ?? hu? [" << - event->request_info->uri << "]" << endl; + conn->uri << "]" << endl; } return 0; } @@ -146,7 +154,7 @@ void Routerin::set_json_path(std::string json_path) -int Routerin::rq_render_mainpage(struct mg_event * event) +int Routerin::rq_render_mainpage(struct mg_connection *conn) { std::cerr << "rendering main page!" << endl; const std::string fubb = @@ -155,7 +163,7 @@ int Routerin::rq_render_mainpage(struct mg_event * event) _dyn_obs->render_object_list()+ std_footer.c_str() ; - mg_printf(event->conn, "HTTP/1.0 200 OK\r\n" + mg_printf(conn, "HTTP/1.0 200 OK\r\n" "Content-Length: %lu\r\n" "Content-Type: text/html\r\n\r\n%s", fubb.size(), @@ -166,61 +174,78 @@ int Routerin::rq_render_mainpage(struct mg_event * event) -int Routerin::rq_static(char const * const reststr , struct mg_event *event) +int Routerin::rq_static(char const * const reststr , struct mg_connection *conn) { std::cerr << " a static file is reqested!" << endl; std::cerr << " path: " << reststr << endl; - sfh->answer_pathreq(reststr,event->conn); - return 1; + return sfh->answer_pathreq(reststr,conn); } -int Routerin::rq_file(char const * const reststr , - struct mg_event *event __attribute__((unused))) +int Routerin::rq_file(char const * const reststr, + struct mg_connection *conn __attribute__((unused))) { std::cerr << " a dynamic file is reqested!" << endl; std::cerr << " path: " << reststr << endl; - return 1; + return sfh->answer_pathreq(reststr,conn); } int Routerin::rq_date(char const * const reststr __attribute__((unused)), - struct mg_event *event __attribute__((unused)) ) + struct mg_connection *conn __attribute__((unused)) ) { std::cerr << "requested filelist ordered by date!" << endl ; return 1; } int Routerin::rq_upload(char const * const reststr __attribute__((unused)), - struct mg_event *event __attribute__((unused))) + struct mg_connection *conn __attribute__((unused))) { - std::cerr << "here we will get uploadish!" << endl ; + std::cerr << "here we will get uploadish!" << endl; + std::cerr << "handle: " << handle_upload( conn ) << "fup!" << endl; + + // get Dynamic Object form Upload + // Persist + // render thankyou page return 1; } -int Routerin::event_requend_route(struct mg_event *event __attribute__((unused)) ){ - std::cerr << "ended request" <type << endl; + std::cerr << "Its type is: " << event << endl; return 1; } -int Routerin::event_newthread_route(struct mg_event *event __attribute__((unused)) ){ - //DEBUG CODE - std::cerr << "Started new thread!" <content, conn->content_len, + var_name, sizeof(var_name), + file_name, sizeof(file_name), + &data, &data_len); + if (ret > 0) { + std::cerr << " got " << file_name << "with len of " << data_len << endl; + } + return ret; } - - - /* * static int event_handler(struct mg_event *event) { diff --git a/src/StaticFileHandler.cc b/src/StaticFileHandler.cc index 7ee18c6..130adf6 100644 --- a/src/StaticFileHandler.cc +++ b/src/StaticFileHandler.cc @@ -1,17 +1,33 @@ #include "StaticFileHandler.H" -std::string +#include + + + std::string StaticFileHandler::_cleanpath (const char * const path) { - //adds no security at all - return "static/"+std::string(path); + //adds no security at all + return "static/"+std::string(path); } -int + int StaticFileHandler::answer_pathreq(const char * const path, - struct mg_connection *conn) + struct mg_connection *conn) { - mg_send_file(conn,_cleanpath(path).c_str()); - return 0; + FILE *fp ; + char buf[1024]; + size_t n = 0; + + fp = fopen(_cleanpath(path).c_str(), "r"); + + if (fp != NULL) { + std::cerr << "outfile" << std::endl; + while ((n =fread(buf,1,sizeof(buf),fp)) > 0){ + mg_send_data(conn,buf,n); + } + fclose(fp); + return MG_TRUE; + } + return MG_FALSE; } - + diff --git a/src/sicmain.cc b/src/sicmain.cc index c9c7d86..5d11e3f 100644 --- a/src/sicmain.cc +++ b/src/sicmain.cc @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -20,30 +21,40 @@ class MongooseHandler{ //const char *options[]; unsigned short listenport; // = {"listening_ports", "8080", NULL}; + // + struct mg_server * srv; + public: //default listenport:8080 MongooseHandler(int listenport=8080): - ctx(nullptr), - listenport(listenport) - { + listenport(listenport), + srv(nullptr) + { char portstring[8]; - - + mg_handler_t mh = & event_route_wrap; + srv = mg_create_server(NULL, mh); std::snprintf(portstring,8,"%d",this->listenport); - const char *options[] = - {"listening_ports",portstring,nullptr}; - this->ctx= mg_start(options, Routerin::event_route, nullptr); - } + mg_set_option(srv,"listening_port",portstring); + //this->ctx= mg_start(options, Routerin::event_route, nullptr); + } + + + void serveloop(const int milisectimeout){ + assert(srv); + mg_poll_server(srv,milisectimeout); + return; + } + //no copy constructor: MongooseHandler( const MongooseHandler &) = delete; //destructor stops the server ~MongooseHandler(){ - if (this->ctx){ - mg_stop(this->ctx); + if (this->srv){ + mg_destroy_server(&(this->srv)); } } @@ -105,10 +116,13 @@ bool configfile_parsing_action(int& argc, char **argv) return true; } +bool killme; + static void signalhandler(int signum){ switch(signum){ + case SIGTERM: case SIGINT: - exit(0); + killme=true; break; default: std::cout << "called sighandler with signal " << signum << " FUPP! " << std::endl; @@ -119,9 +133,10 @@ static void exithandlerfunc(){ std::cout << "alles hat ein ende" << std::endl; } + int main(int argc, char **argv) { - + killme = false; if ( !configfile_parsing_action(argc, argv) ) { std::cerr << "ERROR ERROR BEEP" << std::endl; exit(1); @@ -136,6 +151,7 @@ int main(int argc, char **argv) struct sigaction sa; sa.sa_handler = signalhandler; sigaction(SIGINT, &sa ,nullptr); + sigaction(SIGTERM, &sa ,nullptr); Routerin * merouterin = Routerin::get_instance(); @@ -156,8 +172,8 @@ int main(int argc, char **argv) if (!args_info.daemonize_flag) { - while(1) - getchar(); + while((not killme)) + m->serveloop(1000); } delete m;