Starting from:

$35

CMSC491-Programming Assignment - HTTP Solved

Description: 

 

The goal of this assignment is to allow you to demonstrate your knowledge of HTTP requests and HTTP responses. We'll be implementing a simple HTTP client and a simple HTTP server running version of HTTP/1.0. The goal is to get familiar with requests generated by your favorite web browser and responses from real web servers.

 

 

HTTPClient
•      Your client should be named HTTPClient.java should or HTTPClient.py

•      You are going to implement two methods of HTTP: GET and PUT.  

•      Your client take command line arguments specifying the needed parameters as follow for each operation.

•      Get 

o Use the HTTP client to request data from a web server. Your client should be able to send requests and receive responses from any web server on the Internet. There is no need to write a server program to communicate with the client with GET command. o Your client should accept a single command-line argument: URL, which is the URL that it will request. There is no need to define GET command in the command line here.

§ The URL will be given in the following format:

http://hostname[:port][/path] (only lowercase letters will be used)

•      hostname - the web server's hostname

•      :port - an optional port, if not present, use port 80.

•      path - the path from the web server's main directory to the requested file, if this is not present, then the path is

'/'

•      Example: http://egr.vcu.edu/index.html

§  If any of the arguments are incorrect, exit after printing an error message of the form ERR - arg x, where x is the argument number.

§  Treat any URL as valid as long as it starts with http:// o Connect to the host given in the URL at the port given in the URL thru TCP connection.

§  Handle exceptions as you wish -- for example, if the host doesn't exist or the port given is not open

o   Submit a valid GET request for path/file given in the supplied URL using HTTP/1.0.

§  Your request must include the "Host" field (with the proper entry).

§  Your request must include the "Time" field (with the proper entry).

§  Your request must also include the "User-agent" field with the entry 'VCU-CMSC491'.

§  Your request must also include the "User-name" field with your first name as the entry.

§  No other request fields are needed.

§  Remember to end with extra CR/LF o Print the HTTP request sent to the server.

§  Note: Print the actual string sent to the server.  

o   Parse the HTTP response header received from the server and print the following information:

§  Response code (number)

§  Server type

§  If the response code is in the 200-level:

•              Last modified date

•              Number of bytes in the response data

•              Store the received file (for example: index.html from http://www.vcu.edu/) in the current directory. § If the response code is in the 300-level:

•              The URL where the file is located

o   Print the HTTP response header.

o   In case you successfully received and stored a file, open the stored file using any browser to check it.

o   Once you have this part of the client working, you should test it with the following two test cases:  

1.      Use it to get a file of your choosing from a "real" web server on the

Internet. For example,  java HTTPClient http://www.cnn.com/index.html  

2.      Use it to get a file from your own server program (next). For example, your server is running on 172.18.233.83, port number 10003.  java HTTPClient http://172.18.233.83:10003/index.html Note that you can create your own index.html file (doesn’t to have a real HTML webpage file) or store any of a downloaded index.html files such as cnn index.html file.

 

•      PUT 

o   Use the HTTP client to put data only to your own web server (described next).  

o   Your client should accept a three command-line argument: PUT command, URL to where the files should be stored in the server, and the local path/filename of the file to transmit.

§ The URL will be given in the following format:

http://hostname[:port] (only lowercase letters will be used)

•      hostname - a CS Unix machine (use either atria or sirius)

•      :port - only ports 10000-11000 are open for use.

•      Example: http://172.18.233.83:10010

§  The path/name of local file has the format: [path/]<filename>

•      path - the path of the location of the file to be transmitted at the current machine ,if this is not present, then the path is '/'

•      <filename> is the name of the file that you intend to transmit to the server. If doesn’t exit, you  

§  Similarly, if any of the arguments are incorrect, exit after printing an error message of the form ERR - arg x, where x is the argument number.

o   Connect to the host given in the URL at the port given in the URL thru TCP connection.

§  Handle exceptions as you wish -- for example, if the file doesn't exist, host doesn’t exist, or the port given is not open

o   Submit a valid PUT request for path/file to be transferred to the webserver given in the supplied URL using HTTP/1.0.

§  Your request must include the "Host" field (with the proper entry).

§  Your request must include the "Time" field (with the proper entry).

§  Your request must also include the "User-agent" field with the entry 'VCU-CMSC491'.

§  Your request must also include the "User-name" field with your first name as the entry.

§  No other request fields are needed.

§  Remember to end with extra CR/LF o Print the HTTP PUT request sent to the server.

§  Note: Print the actual string sent to the server. Do not send a request and then re-type the request for output.

o   If the server is successful in receiving and storing the file, the server sends back a "200 OK File Created" response. Otherwise, the server sends back a "606 FAILED File NOT Created" response.

o   Parse the HTTP response header received from the server and print the following information:

§  Response code (number)

§  Server type o Print the HTTP response header.

  

HTTPServer
•      Your server should be named HTTPServer.java should or HTTPServer.py

•      It must accept a single command-line argument: port, which is the port that it will listen on for incoming HTTP requests.

o   If any of the arguments are incorrect, exit after printing an error message of the form ERR - arg x, where x is the argument number.

o   The only error-checking that needs to be done on the port is to ensure it is a positive integer less than 65536.

o   Remember that only ports 10000-11000 are open for use.

•      The server should able to handle both HTTP commands: GET and PUT.  

•      For each new HTTP request, print the client's IP address, port, and the request type in the format IP:port:request

Example: 172.18.233.83:63307:GET

•      Print each line in the HTTP request.

•      Construct a valid HTTP response including status line, any headers you feel are appropriate, and, of course, the requested file in the response body.  

•      For GET, If the server receives for example the "GET index.html HTTP/1.0" request,  o Sends out "200 OK" to the client, followed by the file ./index.html.  o If the requested file doesn't exist, the server sends out "404 Not Found" response to the client.  

•      For PUT, if the server receives the "PUT index.html HTTP/1.0" request, it will save the file as ./index.html.  

o   If the received file from client is successfully created, the server sends back a "200 OK File Created" response to the client.  

o   Otherwise, the server sends back a "606 FAILED File NOT Created" response.

•      The HTTP server program should remain running until the user closes it with Ctrl-C. The program should close the client socket after each request has been received (even if the browser is using HTTP/1.1), but leave the welcoming/listening socket open.

•      Once you have your server working, you could test it with the following two test cases:  

1. Use a real browser (e.g., firefox) to GET a file from your server

•      Note that you can download an index.html of any site and store in your server for the test.  

2. Use your HTTPClient to GET/PUT a file  

 

 

VM Linux Machines: 

•      Open "terminal" window either on Windows, Mac, or Unix machine.

•      On terminal, type “ssh 172.18.233.83 –l <eID>” then your VCU password to authenticate. Note that <eID> is your VCU user login. 

•      To access another machine with different IP, open a new "terminal" and follow the previous step to connect to the class VM machine (172.18.233.83), and then type "ssh 172.16.49.2 -l <eID>" using the same set of credentials you used before. 

 

Rules: 

•      The only programming networking classes allowed are the basic socket classes that we've used with the examples. For example, java.net.URL is not allowed and urllib2 (Python) is not allowed.

•      Your code should run on the VM Linux machines (e.g., 172.18.233.83).           Remember that only ports 10000-11000 are open for use  

•      You are not permitted to work with anyone else (even students not in the class) - all of the coding and documentation must be your own.

•      Your program must compile (if Java/C++) and run on the VM Linux machines.  

•      You must write neat code and document it well. You will lose points for sloppy programs that contain little or no comments.

 

Hints: 

•      Look back in your notes to recall how HTTP requests are formatted and terminated. 

•      Note that readLine() in Java strips off newline characters before returning a String. 

•      Use the equals() method in Java to compare two Strings. 

 

Testing: 

A large part of your program's grade will be determined by how well it handles a set of inputs. You should test your program rigorously before submitting. Because your programs will be run and tested using a script, you must format your output exactly as I have described or you will lose points.

 

The examples below are just examples. I will test your programs rigorously. In particular, I will test your HTTP Client on a wide range of URLs.

 

Example 1 java HTTPServer

Usage: java HTTPServer port

 

 

Example 2 

In this example, after setting up the server (e.g., on 172.18.233.83), the user 

opened a web browser (e.g., on 172.16.49.2) to the URL http://172.18.233.83:10003/my/url 

 

cmsc491> java HTTPServer 10003

172.16.49.2:33083:GET

GET /my/url HTTP/1.1

Host: 172.18.233.83:10003

User-Agent: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20070606 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,i mage/png,*/*;q=0.5

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

 

 

Example 3 java HTTPClient  

Usage: java HTTPClient URL or java HTTPClient  PUT URL path/<filename>

 

Example 4 java HTTPClient http://www.egr.vcu.edu/directory/tamer.nadeem/files/foo.txt

GET /directory/tamer.nadeem/files/foo.txt HTTP/1.0

Host: www.egr.vcu.edu

Time: Thu, 21 Feb 2019 20:53:29 GMT

User-agent: VCU-CMSC491

User-name: Tamer

 

200

Apache/2.2.17 (Unix) PHP/5.3.5 mod_ssl/2.2.17 OpenSSL/0.9.8q

Thu, 19 May 2011 19:23:43 GMT

92

 

HTTP/1.1 200 OK

Date: Thu, 21 Mar 2013 20:53:29 GMT

Server: Apache/2.2.17 (Unix) PHP/5.3.5 mod_ssl/2.2.17 OpenSSL/0.9.8q

Last-Modified: Thu, 19 May 2011 19:23:43 GMT

ETag: "5c-4a3a5f178cdd0"

Accept-Ranges: bytes

Content-Length: 92

Connection: close

Content-Type: text/plain

 

More products