diff --git a/README.md b/README.md index 03e292a..73c16ab 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ +--- ## for correction +--- ## man - **htons, htonl, ntohs, ntohl :** converts the unsigned short or integer argument between host byte order and network byte order @@ -18,36 +20,12 @@ - **getsockname :** returns the current address to which a socket fd is bound - **fcntl :** manipulate an open fd, by performing some actions, like duplicate it or changing its flags +--- ## todo - [ ] read the RFC and do some tests with telnet and NGINX +#### parsing config - [ ] Your program has to take a configuration file as argument, or use a default path. -- [ ] You can’t execve another web server. -- [ ] Your server must never block and the client can be bounced properly if necessary. -- [ ] It must be non-blocking and use only 1 poll() (or equivalent) for all the I/O operations between the client and the server (listen included). -- [ ] poll() (or equivalent) must check read and write at the same time. -- [ ] You must never do a read or a write operation without going through poll() (or equivalent). -- [ ] Checking the value of errno is strictly forbidden after a read or a write operation. -- [ ] You don’t need to use poll() (or equivalent) before reading your configuration file. Because you have to use non-blocking file descriptors, it is possible to use read/recv or write/send functions with no poll() (or equivalent), and your server wouldn’t be blocking. But it would consume more system resources. Thus, if you try to read/recv or write/send in any file descriptor without using poll() (or equivalent), your grade will be 0. -- [ ] You can use every macro and define like FD_SET, FD_CLR, FD_ISSET, FD_ZERO (understanding what and how they do it is very useful). -- [ ] A request to your server should never hang forever. -- [ ] Your server must be compatible with the web browser of your choice. -- [ ] We will consider that NGINX is HTTP 1.1 compliant and may be used to compare headers and answer behaviors. -- [ ] Your HTTP response status codes must be accurate. -- [ ] You server must have default error pages if none are provided. -- [ ] You can’t use fork for something else than CGI (like PHP, or Python, and so forth). -- [ ] You must be able to serve a fully static website. -- [ ] Clients must be able to upload files. -- [ ] You need at least GET, POST, and DELETE methods. -- [ ] Stress tests your server. It must stay available at all cost. -- [ ] Your server must be able to listen to multiple ports (see Configuration file) -- [ ] Your server should never die. -- [ ] Do not test with only one program. -- [ ] Write your tests with a more convenient language such as Python or Golang, and so forth. Even in C or C++ if you want to -- [ ] You must provide some configuration files and default basic files to test and demonstrate every feature works during evaluation. - -### In the configuration file, you should be able to: - - [ ] Choose the port and host of each ’server’. - [ ] Setup the server_names or not. - [ ] The first server for a host:port will be the default for this host:port (that means it will answer to all the requests that don’t belong to an other server). @@ -61,14 +39,45 @@ - [ ] Set a default file to answer if the request is a directory. - [ ] Execute CGI based on certain file extension (for example .php). - [ ] Make the route able to accept uploaded files and configure where they should be saved. - - [ ] Do you wonder what a CGI is? - - [ ] Because you won’t call the CGI directly, use the full path as PATH_INFO. - - [ ] Just remember that, for chunked request, your server needs to unchunked it and the CGI will expect EOF as end of the body. - - [ ] Same things for the output of the CGI. If no content_length is returned from the CGI, EOF will mark the end of the returned data. - - [ ] Your program should call the CGI with the file requested as first argument. - - [ ] The CGI should be run in the correct directory for relative path file access. - - [ ] Your server should work with one CGI (php-CGI, Python, and so forth). +#### connection basic +- [ ] You can’t execve another web server. +- [ ] Your server must never block and the client can be bounced properly if necessary. +- [ ] It must be non-blocking and use only 1 poll() (or equivalent) for all the I/O operations between the client and the server (listen included). +- [ ] poll() (or equivalent) must check read and write at the same time. +- [ ] You must never do a read or a write operation without going through poll() (or equivalent). +- [ ] Checking the value of errno is strictly forbidden after a read or a write operation. +- [ ] You don’t need to use poll() (or equivalent) before reading your configuration file. Because you have to use non-blocking file descriptors, it is possible to use read/recv or write/send functions with no poll() (or equivalent), and your server wouldn’t be blocking. But it would consume more system resources. Thus, if you try to read/recv or write/send in any file descriptor without using poll() (or equivalent), your grade will be 0. +- [ ] You can use every macro and define like FD_SET, FD_CLR, FD_ISSET, FD_ZERO (understanding what and how they do it is very useful). +- [ ] A request to your server should never hang forever. +- [ ] Your server must be compatible with the web browser of your choice. +#### parsing request HTTP (fields, ...) +- [ ] We will consider that NGINX is HTTP 1.1 compliant and may be used to compare headers and answer behaviors. +#### response HTTP (fields, ...) +- [ ] Your HTTP response status codes must be accurate. +- [ ] You server must have default error pages if none are provided. +- [ ] You can’t use fork for something else than CGI (like PHP, or Python, and so forth). +- [ ] You must be able to serve a fully static website. +#### upload files +- [ ] Clients must be able to upload files. +#### CGI +- [ ] You need at least GET, POST, and DELETE methods. +- [ ] Do you wonder what a CGI is? +- [ ] Because you won’t call the CGI directly, use the full path as PATH_INFO. +- [ ] Just remember that, for chunked request, your server needs to unchunked it and the CGI will expect EOF as end of the body. +- [ ] Same things for the output of the CGI. If no content_length is returned from the CGI, EOF will mark the end of the returned data. +- [ ] Your program should call the CGI with the file requested as first argument. +- [ ] The CGI should be run in the correct directory for relative path file access. +- [ ] Your server should work with one CGI (php-CGI, Python, and so forth). +#### write tests +- [ ] Stress tests your server. It must stay available at all cost. +- [ ] Do not test with only one program. +- [ ] Write your tests with a more convenient language such as Python or Golang, and so forth. Even in C or C++ if you want to +#### persistent connexion +- [ ] Your server must be able to listen to multiple ports (see Configuration file) +- [ ] Your server should never die. + +--- ## ressources - [create an http server](https://medium.com/from-the-scratch/http-server-what-do-you-need-to-know-to-build-a-simple-http-server-from-scratch-d1ef8945e4fa) @@ -76,7 +85,9 @@ - [same, translated in french](http://vidalc.chez.com/lf/socket.html) - [bind() vs connect()](https://stackoverflow.com/questions/27014955/socket-connect-vs-bind) - [INADDR_ANY for bind](https://stackoverflow.com/questions/16508685/understanding-inaddr-any-for-socket-programming) +- [hack with CGI](https://www.youtube.com/watch?v=ph6-AKByBU4) +--- ## code architecture diff --git a/srcs_hugo/hugo_Webserv.cpp b/srcs_hugo/hugo_Webserv.cpp index 87e1434..25dcbc8 100644 --- a/srcs_hugo/hugo_Webserv.cpp +++ b/srcs_hugo/hugo_Webserv.cpp @@ -122,6 +122,7 @@ void Webserv::_connect_socket(int i, int bufsize) printf(" %d bytes received\n", len); ret = send(_fds[i].fd, &buffer[0], len, 0); + printf(" send\n"); if (ret < 0) { ::perror(" send() failed");