23 #include "ServiceTask.h"
25 ServiceTask::ServiceTask(
int fd,
string serverRootDirectory,map<string,string> *params,
27 this->fd=fd;this->serverRootDirectory=serverRootDirectory;
29 this->isSSLEnabled = isSSLEnabled;
31 this->sslHandler = sslHandler;
32 this->configData = configData;
35 logger = Logger::getLogger(
"ServiceTask");
38 ServiceTask::~ServiceTask() {
42 void ServiceTask::writeToSharedMemeory(
string sessionId,
string value,
bool napp)
44 string filen = serverRootDirectory+
"/tmp/"+sessionId+
".sess";
45 logger << (
"Saving session to file " + filen) << endl;
48 ofs.open(filen.c_str());
50 ofs.open(filen.c_str(),ios_base::app);
51 ofs.write(value.c_str(),value.length());
55 map<string,string> ServiceTask::readFromSharedMemeory(
string sessionId)
57 map<string,string> valss;
58 string filen = serverRootDirectory+
"/tmp/"+sessionId+
".sess";
59 ifstream ifs(filen.c_str());
61 while(getline(ifs,tem))
64 StringUtil::split(results, all, (
"; "));
65 for(
int j=0;j<(int)results.size()-1;j++)
67 if(results.at(j)==
"")
continue;
69 StringUtil::replaceAll(results.at(j),
"%3B%20",
"; ");
70 StringUtil::split(results1, results.at(j), (
"="));
71 if(results1.size()==2)
73 StringUtil::replaceAll(results1.at(0),
"%3D",
"=");
74 StringUtil::replaceAll(results1.at(1),
"%3D",
"=");
75 valss[results1.at(0)] = results1.at(1);
79 StringUtil::replaceAll(results1.at(0),
"%3D",
"=");
80 valss[results1.at(0)] =
"true";
82 logger << (
"Read key/value pair " + results1.at(0) +
" = " + valss[results1.at(0)]) << endl;
87 string ServiceTask::getFileExtension(
string file)
89 if(file.find_last_of(
".")!=string::npos)
return file.substr(file.find_last_of(
"."));
93 void ServiceTask::createResponse(
HttpResponse &res,
bool flag,map<string,string> vals,
string prevcookid,
long sessionTimeout,
bool sessatserv)
100 string id = CastUtil::lexical_cast<
string>(Timer::getCurrentTime());
102 date = date.addSeconds(sessionTimeout);
103 DateFormat dformat(
"ddd, dd-mmm-yyyy hh:mi:ss");
104 map<string,string>::iterator it;
105 for(it=vals.begin();it!=vals.end();it++)
107 string key = it->first;
108 string value = it->second;
109 StringUtil::replaceAll(key,
"; ",
"%3B%20");
110 StringUtil::replaceAll(key,
"=",
"%3D");
111 StringUtil::replaceAll(value,
"; ",
"%3B%20");
112 StringUtil::replaceAll(value,
"=",
"%3D");
115 res.addCookie(key +
"=" + value +
"; expires="+dformat.format(date)+
" GMT; path=/; HttpOnly");
118 values += key +
"=" + value +
"; ";
126 writeToSharedMemeory(prevcookid,values,
true);
129 writeToSharedMemeory(
id,values,
false);
130 res.addCookie(
"FFEADID=" +
id +
"; expires="+dformat.format(date)+
" GMT; path=/; HttpOnly");
137 string ServiceTask::getContentStr(
string url,
string locale,
string ext)
139 logger << (
"Content request for " + url +
" " + ext) << endl;
147 if(locale.find(
"english")==string::npos && (ext==
".html" || ext==
".htm"))
150 StringUtil::replaceFirst(fnj,
".",(
"_" + locale+
"."));
151 myfile.open(fnj.c_str(),ios::in | ios::binary);
152 if (myfile.is_open())
156 std::string content((std::istreambuf_iterator<char>(myfile)), (std::istreambuf_iterator<char>()));
162 myfile1.open(fname.c_str(),ios::in | ios::binary);
163 if (myfile1.is_open())
165 std::string content((std::istreambuf_iterator<char>(myfile1)), (std::istreambuf_iterator<char>()));
174 void ServiceTask::run()
177 string ip =
"invalid session";
178 string alldatlg =
"\ngot fd from parent";
181 BIO *io=NULL,*ssl_bio=NULL;
185 char buf[MAXBUFLENM];
190 logger <<
"Into Http Service method" << endl;
193 sbio=BIO_new_socket(fd,BIO_NOCLOSE);
195 SSL_set_bio(ssl,sbio,sbio);
197 io=BIO_new(BIO_f_buffer());
198 ssl_bio=BIO_new(BIO_f_ssl());
199 BIO_set_ssl(ssl_bio,ssl,BIO_CLOSE);
200 BIO_push(io,ssl_bio);
202 int r = SSL_accept(ssl);
204 int bser = SSL_get_error(ssl,r);
205 cout << bser << endl;
208 sslHandler.error_occurred((
char*)
"SSL accept error",fd,ssl);
217 er = BIO_gets(io,buf,BUFSIZZ-1);
219 int bser = SSL_get_error(ssl,er);
220 cout << bser << endl;
223 case SSL_ERROR_WANT_READ:
225 logger <<
"ssl more to read error" << endl;
228 case SSL_ERROR_WANT_WRITE:
230 logger <<
"ssl more to write error" << endl;
237 case SSL_ERROR_ZERO_RETURN:
239 sslHandler.error_occurred((
char*)
"SSL error problem",fd,ssl);
240 if(io!=NULL)BIO_free(io);
245 sslHandler.error_occurred((
char*)
"SSL read problem",fd,ssl);
246 if(io!=NULL)BIO_free(io);
252 if(!strcmp(buf,
"\r\n") || !strcmp(buf,
"\n"))
255 if(temp==
"")
continue;
256 temp = temp.substr(0,temp.length()-1);
257 results.push_back(temp);
259 if(temp.find(
"Content-Length:")!=string::npos)
261 std::string cntle = temp.substr(temp.find(
": ")+2);
262 cntle = cntle.substr(0,cntle.length()-1);
266 cntlen = CastUtil::lexical_cast<
int>(cntle);
268 catch(
const char* ex)
270 logger <<
"Bad lexical cast exception while reading http Content-Length" << endl;
273 memset(&buf[0], 0,
sizeof(buf));
280 sbio=BIO_new_socket(fd,BIO_CLOSE);
281 io=BIO_new(BIO_f_buffer());
285 er = BIO_gets(io,buf,BUFSIZZ-1);
289 logger <<
"Socket closed before being serviced" << endl;
293 if(!strcmp(buf,
"\r\n") || !strcmp(buf,
"\n") || er<0)
296 temp = temp.substr(0,temp.length()-1);
297 results.push_back(temp);
299 if(temp.find(
"Content-Length:")!=string::npos)
301 std::string cntle = temp.substr(temp.find(
": ")+2);
302 cntle = cntle.substr(0,cntle.length()-1);
306 cntlen = CastUtil::lexical_cast<
int>(cntle);
308 catch(
const char* ex)
310 logger <<
"Bad lexical cast exception while reading http Content-Length" <<endl;
313 memset(&buf[0], 0,
sizeof(buf));
318 if(isSSLEnabled && cntlen>0)
324 er = BIO_read(io,buf,cntlen);
325 switch(SSL_get_error(ssl,er))
330 case SSL_ERROR_ZERO_RETURN:
332 sslHandler.error_occurred((
char*)
"SSL error problem",fd,ssl);
333 if(io!=NULL)BIO_free(io);
338 sslHandler.error_occurred((
char*)
"SSL read problem",fd,ssl);
339 if(io!=NULL)BIO_free(io);
344 results.push_back(
"\r");
345 results.push_back(temp);
347 memset(&buf[0], 0,
sizeof(buf));
356 er = BIO_read(io,buf,cntlen);
360 logger <<
"Socket closed before being serviced" << endl;
366 results.push_back(
"\r");
367 results.push_back(temp);
369 memset(&buf[0], 0,
sizeof(buf));
373 alldatlg +=
"--read data";
374 map<string,string> params1 = *params;
375 string webpath = serverRootDirectory +
"web/";
379 if(req->getFile()==
"")
381 logger << (
"File requested -> " + req->getFile()) << endl;
382 req->setFile(
"index.html");
386 if(!configData.sessatserv)
387 req->getSession()->setSessionAttributes(req->getCookieInfo());
390 string id = req->getCookieInfoAttribute(
"FFEADID");
391 logger <<
id << endl;
392 map<string,string> values = readFromSharedMemeory(
id);
393 req->getSession()->setSessionAttributes(values);
397 if(configData.cntMap[req->getCntxt_name()]!=
"true")
399 req->setCntxt_name(
"default");
400 req->setCntxt_root(webpath+
"default");
401 req->setUrl(webpath+
"default"+req->getActUrl());
405 if(configData.appMap[req->getCntxt_name()]!=
"false")
409 cerr << dlerror() << endl;
412 string meth1 = (req->getCntxt_name()+
"checkRules");
414 void *mkr1 = dlsym(dlib, meth1.c_str());
418 DCPPtr1 f = (DCPPtr1)mkr1;
419 path1 = f(req->getUrl(),*(req->getSession()));
425 else if(path1!=
"" && path1!=req->getUrl())
433 string ext = getFileExtension(req->getUrl());
434 vector<unsigned char> test;
438 long sessionTimeoutVar = configData.sessionTimeout;
439 bool isContrl = securityHandler.handle(configData.ip_address, req, res, configData.securityObjectMap, sessionTimeoutVar, dlib, configData.cntMap);
441 filterHandler.handleIn(req, res, configData.filterMap, dlib, ext);
445 isContrl = authHandler.handle(configData.autMap, configData.autpattMap, req, res, configData.filterMap, dlib, ext);
447 string pthwofile = req->getCntxt_name()+req->getActUrl();
448 if(req->getCntxt_name()!=
"default" && configData.cntMap[req->getCntxt_name()]==
"true")
450 pthwofile = req->getActUrl();
454 isContrl = controllerHandler.handle(req, res, configData.urlpattMap, configData.mappattMap, dlib, ext,
455 configData.rstCntMap, configData.mapMap, configData.urlMap, pthwofile);
459 res.setHttpVersion(req->getHttpVersion());
461 if(req->getMethod()!=
"TRACE")
467 else if(ext==
".form")
469 formHandler.handle(req, res, configData.formMap, dlib);
471 else if((req->getContent_type().find(
"application/soap+xml")!=string::npos || req->getContent_type().find(
"text/xml")!=string::npos)
472 && (req->getContent().find(
"<soap:Envelope")!=string::npos || req->getContent().find(
"<soapenv:Envelope")!=string::npos)
473 && configData.wsdlmap[req->getFile()]==req->getCntxt_name())
475 soapHandler.handle(req, res, dlib, configData.props[
".xml"]);
479 bool cntrlit = scriptHandler.handle(req, res, configData.handoffs, dlib, ext, configData.props);
486 cntrlit = extHandler.handle(req, res, dlib, ddlib, configData.resourcePath, configData.tmplMap, configData.vwMap, ext, configData.props,
487 configData.ajaxIntfMap);
489 if(!cntrlit && ext==
".fview")
491 content = fviewHandler.handle(req, res, configData.fviewmap);
495 if(res.getContent_str()==
"")
496 content = getContentStr(req->getUrl(),configData.lprops[req->getDefaultLocale()],ext);
498 content = res.getContent_str();
500 if(content.length()==0)
502 res.setHTTPResponseStatus(HTTPResponseStatus::NotFound);
507 res.setHTTPResponseStatus(HTTPResponseStatus::Ok);
508 if(res.getContent_type()==
"")res.setContent_type(configData.props[ext]);
509 res.setContent_str(content);
515 filterHandler.handleOut(req, res, configData.filterMap, dlib, ext);
518 alldatlg +=
"--processed data";
520 bool sessionchanged = !req->hasCookie();
521 sessionchanged |= req->getSession()->isDirty();
522 if(req->getConnection()!=
"")
523 res.setConnection(
"close");
524 createResponse(res,sessionchanged,req->getSession()->getSessionAttributes(),req->getCookieInfoAttribute(
"FFEADID"), sessionTimeoutVar, configData.sessatserv);
526 if(req->getMethod()==
"HEAD")
528 h1 = res.generateHeadResponse();
530 else if(req->getMethod()==
"OPTIONS")
532 h1 = res.generateOptionsResponse();
534 else if(req->getMethod()==
"TRACE")
536 h1 = res.generateTraceResponse(req);
540 h1 = res.generateResponse();
547 if(configData.client_auth==CLIENT_AUTH_REHANDSHAKE){
548 SSL_set_verify(ssl,SSL_VERIFY_PEER |
549 SSL_VERIFY_FAIL_IF_NO_PEER_CERT,0);
553 SSL_set_session_id_context(ssl,
554 (
const unsigned char*)&SSLHandler::s_server_auth_session_id_context,
555 sizeof(SSLHandler::s_server_auth_session_id_context));
557 if(SSL_renegotiate(ssl)<=0)
559 sslHandler.error_occurred((
char*)
"SSL renegotiation error",fd,ssl);
560 if(io!=NULL)BIO_free(io);
563 if(SSL_do_handshake(ssl)<=0)
565 sslHandler.error_occurred((
char*)
"SSL renegotiation error",fd,ssl);
566 if(io!=NULL)BIO_free(io);
569 ssl->state=SSL_ST_ACCEPT;
570 if(SSL_do_handshake(ssl)<=0)
572 sslHandler.error_occurred((
char*)
"SSL renegotiation error",fd,ssl);
573 if(io!=NULL)BIO_free(io);
577 if((r=BIO_write(io,h1.c_str(),h1.length()))<=0)
579 sslHandler.error_occurred((
char*)
"send failed",fd,ssl);
580 if(io!=NULL)BIO_free(io);
583 if((r=BIO_flush(io))<0)
585 sslHandler.error_occurred((
char*)
"Error flushing BIO",fd,ssl);
586 if(io!=NULL)BIO_free(io);
589 sslHandler.closeSSL(fd,ssl,io);
594 if ((size=send(fd,&h1[0] , h1.length(), 0)) == -1)
595 logger <<
"Socket send failed" << endl;
599 memset(&buf[0], 0,
sizeof(buf));
600 logger <<
"Socket closed for writing" << endl;
604 if(io!=NULL)BIO_free_all(io);
607 memset(&buf[0], 0,
sizeof(buf));
617 logger <<
"Standard exception occurred while processing ServiceTask request " << endl;
626 string alldatlg =
"\ngot fd from parent";
629 string webpath = serverRootDirectory +
"web/";
631 if(req->getFile()==
"")
633 logger << req->getFile() << endl;
634 req->setFile(
"index.html");
638 if(!configData.sessatserv)
639 req->getSession()->setSessionAttributes(req->getCookieInfo());
642 string id = req->getCookieInfoAttribute(
"FFEADID");
643 map<string,string> values = readFromSharedMemeory(
id);
644 req->getSession()->setSessionAttributes(values);
648 if(configData.cntMap[req->getCntxt_name()]!=
"true")
650 req->setCntxt_name(
"default");
651 req->setCntxt_root(webpath+
"default");
652 req->setUrl(webpath+
"default"+req->getActUrl());
656 if(configData.appMap[req->getCntxt_name()]!=
"false")
660 cerr << dlerror() << endl;
663 string meth1 = (req->getCntxt_name()+
"checkRules");
665 void *mkr1 = dlsym(dlib, meth1.c_str());
669 DCPPtr1 f = (DCPPtr1)mkr1;
670 path1 = f(req->getUrl(),*(req->getSession()));
676 else if(path1!=
"" && path1!=req->getUrl())
683 string ext = getFileExtension(req->getUrl());
684 vector<unsigned char> test;
688 long sessionTimeoutVar = configData.sessionTimeout;
689 bool isContrl = securityHandler.handle(configData.ip_address, req, res, configData.securityObjectMap, sessionTimeoutVar, dlib, configData.cntMap);
691 filterHandler.handleIn(req, res, configData.filterMap, dlib, ext);
695 isContrl = authHandler.handle(configData.autMap, configData.autpattMap, req, res, configData.filterMap, dlib, ext);
697 string pthwofile = req->getCntxt_name()+req->getActUrl();
698 if(req->getCntxt_name()!=
"default" && configData.cntMap[req->getCntxt_name()]==
"true")
700 pthwofile = req->getActUrl();
704 isContrl = controllerHandler.handle(req, res, configData.urlpattMap, configData.mappattMap, dlib, ext,
705 configData.rstCntMap, configData.mapMap, configData.urlMap, pthwofile);
709 res.setHttpVersion(req->getHttpVersion());
715 else if(ext==
".form")
717 formHandler.handle(req, res, configData.formMap, dlib);
719 else if((req->getContent_type().find(
"application/soap+xml")!=string::npos || req->getContent_type().find(
"text/xml")!=string::npos)
720 && (req->getContent().find(
"<soap:Envelope")!=string::npos || req->getContent().find(
"<soapenv:Envelope")!=string::npos)
721 && configData.wsdlmap[req->getFile()]==req->getCntxt_name())
723 soapHandler.handle(req, res, dlib, configData.props[
".xml"]);
727 bool cntrlit = scriptHandler.handle(req, res, configData.handoffs, dlib, ext, configData.props);
734 cntrlit = extHandler.handle(req, res, dlib, ddlib, configData.resourcePath, configData.tmplMap, configData.vwMap, ext, configData.props,
735 configData.ajaxIntfMap);
737 if(!cntrlit && ext==
".fview")
739 content = fviewHandler.handle(req, res, configData.fviewmap);
743 if(res.getContent_str()==
"")
744 content = getContentStr(req->getUrl(),configData.lprops[req->getDefaultLocale()],ext);
746 content = res.getContent_str();
748 if(content.length()==0)
750 res.setHTTPResponseStatus(HTTPResponseStatus::NotFound);
755 res.setHTTPResponseStatus(HTTPResponseStatus::Ok);
756 if(res.getContent_type()==
"")res.setContent_type(configData.props[ext]);
757 res.setContent_str(content);
763 filterHandler.handleOut(req, res, configData.filterMap, dlib, ext);
765 alldatlg +=
"--processed data";
767 bool sessionchanged = !req->hasCookie();
768 sessionchanged |= req->getSession()->isDirty();
769 if(req->getConnection()!=
"")
770 res.setConnection(
"close");
771 createResponse(res,sessionchanged,req->getSession()->getSessionAttributes(),req->getCookieInfoAttribute(
"FFEADID"), sessionTimeoutVar, configData.sessatserv);
777 catch(
const char* ex)
779 logger << ex << endl;
783 logger <<
"Standard exception occurred while processing ServiceTask request " << endl;