void ServiceTask::handleWebsockClose(WebSocketData* req) { Reflector reflector(ConfigurationData::getInstance()->dlib); std::string className; std::map<std::string, std::map<std::string, std::string> >& websocketMappingMap = ConfigurationData::getInstance()->websocketMappingMap; std::map<std::string, std::string> websockcntMap = websocketMappingMap[req->getCntxt_name()]; std::map<std::string, std::string>::iterator it; for (it=websockcntMap.begin();it!=websockcntMap.end();++it) { if(ConfigurationData::urlMatchesPath(req->getCntxt_name(), it->first, req->getUrl())) { className = it->second; break; } } if(className!="") { void *_temp = ConfigurationData::getInstance()->ffeadContext.getBean("websocketclass_"+className, req->getCntxt_name()); args argus; vals valus; const ClassInfo& srv = ConfigurationData::getClassInfo(className, req->getCntxt_name()); Method methc = srv.getMethod("onClose", argus); if(methc.getMethodName()!="") { //logger << ("WebSocket Controller " + className + " called") << std::endl; reflector.invokeMethodGVP(_temp,methc,valus); logger << "WebSocket Controller onClose" << std::endl; } else { logger << "Invalid WebSocket Controller" << std::endl; } } }
void ServiceTask::handle(HttpRequest* req, HttpResponse* res) { res->setHTTPResponseStatus(HTTPResponseStatus::NotFound); this->serverRootDirectory = ConfigurationData::getInstance()->coreServerProperties.serverRootDirectory; try { if(req->getRequestParseStatus().getCode()>0) { res->setHTTPResponseStatus(req->getRequestParseStatus()); res->addHeaderValue(HttpResponse::Connection, "close"); return; } std::string& webpath = ConfigurationData::getInstance()->coreServerProperties.webPath; if(req->getActUrlParts().size()==0) { res->setHTTPResponseStatus(HTTPResponseStatus::BadRequest); res->addHeaderValue(HttpResponse::Connection, "close"); logger << "Context not found, Closing connection..." << std::endl; return; } if(req->getCntxt_name()=="") { req->setCntxt_name("default"); } if(ConfigurationData::getInstance()->appAliases.find(req->getCntxt_name())!=ConfigurationData::getInstance()->appAliases.end()) { req->setCntxt_name(ConfigurationData::getInstance()->appAliases[req->getCntxt_name()]); if(ConfigurationData::getInstance()->servingContexts.find(req->getCntxt_name())==ConfigurationData::getInstance()->servingContexts.end()) { res->addHeaderValue(HttpResponse::Connection, "close"); logger << "Context not found, Closing connection..." << std::endl; return; } } if(!ConfigurationData::isServingContext(req->getCntxt_name())) { req->setCntxt_name("default"); } req->normalizeUrl(); req->setCntxt_root(webpath+req->getCntxt_name()); req->updateContent(); ConfigurationData::getInstance()->httpRequest.set(req); ConfigurationData::getInstance()->httpResponse.set(res); CommonUtils::setAppName(req->getCntxt_name()); SecurityHandler::populateAuthDetails(req); if(req->hasCookie()) { //if(!ConfigurationData::getInstance()->coreServerProperties.sessatserv) req->getSession()->setSessionAttributes(req->getCookieInfo()); /*else { std::string id = req->getCookieInfoAttribute("FFEADID"); logger << id << std::endl; std::map<std::string,std::string> values; #ifdef INC_DSTC if(ConfigurationData::getInstance()->coreServerProperties.sessservdistocache) values = getSessionDataFromDistocache(id); else #endif values = getSessionDataFromFile(id); req->getSession()->setSessionAttributes(values); }*/ } Reflector reflector(ConfigurationData::getInstance()->dlib); #ifdef INC_APPFLOW /*if(ConfigurationData::getInstance()->applicationFlowMap.find(req->getCntxt_name())!= ConfigurationData::getInstance()->applicationFlowMap.end() && ConfigurationData::getInstance()->applicationFlowMap[req->getCntxt_name()]) { if(ConfigurationData::getInstance().dlib == NULL) { std::cerr << dlerror() << std::endl; exit(-1); } std::string meth1 = (req->getCntxt_name()+"checkRules"); std::string path1; void *mkr1 = dlsym(ConfigurationData::getInstance().dlib, meth1.c_str()); if(mkr1!=NULL) { typedef std::string (*DCPPtr1) (std::string,HttpSession); DCPPtr1 f = (DCPPtr1)mkr1; path1 = f(req->getUrl(),*(req->getSession())); //logger << path1 << std::flush; if(path1=="FAILED") { req->setUrl(""); } else if(path1!="" && path1!=req->getUrl()) { req->setUrl(path1); } } }*/ #endif std::string ext = req->getExt(); long sessionTimeoutVar = ConfigurationData::getInstance()->coreServerProperties.sessionTimeout; bool isContrl = false; try { isContrl = CORSHandler::handle(ConfigurationData::getInstance()->corsConfig, req, res); } catch(const HTTPResponseStatus& status) { res->setHTTPResponseStatus(status); isContrl = true; } bool hasSecurity = SecurityHandler::hasSecurity(req->getCntxt_name()); if(!isContrl && hasSecurity) { isContrl = SecurityHandler::handle(req, res, sessionTimeoutVar, reflector); if(isContrl) { ext = req->getExt(); } } bool hasFilters = FilterHandler::hasFilters(req->getCntxt_name()); if(!isContrl && hasFilters) { FilterHandler::handleIn(req, ext, reflector); isContrl = !FilterHandler::handle(req, res, ext, reflector); if(isContrl) { } ext = req->getExt(); } if(!isContrl) { isContrl = ControllerHandler::handle(req, res, ext, reflector); if(isContrl) { } ext = req->getExt(); } if(!isContrl) { isContrl = ExtHandler::handle(req, res, ConfigurationData::getInstance()->dlib, ConfigurationData::getInstance()->ddlib, ext, reflector); if(isContrl) { } } /*After going through the controller the response might be blank, just set the HTTP version*/ res->update(req); if(req->getMethod()!="TRACE" && !res->isDone()) { //logger << ("Started processing request - phase II") << std::endl; std::string wsUrl = "http://" + ConfigurationData::getInstance()->coreServerProperties.ip_address + req->getCurl(); if(!isContrl) { #ifdef INC_WEBSVC std::string wsName = ConfigurationData::getInstance()->wsdlMap[req->getCntxt_name()][wsUrl]; if(wsName!="") { if(req->getHeader(HttpRequest::ContentType).find("application/soap+xml")!=std::string::npos || req->getHeader(HttpRequest::ContentType).find("text/xml")!=std::string::npos || req->getHeader(HttpRequest::ContentType).find("application/xml")!=std::string::npos) { SoapHandler::handle(req, res, ConfigurationData::getInstance()->dlib, wsName); } else { res->setHTTPResponseStatus(HTTPResponseStatus::BadRequest); } } #endif else { bool cntrlit = false; #ifdef INC_SCRH cntrlit = ScriptHandler::handle(req, res, ConfigurationData::getInstance()->handoffs, ext); #endif if(cntrlit) { } else { std::string pubUrlPath = req->getCntxt_root() + "/public/"; if(req->getUrl().find(pubUrlPath)!=0) { std::string post = ""; if(req->getUrl()!=req->getCntxt_root()) { post = req->getUrl().substr(req->getCntxt_root().length()+1); } if(post=="" || post=="/") { post = "index.html"; } req->setUrl(pubUrlPath+post); } res->setDone(false); //logger << ("Static file requested") << std::endl; } } } } if(hasFilters) { FilterHandler::handleOut(req, res, ext, reflector); } if(hasSecurity) { storeSessionAttributes(res, req, sessionTimeoutVar, ConfigurationData::getInstance()->coreServerProperties.sessatserv); } } catch(const std::exception& e) { logger << "Standard exception occurred while processing ServiceTask request " << std::endl; } }
int main(int argc, char** argv) { bool res = ::wxInitialize(); if (!res) { ::fprintf(stderr, "xreflectord: failed to initialise the wxWidgets library, exiting\n"); return -1; } wxCmdLineParser parser(argc, argv); parser.AddSwitch(NOLOGGING_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddSwitch(DAEMON_SWITCH, wxEmptyString, wxEmptyString, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(LOGDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(CONFDIR_OPTION, wxEmptyString, wxEmptyString, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddParam(NAME_PARAM, wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); int cmd = parser.Parse(); if (cmd != 0) { ::wxUninitialize(); return 0; } bool nolog = parser.Found(NOLOGGING_SWITCH); bool daemon = parser.Found(DAEMON_SWITCH); wxString logDir; bool found = parser.Found(LOGDIR_OPTION, &logDir); if (!found) logDir.Clear(); wxString confDir; found = parser.Found(CONFDIR_OPTION, &confDir); if (!found) confDir = CONF_DIR; wxString name; if (parser.GetParamCount() > 0U) name = parser.GetParam(0U); if (daemon) { pid_t pid = ::fork(); if (pid < 0) { ::fprintf(stderr, "xreflectord: error in fork(), exiting\n"); ::wxUninitialize(); return 1; } // If this is the parent, exit if (pid > 0) return 0; // We are the child from here onwards ::setsid(); ::chdir("/"); ::umask(0); } CXReflectorAppD reflector(nolog, logDir, confDir, name); if (!reflector.init()) { ::wxUninitialize(); return 1; } reflector.run(); ::wxUninitialize(); return 0; }