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
  6. CP2_Test_Code - Sample test code for CP2
  1. Begin with your repository and state of work from Checkpoint 1
  2. Create a logging module for your project.
  3. Enhance HTTP 1.1 parser and add a 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. You must also have a HTTP 1.1 parser as part of Checkpoint 1 on top of the select() layer. In this checkpoint, you will enhance your web server to provide a response for all input requests and support persistent connections. Think of checkpoint 2 as a HTTP 1.1 finite state machine that interprets and parses bytes coming in on buffers from Checkpoint 1 and responds accordingly. 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: