add eboll

This commit is contained in:
Talyx
2022-01-11 22:02:57 +03:00
parent 6dc10a7191
commit 9285dafe99
4 changed files with 101 additions and 27 deletions

View File

@@ -29,6 +29,7 @@ public:
void identifyType(std::string);
void printHeaderInfo(void);
void parseRequest(void);
void clearHeader(void);
Header();
Header(char *);
~Header();

View File

@@ -3,7 +3,8 @@
#include "webserv.hpp"
#define BUFFSIZE 1024
#define BUFFSIZE 1024
#define MAX_CLIENT 1000
class Header;
@@ -11,18 +12,19 @@ class Server
{
private:
int _port;
int _serverSocket;
int _clientSocket;
// int _bufferSize;
int _epolfd;
int _client;
struct epoll_event _events[MAX_CLIENT];
struct sockaddr_in _addres;
std::string _ip;
private:
void checkError(int fd, std::string str);
void sendFile(std::string str);
void sendHeader(Header head);
void sendRespons(Header head);
void sendHeader(Header head, int);
void sendRespons(Header head, int);
void setNonblocking(int fd);
void newConnection(int fd);
public:
Server();
Server(std::string path);

View File

@@ -81,6 +81,7 @@ void Header::parseRequest(void)
if (_request.find(key) != _request.end())
{
std::cout << RED << "ERROR: double header-field" << ZERO_C << std::endl;
std::cout << RED << (_request.find(key))->first << (_request.find(key))->second << std::endl;
}
else
_request[key] = line;
@@ -98,18 +99,27 @@ void Header::printHeaderInfo(void)
std::cout << YELLOW << "request fileName = " << _fileName << ZERO_C << std::endl;
std::cout << YELLOW << "request header:\n" << _buff << ZERO_C << std::endl;
// std::cout << TURGUOISE << "HEADER MAP" << ZERO_C << std::endl;
// for ( it = _request.begin(); it != _request.end(); it++)
// {
// std::cout << PINK << it->first << ZERO_C << std::endl;
// }
// for ( it = _request.begin(); it != _request.end(); it++)
// {
// std::cout << PINK << it->second << ZERO_C << std::endl;
// }
std::cout << TURGUOISE << "HEADER MAP" << ZERO_C << std::endl;
for ( it = _request.begin(); it != _request.end(); it++)
{
std::cout << PINK << it->first << ZERO_C << std::endl;
}
for ( it = _request.begin(); it != _request.end(); it++)
{
std::cout << PINK << it->second << ZERO_C << std::endl;
}
}
void Header::clearHeader(void)
{
_type = -1;
_row = 0;
_buff = NULL;
_fileName = "www/index2.html";
_request.clear();
}
Header::~Header()
{
}

View File

@@ -2,28 +2,30 @@
//----------------------------------------------Constructors-----------------------------------------------------------------------------------
Server::Server()
{
_client = 0;
}
Server::Server(std::string path)
{
(void)path;
_client = 0;
}
//----------------------------------------------Send--------------------------------------------------------------------------------------------
void Server::sendHeader(Header head)
void Server::sendHeader(Header head, int fd)
{
std::string tmp;
const char *header;
tmp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
header = tmp.c_str();
std::cout << TURGUOISE << "Send Header\n" << YELLOW << tmp << ZERO_C;
send(_clientSocket, header, tmp.length(), 0);
send(fd, header, tmp.length(), 0);
(void)head;
}
void Server::sendRespons(Header head)
void Server::sendRespons(Header head, int fd)
{
std::string str = head.getFileName();
const char *path = str.c_str();
@@ -34,11 +36,11 @@ void Server::sendRespons(Header head)
{
file.open("www/index2.html");
}
sendHeader(head);
sendHeader(head, fd);
while (!file.eof())
{
file.read(buff, BUFFSIZE);
send(_clientSocket, buff, file.gcount(), 0);
send(fd, buff, file.gcount(), 0);
}
(void)path;
}
@@ -56,27 +58,86 @@ void Server::setupConfig(void)
}
void Server::setNonblocking(int fd)
{
fcntl(fd, F_SETFL, O_NONBLOCK);
}
void Server::newConnection(int fd)
{
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLOUT | EPOLLET;
ev.data.fd = fd;
epoll_ctl(_epolfd, EPOLL_CTL_ADD, fd, &ev);
_client++;
}
void Server::start(void)
{
Socket serverSocket(AF_INET, SOCK_STREAM, 0, _port);
char buff[BUFFSIZE + 1] = {0};
Header header;
int fd_accept;
checkError(serverSocket.init(3), "Socket init");
_clientSocket = accept(serverSocket.getSocketFd(),
checkError(serverSocket.init(MAX_CLIENT), "Socket init");
fd_accept = accept(serverSocket.getSocketFd(),
serverSocket.getSockaddr(), serverSocket.getSocklen());
checkError(_clientSocket, "Initialize client socket");
checkError(recv(_clientSocket, buff, BUFFSIZE, 0), "Receive msg from client");
checkError(fd_accept, "Initialize client socket");
checkError(recv(fd_accept, buff, BUFFSIZE, 0), "Receive msg from client");
std::cout << TURGUOISE << "Receive Header" << ZERO_C << std::endl;
header.setRequest(buff);
header.parseRequest();
header.printHeaderInfo();
sendRespons(header);
close(_clientSocket);
sendRespons(header, fd_accept);
close(fd_accept);
close(serverSocket.getSocketFd());
//-----------------------------------------------попытка добавить epoll------------------
// Socket serverSocket(AF_INET, SOCK_STREAM, 0, _port);
// char buff[BUFFSIZE + 1] = {0};
// Header header[MAX_CLIENT];
// int fd;
// int n;
// int nfds;
// int _clientSocket;
// nfds = 0;
// n = 0;
// _epolfd = epoll_create1(0);
// checkError(serverSocket.init(MAX_CLIENT), "Socket init");
// setNonblocking(serverSocket.getSocketFd());
// setNonblocking(_epolfd);
// while (true)
// {
// _clientSocket = accept(serverSocket.getSocketFd(),
// serverSocket.getSockaddr(), serverSocket.getSocklen());
// if (_clientSocket > 0)
// newConnection(_clientSocket);
// if (_client > 0)
// nfds = epoll_wait(_epolfd, _events, MAX_CLIENT, -1);
// while (n < nfds)
// {
// fd = _events[n].data.fd;
// // std::cout << "n = " << n << " nfds = " << nfds << " fd = " << fd << " _clientSize = " << _client << " _clientSocket " << _clientSocket << std::endl;
// checkError(recv(fd, buff, BUFFSIZE, 0), "Receive msg from client");
// header[fd].setRequest(buff);
// header[fd].parseRequest();
// header[fd].printHeaderInfo();
// sendRespons(header[fd], fd);
// header[fd].clearHeader();
// close(fd);
// _client--;
// n++;
// }
// n = 0;
// nfds = 0;
// _clientSocket = 0;
// }
// close(serverSocket.getSocketFd());
}
void Server::end(void)
{