Advertisement
Guest User

Untitled

a guest
Jul 28th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. #include "Server.hpp"
  2.  
  3.  
  4.     void runCommands(std::string request){
  5.  
  6.         list commands = split(request,'&'); // распаковываем группу команд
  7.  
  8.         for(list::iterator strCmd = commands.begin(); strCmd!=commands.end(); ++strCmd){
  9.  
  10.             logDebug("Выполнение команды");
  11.             Cmd::tryRunCommand(Cmd::Command(*strCmd)); // посылаем команды парсеру
  12.  
  13.         }
  14.  
  15.     }
  16.  
  17.     void doAnswer(Protocol::Socket *socketPort, std::string request, Session::SessionData *session){
  18.  
  19.         if(request==""){
  20.             request = MAIN_PAGE;
  21.         }
  22.  
  23.         if(request!=LOGIN_PAGE && session==NULL){ // запрещаем любые страницы без сессии кроме авторизации
  24.             request = LOGIN_PAGE;
  25.         }
  26.  
  27.         logDebug("Запрос '"<<request<<"'");
  28.  
  29.         Pages::IPage *page = Pages::findPage(request);
  30.         std::string html = "";
  31.  
  32.         if(page!=NULL){
  33.             html = page->getHTML();
  34.         }
  35.  
  36.         logDebug("Формирование ответа");
  37.  
  38.         std::string header = HTTP::getHTTP()->createContextHeader(html,session);
  39.         socketPort->sendData(header);
  40.     }
  41.  
  42.     void checkRequest(Session::SessionData *session, std::string dataGET, Protocol::Socket *socketPort) {
  43.  
  44.         list request = HTTP::getHTTP()->parseGETRequest(dataGET); // парсим запрос
  45.  
  46.         if (request.size()<1) {
  47.             doAnswer(socketPort, MAIN_PAGE, session);
  48.             return;
  49.         }
  50.  
  51.         logDebug("Запрошена страница '"<<request[0]);
  52.  
  53.         doAnswer(socketPort, request[0], session);
  54.  
  55.         if (request.size()<2) {
  56.             doAnswer(socketPort, MAIN_PAGE, session);
  57.             return;
  58.         }
  59.  
  60.         if(session!=null){
  61.             runCommands(request[1]);
  62.         }
  63.        
  64.     }
  65.  
  66.     bool checkAutorization(Session::SessionData **session, std::string dataGET, Protocol::Socket *socketPort) {
  67.  
  68.         if ((*session = HTTP::getHTTP()->isAutorized(dataGET)) != NULL) { // Пользователь не авторизирован
  69.             logDebug("Авторизация одобрена");
  70.             return true;
  71.         }
  72.        
  73.         *session = HTTP::getHTTP()->tryAutorized(dataGET);
  74.  
  75.         if (session == NULL) { // Пользователь не авторизировался
  76.             logDebug("Авторизация не одобрена");
  77.             doAnswer(socketPort, LOGIN_PAGE, NULL); // заставляем пользователя авторизироваться
  78.             return false;
  79.         }
  80.  
  81.         doAnswer(socketPort, std::string(MAIN_PAGE), *session);
  82.  
  83.         return true;
  84.  
  85.     }
  86.  
  87.     void startServer(Protocol::Socket *socketPort){
  88.  
  89.         Session::SessionData *session = NULL;
  90.  
  91.         for(;;) {
  92.  
  93.             std::string dataGET = socketPort->readData(); // считываем заголовок GET запроса
  94.  
  95.             logDebug("Прочитано: "<<dataGET<<"\n");
  96.            
  97.             if(dataGET==""){
  98.                 socketPort->disconnect();
  99.                 socketPort->open();
  100.                 continue;
  101.             }
  102.  
  103.             if(!checkAutorization(&session,dataGET,socketPort)){
  104.                 continue;
  105.             }
  106.  
  107.             if(session!=null){
  108.                 checkRequest(session,dataGET,socketPort);
  109.             }
  110.            
  111.         }
  112.  
  113.     }
  114.  
  115.     int main(int argc, char **argv){
  116.  
  117.         logDebug("Загрузка конфигураций...");
  118.        
  119.         if(argc>1){
  120.             std::string configPath = argv[1];
  121.             Configuration::readConfig(configPath);
  122.         } else {
  123.             Configuration::readConfig("config.ini");
  124.         }
  125.  
  126.         logDebug("Инициализация данных...");
  127.         Cmd::initParsers();
  128.         Pages::initPages();
  129.  
  130.         int portNumber = atoi(Configuration::getProperty(Configuration::PORT_NUMBER).c_str());
  131.         logDebug("Открытие порта "<<portNumber);
  132.         Protocol::Socket socketPort(portNumber);
  133.         socketPort.open();
  134.  
  135.         logDebug("Старт сервера");
  136.  
  137.         startServer(&socketPort);
  138.  
  139.         return 0;
  140.  
  141.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement