Checkpoint 2 is worth potentially 10 total points out of 100 towards Project 1. The work started here, when completed, will be worth 25 total points out of 100.

Useful resources:

  1. FAQ
  2. Annotated Excerpted RFC 2616 Text - This helps you interpret some RFC text and better understand the exact features you should implement
  3. dumper.py - Point a web browser to this Python web server and observe requests
  4. Static Site - Demo static website to serve with Liso
  5. Liso Prototype - Python web server demoing what requests from Liso should look like; not a full solution
  1. Begin with your repository and state of work from Checkpoint 1
  2. Create a logging module for your project.
  3. Create an HTTP 1.1 parser and layer supporting GET, HEAD, and POST as defined in RFC 2616.

Checkpoint 2 builds on top of the foundation you built in Checkpoint 1. Try architecting these two checkpoints as 'layers' in your design. You have the low-level select() layer from Checkpoint 1 which serves as a blackbox handling the select() system call and associated recv() and send() calls. It should expose an API to Checkpoint 2 that also uses functions provided by Checkpoint 2. That is, Checkpoint 2 also provides functions used by Checkpoint 1 (you are free to design differently, this is only a suggestion). For example, Checkpoint 2 might provide an HTTP 1.1 finite state machine that interprets and parses bytes coming in on buffers from Checkpoint 1. It might also provide special disconnect handlers as needed to cleanup state if a connection closes inside Checkpoint 1 without sending a proper HTTP 1.1 close header option. In addition, Checkpoint 1 might provide functions or a method of passing back bytes in some buffer that Checkpoint 2 wants to be written back to the client. Architect this however you like, you are the software engineer here designing and building a web server based on select().

Files we expect to see in your submission: