Question
Using TCP sockets, you will write a simplified version of a HTTP client and server in python. The client program will use the HTTP protocol
Using TCP sockets, you will write a simplified version of a HTTP client and server in python. The client program will use the HTTP protocol to download a file from the server using the HTTP GET method, and then subsequently use conditional GET operations to download the file only if it has been modified.
The HTTP client will perform the following functions: 1. Take in a single command line argument that specifies a web url containing the hostname and port where the server is running, as well as the name of the file to be downloaded, in the appropriate format. Example: localhost:12000/filename.html 2. Use a HTTP GET operation to download the file named in the URL a. Print out the contents of the file 3. Use a Conditional GET operation to download the file named in the URL again a. If the server indicates the file has not been modified since step 2, print output saying so (not necessary to print out file again) b. Otherwise, the behavior is the same as 2a)
The HTTP server will perform the following functions: 1. Open a TCP socket and listen for incoming HTTP Get and Conditional GET requests from one or more HTTP Clients 2. In the case of a HTTP Get request: a. Read the named file and return a HTTP GET Response, including the Last-Modified header field 3. In the case of a HTTP Conditional Get Request: a. If the file has not been modified since that indicated by If-Modified-Since, return the appropriate Not Modified response (return code 304) b. If the file has been modified, return the file contents as in step 2 4. In the case that the named file does not exist, return the appropriate Not Found error (return code 404) 5. The server must ignore all header fields in HTTP Requests it does not understand
Simplifying Assumptions: Only GET and Conditional GET requests need be supported in client and server Only a subset of header fields need to be supported in HTTP Requests and Responses (see Message Format section) However, the server must ignore all header fields it does not understand. For example, a real web browser will send many more header fields in GET requests than those expected to be implemented by the server. The server MUST ignore these fields and continue processing as if these fields were not part of the GET request. The server MUST NOT report an error in these cases.
Test Cases: Enable wireshark during all the following test cases. One wireshark .pcap is fine for the test cases in this section. 1. Using your HTTP client, download the contents of a text-based html file named filename.html from your HTTP server using the appropriate URL. Example: localhost:12000/filename.html. The client must: a. Print out the contents of the header in the HTTP Request b. Print out the contents of the header in the HTTP Response c. Print out file contents (you can print as is. No formatting is required) 2. File remains unmodified since Step 1. Using your HTTP Client, send a conditional GET request to your HTTP server. The client must: a. Print out the contents of the header in the HTTP Request b. Print out the contents of the header in the HTTP Response, indicating file is not modified. 3. Requested file does not exist. Using your HTTP Client, send a GET request for a filename that does not exist. The client must: a. Print out the contents of the header in the HTTP Request b. Print out the contents of the header in the HTTP Response
Message Format: HTTP messages are encoded in ASCII as strings in a specific format defined according to the HTTP specification[1,2,3].
As part of this assignment, your HTTP Client and HTTP Server programs are only expected to handle the following header fields: HTTP Client GET Request Message: Your GET Request must include the following: Request line containing method (GET) , object (from URL) and version (HTTP1.1) Host: includes hostname (and port, if specified, separated by :) Blank line: signifies ends of header, expressed by \
Example: GET /filename.html HTTP/1.1 Host: localhost:12000
HTTP Server Response to Client GET Request (assuming file exists): The response from the HTTP Server must include the following: Status line including version (HTTP1.1), status code (200), and status phrase (OK) Date: header field containing current date and time in the following format (must be UTC/GMT time zone): o Example of Date format: Mon, 23 Jan 2017 15:55:47 GMT Last-Modified: header field containing date and time file was last modified. Must follow same format as Date: above Content-Length: length of data in bytes Blank line: signifies ends of header Body: Contents of requested file
Example: HTTP/1.1 200 OK Date: Sun, 04 Mar 2018 21:24:58 GMT Last-Modified: Sun, 04 Mar 2018 21:24:58 GMT Content-Length: 75 Content-Type: text/html; charset=UTF-8
First Line
Second Line
Third Line
COMPLETE
HTTP Client Conditional GET Request Message: Your GET Request must include the following: Request line containing method (GET) , object (from URL) and version (HTTP1.1) Host: Same as in GET request If-Modified-Since: Echo back value of Last-Modified time in HTTP GET Response Blank line: signifies ends of header
Example: GET /filename.html HTTP/1.1 Host: localhost:12000 If-Modified-Since: Fri, 02 Mar 2018 21:06:02 GMT
HTTP Server Conditional Response Message (Not Modified): HTTP/1.1 304 Not Modified Date: Sun, 04 Mar 2018 21:24:58 GMT
HTTP Server Response when file not found: HTTP/1.1 404 Not Found Date: Sun, 04 Mar 2018 21:24:58 GMT
Programming Hints: See references [4,5,6]
Get current time in UTC/GMT time zone and convert to string in HTTP format: import datetime, time t = datetime.datetime.now(timezone.utc) date = time.strftime("%a, %d %b %Y %H:%M:%S %Z ", t)
Determining a files modification time (in seconds since 1 Jan, 1970 on Unix machines) import os.path secs = os.path.getmtime(filename)
Convert above time to UTC /GMT (returns a time tuple): import time t = time.gmtime(secs)
Convert above time tuple to a string in HTTP format: last_mod_time = time.strftime("%a, %d %b %Y %H:%M:%S %Z ", t)
Convert a date/time in string format back to time tuple and seconds since 1 Jan, 1970 t = time.strptime(last_mod_time, "%a, %d %b %Y %H:%M:%S %Z ") secs = time.mktime(t)
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started