En Subject
En Subject
Summary:
This project is about writing your own HTTP server.
You will be able to test it with an actual browser.
HTTP is one of the most used protocols on the internet.
Knowing its arcane will be useful, even if you won’t be working on a website.
Version: 21.2
Contents
I Introduction 2
II General rules 3
IV Bonus part 9
1
Chapter I
Introduction
HTTP is the foundation of data communication for the World Wide Web, where hy-
pertext documents include hyperlinks to other resources that the user can easily access.
For example, by a mouse click or by tapping the screen in a web browser.
HTTP was developed to facilitate hypertext and the World Wide Web.
The primary function of a web server is to store, process, and deliver web pages to
clients. The communication between client and server takes place using the Hypertext
Transfer Protocol (HTTP).
Pages delivered are most frequently HTML documents, which may include images,
style sheets, and scripts in addition to the text content.
While the primary function is to serve content, full implementation of HTTP also
includes ways of receiving content from clients. This feature is used for submitting web
forms, including the uploading of les.
2
Chapter II
General rules
• Your program should not crash in any circumstances (even when it runs out of
memory), and should not quit unexpectedly.
If it happens, your project will be considered non-functional and your grade will be
0.
• You have to turn in a Makefile which will compile your source les. It must not
relink.
• Compile your code with c++ and the ags -Wall -Wextra -Werror
• Your code must comply with the C++ 98 standard. Then, it should still compile
if you add the ag -std=c++98.
• Try to always develop using the most C++ features you can (for example, choose
<cstring> over <string.h>). You are allowed to use C functions, but always prefer
their C++ versions if possible.
3
Chapter III
Mandatory part
4
Webserv This is when you nally understand why a URL starts with HTTP
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.
5
Webserv This is when you nally understand why a URL starts with HTTP
III.1 Requirements
• Your program has to take a conguration le as argument, or use a default path.
• 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 conguration le.
• You can use every macro and dene like FD_SET, FD_CLR, FD_ISSET, FD_ZERO (un-
derstanding what and how they do it is very useful).
• 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.
• 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).
• Your server must be able to listen to multiple ports (see Conguration le).
6
Webserv This is when you nally understand why a URL starts with HTTP
Since MacOS doesn’t implement write() the same way as other Unix
OSes, you are allowed to use fcntl().
You must use file descriptors in non-blocking mode in order to get a
behavior similar to the one of other Unix OSes.
However, you are only allowed to use fcntl() with the following
flags:
F_SETFL, O_NONBLOCK and FD_CLOEXEC.
Any other flag is forbidden.
You can get some inspiration from the ’server’ part of NGINX
configuration file.
• The rst 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 routes with one or multiple of the following rules/conguration (routes wont
be using regexp):
7
Webserv This is when you nally understand why a URL starts with HTTP
You must provide some conguration les and default basic les to test and demon-
strate every feature works during evaluation.
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.
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.
8
Chapter IV
Bonus part
9
Chapter V
Turn in your assignment in your Git repository as usual. Only the work inside your
repository will be evaluated during the defense. Don’t hesitate to double check the
names of your les to ensure they are correct.
16D85ACC441674FBA2DF65190663F42A3832CEA21E024516795E1223BBA77916734D1
26120A16827E1B16612137E59ECD492E46EAB67D109B142D49054A7C281404901890F
619D682524F5
10