- c++ compiler
- clang-format for style syntax
- valgrind for check memory leaks
- python3 for tests of integration
- module requests (pip install requests)
42sp-webserv's Introduction
42sp-webserv's People
42sp-webserv's Issues
Make the route able to accept uploaded files and configure where they should be saved.
Support cookies and session management (prepare quick examples).
You don’t need to use poll() (or equivalent) before reading your configuration file
Prototipar os testes funcionais com Python
Unificar pasta dos arquivos públicos
Atualmente temos a pasta pages
, files
e public
que acredito que podem ser unificadas apenas na pasta public
Define a directory or a file from where the file should be searched (for example, if url /kapouet is rooted to /tmp/www, url /kapouet/pouic/toto/pouet is /tmp/www/pouic/toto/pouet).
Abstrair a resposta para ficar em uma estrutura mais bonita
Set a default file to answer if the request is a directory.
EPOLL details
- • 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.
Initial EPOLL setup
Just remember that, for chunked request, your server needs to unchunk it, the CGI will expect EOF as end of the body.
You need at least GET, POST, and DELETE methods.
Setup the server_names or not.
Define a HTTP redirection.
Subject
Subject.pdf
Mandadory Part
Program name | webserv |
---|---|
Turn in files | Makefile, *.{h, hpp}, *.cpp, *.tpp, *.ipp, configuration files |
Makefile | NAME, all, clean, fclean, re |
Arguments | [A configuration file] |
External functs. | Everything in C++ 98. execve, dup, dup2, pipe, strerror, gai_strerror, errno, dup, dup2, fork, htons, htonl, ntohs, ntohl, select, poll, epoll (epoll_create, epoll_ctl, epoll_wait), kqueue (kqueue, kevent), socket, accept, listen, send, recv, bind, connect, getaddrinfo, freeaddrinfo, setsockopt, getsockname, getprotobyname, fcntl, close, read, write, waitpid, kill, signal, access, stat, opendir, readdir and closedir. |
Libft authorized | n/a |
Description | A HTTP server in C++ 98 |
You must write a HTTP server in C++ 98. Your executable will be run as follows:
./webserv [configuration file]
General rules
- Your program should not crash in any circumstances (even when it runs out ofmemory), and should not quit unexpectedly.If it happens, your project will be considered non-functional and your grade will be0.
- You have to turn in a Makefile which will compile your source files. It must notrelink.
- Your Makefile must at least contain the rules:$(NAME), all, clean, fclean and re.
- Compile your code with c++ and the flags -Wall -Wextra -Werror
- Your code must comply with the C++ 98 standard. Then, it should still compileif you add the flag -std=c++98.
- Try to always develop using the most C++ features you can (for example, choose over <string.h>). You are allowed to use C functions, but always prefertheir C++ versions if possible.
- Any external library and Boost libraries are forbidden.
Requirements
- 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/Ooperations 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() (orequivalent).
- Checking the value of errno is strictly forbidden after a read or a write operation.
- #53
- 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.
- #54
- Stress tests your server. It must stay available at all cost.
- Your server must be able to listen to multiple ports (see Configuration file).
Configuration file
In the configuration file, you should be able to:
- Choose the port and host of each ’server’.
- #48
- 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).
- Setup default error pages.
- Limit client body size.
- Setup routes with one or multiple of the following rules/configuration (routes wont be using regexp):
- Define a list of accepted HTTP methods for the route.
- #58
- #49
- Turn on or off directory listing.
- #50
- Execute CGI based on certain file extension (for example .php).
- Make it work with POST and GET methods.
- #51
- Do you wonder what a CGI is?
- Because you won’t call the CGI directly, use the full path as PATH_INFO.
- #52
- 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).
- You must provide some configuration files and default basic files to test and demonstrate every feature works during evaluation
Bonus part
Here are the extra features you can add:
- #61
- Handle multiple CGI.
Even if poll() is mentionned in the subject and the evaluation scale, you can use any equivalent such as select(), kqueue(), or epoll().
Please read the RFC and do some tests with telnet and NGINX before starting this project. Even if you don’t have to implement all the RFC, reading it will help you develop the required features.
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 get some inspiration from the ’server’ part of NGINX configuration file.
If you’ve got a question about one behavior, you should compare your program behavior with NGINX’s. For example, check how does server_name work. We’ve shared with you a small tester. It’s not mandatory to pass it if everything works fine with your browser and tests, but it can help you hunt some bugs.
The important thing is resilience. 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.
The bonus part will only be assessed if the mandatory part is PERFECT. Perfect means the mandatory part has been integrally done and works without malfunctioning. If you have not passed ALL the mandatory requirements, your bonus part will not be evaluated at all.
non-blocking I/O operations
Estudar as funções disponíveis
Conectar os arquivos soltos com o servidor principal
Your executable will be run as follows: ./webserv [configuration file]
Use send() instead of write()
Line 96 in 711c56f
Mentioned on Beej guide that send() is better:
https://beej.us/guide/bgnet/html/split/what-is-a-socket.html#what-is-a-socket
Parser das requests do client
[BONUS] Support cookies and session management (prepare quick examples).
Definir a versão padrão do clang-format
Estamos tendo algumas inconsistências de formatação e pelo que percebi isso vem do fato de estarmos usando diferentes versões do clang-format
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.