I think i have successfully merged origin/master into eric_config_parser, seems fine
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
*.o
|
*.o
|
||||||
|
*.d
|
||||||
*.swp
|
*.swp
|
||||||
*.out
|
*.out
|
||||||
*.exe
|
*.exe
|
||||||
@@ -17,3 +18,5 @@ builds
|
|||||||
ubuntu_tester
|
ubuntu_tester
|
||||||
ubuntu_cgi_tester
|
ubuntu_cgi_tester
|
||||||
webserv
|
webserv
|
||||||
|
!**/webserv/
|
||||||
|
*.log
|
||||||
|
|||||||
58
Makefile
58
Makefile
@@ -1,17 +1,18 @@
|
|||||||
NAME = webserv
|
|
||||||
|
|
||||||
CXX = c++
|
NAME = webserv
|
||||||
|
CXX = c++
|
||||||
|
|
||||||
CXXFLAGS = -Wall -Wextra #-Werror
|
CXXFLAGS = -Wall -Wextra #-Werror
|
||||||
CXXFLAGS += -std=c++98
|
CXXFLAGS += $(HEADERS)
|
||||||
CXXFLAGS += -I$(HEADERS_D)
|
CXXFLAGS += -std=c++98
|
||||||
CXXFLAGS += -g
|
CXXFLAGS += -g
|
||||||
#CXXFLAGS += -O3
|
CXXFLAGS += -MMD -MP #header dependencie
|
||||||
|
#CXXFLAGS += -O3
|
||||||
|
|
||||||
#SHELL = /bin/zsh
|
#SHELL = /bin/zsh
|
||||||
VPATH = $(DIR_SRCS)
|
VPATH = $(SRCS_D)
|
||||||
DIR_SRCS = srcs
|
|
||||||
|
|
||||||
|
HEADERS = $(HEADERS_D:%=-I%)
|
||||||
HEADERS_D = ./srcs
|
HEADERS_D = ./srcs
|
||||||
HEADERS = Webserv.hpp \
|
HEADERS = Webserv.hpp \
|
||||||
ConfigParser.hpp \
|
ConfigParser.hpp \
|
||||||
@@ -22,15 +23,18 @@ HEADERS = Webserv.hpp \
|
|||||||
MethodType.hpp \
|
MethodType.hpp \
|
||||||
utils.hpp \
|
utils.hpp \
|
||||||
|
|
||||||
DEPENDENCIES = $(HEADERS:%=$(HEADERS_D)/%)
|
SRCS_D = srcs srcs/webserv
|
||||||
|
SRCS = main.cpp \
|
||||||
|
ft_itoa.cpp \
|
||||||
|
base.cpp init.cpp close.cpp epoll_update.cpp signal.cpp \
|
||||||
|
accept.cpp request.cpp response.cpp \
|
||||||
|
run_loop.cpp \
|
||||||
|
ConfigParser.cpp \
|
||||||
|
utils.cpp \
|
||||||
|
|
||||||
SRCS = main.cpp \
|
OBJS_D = builds
|
||||||
Webserv.cpp \
|
OBJS = $(SRCS:%.cpp=$(OBJS_D)/%.o)
|
||||||
ConfigParser.cpp \
|
DEPS = $(OBJS:.o=.d) #header dependencie
|
||||||
utils.cpp \
|
|
||||||
|
|
||||||
DIR_OBJS = builds
|
|
||||||
OBJS = $(SRCS:%.cpp=$(DIR_OBJS)/%.o)
|
|
||||||
|
|
||||||
# --------------------
|
# --------------------
|
||||||
# ------ RULES -------
|
# ------ RULES -------
|
||||||
@@ -38,26 +42,24 @@ OBJS = $(SRCS:%.cpp=$(DIR_OBJS)/%.o)
|
|||||||
|
|
||||||
all: $(NAME)
|
all: $(NAME)
|
||||||
|
|
||||||
$(DIR_OBJS)/%.o: %.cpp | $(DIR_OBJS)
|
$(OBJS_D)/%.o: %.cpp | $(OBJS_D)
|
||||||
$(CXX) $(CXXFLAGS) -c $< -o $@
|
$(CXX) $(CXXFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(DIR_OBJS):
|
$(OBJS_D):
|
||||||
mkdir $@
|
mkdir $@
|
||||||
|
|
||||||
$(OBJS): $(DEPENDENCIES)
|
$(NAME): $(OBJS)
|
||||||
#$(OBJS): $(DEPENDENCIES) Makefile
|
$(CXX) $^ -o $(NAME)
|
||||||
|
|
||||||
$(NAME) : $(OBJS)
|
|
||||||
$(CXX) $(OBJS) -o $(NAME)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(OBJS)
|
rm -rf $(OBJS_D)
|
||||||
|
|
||||||
fclean: clean
|
fclean: clean
|
||||||
rm -f $(NAME)
|
rm -f $(NAME)
|
||||||
|
|
||||||
re: fclean all
|
re: fclean all
|
||||||
|
|
||||||
#run: all
|
.PHONY : all clean fclean re
|
||||||
|
|
||||||
|
-include $(DEPS) # header dependencie
|
||||||
|
|
||||||
.PHONY : all clean fclean re run
|
|
||||||
|
|||||||
11
default_error_pages/404.html
Normal file
11
default_error_pages/404.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>404 Not Found</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1 style="text-align:center">404 Not Found</h1>
|
||||||
|
<hr>
|
||||||
|
<p style="text-align:center">Le Webserv/0.1</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -6,9 +6,9 @@
|
|||||||
# include <string>
|
# include <string>
|
||||||
# include <map>
|
# include <map>
|
||||||
|
|
||||||
class Client
|
struct Client
|
||||||
{
|
{
|
||||||
public:
|
// public:
|
||||||
// Client(Placeholder);
|
// Client(Placeholder);
|
||||||
// Client();
|
// Client();
|
||||||
// Client(Client const &src);
|
// Client(Client const &src);
|
||||||
@@ -18,9 +18,11 @@ class Client
|
|||||||
int fd;
|
int fd;
|
||||||
std::string raw_request;
|
std::string raw_request;
|
||||||
std::map<std::string, std::string> request;
|
std::map<std::string, std::string> request;
|
||||||
std::map<std::string, std::string> response;
|
// std::map<std::string, std::string> response;
|
||||||
|
std::string response;
|
||||||
|
unsigned int status;
|
||||||
|
|
||||||
private:
|
// private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -35,17 +35,14 @@
|
|||||||
# include <string.h>
|
# include <string.h>
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
|
# include <cstdlib> // itoa
|
||||||
|
# include <fstream> // ifstream
|
||||||
|
char *ft_itoa(int n);
|
||||||
|
# include <unistd.h> // access
|
||||||
|
|
||||||
# define BUFSIZE 8192
|
extern bool g_run;
|
||||||
# define TIMEOUT 3000
|
extern int g_last_signal;
|
||||||
# define MAX_EVENTS 42 // arbitrary
|
void signal_handler(int signum);
|
||||||
# define MSG_TEST "Le Webserv / 20 =D\n"
|
|
||||||
|
|
||||||
|
|
||||||
// ev.data.u32 filled with tag constant "SERVER_FD/CLIENT_FD"
|
|
||||||
// dont work because ev.data is an "union",
|
|
||||||
// so we can only use one variable (fd, ptr, u32 or u64)
|
|
||||||
// ev.data.u32 = SERVER_FD;
|
|
||||||
|
|
||||||
/* enum // WIP test
|
/* enum // WIP test
|
||||||
{
|
{
|
||||||
@@ -67,7 +64,7 @@ struct s // WIP test
|
|||||||
class Webserv
|
class Webserv
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// base.cpp
|
||||||
Webserv();
|
Webserv();
|
||||||
// Webserv(Webserv const &src);
|
// Webserv(Webserv const &src);
|
||||||
|
|
||||||
@@ -77,8 +74,10 @@ class Webserv
|
|||||||
~Webserv();
|
~Webserv();
|
||||||
// Webserv &operator=(Webserv const &rhs);
|
// Webserv &operator=(Webserv const &rhs);
|
||||||
|
|
||||||
|
// init.cpp
|
||||||
void init_virtual_servers(); // ADD config param
|
void init_virtual_servers(); // ADD config param
|
||||||
void start();
|
// run_loop.cpp
|
||||||
|
void run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _epfd;
|
int _epfd;
|
||||||
@@ -86,19 +85,26 @@ class Webserv
|
|||||||
// std::vector<Server> _servers;
|
// std::vector<Server> _servers;
|
||||||
std::vector<Client> _clients;
|
std::vector<Client> _clients;
|
||||||
|
|
||||||
|
// accept.cpp
|
||||||
void _accept_connection(int fd);
|
void _accept_connection(int fd);
|
||||||
|
// request.cpp
|
||||||
|
void _request(Client *client);
|
||||||
void _read_request(Client *client);
|
void _read_request(Client *client);
|
||||||
|
// response.cpp
|
||||||
|
void _response(Client *client);
|
||||||
void _send_response(Client *client);
|
void _send_response(Client *client);
|
||||||
|
void _construct_response(Client *client);
|
||||||
|
void _insert_status_line(Client *client);
|
||||||
|
void _get_ressource(Client *client);
|
||||||
|
// epoll_update.cpp
|
||||||
int _epoll_update(int fd, uint32_t events, int op);
|
int _epoll_update(int fd, uint32_t events, int op);
|
||||||
int _epoll_update(int fd, uint32_t events, int op, void *ptr);
|
int _epoll_update(int fd, uint32_t events, int op, void *ptr);
|
||||||
|
// signal.cpp
|
||||||
void _handle_last_signal();
|
void _handle_last_signal();
|
||||||
// void _signal_handler(int signum); // invalide dans une class
|
// close.cpp
|
||||||
Client* _actual_client;
|
|
||||||
void _close_client(int fd);
|
void _close_client(int fd);
|
||||||
void _close_all_clients();
|
void _close_all_clients();
|
||||||
|
// init.cpp
|
||||||
void _bind(int socket_fd, in_port_t port);
|
void _bind(int socket_fd, in_port_t port);
|
||||||
void _listen(int socket_fd, unsigned int max_connections);
|
void _listen(int socket_fd, unsigned int max_connections);
|
||||||
};
|
};
|
||||||
|
|||||||
50
srcs/ft_itoa.cpp
Normal file
50
srcs/ft_itoa.cpp
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static int eval_is_negative(int *n)
|
||||||
|
{
|
||||||
|
if (*n < 0)
|
||||||
|
{
|
||||||
|
*n = *n * -1;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int eval_digit_nbr(int n)
|
||||||
|
{
|
||||||
|
int digit_nbr;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
return (1);
|
||||||
|
digit_nbr = 0;
|
||||||
|
while (n != 0)
|
||||||
|
{
|
||||||
|
digit_nbr++;
|
||||||
|
n = n / 10;
|
||||||
|
}
|
||||||
|
return (digit_nbr);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *ft_itoa(int n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *str;
|
||||||
|
int is_negative;
|
||||||
|
|
||||||
|
if (n == -2147483648)
|
||||||
|
return (strdup("-2147483648"));
|
||||||
|
is_negative = eval_is_negative(&n);
|
||||||
|
i = eval_digit_nbr(n) + is_negative;
|
||||||
|
str = new char[i+1];
|
||||||
|
if (is_negative)
|
||||||
|
str[0] = '-';
|
||||||
|
str[i] = '\0';
|
||||||
|
while (i > 0 + is_negative)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
str[i] = (n % 10) + '0';
|
||||||
|
n = n / 10;
|
||||||
|
}
|
||||||
|
return (str);
|
||||||
|
}
|
||||||
26
srcs/webserv/accept.cpp
Normal file
26
srcs/webserv/accept.cpp
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
void Webserv::_accept_connection(int fd)
|
||||||
|
{
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t addr_len;
|
||||||
|
int accepted_fd;
|
||||||
|
|
||||||
|
std::cerr << "accept()\n";
|
||||||
|
addr_len = sizeof addr;
|
||||||
|
accepted_fd = ::accept(fd, (sockaddr*)&addr, &addr_len);
|
||||||
|
if (accepted_fd == -1)
|
||||||
|
{
|
||||||
|
std::perror("err accept()");
|
||||||
|
if (g_last_signal)
|
||||||
|
_handle_last_signal();
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
::fcntl(accepted_fd, F_SETFL, O_NONBLOCK);
|
||||||
|
|
||||||
|
_clients.push_back(Client());
|
||||||
|
_clients.back().fd = accepted_fd;
|
||||||
|
|
||||||
|
_epoll_update(accepted_fd, EPOLLIN, EPOLL_CTL_ADD, &_clients.back());
|
||||||
|
}
|
||||||
54
srcs/webserv/base.cpp
Normal file
54
srcs/webserv/base.cpp
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
Webserv::Webserv()
|
||||||
|
{
|
||||||
|
std::cerr << "Server init\n";
|
||||||
|
|
||||||
|
_epfd = ::epoll_create1(0); // (EPOLL_CLOEXEC) for CGI fork ?
|
||||||
|
if (_epfd == -1)
|
||||||
|
{
|
||||||
|
std::perror("err epoll_create1()");
|
||||||
|
throw std::runtime_error("Epoll init");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::signal(SIGPIPE, signal_handler);
|
||||||
|
std::signal(SIGINT, signal_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Webserv::Webserv(Webserv const &src)
|
||||||
|
{
|
||||||
|
|
||||||
|
} */
|
||||||
|
|
||||||
|
// we'll come back to this
|
||||||
|
/*
|
||||||
|
Webserv::Webserv(std::vector<ServerConfig>* servers)
|
||||||
|
: _servers(servers)
|
||||||
|
{
|
||||||
|
// talk to luke about what all this does
|
||||||
|
// the Param Constructor might need to do dif stuff
|
||||||
|
std::cout << "Server init\n";
|
||||||
|
|
||||||
|
_epfd = ::epoll_create1(0); // (EPOLL_CLOEXEC) for CGI fork ?
|
||||||
|
if (_epfd == -1)
|
||||||
|
{
|
||||||
|
std::perror("err epoll_create1(): ");
|
||||||
|
throw std::runtime_error("Epoll init");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
Webserv::~Webserv()
|
||||||
|
{
|
||||||
|
close(_socket_fd);
|
||||||
|
close(_epfd);
|
||||||
|
_close_all_clients();
|
||||||
|
std::cerr << "Server destroyed\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Webserv & Webserv::operator=(Webserv const &rhs)
|
||||||
|
{
|
||||||
|
|
||||||
|
} */
|
||||||
34
srcs/webserv/close.cpp
Normal file
34
srcs/webserv/close.cpp
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
void Webserv::_close_client(int fd)
|
||||||
|
{
|
||||||
|
std::vector<Client>::iterator it = _clients.begin();
|
||||||
|
while (it != _clients.end())
|
||||||
|
{
|
||||||
|
if (it->fd == fd)
|
||||||
|
{
|
||||||
|
// _epoll_update(fd, 0, EPOLL_CTL_DEL); // normalement superflu, DEBUG
|
||||||
|
if (::close(fd) == -1)
|
||||||
|
std::perror("err close()");
|
||||||
|
else
|
||||||
|
std::cerr << "close fd " << fd << "\n";
|
||||||
|
_clients.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_close_all_clients()
|
||||||
|
{
|
||||||
|
while (!_clients.empty())
|
||||||
|
{
|
||||||
|
// _epoll_update(_clients.back().fd, 0, EPOLL_CTL_DEL); // normalement superflu, DEBUG
|
||||||
|
if (::close(_clients.back().fd) == -1)
|
||||||
|
std::perror("err close()");
|
||||||
|
else
|
||||||
|
std::cerr << "close fd " << _clients.back().fd << "\n";
|
||||||
|
_clients.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
30
srcs/webserv/epoll_update.cpp
Normal file
30
srcs/webserv/epoll_update.cpp
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
int Webserv::_epoll_update(int fd, uint32_t events, int op)
|
||||||
|
{
|
||||||
|
struct epoll_event ev;
|
||||||
|
std::memset(&ev, 0, sizeof ev);
|
||||||
|
ev.events = events;
|
||||||
|
ev.data.fd = fd;
|
||||||
|
if (::epoll_ctl(_epfd, op, fd, &ev) == -1)
|
||||||
|
{
|
||||||
|
std::perror("err _epoll_update()");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Webserv::_epoll_update(int fd, uint32_t events, int op, void *ptr)
|
||||||
|
{
|
||||||
|
struct epoll_event ev;
|
||||||
|
std::memset(&ev, 0, sizeof ev);
|
||||||
|
ev.events = events;
|
||||||
|
ev.data.ptr = ptr;
|
||||||
|
if (::epoll_ctl(_epfd, op, fd, &ev) == -1)
|
||||||
|
{
|
||||||
|
std::perror("err _epoll_update()");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
45
srcs/webserv/init.cpp
Normal file
45
srcs/webserv/init.cpp
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
void Webserv::init_virtual_servers() // ADD config param
|
||||||
|
{
|
||||||
|
_socket_fd = ::socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); // (SOCK_CLOEXEC) for CGI fork ?
|
||||||
|
if (_socket_fd == -1)
|
||||||
|
{
|
||||||
|
std::perror("err socket()");
|
||||||
|
throw std::runtime_error("Socket init");
|
||||||
|
}
|
||||||
|
|
||||||
|
_bind(_socket_fd, 4040);
|
||||||
|
_listen(_socket_fd, 512); // 512 arbitrary
|
||||||
|
|
||||||
|
if (_epoll_update(_socket_fd, EPOLLIN, EPOLL_CTL_ADD) == -1)
|
||||||
|
throw std::runtime_error("Socket init");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_bind(int socket_fd, in_port_t port)
|
||||||
|
{
|
||||||
|
// cast invalid ? how to ?
|
||||||
|
// const struct sockaddr* cast_test = static_cast<const struct sockaddr*>(addr);
|
||||||
|
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
std::memset(&addr, 0, sizeof addr);
|
||||||
|
addr.sin_family = AF_INET;
|
||||||
|
addr.sin_port = ::htons(port);
|
||||||
|
addr.sin_addr.s_addr = ::htonl(INADDR_ANY); // htonl useless with 0 value (INADDR_ANY) ?
|
||||||
|
|
||||||
|
if (::bind(socket_fd, (const sockaddr*)&addr, sizeof addr) == -1)
|
||||||
|
{
|
||||||
|
std::perror("err bind()");
|
||||||
|
throw std::runtime_error("Socket bind");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_listen(int socket_fd, unsigned int max_connections)
|
||||||
|
{
|
||||||
|
if (::listen(socket_fd, max_connections) == -1)
|
||||||
|
{
|
||||||
|
std::perror("err listen()");
|
||||||
|
throw std::runtime_error("Socket listen");
|
||||||
|
}
|
||||||
|
}
|
||||||
37
srcs/webserv/request.cpp
Normal file
37
srcs/webserv/request.cpp
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
#define BUFSIZE 8192
|
||||||
|
|
||||||
|
void Webserv::_request(Client *client)
|
||||||
|
{
|
||||||
|
_read_request(client);
|
||||||
|
if (g_last_signal)
|
||||||
|
_handle_last_signal();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_read_request(Client *client)
|
||||||
|
{
|
||||||
|
char buf[BUFSIZE+1];
|
||||||
|
ssize_t ret;
|
||||||
|
|
||||||
|
std::cerr << "recv()\n";
|
||||||
|
ret = ::recv(client->fd, buf, BUFSIZE, 0);
|
||||||
|
if (ret == -1)
|
||||||
|
{
|
||||||
|
std::perror("err recv()");
|
||||||
|
std::cerr << "client ptr =" << client << "\n"; // DEBUG
|
||||||
|
std::cerr << "client.fd =" << client->fd << "\n"; // DEBUG
|
||||||
|
_close_client(client->fd);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (ret == BUFSIZE)
|
||||||
|
// send error like "request too long" to client
|
||||||
|
*/
|
||||||
|
|
||||||
|
buf[ret] = '\0';
|
||||||
|
client->raw_request.append(buf);
|
||||||
|
|
||||||
|
_epoll_update(client->fd, EPOLLOUT, EPOLL_CTL_MOD, client);
|
||||||
|
}
|
||||||
143
srcs/webserv/response.cpp
Normal file
143
srcs/webserv/response.cpp
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
void Webserv::_response(Client *client)
|
||||||
|
{
|
||||||
|
_send_response(client);
|
||||||
|
if (g_last_signal)
|
||||||
|
_handle_last_signal();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_send_response(Client *client)
|
||||||
|
{
|
||||||
|
ssize_t ret;
|
||||||
|
|
||||||
|
std::cerr << "send()\n";
|
||||||
|
std::cerr << "RAW_REQUEST\n|\n" << client->raw_request << "|\n"; // DEBUG
|
||||||
|
|
||||||
|
_construct_response(client);
|
||||||
|
|
||||||
|
ret = ::send(client->fd, client->response.data(), client->response.size(), 0);
|
||||||
|
if (ret == -1)
|
||||||
|
{
|
||||||
|
std::perror("err send()");
|
||||||
|
std::cerr << "client ptr =" << client << "\n"; // DEBUG
|
||||||
|
std::cerr << "client.fd =" << client->fd << "\n"; // DEBUG
|
||||||
|
_close_client(client->fd);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
_close_client(client->fd);
|
||||||
|
/* if (client->raw_request.find("Connection: keep-alive") == std::string::npos)
|
||||||
|
_close_client(client->fd);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_epoll_update(client->fd, EPOLLIN, EPOLL_CTL_MOD, client);
|
||||||
|
client->raw_request.clear();
|
||||||
|
client->response.clear();
|
||||||
|
} */
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_construct_response(Client *client)
|
||||||
|
{
|
||||||
|
client->status = 200;
|
||||||
|
client->response.append("Server: Webserv/0.1\r\n");
|
||||||
|
|
||||||
|
client->response.append("Connection: close\r\n");
|
||||||
|
|
||||||
|
_get_ressource(client);
|
||||||
|
|
||||||
|
_insert_status_line(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define E404 "\r\n<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1 style=\"text-align:center\">404 Not Found</h1><hr><p style=\"text-align:center\">Le Webserv/0.1</p></body></html>"
|
||||||
|
#define E500 "\r\n<!DOCTYPE html><html><head><title>500 Internal Server Error</title></head><body><h1 style=\"text-align:center\">500 Internal Server Error</h1><hr><p style=\"text-align:center\">Le Webserv/0.1</p></body></html>"
|
||||||
|
void Webserv::_insert_status_line(Client *client)
|
||||||
|
{
|
||||||
|
std::string status_line;
|
||||||
|
|
||||||
|
status_line.append("HTTP/1.1 ");
|
||||||
|
// WIP, maybe make a map for status response
|
||||||
|
switch (client->status)
|
||||||
|
{
|
||||||
|
case (200):
|
||||||
|
status_line.append("200 OK");
|
||||||
|
break;
|
||||||
|
case (404):
|
||||||
|
status_line.append("404 Not Found");
|
||||||
|
client->response.append(E404);
|
||||||
|
break;
|
||||||
|
case (500):
|
||||||
|
status_line.append("500 Internal Server Error");
|
||||||
|
client->response.append(E500);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
status_line.append("\r\n");
|
||||||
|
|
||||||
|
client->response.insert(0, status_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ROOT "website"
|
||||||
|
#define INDEX "index.html"
|
||||||
|
#define MAX_FILESIZE 1000000 // (1Mo)
|
||||||
|
void Webserv::_get_ressource(Client *client)
|
||||||
|
{
|
||||||
|
std::ifstream ifd; // For chunk, ifstream directly in struct CLient for multiples read without close() ?
|
||||||
|
char buf[MAX_FILESIZE+1];
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
// Mini parsing à l'arrache du PATH
|
||||||
|
std::string path;
|
||||||
|
path = client->raw_request.substr(0, client->raw_request.find("\r\n"));
|
||||||
|
path = path.substr(0, path.rfind(" "));
|
||||||
|
path = path.substr(path.find("/"));
|
||||||
|
if (path == "/")
|
||||||
|
path.append(INDEX);
|
||||||
|
path.insert(0, ROOT);
|
||||||
|
|
||||||
|
if (access(path.data(), R_OK) == -1)
|
||||||
|
{
|
||||||
|
std::perror("err access()");
|
||||||
|
client->status = 404;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ifd.open(path.data(), std::ios::binary | std::ios::ate); // std::ios::binary (binary for files like images ?)
|
||||||
|
if (!ifd)
|
||||||
|
{
|
||||||
|
std::cerr << path << ": open fail" << '\n';
|
||||||
|
client->status = 500;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// WIP : Chunk or not chunk (if filesize too big)
|
||||||
|
std::streampos size = ifd.tellg();
|
||||||
|
if (size > MAX_FILESIZE)
|
||||||
|
{
|
||||||
|
// Then chunk
|
||||||
|
client->status = 500; // WIP temp
|
||||||
|
std::cerr << "File too large for non chunk body\n";
|
||||||
|
ifd.close();
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
ifd.seekg(0, std::ios::beg);
|
||||||
|
ifd.read(buf, size);
|
||||||
|
buf[ifd.gcount()] = '\0';
|
||||||
|
|
||||||
|
client->response.append("Content-Type: text/html; charset=UTF-8\r\n");
|
||||||
|
|
||||||
|
client->response.append("Content-Length: ");
|
||||||
|
tmp = ::ft_itoa(ifd.gcount());
|
||||||
|
client->response.append(tmp);
|
||||||
|
delete tmp;
|
||||||
|
client->response.append("\r\n");
|
||||||
|
|
||||||
|
// Body
|
||||||
|
client->response.append("\r\n");
|
||||||
|
client->response.append(buf);
|
||||||
|
|
||||||
|
|
||||||
|
ifd.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
48
srcs/webserv/run_loop.cpp
Normal file
48
srcs/webserv/run_loop.cpp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
#define MAX_EVENTS 42 // arbitrary
|
||||||
|
#define TIMEOUT 3000
|
||||||
|
|
||||||
|
void Webserv::run()
|
||||||
|
{
|
||||||
|
std::cerr << "Server started\n";
|
||||||
|
struct epoll_event events[MAX_EVENTS];
|
||||||
|
int nfds;
|
||||||
|
int i;
|
||||||
|
int count_loop = 0;
|
||||||
|
|
||||||
|
g_run = true;
|
||||||
|
while (g_run)
|
||||||
|
{
|
||||||
|
std::cerr << ++count_loop << "----loop epoll()\n";
|
||||||
|
nfds = ::epoll_wait(_epfd, events, MAX_EVENTS, TIMEOUT);
|
||||||
|
if (nfds == -1)
|
||||||
|
{
|
||||||
|
std::perror("err epoll_wait()");
|
||||||
|
throw std::runtime_error("Epoll wait");
|
||||||
|
}
|
||||||
|
else if (nfds == 0)
|
||||||
|
{
|
||||||
|
if (!_clients.empty())
|
||||||
|
{
|
||||||
|
std::cerr << "Timeout " << TIMEOUT << "ms\n";
|
||||||
|
_close_all_clients();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while (i < nfds)
|
||||||
|
{
|
||||||
|
// if ((events[i].data.u32 == SERVER_FD) && (events[i].events & EPOLLIN)) // Dont work, see "SERVER_FD" define
|
||||||
|
if ((events[i].data.fd == _socket_fd) && (events[i].events & EPOLLIN))
|
||||||
|
_accept_connection(events[i].data.fd);
|
||||||
|
else if (events[i].events & EPOLLIN)
|
||||||
|
_request(static_cast<Client*>(events[i].data.ptr));
|
||||||
|
else if (events[i].events & EPOLLOUT)
|
||||||
|
_response(static_cast<Client*>(events[i].data.ptr));
|
||||||
|
++i;
|
||||||
|
if (!g_run)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
29
srcs/webserv/signal.cpp
Normal file
29
srcs/webserv/signal.cpp
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
#include "Webserv.hpp"
|
||||||
|
|
||||||
|
bool g_run;
|
||||||
|
int g_last_signal;
|
||||||
|
|
||||||
|
void signal_handler(int signum)
|
||||||
|
{
|
||||||
|
g_last_signal = signum;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Webserv::_handle_last_signal()
|
||||||
|
{
|
||||||
|
if (g_last_signal == SIGPIPE)
|
||||||
|
{
|
||||||
|
std::cerr << "SIGPIPE\n";
|
||||||
|
// if (_actual_client)
|
||||||
|
// {
|
||||||
|
// _close_client(_actual_client->fd);
|
||||||
|
// _actual_client = NULL;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
else if (g_last_signal == SIGINT)
|
||||||
|
{
|
||||||
|
g_run = false;
|
||||||
|
// maybe a throw here instead of "g_run" ?
|
||||||
|
}
|
||||||
|
g_last_signal = 0;
|
||||||
|
}
|
||||||
11
website/index.html
Normal file
11
website/index.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Le Webserv</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1 style="text-align:center">Le index (˘ ͜ʖ˘)</h1>
|
||||||
|
<hr>
|
||||||
|
<p style="text-align:center">(˚3˚)</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
300
website/rfc2119_no_link.html
Normal file
300
website/rfc2119_no_link.html
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<!-- saved from url=(0057)https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html -->
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head profile="http://dublincore.org/documents/2008/08/04/dc-html/"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<title>rfc2119</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="Verified-headnote-styling">
|
||||||
|
<span style="font-weight: bold;">This is a purely informative rendering of an RFC that includes verified errata. This rendering may not be used as a reference.</span>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
The following 'Verified' errata have been incorporated in this document:
|
||||||
|
<a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#eid493">EID 493</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_494">EID 494</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_495">EID 495</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_494">EID 496</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#eid498">EID 498</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_499">EID 499</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#eid500">EID 500</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_5101">EID 5101</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<pre>Network Working Group S. Bradner
|
||||||
|
Request for Comments: 2119 Harvard University
|
||||||
|
BCP: 14 March 1997
|
||||||
|
Category: Best Current Practice
|
||||||
|
|
||||||
|
|
||||||
|
Key words for use in RFCs to Indicate Requirement Levels
|
||||||
|
|
||||||
|
Status of this Memo
|
||||||
|
|
||||||
|
This document specifies an Internet Best Current Practices for the
|
||||||
|
Internet Community, and requests discussion and suggestions for
|
||||||
|
improvements. Distribution of this memo is unlimited.
|
||||||
|
|
||||||
|
Abstract
|
||||||
|
|
||||||
|
In many standards track documents several words are used to signify
|
||||||
|
the requirements in the specification. These words are often
|
||||||
|
capitalized. This document defines these words as they should be
|
||||||
|
interpreted in IETF documents. Authors who follow these guidelines
|
||||||
|
should incorporate this phrase near the beginning of their document:
|
||||||
|
|
||||||
|
<span class="Verified-inline-styling" id="inline-499"> The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL <button id="btn_499" target="expand_499" onclick="hideFunction("expand_499")">Expand</button>
|
||||||
|
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
|
||||||
|
RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
|
||||||
|
be interpreted as described in RFC 2119.</span>
|
||||||
|
<div class="nodeCloseClass" id="expand_499"><div class="Verified-endnote-styling" id="eid499">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid499">EID 499</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> Abstract
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
|
||||||
|
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
|
||||||
|
"OPTIONAL" in this document are to be interpreted as described in
|
||||||
|
RFC 2119.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
|
||||||
|
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
|
||||||
|
RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
|
||||||
|
be interpreted as described in RFC 2119.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
The phrase "NOT RECOMMENDED" is missing from this sentence.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
Note that the force of these words is modified by the requirement
|
||||||
|
level of the document in which they are used.
|
||||||
|
|
||||||
|
<span class="Verified-inline-styling" id="inline-495">1. MUST This word, or the terms "REQUIRED" or "SHALL", means that the <button id="btn_495" target="expand_495" onclick="hideFunction("expand_495")">Expand</button>
|
||||||
|
definition is an absolute requirement of the specification.
|
||||||
|
<div class="Verified-endnote-styling" id="eid493">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid493">EID 493</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
|
||||||
|
definition is an absolute prohibition of the specification.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
2. MUST NOT This phrase, or the phrase "SHALL NOT", means that the
|
||||||
|
definition is an absolute prohibition of the specification.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="Verified-endnote-styling" id="eid498">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid498">EID 498</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean that
|
||||||
|
there may exist valid reasons in particular circumstances when the
|
||||||
|
particular behavior is acceptable or even useful, but the full
|
||||||
|
implications should be understood and the case carefully weighed
|
||||||
|
before implementing any behavior described with this label.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED", means that
|
||||||
|
there may exist valid reasons in particular circumstances when the
|
||||||
|
particular behavior is acceptable or even useful, but the full
|
||||||
|
implications should be understood and the case carefully weighed
|
||||||
|
before implementing any behavior described with this label.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="Verified-endnote-styling" id="eid500">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid500">EID 500</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
|
||||||
|
may exist valid reasons in particular circumstances to ignore a
|
||||||
|
particular item, but the full implications must be understood and
|
||||||
|
carefully weighed before choosing a different course.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
3. SHOULD This word, or the adjective "RECOMMENDED", means that there
|
||||||
|
may exist valid reasons in particular circumstances to ignore a
|
||||||
|
particular item, but the full implications must be understood and
|
||||||
|
carefully weighed before choosing a different course.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
<div class="nodeCloseClass" id="expand_495"><div class="Verified-endnote-styling" id="eid495">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid495">EID 495</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the
|
||||||
|
definition is an absolute requirement of the specification.
|
||||||
|
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
1. MUST This word, or the terms "REQUIRED" or "SHALL", means that the
|
||||||
|
definition is an absolute requirement of the specification.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
|
||||||
|
definition is an absolute prohibition of the specification.
|
||||||
|
|
||||||
|
3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
|
||||||
|
may exist valid reasons in particular circumstances to ignore a
|
||||||
|
particular item, but the full implications must be understood and
|
||||||
|
carefully weighed before choosing a different course.
|
||||||
|
|
||||||
|
4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean that
|
||||||
|
there may exist valid reasons in particular circumstances when the
|
||||||
|
particular behavior is acceptable or even useful, but the full
|
||||||
|
implications should be understood and the case carefully weighed
|
||||||
|
before implementing any behavior described with this label.
|
||||||
|
|
||||||
|
<span class="Verified-inline-styling" id="inline-5101">5. MAY This word, or the adjective "OPTIONAL", mean that an item is <button id="btn_5101" target="expand_5101" onclick="hideFunction("expand_5101")">Expand</button>
|
||||||
|
truly optional. One vendor may choose to include the item because a
|
||||||
|
particular marketplace requires it or because the vendor feels that
|
||||||
|
it enhances the product while another vendor may omit the same item.
|
||||||
|
An implementation which does not include a particular option MUST be
|
||||||
|
prepared to interoperate with another implementation which does
|
||||||
|
include the option, though perhaps with reduced functionality. In the
|
||||||
|
same vein an implementation which does include a particular option
|
||||||
|
MUST be prepared to interoperate with another implementation which
|
||||||
|
does not include the option (except, of course, for the feature the
|
||||||
|
option provides).</span>
|
||||||
|
<div class="nodeCloseClass" id="expand_5101"><div class="Verified-endnote-styling" id="eid5101">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid5101">EID 5101</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 5
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
5. MAY This word, or the adjective "OPTIONAL", mean that an item is
|
||||||
|
truly optional. One vendor may choose to include the item because a
|
||||||
|
particular marketplace requires it or because the vendor feels that
|
||||||
|
it enhances the product while another vendor may omit the same item.
|
||||||
|
An implementation which does not include a particular option MUST be
|
||||||
|
prepared to interoperate with another implementation which does
|
||||||
|
include the option, though perhaps with reduced functionality. In the
|
||||||
|
same vein an implementation which does include a particular option
|
||||||
|
MUST be prepared to interoperate with another implementation which
|
||||||
|
does not include the option (except, of course, for the feature the
|
||||||
|
option provides.)
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
5. MAY This word, or the adjective "OPTIONAL", mean that an item is
|
||||||
|
truly optional. One vendor may choose to include the item because a
|
||||||
|
particular marketplace requires it or because the vendor feels that
|
||||||
|
it enhances the product while another vendor may omit the same item.
|
||||||
|
An implementation which does not include a particular option MUST be
|
||||||
|
prepared to interoperate with another implementation which does
|
||||||
|
include the option, though perhaps with reduced functionality. In the
|
||||||
|
same vein an implementation which does include a particular option
|
||||||
|
MUST be prepared to interoperate with another implementation which
|
||||||
|
does not include the option (except, of course, for the feature the
|
||||||
|
option provides).
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
Full stop should appear outside the parentheses in the last sentence.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
6. Guidance in the use of these Imperatives
|
||||||
|
|
||||||
|
Imperatives of the type defined in this memo must be used with care
|
||||||
|
and sparingly. In particular, they MUST only be used where it is
|
||||||
|
actually required for interoperation or to limit behavior which has
|
||||||
|
potential for causing harm <span class="Verified-inline-styling" id="inline-494">(e.g., limiting retransmissions)</span> For <button id="btn_494" target="expand_494" onclick="hideFunction("expand_494")">Expand Multiple</button>
|
||||||
|
<div class="nodeCloseClass" id="expand_494"><div class="Verified-endnote-styling" id="eid494">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid494">EID 494</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 6
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
(e.g., limiting retransmisssions)
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
(e.g., limiting retransmissions)
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="Verified-endnote-styling" id="eid496">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid496">EID 496</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 6
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
In particular, they MUST only be used where it is actually required
|
||||||
|
for interoperation or to limit behavior which has potential for
|
||||||
|
causing harm (e.g., limiting retransmisssions) For example, they
|
||||||
|
must not be used to try to impose a particular method on
|
||||||
|
implementors where the method is not required for interoperability.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
In particular, they MUST only be used where it is actually required
|
||||||
|
for interoperation or to limit behavior which has potential for
|
||||||
|
causing harm (e.g., limiting retransmissions). For example, they
|
||||||
|
must not be used to try to impose a particular method on
|
||||||
|
implementors where the method is not required for interoperability.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div> example, they must not be used to try to impose a particular method
|
||||||
|
on implementors where the method is not required for
|
||||||
|
interoperability.
|
||||||
|
|
||||||
|
7. Security Considerations
|
||||||
|
|
||||||
|
These terms are frequently used to specify behavior with security
|
||||||
|
implications. The effects on security of not implementing a MUST or
|
||||||
|
SHOULD, or doing something the specification says MUST NOT or SHOULD
|
||||||
|
NOT be done may be very subtle. Document authors should take the time
|
||||||
|
to elaborate the security implications of not following
|
||||||
|
recommendations or requirements as most implementors will not have
|
||||||
|
had the benefit of the experience and discussion that produced the
|
||||||
|
specification.
|
||||||
|
|
||||||
|
8. Acknowledgments
|
||||||
|
|
||||||
|
The definitions of these terms are an amalgam of definitions taken
|
||||||
|
from a number of RFCs. In addition, suggestions have been
|
||||||
|
incorporated from a number of people including Robert Ullmann, Thomas
|
||||||
|
Narten, Neal McBurnett, and Robert Elz.
|
||||||
|
|
||||||
|
9. Author's Address
|
||||||
|
|
||||||
|
Scott Bradner
|
||||||
|
Harvard University
|
||||||
|
1350 Mass. Ave.
|
||||||
|
Cambridge, MA 02138
|
||||||
|
|
||||||
|
phone - +1 617 495 3864
|
||||||
|
|
||||||
|
email - sob@harvard.edu
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</pre></body></html>
|
||||||
312
website/rfc2119_sigabrt.html
Normal file
312
website/rfc2119_sigabrt.html
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<!-- saved from url=(0057)https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html -->
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head profile="http://dublincore.org/documents/2008/08/04/dc-html/"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
|
||||||
|
<meta name="robots" content="index,follow">
|
||||||
|
|
||||||
|
<link rel="icon" href="https://www.rfc-editor.org/rfc/inline-errata/css/images/rfc.png" type="image/png">
|
||||||
|
<link rel="shortcut icon" href="https://www.rfc-editor.org/rfc/inline-errata/css/images/rfc.png" type="image/png">
|
||||||
|
<title>rfc2119</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="./rfc2119_files/errata-base.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="./rfc2119_files/errata-color.css" title="Default: Basic Colors">
|
||||||
|
<link rel="alternative stylesheet" type="text/css" href="./rfc2119_files/errata-monochrome.css" title="Monochrome">
|
||||||
|
<link rel="alternative stylesheet" type="text/css" href="./rfc2119_files/errata-printer.css" title="Printer">
|
||||||
|
|
||||||
|
<script src="./rfc2119_files/errata.js.téléchargement"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="Verified-headnote-styling">
|
||||||
|
<span style="font-weight: bold;">This is a purely informative rendering of an RFC that includes verified errata. This rendering may not be used as a reference.</span>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
The following 'Verified' errata have been incorporated in this document:
|
||||||
|
<a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#eid493">EID 493</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_494">EID 494</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_495">EID 495</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_494">EID 496</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#eid498">EID 498</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_499">EID 499</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#eid500">EID 500</a>, <a href="https://www.rfc-editor.org/rfc/inline-errata/rfc2119.html#btn_5101">EID 5101</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<pre>Network Working Group S. Bradner
|
||||||
|
Request for Comments: 2119 Harvard University
|
||||||
|
BCP: 14 March 1997
|
||||||
|
Category: Best Current Practice
|
||||||
|
|
||||||
|
|
||||||
|
Key words for use in RFCs to Indicate Requirement Levels
|
||||||
|
|
||||||
|
Status of this Memo
|
||||||
|
|
||||||
|
This document specifies an Internet Best Current Practices for the
|
||||||
|
Internet Community, and requests discussion and suggestions for
|
||||||
|
improvements. Distribution of this memo is unlimited.
|
||||||
|
|
||||||
|
Abstract
|
||||||
|
|
||||||
|
In many standards track documents several words are used to signify
|
||||||
|
the requirements in the specification. These words are often
|
||||||
|
capitalized. This document defines these words as they should be
|
||||||
|
interpreted in IETF documents. Authors who follow these guidelines
|
||||||
|
should incorporate this phrase near the beginning of their document:
|
||||||
|
|
||||||
|
<span class="Verified-inline-styling" id="inline-499"> The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL <button id="btn_499" target="expand_499" onclick="hideFunction("expand_499")">Expand</button>
|
||||||
|
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
|
||||||
|
RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
|
||||||
|
be interpreted as described in RFC 2119.</span>
|
||||||
|
<div class="nodeCloseClass" id="expand_499"><div class="Verified-endnote-styling" id="eid499">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid499">EID 499</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> Abstract
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
|
||||||
|
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and
|
||||||
|
"OPTIONAL" in this document are to be interpreted as described in
|
||||||
|
RFC 2119.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
|
||||||
|
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
|
||||||
|
RECOMMENDED", "MAY", and "OPTIONAL" in this document are to
|
||||||
|
be interpreted as described in RFC 2119.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
The phrase "NOT RECOMMENDED" is missing from this sentence.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
Note that the force of these words is modified by the requirement
|
||||||
|
level of the document in which they are used.
|
||||||
|
|
||||||
|
<span class="Verified-inline-styling" id="inline-495">1. MUST This word, or the terms "REQUIRED" or "SHALL", means that the <button id="btn_495" target="expand_495" onclick="hideFunction("expand_495")">Expand</button>
|
||||||
|
definition is an absolute requirement of the specification.
|
||||||
|
<div class="Verified-endnote-styling" id="eid493">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid493">EID 493</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
|
||||||
|
definition is an absolute prohibition of the specification.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
2. MUST NOT This phrase, or the phrase "SHALL NOT", means that the
|
||||||
|
definition is an absolute prohibition of the specification.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="Verified-endnote-styling" id="eid498">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid498">EID 498</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean that
|
||||||
|
there may exist valid reasons in particular circumstances when the
|
||||||
|
particular behavior is acceptable or even useful, but the full
|
||||||
|
implications should be understood and the case carefully weighed
|
||||||
|
before implementing any behavior described with this label.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED", means that
|
||||||
|
there may exist valid reasons in particular circumstances when the
|
||||||
|
particular behavior is acceptable or even useful, but the full
|
||||||
|
implications should be understood and the case carefully weighed
|
||||||
|
before implementing any behavior described with this label.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="Verified-endnote-styling" id="eid500">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid500">EID 500</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
|
||||||
|
may exist valid reasons in particular circumstances to ignore a
|
||||||
|
particular item, but the full implications must be understood and
|
||||||
|
carefully weighed before choosing a different course.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
3. SHOULD This word, or the adjective "RECOMMENDED", means that there
|
||||||
|
may exist valid reasons in particular circumstances to ignore a
|
||||||
|
particular item, but the full implications must be understood and
|
||||||
|
carefully weighed before choosing a different course.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
<div class="nodeCloseClass" id="expand_495"><div class="Verified-endnote-styling" id="eid495">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid495">EID 495</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 1
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the
|
||||||
|
definition is an absolute requirement of the specification.
|
||||||
|
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
1. MUST This word, or the terms "REQUIRED" or "SHALL", means that the
|
||||||
|
definition is an absolute requirement of the specification.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
|
||||||
|
definition is an absolute prohibition of the specification.
|
||||||
|
|
||||||
|
3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
|
||||||
|
may exist valid reasons in particular circumstances to ignore a
|
||||||
|
particular item, but the full implications must be understood and
|
||||||
|
carefully weighed before choosing a different course.
|
||||||
|
|
||||||
|
4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean that
|
||||||
|
there may exist valid reasons in particular circumstances when the
|
||||||
|
particular behavior is acceptable or even useful, but the full
|
||||||
|
implications should be understood and the case carefully weighed
|
||||||
|
before implementing any behavior described with this label.
|
||||||
|
|
||||||
|
<span class="Verified-inline-styling" id="inline-5101">5. MAY This word, or the adjective "OPTIONAL", mean that an item is <button id="btn_5101" target="expand_5101" onclick="hideFunction("expand_5101")">Expand</button>
|
||||||
|
truly optional. One vendor may choose to include the item because a
|
||||||
|
particular marketplace requires it or because the vendor feels that
|
||||||
|
it enhances the product while another vendor may omit the same item.
|
||||||
|
An implementation which does not include a particular option MUST be
|
||||||
|
prepared to interoperate with another implementation which does
|
||||||
|
include the option, though perhaps with reduced functionality. In the
|
||||||
|
same vein an implementation which does include a particular option
|
||||||
|
MUST be prepared to interoperate with another implementation which
|
||||||
|
does not include the option (except, of course, for the feature the
|
||||||
|
option provides).</span>
|
||||||
|
<div class="nodeCloseClass" id="expand_5101"><div class="Verified-endnote-styling" id="eid5101">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid5101">EID 5101</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 5
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
5. MAY This word, or the adjective "OPTIONAL", mean that an item is
|
||||||
|
truly optional. One vendor may choose to include the item because a
|
||||||
|
particular marketplace requires it or because the vendor feels that
|
||||||
|
it enhances the product while another vendor may omit the same item.
|
||||||
|
An implementation which does not include a particular option MUST be
|
||||||
|
prepared to interoperate with another implementation which does
|
||||||
|
include the option, though perhaps with reduced functionality. In the
|
||||||
|
same vein an implementation which does include a particular option
|
||||||
|
MUST be prepared to interoperate with another implementation which
|
||||||
|
does not include the option (except, of course, for the feature the
|
||||||
|
option provides.)
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
5. MAY This word, or the adjective "OPTIONAL", mean that an item is
|
||||||
|
truly optional. One vendor may choose to include the item because a
|
||||||
|
particular marketplace requires it or because the vendor feels that
|
||||||
|
it enhances the product while another vendor may omit the same item.
|
||||||
|
An implementation which does not include a particular option MUST be
|
||||||
|
prepared to interoperate with another implementation which does
|
||||||
|
include the option, though perhaps with reduced functionality. In the
|
||||||
|
same vein an implementation which does include a particular option
|
||||||
|
MUST be prepared to interoperate with another implementation which
|
||||||
|
does not include the option (except, of course, for the feature the
|
||||||
|
option provides).
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
Full stop should appear outside the parentheses in the last sentence.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
6. Guidance in the use of these Imperatives
|
||||||
|
|
||||||
|
Imperatives of the type defined in this memo must be used with care
|
||||||
|
and sparingly. In particular, they MUST only be used where it is
|
||||||
|
actually required for interoperation or to limit behavior which has
|
||||||
|
potential for causing harm <span class="Verified-inline-styling" id="inline-494">(e.g., limiting retransmissions)</span> For <button id="btn_494" target="expand_494" onclick="hideFunction("expand_494")">Expand Multiple</button>
|
||||||
|
<div class="nodeCloseClass" id="expand_494"><div class="Verified-endnote-styling" id="eid494">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid494">EID 494</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 6
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
(e.g., limiting retransmisssions)
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
(e.g., limiting retransmissions)
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="Verified-endnote-styling" id="eid496">
|
||||||
|
<pre><b><i><a href="https://www.rfc-editor.org/errata/eid496">EID 496</a> (Verified) is as follows:</i></b>
|
||||||
|
|
||||||
|
<b>Section:</b> 6
|
||||||
|
|
||||||
|
<b>Original Text:</b>
|
||||||
|
|
||||||
|
In particular, they MUST only be used where it is actually required
|
||||||
|
for interoperation or to limit behavior which has potential for
|
||||||
|
causing harm (e.g., limiting retransmisssions) For example, they
|
||||||
|
must not be used to try to impose a particular method on
|
||||||
|
implementors where the method is not required for interoperability.
|
||||||
|
|
||||||
|
<b>Corrected Text:</b>
|
||||||
|
|
||||||
|
In particular, they MUST only be used where it is actually required
|
||||||
|
for interoperation or to limit behavior which has potential for
|
||||||
|
causing harm (e.g., limiting retransmissions). For example, they
|
||||||
|
must not be used to try to impose a particular method on
|
||||||
|
implementors where the method is not required for interoperability.
|
||||||
|
</pre>
|
||||||
|
<b>Notes:</b><br>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div> example, they must not be used to try to impose a particular method
|
||||||
|
on implementors where the method is not required for
|
||||||
|
interoperability.
|
||||||
|
|
||||||
|
7. Security Considerations
|
||||||
|
|
||||||
|
These terms are frequently used to specify behavior with security
|
||||||
|
implications. The effects on security of not implementing a MUST or
|
||||||
|
SHOULD, or doing something the specification says MUST NOT or SHOULD
|
||||||
|
NOT be done may be very subtle. Document authors should take the time
|
||||||
|
to elaborate the security implications of not following
|
||||||
|
recommendations or requirements as most implementors will not have
|
||||||
|
had the benefit of the experience and discussion that produced the
|
||||||
|
specification.
|
||||||
|
|
||||||
|
8. Acknowledgments
|
||||||
|
|
||||||
|
The definitions of these terms are an amalgam of definitions taken
|
||||||
|
from a number of RFCs. In addition, suggestions have been
|
||||||
|
incorporated from a number of people including Robert Ullmann, Thomas
|
||||||
|
Narten, Neal McBurnett, and Robert Elz.
|
||||||
|
|
||||||
|
9. Author's Address
|
||||||
|
|
||||||
|
Scott Bradner
|
||||||
|
Harvard University
|
||||||
|
1350 Mass. Ave.
|
||||||
|
Cambridge, MA 02138
|
||||||
|
|
||||||
|
phone - +1 617 495 3864
|
||||||
|
|
||||||
|
email - sob@harvard.edu
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</pre></body></html>
|
||||||
Reference in New Issue
Block a user