CSCI 4061 Lab13: Basic Sockets and HTTP Post
- Due: 11:59pm Mon 5/03/2021 on Gradescope
- Approximately 1.00% of total grade
CODE DISTRIBUTION: lab13-code.zip
- Download the code distribution
- See further setup instructions below
CHANGELOG: Empty
Table of Contents
1 Rationale
Computer Networks and programming to use them is a large and interesting area of study. This lab demonstrates the barest minimum of functionality by illustrating how to set up a Socket to communicate over a network in Unix and how to format data to request and receive data using Hyper Text Transfer Protocol (HTTP) and two of its most common methods GET and POST. The basic steps are similar to opening a FIFO and reading/writing data with it but several intermediary steps are demonstrated associated with network and encryption issues.
Grading Policy
Credit for this Lab is earned by completing the exercises here and
submitting a Zip of the work to Gradescope. Students are responsible
to check that the results produced locally via make test
are
reflected on Gradescope after submitting their completed
Zip. Successful completion earns 1 Engagement Point.
Lab Exercises are open resource/open collaboration and students are encouraged to coopearte on labs. Students may submit work as groups of up to 5 to Gradescope: one person submits then adds the names of their group members to the submission.
See the full policies in the course syllabus.
2 Codepack
The codepack for this lab is linked at the top of this document. Always download it and unzip/unpack it. It should contain the following files which are briefly described.
File | Use | Description |
---|---|---|
QUESTIONS.txt |
EDIT | Questions to answer: fill in the multiple choice selections in this file. |
http_get.c.c |
Provided | C file to examine / run to answer QUIZ questions |
http_get_ssl.c.c |
Provided | C file to examine / run to answer QUIZ questions |
http_post_ssl.c |
EDIT | C file to study and complete for the CODE portion. See instructions in QUESTIONS.txt |
QUESTIONS.txt.bk |
Backup | Backup copy of the original file to help revert if needed |
Makefile |
Build | Enables make test and make zip |
testy |
Testing | Test running scripts |
test_lab13.org |
Testing | Tests for this lab |
test_quiz_filter |
Testing | Used to simplify quiz checksum |
3 QUESTIONS.txt File Contents
Below are the contents of the QUESTIONS.txt
file for the lab.
Follow the instructions in it to complete the QUIZ and CODE questions
for the lab.
__________________ LAB 13 QUESTIONS __________________ Lab Instructions ================ Follow the instructions below to experiment with topics related to this lab. - For sections marked QUIZ, fill in an (X) for the appropriate response in this file. Use the command `make test-quiz' to see if all of your answers are correct. - For sections marked CODE, complete the code indicated. Use the command `make test-code' to check if your code is complete. - DO NOT CHANGE any parts of this file except the QUIZ sections as it may interfere with the tests otherwise. - If your `QUESTIONS.txt' file seems corrupted, restore it by copying over the `QUESTIONS.txt.bk' backup file. - When you complete the exercises, check your answers with `make test' and if all is well, create a zip file with `make zip' and upload it to Gradescope. Ensure that the Autograder there reflects your local results. - IF YOU WORK IN A GROUP only one member needs to submit and then add the names of their group. QUIZ http_get.c and http_get_ssl.c ================================== Examine the code in `http_get.c' to get a basic sense of how sockets are set up for a client wishing to contact a server. Which of the following are the primary function calls to set up the socket for reading/writing? - ( ) socket(), connect(), activate() - ( ) getaddrinfo(), connect(), mksocket() - ( ) getaddrinfo(), socket(), connect() - ( ) socket(), activate(), getaddrinfo() After setting up the socket, which system calls are used in `http_get.c' to send data to the server and receive response data? - ( ) write() to send, read() to receive - ( ) senddata() to send, receiveresponse() to receive - ( ) put() to send, get() to receive - ( ) socket() to send, connect() to receive() The actual data that is written as the request and received from the server comprises an HTTP GET request/response. What format does this data take? - ( ) It is a C struct written in binary form with fields like msg.host and msg.connection in it. - ( ) It is a complex sequence of bytes that are set up with defined constants like HTTP_CONNECTION and HTTP_HOST - ( ) It is plain text with words like "Host" and "Connection" in it - ( ) It is plain text which is just a web address in it like you would type into a browser: <http://beej.us/index.html> One problem that you will observe about `http_get.c' by experimenting with it will be that it is rejected by may sites for security reasons. The "Secure Socket Layer" (SSL) library can be used to make connections requiring encryption. Examine the `http_get_ssl.c' program and identify how this encryption is used there. - ( ) A public/private key pair is coded which is used in a loop to encrypt the request and then decrypts the response. The code is very complex. - ( ) A bunch of SSL_* calls are made to create an ssl_connection which is used later with SSL_write() and SSL_read() identically to the earlier code making it very similar. - ( ) New options are passed to the socket() / connect() functions that cause it to implement encryption. The code is almost identical. CODE http_post_ssl.c ==================== The GET method of HTTP allows one to specify a web address to get but all information must be passed in the address. While highly flexible, the POST method allows hidden parameters to be passed to a site allowing the same page to respond with different data. The program `http_post_ssl.c' connects to a simple page that responds to the POST method. You can get an idea of the data being submitted by visiting the following page: <https://www-users.cs.umn.edu/~kauffman/quotes_submit.html> On submitting data, one is taken to the page <https://www-users.cs.umn.edu/~kauffman/quotes.php> which will display data based on what was POST'ed. However, directly visiting <https://www-users.cs.umn.edu/~kauffman/quotes.php> will not display any data due to no parameters being passed via a POST. Complete the `http_post_ssl.c' program by lifting code from `http_get_ssl.c'. Once running properly, the program will produce output like the following (assuming that you have an active internet connection and the CSE Labs servers are up). ,---- | >> ./http_post_ssl 1 | Host: www-users.cs.umn.edu | File: /~kauffman/quotes.php | ------- | REQUEST | ------- | POST /~kauffman/quotes.php HTTP/1.1 | Host: www-users.cs.umn.edu | Content-Type: application/x-www-form-urlencoded | Connection: close | Content-Length: 11 | | quote_num=1 | | -------- | RESPONSE | -------- | HTTP/1.1 200 OK | Date: Mon, 26 Apr 2021 04:14:35 GMT | Server: Apache | X-Powered-By: PHP/5.5.9-1ubuntu4.29 | Content-Length: 62 | Connection: close | Content-Type: text/html | | I do not fear computers. I fear lack of them. | - Isaac Asimov | | ------- | | >> ./http_post_ssl 28 | Host: www-users.cs.umn.edu | File: /~kauffman/quotes.php | ------- | REQUEST | ------- | POST /~kauffman/quotes.php HTTP/1.1 | Host: www-users.cs.umn.edu | Content-Type: application/x-www-form-urlencoded | Connection: close | Content-Length: 12 | | quote_num=28 | | -------- | RESPONSE | -------- | HTTP/1.1 200 OK | Date: Mon, 26 Apr 2021 04:14:40 GMT | Server: Apache | X-Powered-By: PHP/5.5.9-1ubuntu4.29 | Vary: Accept-Encoding | Content-Length: 239 | Connection: close | Content-Type: text/html | | Pessimists, we’re told, look at a glass containing 50% air and 50% water and see it as half empty. Optimists, in contrast, see it as half full. Engineers, of course, understand the glass is twice as big as it needs to be. | - Bob Lewis | | ------- | | >> ./http_post_ssl 98 | Host: www-users.cs.umn.edu | File: /~kauffman/quotes.php | ------- | REQUEST | ------- | POST /~kauffman/quotes.php HTTP/1.1 | Host: www-users.cs.umn.edu | Content-Type: application/x-www-form-urlencoded | Connection: close | Content-Length: 12 | | quote_num=98 | | -------- | RESPONSE | -------- | HTTP/1.1 200 OK | Date: Mon, 26 Apr 2021 04:14:58 GMT | Server: Apache | X-Powered-By: PHP/5.5.9-1ubuntu4.29 | Vary: Accept-Encoding | Content-Length: 122 | Connection: close | Content-Type: text/html | | I don’t know what the language of the year 2000 will look like, but I know it will be called Fortran. | - CA Hoare, 1982 | | ------- `----
4 Submission
Follow the instructions at the end of Lab01 if you need a refresher on how to upload your completed lab zip to Gradescope.