ffead.server.doc
ServiceTask.cpp
1 /*
2  Copyright 2009-2012, Sumeet Chhetri
3 
4  Licensed under the Apache License, Version 2.0 (the "License");
5  you may not use this file except in compliance with the License.
6  You may obtain a copy of the License at
7 
8  http://www.apache.org/licenses/LICENSE-2.0
9 
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15 */
16 /*
17  * ServiceTask.cpp
18  *
19  * Created on: 20-Jun-2012
20  * Author: sumeetc
21  */
22 
23 #include "ServiceTask.h"
24 
25 ServiceTask::ServiceTask(int fd,string serverRootDirectory,map<string,string> *params,
26  bool isSSLEnabled, SSL_CTX *ctx, SSLHandler sslHandler, ConfigurationData configData, void* dlib, void* ddlib) {
27  this->fd=fd;this->serverRootDirectory=serverRootDirectory;
28  this->params= params;
29  this->isSSLEnabled = isSSLEnabled;
30  this->ctx = ctx;
31  this->sslHandler = sslHandler;
32  this->configData = configData;
33  this->dlib = dlib;
34  this->ddlib = ddlib;
35  logger = Logger::getLogger("ServiceTask");
36 }
37 
38 ServiceTask::~ServiceTask() {
39  // TODO Auto-generated destructor stub
40 }
41 
42 void ServiceTask::writeToSharedMemeory(string sessionId, string value,bool napp)
43 {
44  string filen = serverRootDirectory+"/tmp/"+sessionId+".sess";
45  logger << ("Saving session to file " + filen) << endl;
46  ofstream ofs;
47  if(napp)
48  ofs.open(filen.c_str());
49  else
50  ofs.open(filen.c_str(),ios_base::app);
51  ofs.write(value.c_str(),value.length());
52  ofs.close();
53 }
54 
55 map<string,string> ServiceTask::readFromSharedMemeory(string sessionId)
56 {
57  map<string,string> valss;
58  string filen = serverRootDirectory+"/tmp/"+sessionId+".sess";
59  ifstream ifs(filen.c_str());
60  string tem,all;
61  while(getline(ifs,tem))
62  all.append(tem+"\n");
63  strVec results;
64  StringUtil::split(results, all, ("; "));
65  for(int j=0;j<(int)results.size()-1;j++)
66  {
67  if(results.at(j)=="")continue;
68  strVec results1;
69  StringUtil::replaceAll(results.at(j),"%3B%20","; ");
70  StringUtil::split(results1, results.at(j), ("="));
71  if(results1.size()==2)
72  {
73  StringUtil::replaceAll(results1.at(0),"%3D","=");
74  StringUtil::replaceAll(results1.at(1),"%3D","=");
75  valss[results1.at(0)] = results1.at(1);
76  }
77  else
78  {
79  StringUtil::replaceAll(results1.at(0),"%3D","=");
80  valss[results1.at(0)] = "true";
81  }
82  logger << ("Read key/value pair " + results1.at(0) + " = " + valss[results1.at(0)]) << endl;
83  }
84  return valss;
85 }
86 
87 string ServiceTask::getFileExtension(string file)
88 {
89  if(file.find_last_of(".")!=string::npos)return file.substr(file.find_last_of("."));
90  return file;
91 }
92 
93 void ServiceTask::createResponse(HttpResponse &res,bool flag,map<string,string> vals,string prevcookid, long sessionTimeout, bool sessatserv)
94 {
95  if(flag)
96  {
97  string values;
98  //logger << "session object modified " << vals.size() << endl;
99  Date date;
100  string id = CastUtil::lexical_cast<string>(Timer::getCurrentTime());
101  //int seconds = sessionTimeout;
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++)
106  {
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");
113  //logger << it->first << " = " << it->second << endl;
114  if(!sessatserv)
115  res.addCookie(key + "=" + value + "; expires="+dformat.format(date)+" GMT; path=/; HttpOnly");
116  else
117  {
118  values += key + "=" + value + "; ";
119  }
120  }
121  if(sessatserv)
122  {
123  if(values!="")
124  {
125  if(prevcookid!="")
126  writeToSharedMemeory(prevcookid,values,true);
127  else
128  {
129  writeToSharedMemeory(id,values,false);
130  res.addCookie("FFEADID=" + id + "; expires="+dformat.format(date)+" GMT; path=/; HttpOnly");
131  }
132  }
133  }
134  }
135 }
136 
137 string ServiceTask::getContentStr(string url,string locale,string ext)
138 {
139  logger << ("Content request for " + url + " " + ext) << endl;
140  string all;
141  string fname = url;
142  if (url=="/")
143  {
144  return all;
145  }
146  ifstream myfile;
147  if(locale.find("english")==string::npos && (ext==".html" || ext==".htm"))
148  {
149  string fnj = fname;
150  StringUtil::replaceFirst(fnj,".",("_" + locale+"."));
151  myfile.open(fnj.c_str(),ios::in | ios::binary);
152  if (myfile.is_open())
153  {
154  /*string line;
155  while(getline(myfile,line)){all.append(line+"\n");}*/
156  std::string content((std::istreambuf_iterator<char>(myfile)), (std::istreambuf_iterator<char>()));
157  myfile.close();
158  return content;
159  }
160  }
161  ifstream myfile1;
162  myfile1.open(fname.c_str(),ios::in | ios::binary);
163  if (myfile1.is_open())
164  {
165  std::string content((std::istreambuf_iterator<char>(myfile1)), (std::istreambuf_iterator<char>()));
166  /*string line;
167  while(getline(myfile1,line)){all.append(line+"\n");}*/
168  myfile1.close();
169  return content;
170  }
171  return all;
172 }
173 
174 void ServiceTask::run()
175 {
176  //logger << dlib << endl;
177  string ip = "invalid session";
178  string alldatlg = "\ngot fd from parent";
179  SSL *ssl=NULL;
180  BIO *sbio=NULL;
181  BIO *io=NULL,*ssl_bio=NULL;
182  try
183  {
184  int cntlen = 0;
185  char buf[MAXBUFLENM];
186  strVec results;
187  stringstream ss;
188  string temp;
189  //int bytes = -1;
190  logger << "Into Http Service method" << endl;
191  if(isSSLEnabled)
192  {
193  sbio=BIO_new_socket(fd,BIO_NOCLOSE);
194  ssl=SSL_new(ctx);
195  SSL_set_bio(ssl,sbio,sbio);
196 
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);
201 
202  int r = SSL_accept(ssl);
203  cout << r << endl;
204  int bser = SSL_get_error(ssl,r);
205  cout << bser << endl;
206  if(r<=0)
207  {
208  sslHandler.error_occurred((char*)"SSL accept error",fd,ssl);
209  return;
210  }
211 
212 
213  int er=-1;
214  bool flag = true;
215  while(flag)
216  {
217  er = BIO_gets(io,buf,BUFSIZZ-1);
218  cout << er << endl;
219  int bser = SSL_get_error(ssl,er);
220  cout << bser << endl;
221  switch(bser)
222  {
223  case SSL_ERROR_WANT_READ:
224  {
225  logger << "ssl more to read error" << endl;
226  break;
227  }
228  case SSL_ERROR_WANT_WRITE:
229  {
230  logger << "ssl more to write error" << endl;
231  break;
232  }
233  case SSL_ERROR_NONE:
234  {
235  break;
236  }
237  case SSL_ERROR_ZERO_RETURN:
238  {
239  sslHandler.error_occurred((char*)"SSL error problem",fd,ssl);
240  if(io!=NULL)BIO_free(io);
241  return;
242  }
243  default:
244  {
245  sslHandler.error_occurred((char*)"SSL read problem",fd,ssl);
246  if(io!=NULL)BIO_free(io);
247  return;
248  }
249  }
250  ss << buf;
251  //logger <<buf <<endl;
252  if(!strcmp(buf,"\r\n") || !strcmp(buf,"\n"))
253  break;
254  string temp(buf);
255  if(temp=="")continue;
256  temp = temp.substr(0,temp.length()-1);
257  results.push_back(temp);
258  //logger << temp <<endl;
259  if(temp.find("Content-Length:")!=string::npos)
260  {
261  std::string cntle = temp.substr(temp.find(": ")+2);
262  cntle = cntle.substr(0,cntle.length()-1);
263  //logger << "contne-length="<<cntle <<endl;
264  try
265  {
266  cntlen = CastUtil::lexical_cast<int>(cntle);
267  }
268  catch(const char* ex)
269  {
270  logger << "Bad lexical cast exception while reading http Content-Length" << endl;
271  }
272  }
273  memset(&buf[0], 0, sizeof(buf));
274  }
275  }
276  else
277  {
278  int er=-1;
279  bool flag = true;
280  sbio=BIO_new_socket(fd,BIO_CLOSE);
281  io=BIO_new(BIO_f_buffer());
282  BIO_push(io,sbio);
283  while(flag)
284  {
285  er = BIO_gets(io,buf,BUFSIZZ-1);
286  if(er==0)
287  {
288  close(fd);
289  logger << "Socket closed before being serviced" << endl;
290  return;
291  }
292  ss << buf;
293  if(!strcmp(buf,"\r\n") || !strcmp(buf,"\n") || er<0)
294  break;
295  string temp(buf);
296  temp = temp.substr(0,temp.length()-1);
297  results.push_back(temp);
298  //logger << temp <<endl;
299  if(temp.find("Content-Length:")!=string::npos)
300  {
301  std::string cntle = temp.substr(temp.find(": ")+2);
302  cntle = cntle.substr(0,cntle.length()-1);
303  //logger << "contne-length="<<cntle <<endl;
304  try
305  {
306  cntlen = CastUtil::lexical_cast<int>(cntle);
307  }
308  catch(const char* ex)
309  {
310  logger << "Bad lexical cast exception while reading http Content-Length" <<endl;
311  }
312  }
313  memset(&buf[0], 0, sizeof(buf));
314  }
315  }
316 
317  ss.clear();
318  if(isSSLEnabled && cntlen>0)
319  {
320  int er=-1;
321  if(cntlen>0)
322  {
323  //logger << "reading conetnt " << cntlen << endl;
324  er = BIO_read(io,buf,cntlen);
325  switch(SSL_get_error(ssl,er))
326  {
327  case SSL_ERROR_NONE:
328  cntlen -= er;
329  break;
330  case SSL_ERROR_ZERO_RETURN:
331  {
332  sslHandler.error_occurred((char*)"SSL error problem",fd,ssl);
333  if(io!=NULL)BIO_free(io);
334  return;
335  }
336  default:
337  {
338  sslHandler.error_occurred((char*)"SSL read problem",fd,ssl);
339  if(io!=NULL)BIO_free(io);
340  return;
341  }
342  }
343  string temp(buf);
344  results.push_back("\r");
345  results.push_back(temp);
346  //logger <<buf <<endl;
347  memset(&buf[0], 0, sizeof(buf));
348  }
349  }
350  else if(cntlen>0)
351  {
352  int er=-1;
353  if(cntlen>0)
354  {
355  //logger << "reading conetnt " << cntlen << endl;
356  er = BIO_read(io,buf,cntlen);
357  if(er==0)
358  {
359  close(fd);
360  logger << "Socket closed before being serviced" << endl;
361  return;
362  }
363  else if(er>0)
364  {
365  string temp(buf);
366  results.push_back("\r");
367  results.push_back(temp);
368  //logger << temp <<endl;
369  memset(&buf[0], 0, sizeof(buf));
370  }
371  }
372  }
373  alldatlg += "--read data";
374  map<string,string> params1 = *params;
375  string webpath = serverRootDirectory + "web/";
376  HttpRequest* req= new HttpRequest(results,webpath);
377  //logger << req->toString() << endl;
378 
379  if(req->getFile()=="")
380  {
381  logger << ("File requested -> " + req->getFile()) << endl;
382  req->setFile("index.html");
383  }
384  if(req->hasCookie())
385  {
386  if(!configData.sessatserv)
387  req->getSession()->setSessionAttributes(req->getCookieInfo());
388  else
389  {
390  string id = req->getCookieInfoAttribute("FFEADID");
391  logger << id << endl;
392  map<string,string> values = readFromSharedMemeory(id);
393  req->getSession()->setSessionAttributes(values);
394  }
395  }
396 
397  if(configData.cntMap[req->getCntxt_name()]!="true")
398  {
399  req->setCntxt_name("default");
400  req->setCntxt_root(webpath+"default");
401  req->setUrl(webpath+"default"+req->getActUrl());
402  }
403  //logger << req->getCntxt_name() << req->getCntxt_root() << req->getUrl() << endl;
404 
405  if(configData.appMap[req->getCntxt_name()]!="false")
406  {
407  if(dlib == NULL)
408  {
409  cerr << dlerror() << endl;
410  exit(-1);
411  }
412  string meth1 = (req->getCntxt_name()+"checkRules");
413  string path1;
414  void *mkr1 = dlsym(dlib, meth1.c_str());
415  if(mkr1!=NULL)
416  {
417  typedef string (*DCPPtr1) (string,HttpSession);
418  DCPPtr1 f = (DCPPtr1)mkr1;
419  path1 = f(req->getUrl(),*(req->getSession()));
420  //logger << path1 << flush;
421  if(path1=="FAILED")
422  {
423  req->setUrl("");
424  }
425  else if(path1!="" && path1!=req->getUrl())
426  {
427  req->setUrl(path1);
428  }
429  }
430  }
431 
432  HttpResponse res;
433  string ext = getFileExtension(req->getUrl());
434  vector<unsigned char> test;
435  string content;
436  string claz;
437  //bool isoAuthRes = false;
438  long sessionTimeoutVar = configData.sessionTimeout;
439  bool isContrl = securityHandler.handle(configData.ip_address, req, res, configData.securityObjectMap, sessionTimeoutVar, dlib, configData.cntMap);
440 
441  filterHandler.handleIn(req, res, configData.filterMap, dlib, ext);
442 
443  if(!isContrl)
444  {
445  isContrl = authHandler.handle(configData.autMap, configData.autpattMap, req, res, configData.filterMap, dlib, ext);
446  }
447  string pthwofile = req->getCntxt_name()+req->getActUrl();
448  if(req->getCntxt_name()!="default" && configData.cntMap[req->getCntxt_name()]=="true")
449  {
450  pthwofile = req->getActUrl();
451  }
452  if(!isContrl)
453  {
454  isContrl = controllerHandler.handle(req, res, configData.urlpattMap, configData.mappattMap, dlib, ext,
455  configData.rstCntMap, configData.mapMap, configData.urlMap, pthwofile);
456  }
457 
458  /*After going through the controller the response might be blank, just set the HTTP version*/
459  res.setHttpVersion(req->getHttpVersion());
460  //logger << req->toString() << endl;
461  if(req->getMethod()!="TRACE")
462  {
463  if(isContrl)
464  {
465 
466  }
467  else if(ext==".form")
468  {
469  formHandler.handle(req, res, configData.formMap, dlib);
470  }
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())
474  {
475  soapHandler.handle(req, res, dlib, configData.props[".xml"]);
476  }
477  else
478  {
479  bool cntrlit = scriptHandler.handle(req, res, configData.handoffs, dlib, ext, configData.props);
480  if(cntrlit)
481  {
482 
483  }
484  else
485  {
486  cntrlit = extHandler.handle(req, res, dlib, ddlib, configData.resourcePath, configData.tmplMap, configData.vwMap, ext, configData.props,
487  configData.ajaxIntfMap);
488  }
489  if(!cntrlit && ext==".fview")
490  {
491  content = fviewHandler.handle(req, res, configData.fviewmap);
492  }
493  else
494  {
495  if(res.getContent_str()=="")
496  content = getContentStr(req->getUrl(),configData.lprops[req->getDefaultLocale()],ext);
497  else
498  content = res.getContent_str();
499  }
500  if(content.length()==0)
501  {
502  res.setHTTPResponseStatus(HTTPResponseStatus::NotFound);
503  //res.setContent_len(CastUtil::lexical_cast<string>(0));
504  }
505  else
506  {
507  res.setHTTPResponseStatus(HTTPResponseStatus::Ok);
508  if(res.getContent_type()=="")res.setContent_type(configData.props[ext]);
509  res.setContent_str(content);
510  //res.setContent_len(CastUtil::lexical_cast<string>(content.length()));
511  //sess.setAttribute("CURR",req->getUrl());
512  }
513  }
514 
515  filterHandler.handleOut(req, res, configData.filterMap, dlib, ext);
516  }
517 
518  alldatlg += "--processed data";
519  string h1;
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);
525  //Head should behave exactly as Get but there should be no entity body
526  if(req->getMethod()=="HEAD")
527  {
528  h1 = res.generateHeadResponse();
529  }
530  else if(req->getMethod()=="OPTIONS")
531  {
532  h1 = res.generateOptionsResponse();
533  }
534  else if(req->getMethod()=="TRACE")
535  {
536  h1 = res.generateTraceResponse(req);
537  }
538  else
539  {
540  h1 = res.generateResponse();
541  }
542  //logger << h1 << endl;
543  if(isSSLEnabled)
544  {
545  int r;
546  /* Now perform renegotiation if requested */
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);
550 
551  /* Stop the client from just resuming the
552  un-authenticated session */
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));
556 
557  if(SSL_renegotiate(ssl)<=0)
558  {
559  sslHandler.error_occurred((char*)"SSL renegotiation error",fd,ssl);
560  if(io!=NULL)BIO_free(io);
561  return;
562  }
563  if(SSL_do_handshake(ssl)<=0)
564  {
565  sslHandler.error_occurred((char*)"SSL renegotiation error",fd,ssl);
566  if(io!=NULL)BIO_free(io);
567  return;
568  }
569  ssl->state=SSL_ST_ACCEPT;
570  if(SSL_do_handshake(ssl)<=0)
571  {
572  sslHandler.error_occurred((char*)"SSL renegotiation error",fd,ssl);
573  if(io!=NULL)BIO_free(io);
574  return;
575  }
576  }
577  if((r=BIO_write(io,h1.c_str(),h1.length()))<=0)
578  {
579  sslHandler.error_occurred((char*)"send failed",fd,ssl);
580  if(io!=NULL)BIO_free(io);
581  return;
582  }
583  if((r=BIO_flush(io))<0)
584  {
585  sslHandler.error_occurred((char*)"Error flushing BIO",fd,ssl);
586  if(io!=NULL)BIO_free(io);
587  return;
588  }
589  sslHandler.closeSSL(fd,ssl,io);
590  }
591  else
592  {
593  int size;
594  if ((size=send(fd,&h1[0] , h1.length(), 0)) == -1)
595  logger << "Socket send failed" << endl;
596  else if(size==0)
597  {
598  close(fd);
599  memset(&buf[0], 0, sizeof(buf));
600  logger << "Socket closed for writing" << endl;
601  return;
602  }
603 
604  if(io!=NULL)BIO_free_all(io);
605  }
606  close(fd);
607  memset(&buf[0], 0, sizeof(buf));
608  ss.clear();
609 
610  //Logger::info("got new connection to process\n"+req->getFile()+" :: " + res.getStatusCode() + "\n"+req->getCntxt_name() + "\n"+req->getCntxt_root() + "\n"+req->getUrl());
611  delete req;
612  //logger << (alldatlg + "--sent data--DONE") << endl;
613  //sessionMap[sessId] = sess;
614  }
615  catch(...)
616  {
617  logger << "Standard exception occurred while processing ServiceTask request " << endl;
618  }
619 }
620 
621 HttpResponse ServiceTask::apacheRun(HttpRequest* req)
622 {
623  //logger << dlib << endl;
624  HttpResponse res;
625  string ip;
626  string alldatlg = "\ngot fd from parent";
627  try
628  {
629  string webpath = serverRootDirectory + "web/";
630 
631  if(req->getFile()=="")
632  {
633  logger << req->getFile() << endl;
634  req->setFile("index.html");
635  }
636  if(req->hasCookie())
637  {
638  if(!configData.sessatserv)
639  req->getSession()->setSessionAttributes(req->getCookieInfo());
640  else
641  {
642  string id = req->getCookieInfoAttribute("FFEADID");
643  map<string,string> values = readFromSharedMemeory(id);
644  req->getSession()->setSessionAttributes(values);
645  }
646  }
647 
648  if(configData.cntMap[req->getCntxt_name()]!="true")
649  {
650  req->setCntxt_name("default");
651  req->setCntxt_root(webpath+"default");
652  req->setUrl(webpath+"default"+req->getActUrl());
653  }
654  //logger << req->getCntxt_name() << req->getCntxt_root() << req->getUrl() << endl;
655 
656  if(configData.appMap[req->getCntxt_name()]!="false")
657  {
658  if(dlib == NULL)
659  {
660  cerr << dlerror() << endl;
661  exit(-1);
662  }
663  string meth1 = (req->getCntxt_name()+"checkRules");
664  string path1;
665  void *mkr1 = dlsym(dlib, meth1.c_str());
666  if(mkr1!=NULL)
667  {
668  typedef string (*DCPPtr1) (string,HttpSession);
669  DCPPtr1 f = (DCPPtr1)mkr1;
670  path1 = f(req->getUrl(),*(req->getSession()));
671  //logger << path1 << flush;
672  if(path1=="FAILED")
673  {
674  req->setUrl("");
675  }
676  else if(path1!="" && path1!=req->getUrl())
677  {
678  req->setUrl(path1);
679  }
680  }
681  }
682 
683  string ext = getFileExtension(req->getUrl());
684  vector<unsigned char> test;
685  string content;
686  string claz;
687  //bool isoAuthRes = false;
688  long sessionTimeoutVar = configData.sessionTimeout;
689  bool isContrl = securityHandler.handle(configData.ip_address, req, res, configData.securityObjectMap, sessionTimeoutVar, dlib, configData.cntMap);
690 
691  filterHandler.handleIn(req, res, configData.filterMap, dlib, ext);
692 
693  if(!isContrl)
694  {
695  isContrl = authHandler.handle(configData.autMap, configData.autpattMap, req, res, configData.filterMap, dlib, ext);
696  }
697  string pthwofile = req->getCntxt_name()+req->getActUrl();
698  if(req->getCntxt_name()!="default" && configData.cntMap[req->getCntxt_name()]=="true")
699  {
700  pthwofile = req->getActUrl();
701  }
702  if(!isContrl)
703  {
704  isContrl = controllerHandler.handle(req, res, configData.urlpattMap, configData.mappattMap, dlib, ext,
705  configData.rstCntMap, configData.mapMap, configData.urlMap, pthwofile);
706  }
707 
708  /*After going through the controller the response might be blank, just set the HTTP version*/
709  res.setHttpVersion(req->getHttpVersion());
710  //logger << req->toString() << endl;
711  if(isContrl)
712  {
713 
714  }
715  else if(ext==".form")
716  {
717  formHandler.handle(req, res, configData.formMap, dlib);
718  }
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())
722  {
723  soapHandler.handle(req, res, dlib, configData.props[".xml"]);
724  }
725  else
726  {
727  bool cntrlit = scriptHandler.handle(req, res, configData.handoffs, dlib, ext, configData.props);
728  if(cntrlit)
729  {
730 
731  }
732  else
733  {
734  cntrlit = extHandler.handle(req, res, dlib, ddlib, configData.resourcePath, configData.tmplMap, configData.vwMap, ext, configData.props,
735  configData.ajaxIntfMap);
736  }
737  if(!cntrlit && ext==".fview")
738  {
739  content = fviewHandler.handle(req, res, configData.fviewmap);
740  }
741  else
742  {
743  if(res.getContent_str()=="")
744  content = getContentStr(req->getUrl(),configData.lprops[req->getDefaultLocale()],ext);
745  else
746  content = res.getContent_str();
747  }
748  if(content.length()==0)
749  {
750  res.setHTTPResponseStatus(HTTPResponseStatus::NotFound);
751  //res.setContent_len(CastUtil::lexical_cast<string>(0));
752  }
753  else
754  {
755  res.setHTTPResponseStatus(HTTPResponseStatus::Ok);
756  if(res.getContent_type()=="")res.setContent_type(configData.props[ext]);
757  res.setContent_str(content);
758  //res.setContent_len(CastUtil::lexical_cast<string>(content.length()));
759  //sess.setAttribute("CURR",req->getUrl());
760  }
761  }
762 
763  filterHandler.handleOut(req, res, configData.filterMap, dlib, ext);
764 
765  alldatlg += "--processed data";
766  string h1;
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);
772  //h1 = res.generateResponse();
773  delete req;
774  //logger << (alldatlg + "--sent data--DONE") << endl;
775  //sessionMap[sessId] = sess;
776  }
777  catch(const char* ex)
778  {
779  logger << ex << endl;
780  }
781  catch(...)
782  {
783  logger << "Standard exception occurred while processing ServiceTask request " << endl;
784  }
785  return res;
786 }