mirror of https://github.com/01-edu/public.git
hamza
2 years ago
1 changed files with 150 additions and 0 deletions
@ -0,0 +1,150 @@
|
||||
## H-server |
||||
|
||||
The Hypertext Transfer Protocol (HTTP) is an application layer protocol in the Internet protocol suite model for distributed, collaborative, hypermedia information systems. |
||||
HTTP is the foundation of data communication for the World Wide Web. Hypertext documents include hyperlinks to other resources that the user can easily access, for example, by a mouse click or tap on the screen in a web browser. |
||||
|
||||
### Instructions |
||||
|
||||
#### Server Part |
||||
|
||||
The Client can be written in one of these languages [Go,C++,C...] |
||||
|
||||
```console |
||||
$ ./localhost [CONFIG FILE] |
||||
Server is Runing in http://[IP]:[PORT] |
||||
``` |
||||
- Your server must not crash for any reason. |
||||
- Any request to your server should never hang forever. |
||||
- Your server can listen on multiple servers and ports at the same time without any conflict |
||||
- You must use the single process and no treads. |
||||
- You must use `exec` functions only in `CGI` part |
||||
- Your server must be compatible with the last version of your chosen browser |
||||
- You can use `NGINX` to compare headers and answer behaviors with your server |
||||
- You must manage at least [`GET`, `POST`, `DELETE`] methods. |
||||
- You must handle customization errors **(Binding error, default page error...)** |
||||
- You must create error page at leat for [400,311,403,404,405,413] |
||||
- You must execute CGI based on certain file extensions [`.php`,`.py`,...] |
||||
- You must use the enverement paramatre of cgi. |
||||
- Your server must receive a request from the browser and send a response using the HTTP header and body |
||||
|
||||
here is an example of an HTTP request with `GET` method |
||||
|
||||
```http |
||||
|
||||
GET /Welcome.html HTTP/1.1 |
||||
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) |
||||
Host: www.01talent.com |
||||
Accept-Language: en-us |
||||
Accept-Encoding: gzip, deflate |
||||
Connection: Keep-Alive |
||||
``` |
||||
and here is an example of an HTTP response : |
||||
|
||||
```http |
||||
HTTP/1.1 404 Not Found |
||||
Date: Thu, 19 Jul 2022 10:36:20 GMT |
||||
Server: Hserver/1.1.0 |
||||
``` |
||||
> Learn about [CGI](https://en.wikipedia.org/wiki/Common_Gateway_Interface) |
||||
|
||||
|
||||
#### Configurations Part |
||||
|
||||
This an example of a simple server configuration. |
||||
``` |
||||
server { |
||||
listen 80; |
||||
|
||||
server_name localhost; |
||||
|
||||
root /usr/share/nginx/html; |
||||
|
||||
error_page Mozilla 404 /usr/share/nginx/errors/404.html; |
||||
|
||||
client_body_size 10m; |
||||
location / |
||||
{ |
||||
http_methods GET POST DELETE; |
||||
|
||||
index index.html |
||||
|
||||
upload_status on; //if it's "on," you should add the "upload_path"; otherwise, if it's "off," there is no need for "upload_status." |
||||
|
||||
upload_path /usr/share/nginx/upload; //depends on "upload_status" |
||||
} |
||||
} |
||||
``` |
||||
|
||||
You have to base your server on this example but You have tested more complex configurations with multiple locations and ports and multiple servers such as : |
||||
``` |
||||
{ |
||||
server { |
||||
listen 80; |
||||
server_address 127.0.0.1; |
||||
server_name localhost; |
||||
... |
||||
... |
||||
... |
||||
location ...{ |
||||
|
||||
} |
||||
location ...{ |
||||
|
||||
} |
||||
} |
||||
server { |
||||
listen 5000; |
||||
listen 5001; |
||||
server_address 192.182.2.1; |
||||
server_name 01edu.com; |
||||
... |
||||
... |
||||
... |
||||
location ...{ |
||||
|
||||
} |
||||
} |
||||
server { |
||||
listen 5001; |
||||
listen 5002; |
||||
listen 5003; |
||||
server_address 192.186.2.54; |
||||
server_name hello.com; |
||||
... |
||||
... |
||||
... |
||||
location ...{ |
||||
|
||||
} |
||||
location ...{ |
||||
|
||||
} |
||||
location ...{ |
||||
|
||||
} |
||||
} |
||||
} |
||||
``` |
||||
The Main Rules: |
||||
- Choose the host(server_address) and a port or multiple ports of each server. |
||||
- The first server for a host: port will be the default if the server_name didn't mutch any other servers server_name. |
||||
- Setup default error pages. |
||||
- Limit client body size In uploading. |
||||
- Setup routes with one or multiple of the following rules/configuration (routes won't be using regexp): |
||||
- Define a list of accepted HTTP methods for the route. |
||||
- Define an HTTP redirection. |
||||
- Define a directory or a file from where the file should be searched (for example, if URL /test is rooted to /usr/share, url /test/tmp/folder1/folder2 is /usr/share/test/tmp/folder1/folder2). |
||||
- Turn on or off the directory listing. |
||||
- Set a default file to answer if the request is a directory. |
||||
|
||||
to check the syntax of the config file you must run this : |
||||
|
||||
```console |
||||
$ ./localhost -t GoodConfigFile.conf |
||||
Localhost : the configuration file GoodConfigFile.conf syntax is ok |
||||
$ ./localhost -t WrongConfigFile.conf |
||||
Localhost : the configuration file WrongConfigFile.conf syntax is not ok |
||||
``` |
||||
|
||||
If you’ve got a question about one behavior, you should compare your |
||||
program behavior with NGINX’s. |
Loading…
Reference in new issue