Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Server.hpp"
- void runCommands(std::string request){
- list commands = split(request,'&'); // распаковываем группу команд
- for(list::iterator strCmd = commands.begin(); strCmd!=commands.end(); ++strCmd){
- logDebug("Выполнение команды");
- Cmd::tryRunCommand(Cmd::Command(*strCmd)); // посылаем команды парсеру
- }
- }
- void doAnswer(Protocol::Socket *socketPort, std::string request, Session::SessionData *session){
- if(request==""){
- request = MAIN_PAGE;
- }
- if(request!=LOGIN_PAGE && session==NULL){ // запрещаем любые страницы без сессии кроме авторизации
- request = LOGIN_PAGE;
- }
- logDebug("Запрос '"<<request<<"'");
- Pages::IPage *page = Pages::findPage(request);
- std::string html = "";
- if(page!=NULL){
- html = page->getHTML();
- }
- logDebug("Формирование ответа");
- std::string header = HTTP::getHTTP()->createContextHeader(html,session);
- socketPort->sendData(header);
- }
- void checkRequest(Session::SessionData *session, std::string dataGET, Protocol::Socket *socketPort) {
- list request = HTTP::getHTTP()->parseGETRequest(dataGET); // парсим запрос
- if (request.size()<1) {
- doAnswer(socketPort, MAIN_PAGE, session);
- return;
- }
- logDebug("Запрошена страница '"<<request[0]);
- doAnswer(socketPort, request[0], session);
- if (request.size()<2) {
- doAnswer(socketPort, MAIN_PAGE, session);
- return;
- }
- if(session!=null){
- runCommands(request[1]);
- }
- }
- bool checkAutorization(Session::SessionData **session, std::string dataGET, Protocol::Socket *socketPort) {
- if ((*session = HTTP::getHTTP()->isAutorized(dataGET)) != NULL) { // Пользователь не авторизирован
- logDebug("Авторизация одобрена");
- return true;
- }
- *session = HTTP::getHTTP()->tryAutorized(dataGET);
- if (session == NULL) { // Пользователь не авторизировался
- logDebug("Авторизация не одобрена");
- doAnswer(socketPort, LOGIN_PAGE, NULL); // заставляем пользователя авторизироваться
- return false;
- }
- doAnswer(socketPort, std::string(MAIN_PAGE), *session);
- return true;
- }
- void startServer(Protocol::Socket *socketPort){
- Session::SessionData *session = NULL;
- for(;;) {
- std::string dataGET = socketPort->readData(); // считываем заголовок GET запроса
- logDebug("Прочитано: "<<dataGET<<"\n");
- if(dataGET==""){
- socketPort->disconnect();
- socketPort->open();
- continue;
- }
- if(!checkAutorization(&session,dataGET,socketPort)){
- continue;
- }
- if(session!=null){
- checkRequest(session,dataGET,socketPort);
- }
- }
- }
- int main(int argc, char **argv){
- logDebug("Загрузка конфигураций...");
- if(argc>1){
- std::string configPath = argv[1];
- Configuration::readConfig(configPath);
- } else {
- Configuration::readConfig("config.ini");
- }
- logDebug("Инициализация данных...");
- Cmd::initParsers();
- Pages::initPages();
- int portNumber = atoi(Configuration::getProperty(Configuration::PORT_NUMBER).c_str());
- logDebug("Открытие порта "<<portNumber);
- Protocol::Socket socketPort(portNumber);
- socketPort.open();
- logDebug("Старт сервера");
- startServer(&socketPort);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement