Esempio n. 1
0
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;
		}
	}
}
Esempio n. 2
0
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;
}