Last updated
Last updated
This assignment has automated tests! Make sure to read the and to download the framework before starting.
Do not use imports for this assignment.
How many websites do you visit per day? Do you need a specialized program for every one of them? Probably not. It turns out that it has not always been the same. Before the invention of HTTP protocol - the backbone of the web - by Tim Berners Lee people used different programs to access different parts of the web. What made it possible was the unification of application-layer web protocols.
However, the complexities of dealing with HTTP are usually hidden behind the abstraction of web server frameworks like Node.js, Flask, Django, and others. Not today! In this assignment, you will explore what happens behind the curtains by implementing a simplified HTTP server.
Important: tests will expect a server to start at address 127.0.0.1 and port 8000 (even though you can develop your server using another address and port). The address and port will be, as well, supplied via test script when starting your server script using the --address
and --port
. Thus tests will start your server script as python3 server.py --address "127.0.0.1" --port 8000
.
Your job is to implement a simplified HTTP 1.1 server supporting both GET and POST methods. The website, based on HTML files and images we provide, should be loadable from your server and be visible in the Google Chrome browser. Please note, that while most modern browsers will render you an HTTP document even if was sent by a protocol other than HTTP (for example FTP), for this assignment you are required to use HTTP for ALL client-server communication.
With this assignment, we provide you with a template rendering which is a minimal requirement for passing an assignment (template structure is specified in the following sections). Your server MUST support GET requests, at least one POST endpoint, and a dynamically rendered page, your server MUST support different types of documents transferred namely HTML files and JPEG images, and your server MUST support different status codes such as 200 (successful page retrieval), 201 (successful POST request submission), 400 (validation error on POST request; for the assignment), 404 (page not found).
Please start by reading section 1 (Introduction) to get a general overview of the HTTP 1.1 protocol and its purpose. To parse a request sent to you by a browser, you should parse the request line parsing as specified in 5.1 (Request Line), the requested resource identifier as specified in 5.2 (The Resource Identified by a Request), and the method out of which your server should support at least two: GET as specified in 9.3 (GET) and POST as specified in 9.5 (POST).
In your HTTP response, you need to include the HTTP version as specified in section 3.2 (HTTP version), the content type as specified in 7.2.1 (Type), and the content length as specified in 7.2.2 (Entity Length), and the response code. Your server should support at least fetching JPG and HTML pages, and response codes 200 as specified in 10.2.1 (OK), 404 as specified in 10.2.5 (Not Found), 201 as specified in 10.2.2 (Created), and 400 as specified in 10.4.1 (Bad Request).
One of the main HTTP 1.1 features - support for persistent connections (question to ask yourself: why were those important to add?). Without the persistent connections support, your browser will not likely load your HTTP 1.1 page. Implement them as specified in section 8 (Connections). You do not need to consider sections 8.2.3 (Use of the 100 (Continue) Status) and 8.2.4 (Client Behavior if Server Prematurely Closes Connection).
Along with your assignment, you will find a website template attached under the data folder. The template has the following structure:
The automated tests expect the server to support the following endpoints:
The form on the main page must use application/x-www-form-urlencoded
encoding and have the fields:
Implementation Requirements:
ISR1: Your implementation should be executable by calling python3 server.py --address "SERVER_ADDR" --port "PORT_ADDR"
. Your assignment can use other files; however, the automated tests assume that after executing the command your server will start at SERVER_ADDR
and PORT_ADDR
.
ISR2: Your server.py file should be located exactly at the place it is located in the testing template. Automated tests will assume the same directory structure.
Server Protocol Requirements:
PR1: The server must support HTTP 1.1
PR2: The server must support the GET method.
PR3: The server must support the POST method.
PR4: The server must support HTTP 1.1 persistent connections
PR5: You must use only HTTP 1.1 for all the communication between the server and the client
Website Template Load Requirements:
LR1: The server must be able to load at least the assignment template in the Google Chrome browser
LR2: When requesting a non-existing page, the server must respond with a pre-templated 404 HTML page
LR3: When requested with “/”, the server must respond with the index.html page
LR4: The server must be able to load an arbitrary HTML file provided its file path. For example, if SERVER_ADDRESS/index.html
was requested, your server should return index.html
.
LR5: The server must be able to load arbitrary JPEG pictures provided their file path. For example, if SERVER_ADDRESS/img/cat.jpg
was requested, your server should return the contents of /img/cat.jpg
file.
LR6: The personal_cats.html
page must be generated dynamically using the data from the form on the index.html
page.
LR7: The endpoint for accepting data from the index.html
form must be located at SERVER_ADDRESS/data
Response Requirements:
RR1: The server has to support at least 200, 201, 400, and 404 status codes
RR2: The server must respond indicating an appropriate response type in a header
RR3: The server must indicate the appropriate response length in a header
RR4: The server must indicate the appropriate protocol type (HTTP 1.1) in the header
RR5: The server must use UTF-8 encoding and indicate it in every response header.
RR6: If the form was submitted successfully, the server must respond with the contents of success.html
file and 201 status code.
RR7: The server must respond with the contents of 404.html and 404 status code if the page does not exist.
RR8: The form at index.html
must have an empty fields server-side validation and the server must respond with the contents of 400.html and 400 status code if the form was submitted with the empty fields.
Did you complete the assignment? Great! On the page index.html you will see pictures of two cats. You can change those with pictures of your own cats by putting your cat picture in img folder and changing the image src
tag. PLEASE DO NOT DELETE OTHER JPEG FILES as it will likely fail the tests. Submit the final version on CodeGrade (with added pictures) and hand in your assignment. In case you have completed the assignment and submitted photos we might add your cat to the next version of the HTTP assignment template.
/
GET
The main index.html page with the form and images
/index.html
GET
The main index.html page with the form and images
/data
POST
The form (from the main page) submission endpoint
/img/gleb_cat.jpeg
GET
The image of Gleb's cat on the main page
/img/standing_cat.jpeg
GET
The image of a standing cat
cat_url
A url of cat picture
description
Description of a cat picture