mirror of https://github.com/01-edu/public.git
Browse Source
due to git wrong pull/merge previous commits have been lost. commit messages relevant to this project are transcripted here as reference: commitpull/1533/head05f8f75d05
Author: mikysett <mikysett@gmail.com> Date: Mon Sep 26 16:53:53 2022 +0100 feat(localhost): complete subject and audit audit completely refactored and improved (more clear, more questions, irrelevant question removed, bonuses updated) small improvements on the subject commitfd3a2a00ae
Author: mikysett <mikysett@gmail.com> Date: Thu Sep 22 17:45:38 2022 +0100 feat(localhost): change bonuses php file with mysql is redundant (a CGI must already be implemented). to suggest rewriting it with a different language looks like a nice challenge, maybe a bit big for a bonus commit6b6f2b9fb2
Author: mikysett <mikysett@gmail.com> Date: Thu Sep 22 17:41:32 2022 +0100 feat(localhost): add details for CGI and config file commit9506a2b8bb
Author: mikysett <mikysett@gmail.com> Date: Thu Sep 22 16:39:31 2022 +0100 refactor(localhost): improve first paragraph style commit0c4e6300ee
Author: mikysett <mikysett@gmail.com> Date: Thu Sep 22 16:35:36 2022 +0100 feat(localhost): add clarity for I/O multiplexing commitde46cebb8b
Author: mikysett <mikysett@gmail.com> Date: Thu Sep 22 16:14:31 2022 +0100 fix(localhost): remove error code 311 and add 500 error 311 doesn't exist. error 500 seems relevant and should be implemented by students. commita82f254a9a
Author: Michele Sessa <mikysett@gmail.com> Date: Wed Sep 21 18:37:36 2022 +0100 refactor(localhost): change subject structure overall structure modified to have more modulary and clarity. this is still a work in progress and far to be complete. at the moment few parts were removed/replaced, focus being in reorganizing what already exists. future commits should focus on adding restrictions/information for clarity and to better define the work to be done by the student. commit2244f72d45
Author: Zainab Dnaya <diyanazizo13@gmail.com> Date: Wed Sep 21 13:19:48 2022 +0100 docs(audit/localhost) : Fix Many po commit3e7946086a
Author: Zainab Dnaya <diyanazizo13@gmail.com> Date: Tue Sep 20 22:02:17 2022 +0100 Update README.md commit7b2b9865ed
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Wed Jul 27 11:25:41 2022 +0100 feat: subject commit6b198c4a85
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Wed Jul 27 09:57:00 2022 +0100 feat: subject commit856819bfe0
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 20:03:38 2022 +0100 Update README.md commit336e6a5dfb
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 20:02:10 2022 +0100 Update README.md commit812f0c9a21
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 20:00:18 2022 +0100 add condition in bonus part commit88cea7e245
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 19:58:48 2022 +0100 Update README.md commitea50617445
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 19:57:24 2022 +0100 Add bonus part commit5799df1bd9
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Mon Jul 25 18:56:40 2022 +0100 feat: Update the audit commitebefd1dd87
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Mon Jul 25 18:17:46 2022 +0100 feat: Update the audir commit5824b1e835
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Fri Jul 22 15:58:57 2022 +0100 Update README.md commit2af3808b9a
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Fri Jul 22 15:40:40 2022 +0100 add condition of http code and redirections commit0b4d914093
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Mon Jul 25 11:12:19 2022 +0100 Localhost Subject commite67bc965ed
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Thu Jul 21 12:51:02 2022 +0100 add cgi condition commit5ff06919be
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Thu Jul 21 12:43:21 2022 +0100 Update README.md commit20dd21f24d
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Thu Jul 21 12:27:30 2022 +0100 add hints && add conditions commit456e875a2e
Author: hamza <hamzaelkhatri@gmail.com> Date: Wed Jul 20 11:57:00 2022 +0100 fix the name commit51ff541d7e
Author: hamza <hamzaelkhatri@gmail.com> Date: Wed Jul 20 11:56:28 2022 +0100 add subject for localhost commit71aec7298b
Author: Michele Sessa <mikysett@gmail.com> Date: Wed Sep 21 18:37:36 2022 +0100 refactor(localhost): change subject structure overall structure modified to have more modulary and clarity. this is still a work in progress and far to be complete. at the moment few parts were removed/replaced, focus being in reorganizing what already exists. future commits should focus on adding restrictions/information for clarity and to better define the work to be done by the student. commitd914a302ce
Author: Zainab Dnaya <diyanazizo13@gmail.com> Date: Wed Sep 21 13:19:48 2022 +0100 docs(audit/localhost) : Fix Many po commit2ddf32ff5c
Author: Zainab Dnaya <diyanazizo13@gmail.com> Date: Tue Sep 20 22:02:17 2022 +0100 Update README.md commit6f6b410fbf
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Wed Jul 27 11:25:41 2022 +0100 feat: subject commit789f9496f9
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Wed Jul 27 09:57:00 2022 +0100 feat: subject commit8aba27a2ff
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 20:03:38 2022 +0100 Update README.md commit31def6fdb2
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 20:02:10 2022 +0100 Update README.md commit7b104f5e7e
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 20:00:18 2022 +0100 add condition in bonus part commit1856eaa5b0
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 19:58:48 2022 +0100 Update README.md commit3d5c2807bd
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Tue Jul 26 19:57:24 2022 +0100 Add bonus part commit3c3f1663a7
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Mon Jul 25 18:56:40 2022 +0100 feat: Update the audit commitc1818288c8
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Mon Jul 25 18:17:46 2022 +0100 feat: Update the audir commit1f79b2261f
Author: zainabdnaya <diyanazizo13@gmail.com> Date: Mon Jul 25 11:12:19 2022 +0100 Localhost Subject commit6f3c37ef1a
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Fri Jul 22 15:58:57 2022 +0100 Update README.md commit47628970b2
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Fri Jul 22 15:40:40 2022 +0100 add condition of http code and redirections commit234e09311e
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Thu Jul 21 12:51:02 2022 +0100 add cgi condition commita41ec15a3a
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Thu Jul 21 12:43:21 2022 +0100 Update README.md commit37d29e27cf
Author: Hamza elkhatri <40549481+Hamzaelkhatri@users.noreply.github.com> Date: Thu Jul 21 12:27:30 2022 +0100 add hints && add conditions commit3ab59cd27e
Author: hamza <hamzaelkhatri@gmail.com> Date: Wed Jul 20 11:57:00 2022 +0100 fix the name commitcb9e085945
Author: hamza <hamzaelkhatri@gmail.com> Date: Wed Jul 20 11:56:28 2022 +0100 add subject for localhost
mikysett
2 years ago
committed by
Michele
2 changed files with 141 additions and 0 deletions
@ -0,0 +1,76 @@ |
|||||||
|
## Localhost |
||||||
|
|
||||||
|
Finally you are going to understand how internet works from the server side. The Hypertext Transfer Protocol was created in order to ensure a reliable way to communicate on a request/response base. |
||||||
|
|
||||||
|
This protocol is used by servers and clients (usually browsers) to serve content and it is the backbone of the World Wide Web, still it is also used in many other cases that are far beyond the scope of this exercise. |
||||||
|
|
||||||
|
Here you will learn the basics of the protocol and a good place to start could be the [HTTP/1.1 RFC](https://www.rfc-editor.org/rfc/rfc9112.html). |
||||||
|
|
||||||
|
|
||||||
|
### Instructions |
||||||
|
|
||||||
|
- The project can be written in one of these languages [`Rust`, `C++`, `C`]. |
||||||
|
|
||||||
|
#### The Server |
||||||
|
|
||||||
|
- Your server should **never** crash. |
||||||
|
- All requests should timeout if they are taking too long. |
||||||
|
- Your server should be able to listen on multiple ports and instantiate multiple servers at the same time. |
||||||
|
- You must use only one process and one thread. |
||||||
|
- Your server must receive a request from the browser/client and send a response using the `HTTP` header and body. |
||||||
|
- Your server should be compatible with `HTTP/1.1` protocol. |
||||||
|
- You can compare your results with `NGINX` which will be used as the reference. |
||||||
|
- Your server should be compatible with the last version of your chosen browser. |
||||||
|
- Your server should manage at least [`GET`, `POST`, `DELETE`] methods. |
||||||
|
- Your server should be able to receive file uploads made by the client. |
||||||
|
- Your server should handle cookies and sessions. |
||||||
|
- You should create default error pages for at least the following error codes [400,403,404,405,413,500]. |
||||||
|
- Your server should call `select` function (or `poll` or equivalent) only once for each client/server communication. |
||||||
|
- All reads and writes should pass by `select` or equivalent API. |
||||||
|
- All I/O operations should be non-blocking. |
||||||
|
- You should manage chunked and unchunked requests. |
||||||
|
- You should set the right status for each response. |
||||||
|
|
||||||
|
#### The CGI |
||||||
|
- Based on the file extension the server will execute the corresponding `CGI` (for example `.php` or `.py`). |
||||||
|
- You need to implement only one `CGI` of your choice. |
||||||
|
- You are allowed to fork a new process to run the `CGI`. |
||||||
|
- `CGI` expects the file to process as first argument and `EOF` as end of the body. |
||||||
|
- Pay attention to the directory where the `CGI` will run for correct relative paths handling. |
||||||
|
- The `CGI` will check `PATH_INFO` environment variable to define the full path. |
||||||
|
|
||||||
|
#### Configuration File |
||||||
|
|
||||||
|
In the file you should be able to specify the following: |
||||||
|
|
||||||
|
- The host (server_address) and one or multiple ports for each server. |
||||||
|
- The first server for a host:port will be the default if the "server_name" didn't match any other server. |
||||||
|
- Path to custom error pages. |
||||||
|
- Limit client body size for uploads. |
||||||
|
- Setup routes with one or multiple of the following settings: |
||||||
|
- Define a list of accepted HTTP methods for the route. |
||||||
|
- Define HTTP redirections. |
||||||
|
- Define a directory or a file from where the file should be searched (for example, if `/test` is rooted to `/usr/Desktop`, the URL `/test/my_page.html` will route to `/usr/Desktop/my_page.html`). |
||||||
|
- Define a default file for the route if the URL is a directory. |
||||||
|
- Specify a `CGI` to use for a certain file extension. |
||||||
|
- Turn on or off directory listing. |
||||||
|
- Set a default file to answer if the request is a directory. |
||||||
|
- No need to manage comments "(#)". |
||||||
|
|
||||||
|
> Routes won't need to support regular expressions. |
||||||
|
|
||||||
|
> There is no need to pass through `poll` when reading the configuration file. |
||||||
|
|
||||||
|
#### Testing your server |
||||||
|
- Do stress tests (for example with `siege -b [IP]:[PORT]`), it must stay available at all costs (availability should be up to 99.5). |
||||||
|
- Create tests for as many cases as you can (redirections, bad configuration files, static and dynamic pages, default error pages and so on). |
||||||
|
- You will be requested to provide and explain your tests during the audits. |
||||||
|
- You can use the language you prefer to write tests, as long as they are exhaustive and the auditor can check their behavior. |
||||||
|
- Test possible memory leaks before to submit the project. |
||||||
|
- Once again, the server should never crash and never leak memory. |
||||||
|
|
||||||
|
### Bonus |
||||||
|
- Handle at least one more `CGI`. |
||||||
|
- Write the project in two different programming languages. |
||||||
|
|
||||||
|
> If the two languages are C and C++ the provided solution for C++ should heavily rely on C++ specific features. |
@ -0,0 +1,65 @@ |
|||||||
|
#### Functional |
||||||
|
|
||||||
|
#### Localhost is about creating your own HTTP server and test it with an actual browser. |
||||||
|
#### Take the necessary time to understand the project and to test it, looking into the source code will help a lot. |
||||||
|
|
||||||
|
### Basic server mechanics |
||||||
|
|
||||||
|
#### The student should be able to justify his choices and explain the following: |
||||||
|
###### How does an HTTP server works? |
||||||
|
###### Which function was used for I/O Multiplexing and how does it works? |
||||||
|
###### Is the server using only one select (or equivalent) to read the client requests and write answers? |
||||||
|
###### Why is it important to use only one select and how was it achieved? |
||||||
|
###### Read the code that goes from the select (or equivalent) to the read and write of a client, is there only one read or write per client per select (or equivalent)? |
||||||
|
###### Are the return values for I/O functions [read,recv,write,send] checked properly? (checking only -1 or 0 is not enough, both should be checked). |
||||||
|
###### If an error is returned by the previous functions on a socket, is the client removed? |
||||||
|
###### Is writing and reading ALWAYS done through a select (or equivalent)? |
||||||
|
|
||||||
|
### Configuration file |
||||||
|
|
||||||
|
#### Check the configuration file and ensure the following configs are working: |
||||||
|
##### Setup a single server with a single port. |
||||||
|
##### Setup multiple servers with different port. |
||||||
|
##### Setup multiple servers with different hostnames (for example: curl --resolve test.com:80:127.0.0.1 http://test.com/). |
||||||
|
##### Setup custom error pages. |
||||||
|
##### Limit the client body (for example: curl -X POST -H "Content-Type: plain/text" --data "BODY with something shorter or longer than body limit"). |
||||||
|
##### Setup routes and ensure they are taken into account. |
||||||
|
##### Setup a default file in case the path is a directory. |
||||||
|
##### Setup a list of accepted methods for a route (for example: try to DELETE something with and without permission). |
||||||
|
|
||||||
|
### Methods and cookies |
||||||
|
|
||||||
|
#### For each method be sure to check the status code (200, 404 etc): |
||||||
|
###### Are the GET requests working properly? |
||||||
|
###### Are the POST requests working properly? |
||||||
|
###### Are the DELETE requests working properly? |
||||||
|
###### Test a WRONG request, is the server still working properly? |
||||||
|
###### Upload some files to the server and get them back to test they were not corrupted. |
||||||
|
###### A working session and cookies system is present on the server? |
||||||
|
|
||||||
|
### Interaction with the browser |
||||||
|
|
||||||
|
#### Open the browser used by the team during tests and its developer tools panel to help you with tests. |
||||||
|
###### Is te browser connecting with the server with no issues? |
||||||
|
###### Are the request and response headers correct? (It should serve a full static website without any problem). |
||||||
|
###### Try a wrong URL on the server, is it handled properly? |
||||||
|
###### Try to list a directory, is it handled properly? |
||||||
|
###### Try a redirected URL, is it handled properly? |
||||||
|
###### Check the implemented CGI, does it works properly with chunked and unchunked data? |
||||||
|
|
||||||
|
### Port issues |
||||||
|
|
||||||
|
###### Configure multiple ports and websites and ensure it is working as expected. |
||||||
|
###### Configure the same port multiple times. The server should find the error. |
||||||
|
###### Configure multiple servers at the same time with different configurations but with common ports. Ask why the server should work if one of the configurations isn't working. |
||||||
|
|
||||||
|
### Siege & stress test |
||||||
|
|
||||||
|
##### Use siege with a GET method on an empty page, availability should be at least 99.5% with the command `siege -b [IP]:[PORT]`. |
||||||
|
##### Check if there is no memory leak (you could use some tools like top). |
||||||
|
##### Check if there is no hanging connection. |
||||||
|
|
||||||
|
### Bonus Part |
||||||
|
|
||||||
|
##### +There's more than one CGI system such as [Python,C++,Perl]. |
||||||
|
##### +There is a second implementation of the server in a different language (repeat practical tests on it before to validate). |
Loading…
Reference in new issue