diff --git a/includes/Socket.hpp b/includes/Socket.hpp index ce1fc17..aa84da0 100644 --- a/includes/Socket.hpp +++ b/includes/Socket.hpp @@ -7,7 +7,7 @@ class Socket { Socket *_parent; std::vector _childs; struct sockaddr_in _address; - string tmp; + string _tmp; string _header; string _content; diff --git a/srcs/load/Route.cpp b/srcs/load/Route.cpp index 489e946..b19d362 100644 --- a/srcs/load/Route.cpp +++ b/srcs/load/Route.cpp @@ -1,26 +1,27 @@ #include "webserv.hpp" -Route::Route(Server *server, string location, JSONNode *datas) : _server(server), _location(location){ - JSONObject object = datas->obj(); - JSONNode *tmp; - if ((tmp = object["root"])) - _root = tmp->str(); - if ((tmp = object["return"])) - _ret = tmp->str(); - if ((tmp = object["autoindex"])) - _autoindex = tmp->boo(); - if ((tmp = object["indexs"])) { - JSONList indexs = tmp->lst(); - for (JSONList::iterator it = indexs.begin(); it < indexs.end(); it++) { - _indexs.push_back((*it)->str()); - } - } - if ((tmp = object["add_header"])) { - JSONList headers = tmp->lst(); - for (JSONList::iterator it = headers.begin(); it < headers.end(); it++) { - _headers.push_back((*it)->str()); - } - } +Route::Route(Server *server, string location, JSONNode *datas) + : _server(server), _location(location) { + JSONObject object = datas->obj(); + JSONNode *tmp; + if ((tmp = object["root"])) + _root = tmp->str(); + if ((tmp = object["return"])) + _ret = tmp->str(); + if ((tmp = object["autoindex"])) + _autoindex = tmp->boo(); + if ((tmp = object["indexs"])) { + JSONList indexs = tmp->lst(); + for (JSONList::iterator it = indexs.begin(); it < indexs.end(); it++) { + _indexs.push_back((*it)->str()); + } + } + if ((tmp = object["add_header"])) { + JSONList headers = tmp->lst(); + for (JSONList::iterator it = headers.begin(); it < headers.end(); it++) { + _headers.push_back((*it)->str()); + } + } } Route::~Route(void) {} @@ -32,63 +33,65 @@ std::vector Route::getIndexsLst(void) { return _indexs; } std::vector Route::getHeadersLst(void) { return _headers; } string Route::getIndex(string uri, string path) { - std::stringstream content; - std::stringstream ret; - DIR *dir; - struct dirent *entry; - struct stat info; - std::vector indexs = getIndexsLst(); - std::vector::iterator it; + std::stringstream content; + std::stringstream ret; + DIR *dir; + struct dirent *entry; + struct stat info; + std::vector indexs = getIndexsLst(); + std::vector::iterator it; - if ((dir = opendir(path.c_str())) == NULL) - return ""; - else { - content << "

" << path << " files :

\n
    \n"; - while ((entry = readdir(dir)) != NULL) { - if (entry->d_name[0] == '.') - continue; - for (it = indexs.begin(); it < indexs.end(); it++) { - if (entry->d_name == *it) - return (read_file(path + "/" + *it)); - } - content << "
  • d_name << "\">"<< entry->d_name << "
  • \n"; - if (stat(path.c_str(), &info) != 0) - std::cerr << "stat() error on " << path << ": " - << strerror(errno) << "\n"; - } - content << "
      "; - closedir(dir); - } - if (!_autoindex) - return ""; - ret << "Content-type: text/html \n"; - ret << "Content-length: "<< content.str().length(); - ret << "\n\n" << content.str(); - return ret.str(); + if ((dir = opendir(path.c_str())) == NULL) + return ""; + else { + content << "

      " << path + << " files :

      \n
        \n"; + while ((entry = readdir(dir)) != NULL) { + if (entry->d_name[0] == '.') + continue; + for (it = indexs.begin(); it < indexs.end(); it++) { + if (entry->d_name == *it) + return (read_file(path + "/" + *it)); + } + content << "
      • d_name << "\">" + << entry->d_name << "
      • \n"; + if (stat(path.c_str(), &info) != 0) + std::cerr << "stat() error on " << path << ": " << strerror(errno) + << "\n"; + } + content << "
          "; + closedir(dir); + } + if (!_autoindex) + return ""; + ret << "Content-type: text/html \r\n"; + ret << "Content-length: " << content.str().length() << "\r\n"; + ret << "\r\n" << content.str(); + return ret.str(); } string Route::correctUri(string uri) { - std::stringstream ret; - std::vector::iterator it; - std::vector::iterator it2; + std::stringstream ret; + std::vector::iterator it; + std::vector::iterator it2; - //cout << "Correcting request: " << uri << " with root: " << _root << "\n"; - ret << _root; - std::vector loc_split = split(_location, '/'); - std::vector uri_split = split(uri, '/'); - it2 = uri_split.begin(); - for (it = loc_split.begin(); it < loc_split.end(); it++) { - while (*it2 == "") - it2++; - while (*it == "") - it++; - if (it != loc_split.end()) - it2++; - } + // cout << "Correcting request: " << uri << " with root: " << _root << "\n"; + ret << _root; + std::vector loc_split = split(_location, '/'); + std::vector uri_split = split(uri, '/'); + it2 = uri_split.begin(); + for (it = loc_split.begin(); it < loc_split.end(); it++) { + while (*it2 == "") + it2++; + while (*it == "") + it++; + if (it != loc_split.end()) + it2++; + } - while (it2 < uri_split.end()) { - ret << "/" << *(it2++); - } - //cout << "resutlt: " << ret.str() << "\n"; - return ret.str(); + while (it2 < uri_split.end()) { + ret << "/" << *(it2++); + } + // cout << "resutlt: " << ret.str() << "\n"; + return ret.str(); } diff --git a/srcs/load/Socket.cpp b/srcs/load/Socket.cpp index d1a0325..88c9d64 100644 --- a/srcs/load/Socket.cpp +++ b/srcs/load/Socket.cpp @@ -1,169 +1,170 @@ - #include "webserv.hpp" Socket::Socket(listen_t listen) : _listen(listen) {} -Socket::Socket(int fd, Socket *parent) : _fd(fd),_parent(parent) {} +Socket::Socket(int fd, Socket *parent) : _fd(fd), _parent(parent) {} + Socket::~Socket(void) { - close(_fd); - cout << "Socket destroyed!\n"; + close(_fd); + cout << "Socket destroyed!\n"; } int Socket::launch(void) { - int opt = 1; - string ip = _listen.ip; - int port = _listen.port; + int opt = 1; + string ip = _listen.ip; + int port = _listen.port; - _fd = socket(AF_INET, SOCK_STREAM, 0); - if (_fd == 0) { - cout << "Socket creation: " << strerror(errno) << "\n"; - return (EXIT_FAILURE); - } - int opt_ret = setsockopt(_fd, SOL_SOCKET, SO_REUSEADDR, - (char *)&opt, sizeof(opt)); - if (opt_ret < 0) { - cout << "Sockopt: " << strerror(errno) << "\n"; - return (EXIT_FAILURE); - } + _fd = socket(AF_INET, SOCK_STREAM, 0); + if (_fd == 0) { + cout << "Socket creation: " << strerror(errno) << "\n"; + return (EXIT_FAILURE); + } + int opt_ret = + setsockopt(_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)); + if (opt_ret < 0) { + cout << "Sockopt: " << strerror(errno) << "\n"; + return (EXIT_FAILURE); + } - _address.sin_family = AF_INET; - _address.sin_addr.s_addr = inet_addr(ip.c_str()); - _address.sin_port = htons(port); + _address.sin_family = AF_INET; + _address.sin_addr.s_addr = inet_addr(ip.c_str()); + _address.sin_port = htons(port); - if (bind(_fd, (struct sockaddr *)&_address, sizeof(_address)) < - 0) { - cout << "Bind: " << strerror(errno) << "\n"; - return (EXIT_FAILURE); - } - cout << "Listener " << ip << " on port " << port << "\n"; + if (bind(_fd, (struct sockaddr *)&_address, sizeof(_address)) < 0) { + cout << "Bind: " << strerror(errno) << "\n"; + return (EXIT_FAILURE); + } + cout << "Listener " << ip << " on port " << port << "\n"; - if (listen(_fd, 3) < 0) { - cout << "Listen: " << strerror(errno) << "\n"; - return (EXIT_FAILURE); - } - cout << "Master: " << _fd << "\n"; - if (_fd < _min_fd) - _min_fd = _fd; - _amount++; - return (EXIT_SUCCESS); + if (listen(_fd, 3) < 0) { + cout << "Listen: " << strerror(errno) << "\n"; + return (EXIT_FAILURE); + } + cout << "Master: " << _fd << "\n"; + if (_fd < _min_fd) + _min_fd = _fd; + _amount++; + return (EXIT_SUCCESS); } void Socket::set_fds(void) { - int child_fd; - FD_SET(_fd, &_readfds); - for (std::vector::iterator it = _childs.begin(); it < _childs.end(); - it++) { - child_fd = (*it)->_fd; - FD_SET(child_fd, &_readfds); - if (child_fd > _max_fd) - _max_fd = child_fd; - } + int child_fd; + FD_SET(_fd, &_readfds); + for (std::vector::iterator it = _childs.begin(); it < _childs.end(); + it++) { + child_fd = (*it)->_fd; + FD_SET(child_fd, &_readfds); + if (child_fd > _max_fd) + _max_fd = child_fd; + } } void Socket::refresh(Env *env) { - int valread; - int addrlen = sizeof(_address); - char buffer[10000]; - if (FD_ISSET(_fd, &_readfds)) { - int new_socket = accept(_fd, (struct sockaddr *)&_address, - (socklen_t *)&addrlen); - if (new_socket < 0) { - cout << "Accept: " << strerror(errno) << "\n"; - exit(EXIT_FAILURE); - } + int valread; + int addrlen = sizeof(_address); + char buffer[10000]; + if (FD_ISSET(_fd, &_readfds)) { + int new_socket = + accept(_fd, (struct sockaddr *)&_address, (socklen_t *)&addrlen); + if (new_socket < 0) { + cout << "Accept: " << strerror(errno) << "\n"; + exit(EXIT_FAILURE); + } #ifdef __APPLE__ - //fcntl(new_socket, F_GETNOSIGPIPE); - fcntl(new_socket, F_SETFL, O_NONBLOCK); + // fcntl(new_socket, F_GETNOSIGPIPE); + fcntl(new_socket, F_SETFL, O_NONBLOCK); #endif - cout << "New connection, socket fd is " << new_socket - << ", ip is : " << inet_ntoa(_address.sin_addr) - << ", port : " << ntohs(_address.sin_port) << "\n"; - _childs.push_back(new Socket(new_socket, this)); - } - int child_fd; - for (std::vector::iterator it = _childs.begin(); it < _childs.end(); it++) { - child_fd = (*it)->_fd; - if (FD_ISSET(child_fd, &_readfds)) { - valread = read(child_fd, buffer, 10000); - if (valread == 0) { - getpeername(child_fd, (struct sockaddr *)&_address, - (socklen_t *)&addrlen); - cout << "Host disconnected, ip " << inet_ntoa(_address.sin_addr) - << ", port " << ntohs(_address.sin_port) << "\n"; - delete (*it); - _childs.erase(it); - } else { - buffer[valread] = '\0'; - (*it)->answer(env, buffer); - } - } - } + cout << "New connection, socket fd is " << new_socket + << ", ip is : " << inet_ntoa(_address.sin_addr) + << ", port : " << ntohs(_address.sin_port) << "\n"; + _childs.push_back(new Socket(new_socket, this)); + } + int child_fd; + for (std::vector::iterator it = _childs.begin(); it < _childs.end(); + it++) { + child_fd = (*it)->_fd; + if (FD_ISSET(child_fd, &_readfds)) { + valread = read(child_fd, buffer, 10000); + if (valread == 0) { + getpeername(child_fd, (struct sockaddr *)&_address, + (socklen_t *)&addrlen); + cout << "Host disconnected, ip " << inet_ntoa(_address.sin_addr) + << ", port " << ntohs(_address.sin_port) << "\n"; + delete (*it); + _childs.erase(it); + } else { + buffer[valread] = '\0'; + (*it)->answer(env, buffer); + } + } + } } bool Socket::waitHeader() { - if (_header.length() < 1) - return false; - std::vector lines = split(header, '\r\n'); - bool is_valid = false; - for (std::vector::iterator it = lines.begin(); - it < lines.end(); it++) { - if (*it == "") - is_valid = true; - } - if (!is_valid || lines.at(0) == "") - return false; - std::vector head = split(lines.at(0), ' '); - if ((head.at(0) != "GET" && head.at(0) != "POST" && head.at(0) != "DELETE") - || head.size() < 2) - return false; - - return true; + if (_tmp.length() < 1) + return false; + std::vector lines = split(_tmp, '\n'); + bool is_valid = false; + for (std::vector::iterator it = lines.begin(); it < lines.end(); + it++) { + if (*it == "\r") + is_valid = true; + } + if (!is_valid) + return false; + _header = _tmp; + _tmp = ""; + return true; } int Socket::answer(Env *env, string request) { - tmp += request; - cout << "|===|request|===>"<< _request << "|===||\n"; - if (_header == "") { - waitHeader(); - cout << "Bad request recieved\n"; - return EXIT_FAILURE; - } - std::vector lines = split(_request, '\n'); - std::vector head = split(lines.at(0), ' '); - string uri = head.at(1); - cout << uri << "\n"; - string ret; - std::stringstream answer; - answer << "HTTP/1.1"; + _tmp += request; + cout << "|===|request|===>" << _tmp << "|===||\n"; + if (_header == "") { + waitHeader(); + } + std::vector lines = split(_header, '\n'); + std::vector head = split(lines.at(0), ' '); + string uri = head.at(1); + cout << uri << "\n"; + string ret; + std::stringstream answer; + answer << "HTTP/1.1"; + + Server *server = env->choose_server(_parent, split(lines.at(1), ' ').at(1)); + Route *route = server->get_route(uri); + std::vector headers; - Server *server = env->choose_server(_parent, split(lines.at(1), ' ').at(1)); - Route *route = server->get_route(uri); - std::vector headers; - if ((headers = route->getHeadersLst()).size() > 0) { - if (std::find(headers.begin(), headers.end(), head.at(0)) == headers.end()) - send_answer("HTTP/1.1 405 Method Not Allowed"); - } else if ((headers = server->getHeadersLst()).size() > 0) { - if (std::find(headers.begin(), headers.end(), head.at(0)) == headers.end()) - send_answer("HTTP/1.1 405 Method Not Allowed"); - } + if ((head.at(0) != "GET" && head.at(0) != "POST" && head.at(0) != "DELETE") || + head.size() < 2) + send_answer("HTTP/1.1 405 Method Not Allowed\r\nContent-length: 0\r\n\r\n"); + else if ((headers = route->getHeadersLst()).size() > 0) { + if (std::find(headers.begin(), headers.end(), head.at(0)) == headers.end()) + send_answer("HTTP/1.1 405 Method Not Allowed\r\nContent-length: 0\r\n\r\n"); + } else if ((headers = server->getHeadersLst()).size() > 0) { + if (std::find(headers.begin(), headers.end(), head.at(0)) == headers.end()) + send_answer("HTTP/1.1 405 Method Not Allowed\r\nContent-length: 0\r\n\r\n"); + } - string path = route->correctUri(uri); - cout << "Path: " << path << "\n"; - ret = route->getIndex(uri, path); - if (ret == "") { - cout << "No index: lf file\n"; - ret = read_file(path); - } - answer << (ret == "" ? " 404 Not Found\nContent-length: 0\n\n" : " 200 OK\n") << ret; - cout << "|===|Answer|===>" << answer.str() << "|===||\n"; - send_answer(answer.str()); - _request = ""; - return EXIT_SUCCESS; + string path = route->correctUri(uri); + cout << "Path: " << path << "\n"; + ret = route->getIndex(uri, path); + if (ret == "") { + cout << "No index: lf file\n"; + ret = read_file(path); + } + answer << (ret == "" ? " 404 Not Found\r\nContent-length: 0\r\n\r\n" : " 200 OK\r\n") + << ret; + cout << "|===|Answer|===>" << answer.str() << "|===||\n"; + send_answer(answer.str()); + _content = ""; + _header = ""; + return EXIT_SUCCESS; } void Socket::send_answer(string msg) { #ifdef __linux__ - send(_fd, msg.c_str(), msg.length(), MSG_NOSIGNAL); + send(_fd, msg.c_str(), msg.length(), MSG_NOSIGNAL); #elif __APPLE__ - send(_fd, msg.c_str(), msg.length(), 0); + send(_fd, msg.c_str(), msg.length(), 0); #endif } diff --git a/srcs/tools.cpp b/srcs/tools.cpp index 96ca5bf..ee95321 100644 --- a/srcs/tools.cpp +++ b/srcs/tools.cpp @@ -219,8 +219,8 @@ string read_file(string path) { std::getline(file, str); content += str + "\n"; } - ret << "Content-type: " << getMime(path) << "\n"; - ret << "Content-length: " << content.length(); - ret << "\n\n" << content; + ret << "Content-type: " << getMime(path) << "\r\n"; + ret << "Content-length: " << content.length() << "\r\n"; + ret << "\r\n" << content; return (ret.str()); }