Git Product home page Git Product logo

http-webserver-implementation's People

Contributors

kritikagarg avatar

Watchers

 avatar  avatar

http-webserver-implementation's Issues

Assignment 5 Report

================================================================================
Assignment: cs531a5
Student: Kritika Garg <[email protected]>
Time: 20191207-192238 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a5
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a5` branch/tag out
500 Server Error: Internal Server Error ("error fetching: fatal: Couldn't find remote ref a5
: exit status 128")
Building image `cs531/kgarg:a5` failed
Ensure that the repo is accessible and contains a valid `Dockerfile`

Assignment 0-1 Report

================================================================================
Assignment: echo
Student: Kritika Garg <[email protected]>
Time: 20190913-190227-UTC
Repository: https://github.com/kritikagarg/cs531/tree/master
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

HTTP/1.1 200 OK
Content-Length: 955
Content-Type: text/plain; charset=utf-8
Date: Fri, 13 Sep 2019 19:02:32 GMT
Server: Werkzeug/0.15.6 Python/3.7.0

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `master` branch/tag out
Step 1/8 : FROM python:3.6
 ---> 653edda0213f
Step 2/8 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 1f9e1e432522
Step 3/8 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> c63f08de6c0d
Step 4/8 : WORKDIR /app
 ---> Using cache
 ---> afc9513d97c1
Step 5/8 : COPY . /app/
 ---> 76be0ce588c9
Step 6/8 : EXPOSE 80
 ---> Running in 727af8b127e8
Removing intermediate container 727af8b127e8
 ---> 7734072ee2aa
Step 7/8 : RUN chmod a+x echoserver.py
 ---> Running in ff242d4108ec
Removing intermediate container ff242d4108ec
 ---> 113f0b6cbe7f
Step 8/8 : ENTRYPOINT ["./echoserver.py"]
 ---> Running in 9fc76a921543
Removing intermediate container 9fc76a921543
 ---> 94ea1392173e
Successfully built 94ea1392173e
Successfully tagged cs531/kgarg:master

A new container is created and the server `cs531-kgarg` is deployed successfully
Testing server: cs531-kgarg against echo test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_echo_back_single_line: Test echo back server with a single line message
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* `The quick brown fox jumps over the lazy dog 7413 times!` is present in the response
[PASSED]

> The quick brown fox jumps over the lazy dog 7413 times!
> 
> 

< The quick brown fox jumps over the lazy dog 7413 times!
< 
< 
< 

--------------------------------------------------------------------------------
test_echo_back_multi_line: Test echo back server with a multi line message
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* `7293 little monkeys jumping on the bed,` is present in the response
* `One fell down and bumped his head,` is present in the response
* `Mama called the doctor and the doctor said,` is present in the response
* `"No more monkeys jumping on the bed!"` is present in the response
[PASSED]

> 7293 little monkeys jumping on the bed,
> One fell down and bumped his head,
> Mama called the doctor and the doctor said,
> "No more monkeys jumping on the bed!"
> 
> 

< 7293 little monkeys jumping on the bed,
< One fell down and bumped his head,
< Mama called the doctor and the doctor said,
< "No more monkeys jumping on the bed!"
< 
< 
< 

--------------------------------------------------------------------------------
test_echo_back_sparse_line: Test echo back server with a message containing some empty lines
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* `UNIX Epoch Time` is present in the response
* `It is a system for describing a point in time.` is present in the response
* `It is the number of seconds that have elapsed since the Unix epoch.` is present in the response
* `That is the time 00:00:00 UTC on 1 January 1970, minus leap seconds.` is present in the response
* `Current Epoch: 1568401358` is present in the response
[PASSED]

> UNIX Epoch Time
> 
>   It is a system for describing a point in time.
>   It is the number of seconds that have elapsed since the Unix epoch.
>   That is the time 00:00:00 UTC on 1 January 1970, minus leap seconds.
> 
> 
> Current Epoch: 1568401358

< UNIX Epoch Time
< 
<   It is a system for describing a point in time.
<   It is the number of seconds that have elapsed since the Unix epoch.
<   That is the time 00:00:00 UTC on 1 January 1970, minus leap seconds.
< 
< 
< Current Epoch: 1568401358
< 

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_echo_back_single_line
PASSED: test_echo_back_multi_line
PASSED: test_echo_back_sparse_line
--------------------------------------------------------------------------------
TOTAL: 3, PASSED: 3, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
HTTP/1.1 200 OK
Content-Length: 44
Content-Type: text/plain; charset=utf-8
Date: Fri, 13 Sep 2019 19:02:39 GMT
Server: Werkzeug/0.15.6 Python/3.7.0

Server `cs531-kgarg` destroyed successfully.

Assignment 3 Report

================================================================================
Assignment: cs531a1
Student: Kritika Garg <[email protected]>
Time: 20191029-150535 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a3
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a3` branch/tag out
Released at: 2019-10-29T00:11:18Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/logs/
 ---> Using cache
 ---> 2c56ada8bde9
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> 1c259e57765a
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> ed0a2a5ae02b
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> 67d63964677c
Step 9/13 : COPY . /app/
 ---> 0e9bd043697e
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 414f94c07552
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl (226kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=73cb55bea84d6f232e1404102cc64575ab7e4c262a91c6699681aa823cd40dbe
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.0 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.12.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 414f94c07552
 ---> 85b8db92f7d4
Step 11/13 : EXPOSE 80
 ---> Running in 0c5c3523dc2c
Removing intermediate container 0c5c3523dc2c
 ---> 2f37d8cb3695
Step 12/13 : RUN chmod a+x *.py
 ---> Running in cc9492220ac7
Removing intermediate container cc9492220ac7
 ---> 0c0d41b7a613
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in 07b79d76221c
Removing intermediate container 07b79d76221c
 ---> e45fd76e6b72
Successfully built e45fd76e6b72
Successfully tagged cs531/kgarg:a3

Related existing container removed
A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a1 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_url_get_ok: Test whether the URL of the assignment 1 directory returns HTTP/1.1 200 OK on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `200`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET http://cs531-kgarg/a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-mnyC6LrMQz"
< Content-Length: 1936
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_url_head_ok: Test whether the URL of the assignment 1 directory returns 200 on HEAD
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload is empty
[PASSED]

> HEAD http://cs531-kgarg/a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-mnyC6LrMQz"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_path_head_ok: Test whether the relative path of the assignment 1 directory returns 200 on HEAD
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload is empty
[PASSED]

> HEAD /a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-mnyC6LrMQz"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_path_options_ok: Test whether the relative path of the assignment 1 directory returns 200 on OPTIONS
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Allow` header is present
* `Allow` header contains `GET`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> OPTIONS /a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-mnyC6LrMQz"
< Allow: GET, HEAD, OPTIONS, TRACE
< Content-Length: 0
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_get_missing: Test whether a non-existing path returns 404 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET /1/1.1/go%20hokies.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (187 bytes)]

--------------------------------------------------------------------------------
test_get_duplicate_path_prefix: Test tight path prefix checking
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET /a1-test/a1-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (187 bytes)]

--------------------------------------------------------------------------------
test_unsupported_version: Test whether a request with unsupported version returns 505
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `505`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET / HTTP/1.11
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 505 HTTP Version Not Supported
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (221 bytes)]

--------------------------------------------------------------------------------
test_invalid_request: Test whether an invalid request returns 400
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> qwerty
> 

< HTTP/1.1 400 Bad Request
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (191 bytes)]

--------------------------------------------------------------------------------
test_missing_host_header: Test whether missing Host header in a request returns 400
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET / HTTP/1.1
> Connection: close
> 

< HTTP/1.1 400 Bad Request
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (191 bytes)]

--------------------------------------------------------------------------------
test_post_not_implemented: Test whether the assignment 1 returns 501 on POST
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `501`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> POST /a1-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 501 Not Implemented
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (199 bytes)]

--------------------------------------------------------------------------------
test_trace_echoback: Test whether the server echoes back the request on TRACE
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `message/http`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload begins with `TRACE /a1-test/1/1.4/ HTTP/1.1`
* Payload contains `User-Agent: CS531 Assignment 1 Tester/1572361564`
* Payload contains `Connection: close`
[PASSED]

> TRACE /a1-test/1/1.4/ HTTP/1.1
> Host: cs531-kgarg
> User-Agent: CS531 Assignment 1 Tester/1572361564
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Content-Length: 122
< Content-Type: message/http
< Connection: close
< 
* [Payload redacted (122 bytes)]

--------------------------------------------------------------------------------
test_get_escaped_file_name: Test whether the escaped file name is respected
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload contains `lower case html`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.4/test%3A.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "4400055101ad85035c4d0d010bf199b6-pqlUyEBwRm"
< Content-Length: 25
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (25 bytes)]

--------------------------------------------------------------------------------
test_get_escape_escaping_character: Test whether the escaped escaping caracter in a file name is respected
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload contains `Go Monarchs!`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.4/escape%25this.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "d23695deea09abedde3aaf360277a782-nooTxpYWRv"
< Content-Length: 67
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (67 bytes)]

--------------------------------------------------------------------------------
test_get_jpeg_image: Test whether a JPEG image returns 200 with proper Content-Length on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Length` header is present
* `Content-Length` header has value `38457`
* Payload size is `38457` bytes
[PASSED]

> GET http://cs531-kgarg/a1-test/2/0.jpeg HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "a5ee39e4649fdd082e17b9c6a5758885-rvlF63GmBE"
< Content-Length: 38457
< Content-Type: image/jpeg
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (38457 bytes)]

--------------------------------------------------------------------------------
test_get_case_sensitive_file_extension: Test whether file extensions are treated case-sensitive
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
[PASSED]

> GET http://cs531-kgarg/a1-test/2/0.JPEG HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (187 bytes)]

--------------------------------------------------------------------------------
test_get_empty_text_file: Test whether an empty file returns zero bytes with 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `0`
* Payload is empty
[PASSED]

> GET http://cs531-kgarg/a1-test/4/thisfileisempty.txt HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "d41d8cd98f00b204e9800998ecf8427e-wANtPZWNwK"
< Content-Length: 0
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close

--------------------------------------------------------------------------------
test_get_empty_unknown_file_directory: Test whether an unknown empty file or directory returns zero bytes and a valid Content-Type with 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `application/octet-stream`
* `Content-Length` header is present
* `Content-Length` header has value `0`
* Payload is empty
[PASSED]

> GET http://cs531-kgarg/a1-test/4/directory3isempty HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "d41d8cd98f00b204e9800998ecf8427e-xBACBq3XWk"
< Content-Length: 0
< Content-Type: application/octet-stream
< Accept-Range: bytes
< Connection: close

--------------------------------------------------------------------------------
test_get_filename_with_many_dots: Test whether file names with multiple dots return 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/xml`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.2/arXiv.org.Idenitfy.repsonse.xml HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "60757ce40ecb43052efe0f5a329a3d0d-zEjTnNArj6"
< Content-Length: 3142
< Content-Type: text/xml
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (3142 bytes)]

--------------------------------------------------------------------------------
test_get_magic_cookie_of_a_binary_file: Test whether a GIF file contains identifying magic cookie
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload begins with `GIF89a`
[PASSED]

> GET http://cs531-kgarg/a1-test/2/6.gif HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "f15d0e729fffe52ad0afc2320484c553-vz6H403lkx"
< Content-Length: 49803
< Content-Type: image/gif
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (49803 bytes)]

--------------------------------------------------------------------------------
test_access_log_as_virtual_uri: Test whether the access log is available as a Virtual URI in the Common Log Format
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* Payload is not empty
* Selected log entry `172.22.0.2 - - [29/Oct/2019:15:06:04 +0000] "GET http://cs531-kgarg/a1-test/2/index.html HTTP/1.1" 200 1936`
* `172.22.0.2` is a valid IP address
* `172.22.0.2` is potentially the IP address of a client
* `29/Oct/2019:15:06:04 +0000` is formatted correctly
* `200` is a valid status code
* `1936` is a valid size
[PASSED]

> GET /.well-known/access.log HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:06:00 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 29 Oct 2019 15:05:49 GMT
< Etag: "1ab54a0e397017d95dadcfb48d9de10a-pqgCyw7MyL"
< Content-Length: 1844
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1844 bytes)]

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_url_get_ok
PASSED: test_url_head_ok
PASSED: test_path_head_ok
PASSED: test_path_options_ok
PASSED: test_get_missing
PASSED: test_get_duplicate_path_prefix
PASSED: test_unsupported_version
PASSED: test_invalid_request
PASSED: test_missing_host_header
PASSED: test_post_not_implemented
PASSED: test_trace_echoback
PASSED: test_get_escaped_file_name
PASSED: test_get_escape_escaping_character
PASSED: test_get_jpeg_image
PASSED: test_get_case_sensitive_file_extension
PASSED: test_get_empty_text_file
PASSED: test_get_empty_unknown_file_directory
PASSED: test_get_filename_with_many_dots
PASSED: test_get_magic_cookie_of_a_binary_file
PASSED: test_access_log_as_virtual_uri
--------------------------------------------------------------------------------
TOTAL: 20, PASSED: 20, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.
================================================================================
Assignment: cs531a2
Student: Kritika Garg <[email protected]>
Time: 20191029-150812 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a3
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a3` branch/tag out
Released at: 2019-10-29T00:11:18Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/logs/
 ---> Using cache
 ---> 2c56ada8bde9
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> 1c259e57765a
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> ed0a2a5ae02b
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> 67d63964677c
Step 9/13 : COPY . /app/
 ---> a6bf5e943d2e
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 235de8299432
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl (226kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=72031b66e6de650059a480736b0b76bd4da2a04f7db663d6934d3c1f02186abe
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.0 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.12.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 235de8299432
 ---> 2a59c70e9a05
Step 11/13 : EXPOSE 80
 ---> Running in d16eb92fcd06
Removing intermediate container d16eb92fcd06
 ---> 4525b1853ee2
Step 12/13 : RUN chmod a+x *.py
 ---> Running in ef7a8473b153
Removing intermediate container ef7a8473b153
 ---> 023713e26fdb
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in b3585e6e6775
Removing intermediate container b3585e6e6775
 ---> c19fd2959faf
Successfully built c19fd2959faf
Successfully tagged cs531/kgarg:a3

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a2 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_get_directory_listing: Test whether a2-test directory root returns directory listing
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 29 Oct 2019 15:08:20 GMT
< Etag: "e963a1a41458329b43100aa73e34e5c0-O26hwOMRo0"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< 
* [Payload redacted (2641 bytes)]

--------------------------------------------------------------------------------
test_redirect_to_trailing_slash_for_directory_url: Test whether redirects URL to trailing slashes when missing for existing directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `301`
* `Location` header is present
* `Location` header ends with `/a2-test/2/`
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/2 HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 301 Moved Permanently
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Location: /a2-test/2/
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (203 bytes)]

--------------------------------------------------------------------------------
test_redirect_to_trailing_slash_for_directory_path: Test whether redirects path to trailing slashes when missing for existing directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `301`
* `Location` header is present
* `Location` header ends with `/a2-test/1/`
* Socket connection is closed
[PASSED]

> GET /a2-test/1 HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 301 Moved Permanently
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Location: /a2-test/1/
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (203 bytes)]

--------------------------------------------------------------------------------
test_get_default_index_file: Test whether default index.html is returned instead of directory listing
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is not empty
* Fetching `/a2-test/2/index.html` for content comparison
* Contents of `/a2-test/2/` and `/a2-test/2/index.html` are the same
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/2/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-zEAcnNArj6"
< Content-Length: 1936
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_redirect_as_per_regexp_trailing_wildcard_capture: Test whether redirects as per the regular expression with wildcard trailing capture group
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `302`
* `Location` header is present
* `Location` header ends with `/a2-test/1/1.1/assignment1.ppt`
[PASSED]

> HEAD /a2-test/1/1.3/assignment1.ppt HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 302 Found
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Location: /a2-test/1/1.1/assignment1.ppt
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_redirect_as_per_regexp_trailing_specific_file: Test whether redirects as per the regular expression with a specific trailing file name
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `302`
* `Location` header is present
* `Location` header ends with `/a2-test/galaxie.html`
[PASSED]

> HEAD /a2-test/coolcar.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 302 Found
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Location: /a2-test/galaxie.html
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_dont_redirect_target_file: Test whether the target of the configured redirect returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/galaxie.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 03:44:27 GMT
< Etag: "7d344af10346d1a6f168ecc66d6885af-ZopsxnpqD1"
< Content-Length: 96
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_fresh: Test whether conditional HEAD of a fresh file returns 304 Not Modified
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `304`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 20 Oct 2018 02:33:21 GMT
> Connection: close
> 

< HTTP/1.1 304 Not Modified
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_stale: Test whether conditional HEAD of a stale file returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 20 Oct 2018 02:33:20 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_invalid_datetime: Test whether conditional HEAD with invalid datetime returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: who-doesn't-want-a-fairlane?
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_unsupported_datetime_format: Test whether conditional HEAD with unsupported datetime format returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: 2018-10-20 02:33:21.304307000 -0000
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_include_etag: Test whether the HEAD response contains an ETag
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `ETag` header is present
* `ETag` is not empty and properly formatted in double quotes as `"e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"`
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_valid_etag_ok: Test whether a valid ETag returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `1966 Ford Fairlane`
[PASSED]

> GET /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nooTxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_etag_if_match_failure: Test whether a random ETag returns 412 Precondition Failed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `412`
[PASSED]

> GET /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "203948kjaldsf002"
> Connection: close
> 

< HTTP/1.1 412 Precondition Failed
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (207 bytes)]

--------------------------------------------------------------------------------
test_implicit_keep_alive_until_timeout: Test whether the socket connection is kept alive by default and closed after the set timeout
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making a subsequent request after `5` seconds
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `408`
* `Connection` header is present
* `Connection` header has value `close`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-zEAcnNArj6"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 408 Request Timeout
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_explicit_keep_alive_until_timeout: Test whether the socket connection is kept alive when explicitly requested and closed after the set timeout
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making a subsequent request after `5` seconds
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `408`
* `Connection` header is present
* `Connection` header has value `close`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: keep-alive
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: keep-alive
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-zEAcnNArj6"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 408 Request Timeout
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_trace_unnecessary_conditionals: Test whether many unnecessary conditionals are not processed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `message/http`
* Payload begins with `TRACE /a2-test/2/index.html HTTP/1.1`
[PASSED]

> TRACE /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "not-a-real-etag"
> If-None-Match: "also-not-a-real-etag"
> If-Modified-Since: Fri, 19 Oct 2018 22:33:21 GMT
> If-Unmodified-Since: Fri, 19 Oct 2018 22:33:21 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Content-Length: 248
< Content-Type: message/http
< Connection: close
< 
* [Payload redacted (248 bytes)]

--------------------------------------------------------------------------------
test_pipeline_requests: Test whether multiple pipelined requests are processed and returned in the same order
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Parsing second response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Parsing third response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> GET /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 29 Oct 2019 15:08:34 GMT
< Etag: "e963a1a41458329b43100aa73e34e5c0-6vKTMWqOxq"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-zEAcnNArj6"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 29 Oct 2019 15:08:34 GMT
< Etag: "e963a1a41458329b43100aa73e34e5c0-6vKTMWqOxq"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< 
* [Payload redacted (2641 bytes)]

--------------------------------------------------------------------------------
test_long_lived_connection: Test whether the socket connection is kept alive to process multiple requests successively
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making second request
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making third request
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> GET /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 29 Oct 2019 15:08:34 GMT
< Etag: "e963a1a41458329b43100aa73e34e5c0-6vKTMWqOxq"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-zEAcnNArj6"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:08:31 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 29 Oct 2019 15:08:35 GMT
< Etag: "e963a1a41458329b43100aa73e34e5c0-7wVtyRwp9R"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< 
* [Payload redacted (2641 bytes)]

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_get_directory_listing
PASSED: test_redirect_to_trailing_slash_for_directory_url
PASSED: test_redirect_to_trailing_slash_for_directory_path
PASSED: test_get_default_index_file
PASSED: test_redirect_as_per_regexp_trailing_wildcard_capture
PASSED: test_redirect_as_per_regexp_trailing_specific_file
PASSED: test_dont_redirect_target_file
PASSED: test_conditional_head_fresh
PASSED: test_conditional_head_stale
PASSED: test_conditional_head_invalid_datetime
PASSED: test_conditional_head_unsupported_datetime_format
PASSED: test_include_etag
PASSED: test_valid_etag_ok
PASSED: test_etag_if_match_failure
PASSED: test_implicit_keep_alive_until_timeout
PASSED: test_explicit_keep_alive_until_timeout
PASSED: test_trace_unnecessary_conditionals
PASSED: test_pipeline_requests
PASSED: test_long_lived_connection
--------------------------------------------------------------------------------
TOTAL: 19, PASSED: 19, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.
================================================================================
Assignment: cs531a3
Student: Kritika Garg <[email protected]>
Time: 20191029-154610 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a3
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a3` branch/tag out
Released at: 2019-10-29T00:11:18Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/logs/
 ---> Using cache
 ---> 2c56ada8bde9
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> 1c259e57765a
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> ed0a2a5ae02b
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> 67d63964677c
Step 9/13 : COPY . /app/
 ---> ad2487ab18cb
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 966d20c46cdd
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl (226kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=e427656c9388a0713749489917f06dd7ac5899015244db4cfe91d1fcb7614599
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.0 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.12.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 966d20c46cdd
 ---> 5e2e0f9d3b1f
Step 11/13 : EXPOSE 80
 ---> Running in 1471bd2acd39
Removing intermediate container 1471bd2acd39
 ---> deb6e5c21e9b
Step 12/13 : RUN chmod a+x *.py
 ---> Running in d365231baaa1
Removing intermediate container d365231baaa1
 ---> 78203395165e
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in 0a890a2c169e
Removing intermediate container 0a890a2c169e
 ---> b120128b3816
Successfully built b120128b3816
Successfully tagged cs531/kgarg:a3

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a3 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_useragent_get_text_ok: Test whether a request with a custom user-agent returns OK with corresponding text response
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `193`
* Payload contains `______________`
[PASSED]

> GET http://cs531-kgarg/a3-test/fairlane.txt HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1572363995
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "55d0c79f6feaf06fa2a2dbca5b62efad-M2JF9o9vE1"
< Content-Length: 193
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (193 bytes)]

--------------------------------------------------------------------------------
test_partial_content_range_language: Test whether a valid range request header returns partial content in a specific langaue
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `206`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Language` header is present
* `Content-Language` header has value `es`
* `Content-Range` header is present
* `Content-Length` header is present
* `Content-Length` header has value `100`
* Payload size is `100` bytes
[PASSED]

> GET http://cs531-kgarg/a3-test/index.html.es HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1572363995
> Referer: http://cs531-kgarg/a3-test/index.html
> Range: bytes=0-99
> Connection: close
> 

< HTTP/1.1 206 Partial Content
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "c4ea947cd06b0602bb4d168b18fb36cf-O2ZIwPwEqj"
< Content-Range: bytes 0-99/7643
< Content-Language: es
< Content-Length: 100
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (100 bytes)]

--------------------------------------------------------------------------------
test_chunked_404: Test whether a 404 Not Found page returns chunked encoded HTML
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `404`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET /a3-test/index.htmll HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1572363995
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (187 bytes)]

--------------------------------------------------------------------------------
test_conditional_head_image_fresh: Test whether conditional HEAD of a fresh image file returns 304 Not Modified
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `304`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane.gif HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 10 Nov 2018 20:46:11 GMT
> Connection: close
> 

< HTTP/1.1 304 Not Modified
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_image_stale: Test whether conditional HEAD of a stale image file returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `image/gif`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane.gif HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 27 Oct 2018 20:46:09 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "f96f06ec4a14a91969a5476e74d08b94-Q2AT9D9Jzp"
< Content-Length: 49803
< Content-Type: image/gif
< Connection: close

--------------------------------------------------------------------------------
test_no_accept_header_multiple_choices: Test whether missing Accept header yields multiple choices
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 300 Multiple Choice
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Alternates: {"fairlane.gif" 1 {type image/gif} {length 49803}}, {"fairlane.jpeg" 1 {type image/jpeg} {length 38457}}, {"fairlane.png" 1 {type image/png} {length 98203}}, {"fairlane.txt" 1 {type text/plain} {length 193}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_ambiguous_accept_header_multiple_choices: Test whether an Accept header with the same qvalue for all image types yields multiple choices
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET /a3-test/fairlane HTTP/1.1
> Accept: image/*; q=1.0
> Host: cs531-kgarg:80
> Connection: close
> 

< HTTP/1.1 300 Multiple Choice
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Alternates: {"fairlane.gif" 1 {type image/gif} {length 49803}}, {"fairlane.jpeg" 1 {type image/jpeg} {length 38457}}, {"fairlane.png" 1 {type image/png} {length 98203}}, {"fairlane.txt" 1 {type text/plain} {length 193}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (605 bytes)]

--------------------------------------------------------------------------------
test_accept_header_png_ok: Test whether an Accept header with unique qvalue returns a PNG
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `image/png`
* `Content-Length` header is present
* `Content-Length` header has value `98203`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane HTTP/1.1
> Host: cs531-kgarg:80
> Accept: image/jpeg; q=0.9, image/png; q=0.91, image/tiff; q=0.95
> User-Agent: CS531 Assignment 3 Tester/1572363995
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "6ff23fe4f2e350a79791539f2b795dd6-VklFX4XzO6"
< Content-Length: 98203
< Content-Type: image/png
< Vary: negotiate, accept
< Connection: close

--------------------------------------------------------------------------------
test_accept_header_text_ok: Test whether an Accept header with high qvalue returns plain text
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `193`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane HTTP/1.1
> Host: cs531-kgarg:80
> Accept: text/*; q=1.0, image/*; q=0.99
> User-Agent: CS531 Assignment 3 Tester/1572363995
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "55d0c79f6feaf06fa2a2dbca5b62efad-M2JF9o9vE1"
< Content-Length: 193
< Content-Type: text/plain
< Vary: negotiate, accept
< Connection: close

--------------------------------------------------------------------------------
test_not_accptable_encoding: Test whether explicit zero qvalue for all supported encodings returns 406 Not Acceptable
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `406`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/vt-uva.html HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Encoding: compress; q=0.0, gzip; q=0.0, deflate; q=0.5
> Connection: close
> 

< HTTP/1.1 406 Not Acceptable
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Alternates: {"vt-uva.html.Z" 1 {type text/html} {length 42757}}, {"vt-uva.html.gz" 1 {type text/html} {length 21840}}
< Vary: negotiate, accept-encoding
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_explicit_extention_ignore_content_negotiation: Test whether an explicit existing file extension ignores content negotiation
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Encoding` header is present
* `Content-Encoding` header has value `compress`
* `Content-Length` header is present
* `Content-Length` header has value `42757`
* Payload is empty
[PASSED]

> HEAD /a3-test/vt-uva.html.Z HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Encoding: compress; q=0.0, gzip; q=0.5
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:22:55 GMT
< Etag: "a21cdfa0751d75d43e5a663fbd548b82-3p0ix8xWP9"
< Content-Encoding: compress
< Content-Length: 42757
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_ambiguous_accept_language_multiple_choices: Test whether an Accept-Language header with the same qvalue for more than one available languages yields multiple choices
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/index.html HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Language: en; q=1.0, de; q=1.0, fr; q=1.0
> Connection: close
> 

< HTTP/1.1 300 Multiple Choice
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Alternates: {"index.html.de" 1 {type de} {length 7316}}, {"index.html.en" 1 {type en} {length 7233}}, {"index.html.es" 1 {type es} {length 7643}}, {"index.html.ja.jis" 1 {type ja} {length 7635}}, {"index.html.ko.euc-kr" 1 {type ko} {length 6951}}, {"index.html.ru.koi8-r" 1 {type ru} {length 7277}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_not_accptable_incompatiple_charset: Test whether explicit zero qvalue of charset associated with the explicit language extension returns 406 Not Acceptable
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `406`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/index.html.ja HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Language: en; q=1.0, ja; q=0.5
> Accept-Charset: euc-jp; q=1.0, iso-2022-jp; q=0.0
> Connection: close
> 

< HTTP/1.1 406 Not Acceptable
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Vary: negotiate, accept-language, accept-charset
< Alternates: {"index.html.ja.jis" 1 {type ja} {length 7635}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_partial_content_range_text: Test whether a valid range request header returns partial content in plain text
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `206`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Range` header is present
* `Content-Range` header has value `bytes 10-20/193`
* `Content-Length` header is present
* `Content-Length` header has value `11`
* Payload size is `11` bytes
[PASSED]

> GET /a3-test/fairlane.txt HTTP/1.1
> Host: cs531-kgarg:80
> Range: bytes=10-20
> Connection: close
> 

< HTTP/1.1 206 Partial Content
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "55d0c79f6feaf06fa2a2dbca5b62efad-M2JF9o9vE1"
< Content-Range: bytes 10-20/193
< Content-Length: 11
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (11 bytes)]

--------------------------------------------------------------------------------
test_etag_precondition_failure: Test whether a random If-Match ETag returns 412 Precondition Failed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `412`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET /a3-test/fairlane.txt HTTP/1.1
> Host: cs531-kgarg
> If-Match: "20933948kjaldsf000002"
> Connection: close
> 

< HTTP/1.1 412 Precondition Failed
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (207 bytes)]

--------------------------------------------------------------------------------
test_explicit_language_charset_etag: Test whether explicit language and charset as extensions returns ETag and Content-Type with charset
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=koi8-r`
* `Content-Language` header is present
* `Content-Language` header has value `ru`
* `ETag` header is present
* `ETag` is not empty and properly formatted in double quotes as `"a4fb640ff753fbdeb23ddc7cf605dd0d-1nMiOjOLvo"`
* Payload size is `7277` bytes
[PASSED]

> GET /a3-test/index.html.ru.koi8-r HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1572363995
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "a4fb640ff753fbdeb23ddc7cf605dd0d-1nMiOjOLvo"
< Content-Language: ru
< Content-Length: 7277
< Content-Type: text/html; charset=koi8-r
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (7277 bytes)]

--------------------------------------------------------------------------------
test_valid_etag_conditional_get: Test whether conditional GET with a valid ETag returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=koi8-r`
* `Content-Language` header is present
* `Content-Language` header has value `ru`
* Payload size is `7277` bytes
[PASSED]

> GET /a3-test/index.html.ru.koi8-r HTTP/1.1
> Host: cs531-kgarg
> If-Match: "a4fb640ff753fbdeb23ddc7cf605dd0d-1nMiOjOLvo"
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "a4fb640ff753fbdeb23ddc7cf605dd0d-1nMiOjOLvo"
< Content-Language: ru
< Content-Length: 7277
< Content-Type: text/html; charset=koi8-r
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (7277 bytes)]

--------------------------------------------------------------------------------
test_pipeline_range_negotiate: Test whether multiple pipelined requests with content negotiations are processed and returned in the same order
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `206`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Range` header is present
* `Content-Length` header is present
* `Content-Length` header has value `100`
* Parsing second response
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Parsing third response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=iso-2022-jp`
* `Content-Language` header is present
* `Content-Language` header has value `ja`
* `Content-Length` header is present
* `Content-Length` header has value `7635`
* Payload is empty
* Socket connection is closed
[PASSED]

> HEAD http://cs531-kgarg/a3-test/index.html.en HTTP/1.1
> Range: bytes=-100
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a3-test/index.html HTTP/1.1
> Negotiate: 1.0
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a3-test/index.html.ja.jis HTTP/1.1
> Host: cs531-kgarg:80
> Connection: close
> 

< HTTP/1.1 206 Partial Content
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "8861349ef2fe9e4a28054f96832ae7cf-X0phG6GkpR"
< Content-Range: bytes 7133-7232/7233
< Content-Language: en
< Content-Length: 100
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 300 Multiple Choice
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Alternates: {"index.html.de" 1 {type de} {length 7316}}, {"index.html.en" 1 {type en} {length 7233}}, {"index.html.es" 1 {type es} {length 7643}}, {"index.html.ja.jis" 1 {type ja} {length 7635}}, {"index.html.ko.euc-kr" 1 {type ko} {length 6951}}, {"index.html.ru.koi8-r" 1 {type ru} {length 7277}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Tue, 29 Oct 2019 15:46:30 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "7f4abbb6cfe16587a6ce6c1e98c99c3c-YnXfg0gjGq"
< Content-Language: ja
< Content-Length: 7635
< Content-Type: text/html; charset=iso-2022-jp
< Connection: close

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_useragent_get_text_ok
PASSED: test_partial_content_range_language
PASSED: test_chunked_404
PASSED: test_conditional_head_image_fresh
PASSED: test_conditional_head_image_stale
PASSED: test_no_accept_header_multiple_choices
PASSED: test_ambiguous_accept_header_multiple_choices
PASSED: test_accept_header_png_ok
PASSED: test_accept_header_text_ok
PASSED: test_not_accptable_encoding
PASSED: test_explicit_extention_ignore_content_negotiation
PASSED: test_ambiguous_accept_language_multiple_choices
PASSED: test_not_accptable_incompatiple_charset
PASSED: test_partial_content_range_text
PASSED: test_etag_precondition_failure
PASSED: test_explicit_language_charset_etag
PASSED: test_valid_etag_conditional_get
PASSED: test_pipeline_range_negotiate
--------------------------------------------------------------------------------
TOTAL: 18, PASSED: 18, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.

Assignment 4 Report

================================================================================
Assignment: cs531a1
Student: Kritika Garg <[email protected]>
Time: 20191118-180430 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a4
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a4` branch/tag out
Released at: 2019-11-14T21:30:48Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/www/cs531server/logs/
 ---> Using cache
 ---> 2689462361d6
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> c2f51c6509f4
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> 366251389a19
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> b5138158d4be
Step 9/13 : COPY . /app/
 ---> f22a46886f42
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in f8a770d4adef
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=a97fc8d5bd7798a933f26009f8d15707c3ef12125804cedf6f279f106c666907
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.1 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.13.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container f8a770d4adef
 ---> 0da61217f24d
Step 11/13 : EXPOSE 80
 ---> Running in 34c1a65d418a
Removing intermediate container 34c1a65d418a
 ---> 20b83fe55d5e
Step 12/13 : RUN chmod a+x *.py
 ---> Running in d6f413710dcf
Removing intermediate container d6f413710dcf
 ---> 437a66e98f16
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in a3c11fcc50f3
Removing intermediate container a3c11fcc50f3
 ---> 9d44a3efaee4
Successfully built 9d44a3efaee4
Successfully tagged cs531/kgarg:a4

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a1 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_url_get_ok: Test whether the URL of the assignment 1 directory returns HTTP/1.1 200 OK on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `200`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET http://cs531-kgarg/a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nozcxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_url_head_ok: Test whether the URL of the assignment 1 directory returns 200 on HEAD
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload is empty
[PASSED]

> HEAD http://cs531-kgarg/a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nozcxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_path_head_ok: Test whether the relative path of the assignment 1 directory returns 200 on HEAD
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload is empty
[PASSED]

> HEAD /a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nozcxpYWRv"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_path_options_ok: Test whether the relative path of the assignment 1 directory returns 200 on OPTIONS
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Allow` header is present
* `Allow` header contains `GET`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> OPTIONS /a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-nozcxpYWRv"
< Content-Length: 0
< Content-Type: text/html
< Allow: GET, HEAD, OPTIONS, TRACE
< Connection: close

--------------------------------------------------------------------------------
test_get_missing: Test whether a non-existing path returns 404 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET /1/1.1/go%20hokies.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (176 bytes)]

--------------------------------------------------------------------------------
test_get_duplicate_path_prefix: Test tight path prefix checking
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET /a1-test/a1-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (176 bytes)]

--------------------------------------------------------------------------------
test_unsupported_version: Test whether a request with unsupported version returns 505
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `505`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET / HTTP/1.11
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 505 HTTP Version Not Supported
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (210 bytes)]

--------------------------------------------------------------------------------
test_invalid_request: Test whether an invalid request returns 400
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> qwerty
> 

< HTTP/1.1 400 Bad Request
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (180 bytes)]

--------------------------------------------------------------------------------
test_missing_host_header: Test whether missing Host header in a request returns 400
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET / HTTP/1.1
> Connection: close
> 

< HTTP/1.1 400 Bad Request
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (180 bytes)]

--------------------------------------------------------------------------------
test_post_not_implemented: Test whether the assignment 1 returns 501 on POST
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `501`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> POST /a1-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 501 Not Implemented
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (188 bytes)]

--------------------------------------------------------------------------------
test_trace_echoback: Test whether the server echoes back the request on TRACE
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `message/http`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload begins with `TRACE /a1-test/1/1.4/ HTTP/1.1`
* Payload contains `User-Agent: CS531 Assignment 1 Tester/1574100297`
* Payload contains `Connection: close`
[PASSED]

> TRACE /a1-test/1/1.4/ HTTP/1.1
> Host: cs531-kgarg
> User-Agent: CS531 Assignment 1 Tester/1574100297
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Content-Length: 122
< Content-Type: message/http
< Connection: close
< 
* [Payload redacted (122 bytes)]

--------------------------------------------------------------------------------
test_get_escaped_file_name: Test whether the escaped file name is respected
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload contains `lower case html`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.4/test%3A.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "4400055101ad85035c4d0d010bf199b6-qrnCR6o2MZ"
< Content-Length: 25
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (25 bytes)]

--------------------------------------------------------------------------------
test_get_escape_escaping_character: Test whether the escaped escaping caracter in a file name is respected
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload contains `Go Monarchs!`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.4/escape%25this.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "d23695deea09abedde3aaf360277a782-o0PH8p0wyE"
< Content-Length: 67
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (67 bytes)]

--------------------------------------------------------------------------------
test_get_jpeg_image: Test whether a JPEG image returns 200 with proper Content-Length on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Length` header is present
* `Content-Length` header has value `38457`
* Payload size is `38457` bytes
[PASSED]

> GET http://cs531-kgarg/a1-test/2/0.jpeg HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "a5ee39e4649fdd082e17b9c6a5758885-vz6H403lkx"
< Content-Length: 38457
< Content-Type: image/jpeg
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (38457 bytes)]

--------------------------------------------------------------------------------
test_get_case_sensitive_file_extension: Test whether file extensions are treated case-sensitive
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
[PASSED]

> GET http://cs531-kgarg/a1-test/2/0.JPEG HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (176 bytes)]

--------------------------------------------------------------------------------
test_get_empty_text_file: Test whether an empty file returns zero bytes with 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `0`
* Payload is empty
[PASSED]

> GET http://cs531-kgarg/a1-test/4/thisfileisempty.txt HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "d41d8cd98f00b204e9800998ecf8427e-xBACBq3XWk"
< Content-Length: 0
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close

--------------------------------------------------------------------------------
test_get_empty_unknown_file_directory: Test whether an unknown empty file or directory returns zero bytes and a valid Content-Type with 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `application/octet-stream`
* `Content-Length` header is present
* `Content-Length` header has value `0`
* Payload is empty
[PASSED]

> GET http://cs531-kgarg/a1-test/4/directory3isempty HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "d41d8cd98f00b204e9800998ecf8427e-yDGIJmR4BZ"
< Content-Length: 0
< Content-Type: application/octet-stream
< Accept-Range: bytes
< Connection: close

--------------------------------------------------------------------------------
test_get_filename_with_many_dots: Test whether file names with multiple dots return 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/xml`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.2/arXiv.org.Idenitfy.repsonse.xml HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "60757ce40ecb43052efe0f5a329a3d0d-A2ZIVJzRD4"
< Content-Length: 3142
< Content-Type: text/xml
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (3142 bytes)]

--------------------------------------------------------------------------------
test_get_magic_cookie_of_a_binary_file: Test whether a GIF file contains identifying magic cookie
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload begins with `GIF89a`
[PASSED]

> GET http://cs531-kgarg/a1-test/2/6.gif HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "f15d0e729fffe52ad0afc2320484c553-wANtPZWNwK"
< Content-Length: 49803
< Content-Type: image/gif
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (49803 bytes)]

--------------------------------------------------------------------------------
test_access_log_as_virtual_uri: Test whether the access log is available as a Virtual URI in the Common Log Format
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* Payload is not empty
* Selected log entry `172.22.0.2 - - [18/Nov/2019:18:04:57 +0000] "GET http://cs531-kgarg/a1-test/4/directory3isempty HTTP/1.1" 200 0`
* `172.22.0.2` is a valid IP address
* `172.22.0.2` is potentially the IP address of a client
* `18/Nov/2019:18:04:57 +0000` is formatted correctly
* `200` is a valid status code
* `0` is a valid size
[PASSED]

> GET /.well-known/access.log HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 18:04:52 GMT
< Server: kitkat.2.0
< Last-Modified: Mon, 18 Nov 2019 18:04:37 GMT
< Etag: "5c810027235a13ad36768840102cb351-M2ZC9JwrVG"
< Content-Length: 1844
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1844 bytes)]

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_url_get_ok
PASSED: test_url_head_ok
PASSED: test_path_head_ok
PASSED: test_path_options_ok
PASSED: test_get_missing
PASSED: test_get_duplicate_path_prefix
PASSED: test_unsupported_version
PASSED: test_invalid_request
PASSED: test_missing_host_header
PASSED: test_post_not_implemented
PASSED: test_trace_echoback
PASSED: test_get_escaped_file_name
PASSED: test_get_escape_escaping_character
PASSED: test_get_jpeg_image
PASSED: test_get_case_sensitive_file_extension
PASSED: test_get_empty_text_file
PASSED: test_get_empty_unknown_file_directory
PASSED: test_get_filename_with_many_dots
PASSED: test_get_magic_cookie_of_a_binary_file
PASSED: test_access_log_as_virtual_uri
--------------------------------------------------------------------------------
TOTAL: 20, PASSED: 20, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.
================================================================================
Assignment: cs531a2
Student: Kritika Garg <[email protected]>
Time: 20191118-170323 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a4
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a4` branch/tag out
Released at: 2019-11-14T21:30:48Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/www/cs531server/logs/
 ---> Using cache
 ---> 2689462361d6
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> c2f51c6509f4
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> 366251389a19
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> b5138158d4be
Step 9/13 : COPY . /app/
 ---> a58696a1bac8
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 2cfe32f7ec38
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=ed1f7af2c4ce90820c039c1050b8450cb39bd0389eceb8b6fc205a956426a660
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.1 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.13.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 2cfe32f7ec38
 ---> 536d02617fd1
Step 11/13 : EXPOSE 80
 ---> Running in d40f7b65f7ef
Removing intermediate container d40f7b65f7ef
 ---> ae30f1a97ac4
Step 12/13 : RUN chmod a+x *.py
 ---> Running in 4d75433cbacd
Removing intermediate container 4d75433cbacd
 ---> c25654b0e5b2
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in 493c3ede9d15
Removing intermediate container 493c3ede9d15
 ---> 4fb50aec9bdb
Successfully built 4fb50aec9bdb
Successfully tagged cs531/kgarg:a4

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a2 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_get_directory_listing: Test whether a2-test directory root returns directory listing
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Mon, 18 Nov 2019 17:03:29 GMT
< Etag: "153bd862718f52481bce7aa2f87f7a63-zElSnrkyg5"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< 
* [Payload redacted (2562 bytes)]

--------------------------------------------------------------------------------
test_redirect_to_trailing_slash_for_directory_url: Test whether redirects URL to trailing slashes when missing for existing directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `301`
* `Location` header is present
* `Location` header ends with `/a2-test/2/`
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/2 HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 301 Moved Permanently
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Location: /a2-test/2/
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (192 bytes)]

--------------------------------------------------------------------------------
test_redirect_to_trailing_slash_for_directory_path: Test whether redirects path to trailing slashes when missing for existing directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `301`
* `Location` header is present
* `Location` header ends with `/a2-test/1/`
* Socket connection is closed
[PASSED]

> GET /a2-test/1 HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 301 Moved Permanently
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Location: /a2-test/1/
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (192 bytes)]

--------------------------------------------------------------------------------
test_get_default_index_file: Test whether default index.html is returned instead of directory listing
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is not empty
* Fetching `/a2-test/2/index.html` for content comparison
* Contents of `/a2-test/2/` and `/a2-test/2/index.html` are the same
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/2/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-A2ouVJzRD4"
< Content-Length: 1936
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_redirect_as_per_regexp_trailing_wildcard_capture: Test whether redirects as per the regular expression with wildcard trailing capture group
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `302`
* `Location` header is present
* `Location` header ends with `/a2-test/1/1.1/assignment1.ppt`
[PASSED]

> HEAD /a2-test/1/1.3/assignment1.ppt HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 302 Found
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Location: /a2-test/1/1.1/assignment1.ppt
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_redirect_as_per_regexp_trailing_specific_file: Test whether redirects as per the regular expression with a specific trailing file name
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `302`
* `Location` header is present
* `Location` header ends with `/a2-test/galaxie.html`
[PASSED]

> HEAD /a2-test/coolcar.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 302 Found
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Location: /a2-test/galaxie.html
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_dont_redirect_target_file: Test whether the target of the configured redirect returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/galaxie.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 03:44:27 GMT
< Etag: "7d344af10346d1a6f168ecc66d6885af-1nEUOw9Akr"
< Content-Length: 96
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_fresh: Test whether conditional HEAD of a fresh file returns 304 Not Modified
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `304`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 20 Oct 2018 02:33:21 GMT
> Connection: close
> 

< HTTP/1.1 304 Not Modified
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_stale: Test whether conditional HEAD of a stale file returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 20 Oct 2018 02:33:20 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_invalid_datetime: Test whether conditional HEAD with invalid datetime returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: who-doesn't-want-a-fairlane?
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_unsupported_datetime_format: Test whether conditional HEAD with unsupported datetime format returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: 2018-10-20 02:33:21.304307000 -0000
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_include_etag: Test whether the HEAD response contains an ETag
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `ETag` header is present
* `ETag` is not empty and properly formatted in double quotes as `"e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"`
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_valid_etag_ok: Test whether a valid ETag returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `1966 Ford Fairlane`
[PASSED]

> GET /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-o0PH8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_etag_if_match_failure: Test whether a random ETag returns 412 Precondition Failed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `412`
[PASSED]

> GET /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "203948kjaldsf002"
> Connection: close
> 

< HTTP/1.1 412 Precondition Failed
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (196 bytes)]

--------------------------------------------------------------------------------
test_implicit_keep_alive_until_timeout: Test whether the socket connection is kept alive by default and closed after the set timeout
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making a subsequent request after `5` seconds
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `408`
* `Connection` header is present
* `Connection` header has value `close`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-A2ouVJzRD4"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 408 Request Timeout
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_explicit_keep_alive_until_timeout: Test whether the socket connection is kept alive when explicitly requested and closed after the set timeout
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making a subsequent request after `5` seconds
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `408`
* `Connection` header is present
* `Connection` header has value `close`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: keep-alive
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: keep-alive
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-A2ouVJzRD4"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 408 Request Timeout
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_trace_unnecessary_conditionals: Test whether many unnecessary conditionals are not processed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `message/http`
* Payload begins with `TRACE /a2-test/2/index.html HTTP/1.1`
[PASSED]

> TRACE /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "not-a-real-etag"
> If-None-Match: "also-not-a-real-etag"
> If-Modified-Since: Fri, 19 Oct 2018 22:33:21 GMT
> If-Unmodified-Since: Fri, 19 Oct 2018 22:33:21 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Content-Length: 248
< Content-Type: message/http
< Connection: close
< 
* [Payload redacted (248 bytes)]

--------------------------------------------------------------------------------
test_pipeline_requests: Test whether multiple pipelined requests are processed and returned in the same order
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Parsing second response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Parsing third response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> GET /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Mon, 18 Nov 2019 17:03:42 GMT
< Etag: "153bd862718f52481bce7aa2f87f7a63-zElSnrkyLO"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-A2ouVJzRD4"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Mon, 18 Nov 2019 17:03:42 GMT
< Etag: "153bd862718f52481bce7aa2f87f7a63-zElSnrkyLO"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< 
* [Payload redacted (2562 bytes)]

--------------------------------------------------------------------------------
test_long_lived_connection: Test whether the socket connection is kept alive to process multiple requests successively
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making second request
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making third request
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> GET /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Mon, 18 Nov 2019 17:03:42 GMT
< Etag: "153bd862718f52481bce7aa2f87f7a63-zElSnrkyLO"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< Etag: "e5359f8ba4c1697b0d5088c8344d08d5-A2ouVJzRD4"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:03:45 GMT
< Server: kitkat.2.0
< Last-Modified: Mon, 18 Nov 2019 17:03:43 GMT
< Etag: "153bd862718f52481bce7aa2f87f7a63-A2OiVRwPYB"
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< 
* [Payload redacted (2562 bytes)]

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_get_directory_listing
PASSED: test_redirect_to_trailing_slash_for_directory_url
PASSED: test_redirect_to_trailing_slash_for_directory_path
PASSED: test_get_default_index_file
PASSED: test_redirect_as_per_regexp_trailing_wildcard_capture
PASSED: test_redirect_as_per_regexp_trailing_specific_file
PASSED: test_dont_redirect_target_file
PASSED: test_conditional_head_fresh
PASSED: test_conditional_head_stale
PASSED: test_conditional_head_invalid_datetime
PASSED: test_conditional_head_unsupported_datetime_format
PASSED: test_include_etag
PASSED: test_valid_etag_ok
PASSED: test_etag_if_match_failure
PASSED: test_implicit_keep_alive_until_timeout
PASSED: test_explicit_keep_alive_until_timeout
PASSED: test_trace_unnecessary_conditionals
PASSED: test_pipeline_requests
PASSED: test_long_lived_connection
--------------------------------------------------------------------------------
TOTAL: 19, PASSED: 19, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.
================================================================================
Assignment: cs531a3
Student: Kritika Garg <[email protected]>
Time: 20191118-171247 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a4
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a4` branch/tag out
Released at: 2019-11-14T21:30:48Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/www/cs531server/logs/
 ---> Using cache
 ---> 2689462361d6
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> c2f51c6509f4
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> 366251389a19
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> b5138158d4be
Step 9/13 : COPY . /app/
 ---> a878e0ea41c1
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 0457310c7306
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=38c093739ebe8aee72addc0cf1f45e76f33b0b3a853ecc2fe98f282601c7a67c
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.1 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.13.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 0457310c7306
 ---> 52a77b7b1863
Step 11/13 : EXPOSE 80
 ---> Running in 8acedb273f29
Removing intermediate container 8acedb273f29
 ---> 7b1ea0f4ba1b
Step 12/13 : RUN chmod a+x *.py
 ---> Running in 6ec2621f6c87
Removing intermediate container 6ec2621f6c87
 ---> dc970c616adf
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in 1fcef8200d9d
Removing intermediate container 1fcef8200d9d
 ---> 36e03d2e4ad4
Successfully built 36e03d2e4ad4
Successfully tagged cs531/kgarg:a4

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a3 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_useragent_get_text_ok: Test whether a request with a custom user-agent returns OK with corresponding text response
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `193`
* Payload contains `______________`
[PASSED]

> GET http://cs531-kgarg/a3-test/fairlane.txt HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1574097193
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "55d0c79f6feaf06fa2a2dbca5b62efad-N20H9n9wv8"
< Content-Length: 193
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (193 bytes)]

--------------------------------------------------------------------------------
test_partial_content_range_language: Test whether a valid range request header returns partial content in a specific langaue
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `206`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Language` header is present
* `Content-Language` header has value `es`
* `Content-Range` header is present
* `Content-Length` header is present
* `Content-Length` header has value `100`
* Payload size is `100` bytes
[PASSED]

> GET http://cs531-kgarg/a3-test/index.html.es HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1574097193
> Referer: http://cs531-kgarg/a3-test/index.html
> Range: bytes=0-99
> Connection: close
> 

< HTTP/1.1 206 Partial Content
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "c4ea947cd06b0602bb4d168b18fb36cf-P9MuZDZJyR"
< Content-Range: bytes 0-99/7643
< Content-Language: es
< Content-Length: 100
< Content-Type: text/html
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (100 bytes)]

--------------------------------------------------------------------------------
test_chunked_404: Test whether a 404 Not Found page returns chunked encoded HTML
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `404`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET /a3-test/index.htmll HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1574097193
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (176 bytes)]

--------------------------------------------------------------------------------
test_conditional_head_image_fresh: Test whether conditional HEAD of a fresh image file returns 304 Not Modified
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `304`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane.gif HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 10 Nov 2018 20:46:11 GMT
> Connection: close
> 

< HTTP/1.1 304 Not Modified
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_image_stale: Test whether conditional HEAD of a stale image file returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `image/gif`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane.gif HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 27 Oct 2018 20:46:09 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "f96f06ec4a14a91969a5476e74d08b94-R05UQKQy71"
< Content-Length: 49803
< Content-Type: image/gif
< Connection: close

--------------------------------------------------------------------------------
test_no_accept_header_multiple_choices: Test whether missing Accept header yields multiple choices
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 300 Multiple Choice
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Alternates: {"fairlane.gif" 1 {type image/gif} {length 49803}}, {"fairlane.jpeg" 1 {type image/jpeg} {length 38457}}, {"fairlane.png" 1 {type image/png} {length 98203}}, {"fairlane.txt" 1 {type text/plain} {length 193}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_ambiguous_accept_header_multiple_choices: Test whether an Accept header with the same qvalue for all image types yields multiple choices
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET /a3-test/fairlane HTTP/1.1
> Accept: image/*; q=1.0
> Host: cs531-kgarg:80
> Connection: close
> 

< HTTP/1.1 300 Multiple Choice
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Alternates: {"fairlane.gif" 1 {type image/gif} {length 49803}}, {"fairlane.jpeg" 1 {type image/jpeg} {length 38457}}, {"fairlane.png" 1 {type image/png} {length 98203}}, {"fairlane.txt" 1 {type text/plain} {length 193}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (588 bytes)]

--------------------------------------------------------------------------------
test_accept_header_png_ok: Test whether an Accept header with unique qvalue returns a PNG
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `image/png`
* `Content-Length` header is present
* `Content-Length` header has value `98203`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane HTTP/1.1
> Host: cs531-kgarg:80
> Accept: image/jpeg; q=0.9, image/png; q=0.91, image/tiff; q=0.95
> User-Agent: CS531 Assignment 3 Tester/1574097193
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "6ff23fe4f2e350a79791539f2b795dd6-WlpfxpxNlK"
< Content-Location: /a3-test/fairlane.png
< Content-Length: 98203
< Content-Type: image/png
< Vary: negotiate, accept
< Connection: close

--------------------------------------------------------------------------------
test_accept_header_text_ok: Test whether an Accept header with high qvalue returns plain text
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `193`
* Payload is empty
[PASSED]

> HEAD /a3-test/fairlane HTTP/1.1
> Host: cs531-kgarg:80
> Accept: text/*; q=1.0, image/*; q=0.99
> User-Agent: CS531 Assignment 3 Tester/1574097193
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "55d0c79f6feaf06fa2a2dbca5b62efad-N20H9n9wv8"
< Content-Location: /a3-test/fairlane.txt
< Content-Length: 193
< Content-Type: text/plain
< Vary: negotiate, accept
< Connection: close

--------------------------------------------------------------------------------
test_not_accptable_encoding: Test whether explicit zero qvalue for all supported encodings returns 406 Not Acceptable
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `406`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/vt-uva.html HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Encoding: compress; q=0.0, gzip; q=0.0, deflate; q=0.5
> Connection: close
> 

< HTTP/1.1 406 Not Acceptable
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Alternates: {"vt-uva.html.Z" 1 {type text/html} {length 42757}}, {"vt-uva.html.gz" 1 {type text/html} {length 21840}}
< Vary: negotiate, accept-encoding
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_explicit_extention_ignore_content_negotiation: Test whether an explicit existing file extension ignores content negotiation
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Encoding` header is present
* `Content-Encoding` header has value `compress`
* `Content-Length` header is present
* `Content-Length` header has value `42757`
* Payload is empty
[PASSED]

> HEAD /a3-test/vt-uva.html.Z HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Encoding: compress; q=0.0, gzip; q=0.5
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:22:55 GMT
< Etag: "a21cdfa0751d75d43e5a663fbd548b82-O22cwPwEgZ"
< Content-Encoding: compress
< Content-Length: 42757
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_ambiguous_accept_language_multiple_choices: Test whether an Accept-Language header with the same qvalue for more than one available languages yields multiple choices
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/index.html HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Language: en; q=1.0, de; q=1.0, fr; q=1.0
> Connection: close
> 

< HTTP/1.1 300 Multiple Choice
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Alternates: {"index.html.de" 1 {type de} {length 7316}}, {"index.html.en" 1 {type en} {length 7233}}, {"index.html.es" 1 {type es} {length 7643}}, {"index.html.ja.jis" 1 {type ja} {length 7635}}, {"index.html.ko.euc-kr" 1 {type ko} {length 6951}}, {"index.html.ru.koi8-r" 1 {type ru} {length 7277}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_not_accptable_incompatiple_charset: Test whether explicit zero qvalue of charset associated with the explicit language extension returns 406 Not Acceptable
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `406`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is empty
[PASSED]

> HEAD /a3-test/index.html.ja HTTP/1.1
> Host: cs531-kgarg:80
> Accept-Language: en; q=1.0, ja; q=0.5
> Accept-Charset: euc-jp; q=1.0, iso-2022-jp; q=0.0
> Connection: close
> 

< HTTP/1.1 406 Not Acceptable
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Vary: negotiate, accept-language, accept-charset
< Alternates: {"index.html.ja.jis" 1 {type ja} {length 7635}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_partial_content_range_text: Test whether a valid range request header returns partial content in plain text
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `206`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Range` header is present
* `Content-Range` header has value `bytes 10-20/193`
* `Content-Length` header is present
* `Content-Length` header has value `11`
* Payload size is `11` bytes
[PASSED]

> GET /a3-test/fairlane.txt HTTP/1.1
> Host: cs531-kgarg:80
> Range: bytes=10-20
> Connection: close
> 

< HTTP/1.1 206 Partial Content
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "55d0c79f6feaf06fa2a2dbca5b62efad-N20H9n9wv8"
< Content-Range: bytes 10-20/193
< Content-Length: 11
< Content-Type: text/plain
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (11 bytes)]

--------------------------------------------------------------------------------
test_etag_precondition_failure: Test whether a random If-Match ETag returns 412 Precondition Failed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `412`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET /a3-test/fairlane.txt HTTP/1.1
> Host: cs531-kgarg
> If-Match: "20933948kjaldsf000002"
> Connection: close
> 

< HTTP/1.1 412 Precondition Failed
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (196 bytes)]

--------------------------------------------------------------------------------
test_explicit_language_charset_etag: Test whether explicit language and charset as extensions returns ETag and Content-Type with charset
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=koi8-r`
* `Content-Language` header is present
* `Content-Language` header has value `ru`
* `ETag` header is present
* `ETag` is not empty and properly formatted in double quotes as `"a4fb640ff753fbdeb23ddc7cf605dd0d-2orI6x60nX"`
* Payload size is `7277` bytes
[PASSED]

> GET /a3-test/index.html.ru.koi8-r HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 3 Tester/1574097193
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "a4fb640ff753fbdeb23ddc7cf605dd0d-2orI6x60nX"
< Content-Language: ru
< Content-Length: 7277
< Content-Type: text/html; charset=koi8-r
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (7277 bytes)]

--------------------------------------------------------------------------------
test_valid_etag_conditional_get: Test whether conditional GET with a valid ETag returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=koi8-r`
* `Content-Language` header is present
* `Content-Language` header has value `ru`
* Payload size is `7277` bytes
[PASSED]

> GET /a3-test/index.html.ru.koi8-r HTTP/1.1
> Host: cs531-kgarg
> If-Match: "a4fb640ff753fbdeb23ddc7cf605dd0d-2orI6x60nX"
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "a4fb640ff753fbdeb23ddc7cf605dd0d-2orI6x60nX"
< Content-Language: ru
< Content-Length: 7277
< Content-Type: text/html; charset=koi8-r
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (7277 bytes)]

--------------------------------------------------------------------------------
test_pipeline_range_negotiate: Test whether multiple pipelined requests with content negotiations are processed and returned in the same order
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `206`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Range` header is present
* `Content-Length` header is present
* `Content-Length` header has value `100`
* Parsing second response
* Response parsed
* Status is `300`
* `Alternates` header is present
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Parsing third response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=iso-2022-jp`
* `Content-Language` header is present
* `Content-Language` header has value `ja`
* `Content-Length` header is present
* `Content-Length` header has value `7635`
* Payload is empty
* Socket connection is closed
[PASSED]

> HEAD http://cs531-kgarg/a3-test/index.html.en HTTP/1.1
> Range: bytes=-100
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a3-test/index.html HTTP/1.1
> Negotiate: 1.0
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a3-test/index.html.ja.jis HTTP/1.1
> Host: cs531-kgarg:80
> Connection: close
> 

< HTTP/1.1 206 Partial Content
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "8861349ef2fe9e4a28054f96832ae7cf-YnXfg0gjGq"
< Content-Range: bytes 7133-7232/7233
< Content-Language: en
< Content-Length: 100
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 300 Multiple Choice
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Alternates: {"index.html.de" 1 {type de} {length 7316}}, {"index.html.en" 1 {type en} {length 7233}}, {"index.html.es" 1 {type es} {length 7643}}, {"index.html.ja.jis" 1 {type ja} {length 7635}}, {"index.html.ko.euc-kr" 1 {type ko} {length 6951}}, {"index.html.ru.koi8-r" 1 {type ru} {length 7277}}
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:13:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 03 Nov 2018 14:10:11 GMT
< Etag: "7f4abbb6cfe16587a6ce6c1e98c99c3c-ZoGFxmxXOL"
< Content-Language: ja
< Content-Length: 7635
< Content-Type: text/html; charset=iso-2022-jp
< Connection: close

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_useragent_get_text_ok
PASSED: test_partial_content_range_language
PASSED: test_chunked_404
PASSED: test_conditional_head_image_fresh
PASSED: test_conditional_head_image_stale
PASSED: test_no_accept_header_multiple_choices
PASSED: test_ambiguous_accept_header_multiple_choices
PASSED: test_accept_header_png_ok
PASSED: test_accept_header_text_ok
PASSED: test_not_accptable_encoding
PASSED: test_explicit_extention_ignore_content_negotiation
PASSED: test_ambiguous_accept_language_multiple_choices
PASSED: test_not_accptable_incompatiple_charset
PASSED: test_partial_content_range_text
PASSED: test_etag_precondition_failure
PASSED: test_explicit_language_charset_etag
PASSED: test_valid_etag_conditional_get
PASSED: test_pipeline_range_negotiate
--------------------------------------------------------------------------------
TOTAL: 18, PASSED: 18, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.
================================================================================
Assignment: cs531a4
Student: Kritika Garg <[email protected]>
Time: 20191118-172653 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a4
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a4` branch/tag out
Released at: 2019-11-14T21:30:48Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/www/cs531server/logs/
 ---> Using cache
 ---> 2689462361d6
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> c2f51c6509f4
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> 366251389a19
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> b5138158d4be
Step 9/13 : COPY . /app/
 ---> 41ad3d5a8772
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 97c73911f583
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=2d45fac81e13f8706223b910af2f323f53c5bec621dcd2d1fd6033e888913e82
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.1 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.13.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 97c73911f583
 ---> c444f01e0d63
Step 11/13 : EXPOSE 80
 ---> Running in f89e57117391
Removing intermediate container f89e57117391
 ---> 016690bf468a
Step 12/13 : RUN chmod a+x *.py
 ---> Running in 8492ffdbcfcb
Removing intermediate container 8492ffdbcfcb
 ---> 18a6417a4275
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in 6c01563fe102
Removing intermediate container 6c01563fe102
 ---> 085d758a64ba
Successfully built 085d758a64ba
Successfully tagged cs531/kgarg:a4

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a4 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_basic_auth_realm: Test whether files are protected with HTTP Basic auth and return configured realm
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header has value `Basic realm="Fried Twice"`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited1/protected HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Basic realm="Fried Twice"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_basic_wrong_auth_unauthorized: Test whether access is unauthorized with wrong Authorization header
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header has value `Basic realm="Fried Twice"`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited1/protected HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Authorization: Basic YmRhOm1sbg==
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Basic realm="Fried Twice"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_nested_basic_auth: Test whether files in nested directories are protected with HTTP Basic auth
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header has value `Basic realm="Fried Twice"`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited1/1/protected2 HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Basic realm="Fried Twice"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_basic_auth_ok: Test whether access is granted with valid Authorization header
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `application/octet-stream`
* `Content-Length` header is present
* `Content-Length` header has value `24`
* Payload contains `this file is protected`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited1/protected HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Referer: http://cs531-kgarg/a4-test/index.html
> Authorization: Basic bWxuOm1sbg==
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "8ed899d84c0b40379d76da3fa7f7670b-VkNs5xJ0EM"
< Content-Length: 24
< Content-Type: application/octet-stream
< WWW-Authenticate: Basic realm="Fried Twice"
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (24 bytes)]

--------------------------------------------------------------------------------
test_nested_basic_auth_ok: Test whether access is granted with valid Authorization header in nested directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `application/octet-stream`
* `Content-Length` header is present
* `Content-Length` header has value `29`
* Payload contains `this file is protected too!`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited1/1/protected2 HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Authorization: Basic YmRhOmJkYQ==
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "a273c13b965967fa99646f6cde0f0ef2-1nEUkM4n08"
< Content-Length: 29
< Content-Type: application/octet-stream
< WWW-Authenticate: Basic realm="Fried Twice"
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (29 bytes)]

--------------------------------------------------------------------------------
test_double_auth_bad: Test whether two Authorization headers report a bad request
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Transfer-Encoding` header is present
* `Transfer-Encoding` header has value `chunked`
* Payload is not empty
[PASSED]

> GET http://cs531-kgarg/a4-test/limited1/protected HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Authorization: Basic YmRhOmJkYQ==
> Authorization: Basic ZZRhOmJkYQ==
> Connection: close
> 

< HTTP/1.1 400 Bad Request
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Basic realm="Fried Twice"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (180 bytes)]

--------------------------------------------------------------------------------
test_nested_digest_auth: Test whether files in nested directories are protected with HTTP Digest auth
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODAzOS45ODM1MDYgMmEzODA5NmQwODM1YWNmZDNjMjRiMDE0NWI2OWUyMGY="
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_head_nested_digest_auth: Test whether HEAD method in nested directories is protected with HTTP Digest auth
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> HEAD http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODAzOS45OTU1OTg2IGJlZTU3ZTI3NDgxYTYxMDEzMmMyZmM0MjBiZGVhNjlj"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_options_nested_digest_auth: Test whether OPTIONS method in nested directories is protected with HTTP Digest auth
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> OPTIONS http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4wMDc2NzE2IGFhNjYxNTBmZDZjMDA5ZjVhZDQwOTcxMmE1OWU4ODA2"
< Allow: GET, HEAD, OPTIONS, TRACE
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_wrong_realm_unauthorized: Test whether an incorrect realm prevents authorization
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> Authorization: Digest username="mln", realm="ColonialPlace", uri="http://cs531-kgarg/a4-test/limited2/foo/bar.txt", qop=auth, nonce="MTU3NDA5ODA0MC4wMTk3MTQ0IDUwODQ1NDc0NGVkZDE5NmNhYmZiNTMyMzVmZWEwZTky", nc=00000001, cnonce="014a54548c61ba03827ef6a4dc2f7b4c", response="dd556917b1b2f5da0d7274288fa52b41"
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4wMzIxMTQ3IDkzMThmMjE5NTc1ZmU2MTUyNWEzZjAxOTU2ZGUyMGU3", opaque="4c64111d6c53ded72cf1ed71a538b20b"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_wrong_ncount_unauthorized: Test whether an incorrect nonce count prevents authorization
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> Authorization: Digest username="mln", realm="Colonial Place", uri="http://cs531-kgarg/a4-test/limited2/foo/bar.txt", qop=auth, nonce="MTU3NDA5ODA0MC4wNDQzMzk3IGVhNDY0MTQxODE2YzU0MTdlMTk0NzRmMzk5NzNkYTZm", nc=00000002, cnonce="014a54548c61ba03827ef6a4dc2f7b4c", response="7a3ff0b4fd00eb3f4dbdd583b23a276a"
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4wNTY2MTkgYTc1ZDg1Yjg3NGJhM2ViM2ZmMzk1NTEyYThhOTU3MGE=", opaque="4c64111d6c53ded72cf1ed71a538b20b"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_wrong_digest_response_unauthorized: Test whether an incorrect digest response prevents authorization
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> Authorization: Digest username="mln", realm="Colonial Place", uri="http://cs531-kgarg/a4-test/limited2/foo/bar.txt", qop=auth, nonce="MTU3NDA5ODA0MC4wNjg2OTQ2IGI0NTY4MTNhYTQwZGYzZDNiNDU0YjYzNWM4NWY0OTVk", nc=00000001, cnonce="014a54548c61ba03827ef6a4dc2f7b4c", response="d758ab4c15edb441cfc49a7c382c2fdd"
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4wODA4NDQgNjRjNWVkNmE1MWNkMmNmM2MxNWNlMjNjZDA1ZDQ5ZDI=", opaque="4c64111d6c53ded72cf1ed71a538b20b"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_wrong_digest_user_unauthorized: Test whether an incorrect digest user prevents authorization
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> Authorization: Digest username="bda", realm="Colonial Place", uri="http://cs531-kgarg/a4-test/limited2/foo/bar.txt", qop=auth, nonce="MTU3NDA5ODA0MC4wOTMwMDggNjcwZGM5Y2JjNzQ0ZDkyY2E5ZGM0MzY5MmJmZDAwZjk", nc=00000002, cnonce="014a54548c61ba03827ef6a4dc2f7b4c", response="d2aacb77494904e1d5b63268fea28613"
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4xMDQ5MDk0IDM2MDViY2M4ZDMwYjBmZWVlODUxNWYyODM3ODA1N2Qx", opaque="4c64111d6c53ded72cf1ed71a538b20b"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_correct_realm_authorized: Test whether a correct realm with other values grants authorization
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Authentication-Info` header is present
* `Authentication-Info` header contains `bbe4fcff28c5abcb99fc1633464eaf40`
[PASSED]

> GET http://cs531-kgarg/a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg:80
> Authorization: Digest username="mln", realm="Colonial Place", uri="http://cs531-kgarg/a4-test/limited2/foo/bar.txt", qop=auth, nonce="MTU3NDA5ODA0MC4xMTY2OTk3IDJlYjljZjJjY2FjNzBjODdhNTRiMTNmMzhjNjM2OWJl", nc=00000001, cnonce="014a54548c61ba03827ef6a4dc2f7b4c", response="352a3604e5e9ebc4c3fe58b438178f74"
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "2d984d55cdc9de46f8dabb36b57a86f4-4qvCmBVYnr"
< Content-Length: 18
< Content-Type: text/plain
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4xMjg4Mzc4IGQxZWU4MDc3NjM4YjllMDBmYjMxYmY4OTYxYzg3MGRl", opaque="4c64111d6c53ded72cf1ed71a538b20b"
< Authentication-Info: Digest rspauth="bbe4fcff28c5abcb99fc1633464eaf40", cnonce="014a54548c61ba03827ef6a4dc2f7b4c", nc=00000001, qop=auth
< Accept-Range: bytes
< Connection: close
< 
* [Payload redacted (18 bytes)]

--------------------------------------------------------------------------------
test_auth_over_conditional_get: Test whether authorization is ensured before conditional GET precondition check
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header begins with `Digest`
[PASSED]

> GET /a4-test/limited2/foo/bar.txt HTTP/1.1
> Host: cs531-kgarg
> If-Match: "x248kjaldsf00000000002"
> Connection: close
> 

< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4xNDEzNTE3IDZhODFkZGM1MGEzZWNkYmY3ZGZkZjhhYjFjN2NkNTcx"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (182 bytes)]

--------------------------------------------------------------------------------
test_large_range_not_satisfiable: Test whether a Range larger than the file returns 416 Range Not Satisfiable
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `416`
* Payload is empty
[PASSED]

> HEAD /a4-test/index.html.ru.koi8-r HTTP/1.1
> Host: cs531-kgarg:80
> Range: bytes=20000-29999
> Connection: close
> 

< HTTP/1.1 416 Range Not Satisfiable
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "a4fb640ff753fbdeb23ddc7cf605dd0d-6vyh1rNVgX"
< Content-Range: bytes */7277
< Content-Language: ru
< Content-Type: text/html; charset=koi8-r
< WWW-Authenticate: Digest realm="Colonial Place", algorithm=MD5, qop="auth", nonce="MTU3NDA5ODA0MC4xNDEzNTE3IDZhODFkZGM1MGEzZWNkYmY3ZGZkZjhhYjFjN2NkNTcx"
< Transfer-Encoding: chunked
< Connection: close

--------------------------------------------------------------------------------
test_pipeline_auth: Test whether authorization is respected in pipeline requests
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `416`
* Parsing second response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Language` header is present
* `Content-Language` header has value `de`
* Parsing third response
* Response parsed
* Status is `401`
* `WWW-Authenticate` header is present
* `WWW-Authenticate` header has value `Basic realm="Fried Twice"`
* Parsing fourth response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Content-Language` header is present
* `Content-Language` header has value `en`
* Parsing fifth response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header has value `text/html; charset=iso-2022-jp`
* `Content-Language` header is present
* `Content-Language` header has value `ja`
* `Content-Length` header is present
* `Content-Length` header has value `7635`
* Payload is empty
* Socket connection is closed
[PASSED]

> HEAD http://cs531-kgarg/a4-test/limited1/protected HTTP/1.1
> Range: bytes=20000-29999
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Authorization: Basic YmRhOmJkYQ==
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a4-test/index.html.de HTTP/1.1
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a4-test/limited1/protected HTTP/1.1
> Host: cs531-kgarg:80
> User-Agent: CS531 Assignment 4 Tester/1574098039
> Authorization: Basic YmRhOmJkYQxx
> 
> HEAD http://cs531-kgarg/a4-test/index.html.en HTTP/1.1
> Host: cs531-kgarg:80
> 
> HEAD http://cs531-kgarg/a4-test/index.html.ja.jis HTTP/1.1
> Host: cs531-kgarg:80
> Connection: close
> 

< HTTP/1.1 416 Range Not Satisfiable
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "8ed899d84c0b40379d76da3fa7f7670b-VkNs5xJ0EM"
< Content-Range: bytes */24
< Content-Type: application/octet-stream
< WWW-Authenticate: Basic realm="Fried Twice"
< Transfer-Encoding: chunked
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "1f2e3787d5543944195a962517a8fd8d-7w7IQAgE0L"
< Content-Language: de
< Content-Length: 7316
< Content-Type: text/html
< WWW-Authenticate: Basic realm="Fried Twice"
< Connection: keep-alive
< 
< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< WWW-Authenticate: Basic realm="Fried Twice"
< Transfer-Encoding: chunked
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "8861349ef2fe9e4a28054f96832ae7cf-Vkkh5xJ0EM"
< Content-Language: en
< Content-Length: 7233
< Content-Type: text/html
< WWW-Authenticate: Basic realm="Fried Twice"
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Mon, 18 Nov 2019 17:27:15 GMT
< Server: kitkat.2.0
< Last-Modified: Tue, 10 Jan 2012 00:02:44 GMT
< Etag: "7f4abbb6cfe16587a6ce6c1e98c99c3c-WlRHP5EzQ0"
< Content-Language: ja
< Content-Length: 7635
< Content-Type: text/html; charset=iso-2022-jp
< WWW-Authenticate: Basic realm="Fried Twice"
< Connection: close

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_basic_auth_realm
PASSED: test_basic_wrong_auth_unauthorized
PASSED: test_nested_basic_auth
PASSED: test_basic_auth_ok
PASSED: test_nested_basic_auth_ok
PASSED: test_double_auth_bad
PASSED: test_nested_digest_auth
PASSED: test_head_nested_digest_auth
PASSED: test_options_nested_digest_auth
PASSED: test_wrong_realm_unauthorized
PASSED: test_wrong_ncount_unauthorized
PASSED: test_wrong_digest_response_unauthorized
PASSED: test_wrong_digest_user_unauthorized
PASSED: test_correct_realm_authorized
PASSED: test_auth_over_conditional_get
PASSED: test_large_range_not_satisfiable
PASSED: test_pipeline_auth
--------------------------------------------------------------------------------
TOTAL: 17, PASSED: 17, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.

Assignment 2 Report

================================================================================
Assignment: cs531a1
Student: Kritika Garg <[email protected]>
Time: 20191019-165747 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a2
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a2` branch/tag out
Released at: 2019-10-18T05:40:20Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/logs/
 ---> Using cache
 ---> 2c56ada8bde9
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> 1c259e57765a
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> 3ec0c7e0fd3c
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> daff0b88b6e2
Step 9/13 : COPY . /app/
 ---> 9834777558a9
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in bdebb482a9dd
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl (226kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=17fd2972a823f65fead361cb01f6d2bb18e8cc2d4768812f9ed190ef7d38c1d6
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.0 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.12.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container bdebb482a9dd
 ---> 0ff3a7b97a69
Step 11/13 : EXPOSE 80
 ---> Running in 59932f72b60a
Removing intermediate container 59932f72b60a
 ---> 3b18a2caa8f1
Step 12/13 : RUN chmod a+x *.py
 ---> Running in 80eb04ec70b9
Removing intermediate container 80eb04ec70b9
 ---> 27848aec7b69
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in b77d74d31d3a
Removing intermediate container b77d74d31d3a
 ---> 4a93e433ef0c
Successfully built 4a93e433ef0c
Successfully tagged cs531/kgarg:a2

Related existing container removed
A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a1 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_url_get_ok: Test whether the URL of the assignment 1 directory returns HTTP/1.1 200 OK on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `200`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET http://cs531-kgarg/a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-9yruxVpOwQ"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_url_head_ok: Test whether the URL of the assignment 1 directory returns 200 on HEAD
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload is empty
[PASSED]

> HEAD http://cs531-kgarg/a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-9yruxVpOwQ"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_path_head_ok: Test whether the relative path of the assignment 1 directory returns 200 on HEAD
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload is empty
[PASSED]

> HEAD /a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-9yruxVpOwQ"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_path_options_ok: Test whether the relative path of the assignment 1 directory returns 200 on OPTIONS
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Allow` header is present
* `Allow` header contains `GET`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> OPTIONS /a1-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-9yruxVpOwQ"
< Content-Length: 0
< Content-Type: text/html
< Connection: close
< Allow: GET, HEAD, OPTIONS, TRACE

--------------------------------------------------------------------------------
test_get_missing: Test whether a non-existing path returns 404 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET /1/1.1/go%20hokies.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_get_duplicate_path_prefix: Test tight path prefix checking
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET /a1-test/a1-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_unsupported_version: Test whether a request with unsupported version returns 505
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `505`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET / HTTP/1.11
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 505 HTTP Version Not Supported
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_invalid_request: Test whether an invalid request returns 400
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> qwerty
> 

< HTTP/1.1 400 Bad Request
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: keep-alive

--------------------------------------------------------------------------------
test_missing_host_header: Test whether missing Host header in a request returns 400
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `400`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> GET / HTTP/1.1
> Connection: close
> 

< HTTP/1.1 400 Bad Request
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_post_not_implemented: Test whether the assignment 1 returns 501 on POST
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `501`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
[PASSED]

> POST /a1-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 501 Not Implemented
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_trace_echoback: Test whether the server echoes back the request on TRACE
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `message/http`
* `Date` header is present
* `Date` header is in the preferred RCF7231 format
* Payload begins with `TRACE /a1-test/1/1.4/ HTTP/1.1`
* Payload contains `User-Agent: CS531 Assignment 1 Tester/1571504292`
* Payload contains `Connection: close`
[PASSED]

> TRACE /a1-test/1/1.4/ HTTP/1.1
> Host: cs531-kgarg
> User-Agent: CS531 Assignment 1 Tester/1571504292
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 122
< Content-Type: message/http
< Connection: close
< 
* [Payload redacted (122 bytes)]

--------------------------------------------------------------------------------
test_get_escaped_file_name: Test whether the escaped file name is respected
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload contains `lower case html`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.4/test%3A.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "4400055101ad85035c4d0d010bf199b6-lm2ckqvMYx"
< Content-Length: 25
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (25 bytes)]

--------------------------------------------------------------------------------
test_get_escape_escaping_character: Test whether the escaped escaping caracter in a file name is respected
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload contains `Go Monarchs!`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.4/escape%25this.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "d23695deea09abedde3aaf360277a782-jkZcA1vOx8"
< Content-Length: 67
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (67 bytes)]

--------------------------------------------------------------------------------
test_get_jpeg_image: Test whether a JPEG image returns 200 with proper Content-Length on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Length` header is present
* `Content-Length` header has value `38457`
* Payload size is `38457` bytes
[PASSED]

> GET http://cs531-kgarg/a1-test/2/0.jpeg HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "a5ee39e4649fdd082e17b9c6a5758885-nozcxpYWRv"
< Content-Length: 38457
< Content-Type: image/jpeg
< Connection: close
< 
* [Payload redacted (38457 bytes)]

--------------------------------------------------------------------------------
test_get_case_sensitive_file_extension: Test whether file extensions are treated case-sensitive
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* HTTP version is `HTTP/1.1`
* Status is `404`
[PASSED]

> GET http://cs531-kgarg/a1-test/2/0.JPEG HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 404 Not Found
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_get_empty_text_file: Test whether an empty file returns zero bytes with 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* `Content-Length` header is present
* `Content-Length` header has value `0`
* Payload is empty
[PASSED]

> GET http://cs531-kgarg/a1-test/4/thisfileisempty.txt HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "d41d8cd98f00b204e9800998ecf8427e-pq9fyEBwRm"
< Content-Length: 0
< Content-Type: text/plain
< Connection: close

--------------------------------------------------------------------------------
test_get_empty_unknown_file_directory: Test whether an unknown empty file or directory returns zero bytes and a valid Content-Type with 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `application/octet-stream`
* `Content-Length` header is present
* `Content-Length` header has value `0`
* Payload is empty
[PASSED]

> GET http://cs531-kgarg/a1-test/4/directory3isempty HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "d41d8cd98f00b204e9800998ecf8427e-qrMHR6o2MZ"
< Content-Length: 0
< Content-Type: application/octet-stream
< Connection: close

--------------------------------------------------------------------------------
test_get_filename_with_many_dots: Test whether file names with multiple dots return 200 on GET
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/xml`
[PASSED]

> GET http://cs531-kgarg/a1-test/1/1.2/arXiv.org.Idenitfy.repsonse.xml HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "60757ce40ecb43052efe0f5a329a3d0d-vzRS403lkx"
< Content-Length: 3142
< Content-Type: text/xml
< Connection: close
< 
* [Payload redacted (3142 bytes)]

--------------------------------------------------------------------------------
test_get_magic_cookie_of_a_binary_file: Test whether a GIF file contains identifying magic cookie
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* Payload begins with `GIF89a`
[PASSED]

> GET http://cs531-kgarg/a1-test/2/6.gif HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "f15d0e729fffe52ad0afc2320484c553-wA7CPZWNwK"
< Content-Length: 49803
< Content-Type: image/gif
< Connection: close
< 
* [Payload redacted (49803 bytes)]

--------------------------------------------------------------------------------
test_access_log_as_virtual_uri: Test whether the access log is available as a Virtual URI in the Common Log Format
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/plain`
* Payload is not empty
* Selected log entry `127.0.0.1 - - [17/Oct/2019:01:11:39 +0000] "GET http://0.0.0.0:8080/a2-test/2/index.html HTTP/1.1" 200 1936`
* `127.0.0.1` is a valid IP address
* `127.0.0.1` is potentially the IP address of a client
* `17/Oct/2019:01:11:39 +0000` is formatted correctly
* `200` is a valid status code
* `1936` is a valid size
[PASSED]

> GET /.well-known/access.log HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 16:58:08 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 19 Oct 2019 16:58:00 GMT
< ETag: "88a7cad52b945d84eed8653808f46dea-JjJcynx4r0"
< Content-Length: 221719
< Content-Type: text/plain
< Connection: close
< 
* [Payload redacted (221719 bytes)]

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_url_get_ok
PASSED: test_url_head_ok
PASSED: test_path_head_ok
PASSED: test_path_options_ok
PASSED: test_get_missing
PASSED: test_get_duplicate_path_prefix
PASSED: test_unsupported_version
PASSED: test_invalid_request
PASSED: test_missing_host_header
PASSED: test_post_not_implemented
PASSED: test_trace_echoback
PASSED: test_get_escaped_file_name
PASSED: test_get_escape_escaping_character
PASSED: test_get_jpeg_image
PASSED: test_get_case_sensitive_file_extension
PASSED: test_get_empty_text_file
PASSED: test_get_empty_unknown_file_directory
PASSED: test_get_filename_with_many_dots
PASSED: test_get_magic_cookie_of_a_binary_file
PASSED: test_access_log_as_virtual_uri
--------------------------------------------------------------------------------
TOTAL: 20, PASSED: 20, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.
================================================================================
Assignment: cs531a2
Student: Kritika Garg <[email protected]>
Time: 20191019-170233 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a2
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a2` branch/tag out
Released at: 2019-10-18T05:40:20Z
Step 1/13 : FROM python:3.7
 ---> 02d2bb146b3b
Step 2/13 : LABEL maintainer="Kritika Garg <@kritikagarg7>"
 ---> Using cache
 ---> 5073b4ad5996
Step 3/13 : ENV  PYTHONUNBUFFERED=1
 ---> Using cache
 ---> 6e30d35586c7
Step 4/13 : ENV  DOCROOT=/var/www/cs531server
 ---> Using cache
 ---> 8c110a5ef2a8
Step 5/13 : ENV  LOG_DIR=/var/logs/
 ---> Using cache
 ---> 2c56ada8bde9
Step 6/13 : ADD  sample/* $DOCROOT/
 ---> Using cache
 ---> 1c259e57765a
Step 7/13 : ADD  logs/* $LOG_DIR/
 ---> Using cache
 ---> 3ec0c7e0fd3c
Step 8/13 : WORKDIR /app
 ---> Using cache
 ---> daff0b88b6e2
Step 9/13 : COPY . /app/
 ---> e93e97b86703
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 9db3d996c53c
Collecting ruamel.yaml (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/90/ecff85a2e9c497e2fa7142496e10233556b5137db5bd46f3f3b006935ca8/ruamel.yaml-0.16.5-py2.py3-none-any.whl (123kB)
Collecting hashids (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/02/d3/0191ddd06cace1873f237f134a357d8af84c0ed3740526f4946ddbfaeed6/hashids-1.2.0.tar.gz
Collecting Jinja2 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/65/e0/eb35e762802015cab1ccee04e8a277b03f1d8e53da3ec3106882ec42558b/Jinja2-2.10.3-py2.py3-none-any.whl (125kB)
Collecting python-dateutil (from -r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl (226kB)
Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.8" (from ruamel.yaml->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/40/80/da16b691d5e259dd9919a10628e541fca321cb4b078fbb88e1c7c22aa42d/ruamel.yaml.clib-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (547kB)
Collecting MarkupSafe>=0.23 (from Jinja2->-r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Collecting six>=1.5 (from python-dateutil->-r requirements.txt (line 4))
  Downloading https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Building wheels for collected packages: hashids
  Building wheel for hashids (setup.py): started
  Building wheel for hashids (setup.py): finished with status 'done'
  Created wheel for hashids: filename=hashids-1.2.0-cp37-none-any.whl size=6724 sha256=f4746ea296eb4e540acad8961a86e8ff2a38839ab498c88df4892b02bafcbde9
  Stored in directory: /root/.cache/pip/wheels/f9/a9/3e/b57f0dba48497aacf3c20fc4aeefc7748a2ba34c8a8e48bf44
Successfully built hashids
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, hashids, MarkupSafe, Jinja2, six, python-dateutil
Successfully installed Jinja2-2.10.3 MarkupSafe-1.1.1 hashids-1.2.0 python-dateutil-2.8.0 ruamel.yaml-0.16.5 ruamel.yaml.clib-0.2.0 six-1.12.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 9db3d996c53c
 ---> 6512b543b266
Step 11/13 : EXPOSE 80
 ---> Running in 9d2ae983d349
Removing intermediate container 9d2ae983d349
 ---> 91bef8957761
Step 12/13 : RUN chmod a+x *.py
 ---> Running in 441d8e27087a
Removing intermediate container 441d8e27087a
 ---> 18252a4ce0c8
Step 13/13 : CMD ["./server.py", "0.0.0.0", "80"]
 ---> Running in 7ca871133ced
Removing intermediate container 7ca871133ced
 ---> 0ff0d5906c8a
Successfully built 0ff0d5906c8a
Successfully tagged cs531/kgarg:a2

A new container is created and the server `cs531-kgarg` is deployed successfully

Testing server: cs531-kgarg against cs531a2 test suite

Testing cs531-kgarg:80
--------------------------------------------------------------------------------
test_get_directory_listing: Test whether a2-test directory root returns directory listing
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 19 Oct 2019 17:02:44 GMT
< ETag: "73c0ac83c0c9026008bfde8098ffa338-yDmsJ4Yj31"
< Content-Length: 2539
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (2539 bytes)]

--------------------------------------------------------------------------------
test_redirect_to_trailing_slash_for_directory_url: Test whether redirects URL to trailing slashes when missing for existing directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `301`
* `Location` header is present
* `Location` header ends with `/a2-test/2/`
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/2 HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 301 Moved Permanently
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Location: /a2-test/2/
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_redirect_to_trailing_slash_for_directory_path: Test whether redirects path to trailing slashes when missing for existing directories
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `301`
* `Location` header is present
* `Location` header ends with `/a2-test/1/`
* Socket connection is closed
[PASSED]

> GET /a2-test/1 HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 301 Moved Permanently
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Location: /a2-test/1/
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_get_default_index_file: Test whether default index.html is returned instead of directory listing
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is not empty
* Fetching `/a2-test/2/index.html` for content comparison
* Contents of `/a2-test/2/` and `/a2-test/2/index.html` are the same
* Socket connection is closed
[PASSED]

> GET http://cs531-kgarg/a2-test/2/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-o0vS8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_redirect_as_per_regexp_trailing_wildcard_capture: Test whether redirects as per the regular expression with wildcard trailing capture group
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `302`
* `Location` header is present
* `Location` header ends with `/a2-test/1/1.1/assignment1.ppt`
[PASSED]

> HEAD /a2-test/1/1.3/assignment1.ppt HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 302 Found
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Location: /a2-test/1/1.1/assignment1.ppt
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_redirect_as_per_regexp_trailing_specific_file: Test whether redirects as per the regular expression with a specific trailing file name
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `302`
* `Location` header is present
* `Location` header ends with `/a2-test/galaxie.html`
[PASSED]

> HEAD /a2-test/coolcar.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 302 Found
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Location: /a2-test/galaxie.html
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_dont_redirect_target_file: Test whether the target of the configured redirect returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/galaxie.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 03:44:27 GMT
< ETag: "7d344af10346d1a6f168ecc66d6885af-Q26F94y13n"
< Content-Length: 96
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_fresh: Test whether conditional HEAD of a fresh file returns 304 Not Modified
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `304`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 20 Oct 2018 02:33:21 GMT
> Connection: close
> 

< HTTP/1.1 304 Not Modified
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_stale: Test whether conditional HEAD of a stale file returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: Sat, 20 Oct 2018 02:33:20 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_invalid_datetime: Test whether conditional HEAD with invalid datetime returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: who-doesn't-want-a-fairlane?
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_conditional_head_unsupported_datetime_format: Test whether conditional HEAD with unsupported datetime format returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Modified-Since: 2018-10-20 02:33:21.304307000 -0000
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_include_etag: Test whether the HEAD response contains an ETag
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `ETag` header is present
* `ETag` is not empty and properly formatted in double quotes as `"e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"`
[PASSED]

> HEAD /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close

--------------------------------------------------------------------------------
test_valid_etag_ok: Test whether a valid ETag returns 200 OK
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `1966 Ford Fairlane`
[PASSED]

> GET /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-pq9fyEBwRm"
< Content-Length: 1936
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (1936 bytes)]

--------------------------------------------------------------------------------
test_etag_if_match_failure: Test whether a random ETag returns 412 Precondition Failed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `412`
[PASSED]

> GET /a2-test/2/fairlane.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "203948kjaldsf002"
> Connection: close
> 

< HTTP/1.1 412 Precondition Failed
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_implicit_keep_alive_until_timeout: Test whether the socket connection is kept alive by default and closed after the set timeout
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making a subsequent request after `5` seconds
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `408`
* `Connection` header is present
* `Connection` header has value `close`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-o0vS8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 408 Request Timeout
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_explicit_keep_alive_until_timeout: Test whether the socket connection is kept alive when explicitly requested and closed after the set timeout
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making a subsequent request after `5` seconds
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `408`
* `Connection` header is present
* `Connection` header has value `close`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: keep-alive
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> Connection: keep-alive
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-o0vS8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 408 Request Timeout
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Content-Length: 0
< Connection: close

--------------------------------------------------------------------------------
test_trace_unnecessary_conditionals: Test whether many unnecessary conditionals are not processed
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `message/http`
* Payload begins with `TRACE /a2-test/2/index.html HTTP/1.1`
[PASSED]

> TRACE /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> If-Match: "not-a-real-etag"
> If-None-Match: "also-not-a-real-etag"
> If-Modified-Since: Fri, 19 Oct 2018 22:33:21 GMT
> If-Unmodified-Since: Fri, 19 Oct 2018 22:33:21 GMT
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Content-Length: 248
< Content-Type: message/http
< Connection: close
< 
* [Payload redacted (248 bytes)]

--------------------------------------------------------------------------------
test_pipeline_requests: Test whether multiple pipelined requests are processed and returned in the same order
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Parsing second response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Parsing third response
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> GET /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 19 Oct 2019 17:02:44 GMT
< ETag: "73c0ac83c0c9026008bfde8098ffa338-yDmsJ4Yj31"
< Content-Length: 2539
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-o0vS8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 19 Oct 2019 17:02:44 GMT
< ETag: "73c0ac83c0c9026008bfde8098ffa338-yDmsJ4Yj31"
< Content-Length: 2539
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (2539 bytes)]

--------------------------------------------------------------------------------
test_long_lived_connection: Test whether the socket connection is kept alive to process multiple requests successively
* Connecting to the `cs531-kgarg:80` server
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making second request
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload is empty
* Socket connection is kept alive
* Making third request
* Reusing existing connection
* Request data sent
* Response data read
* Response parsed
* Status is `200`
* `Content-Type` header is present
* `Content-Type` header begins with `text/html`
* Payload contains `coolcar.html`
* Payload contains `ford`
* Socket connection is closed
[PASSED]

> HEAD /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> 
> HEAD /a2-test/2/index.html HTTP/1.1
> Host: cs531-kgarg
> 
> GET /a2-test/ HTTP/1.1
> Host: cs531-kgarg
> Connection: close
> 

< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 19 Oct 2019 17:02:44 GMT
< ETag: "73c0ac83c0c9026008bfde8098ffa338-yDmsJ4Yj31"
< Content-Length: 2539
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 20 Oct 2018 02:33:21 GMT
< ETag: "e5359f8ba4c1697b0d5088c8344d08d5-o0vS8p0wyE"
< Content-Length: 1936
< Content-Type: text/html
< Connection: keep-alive
< 
< HTTP/1.1 200 OK
< Date: Sat, 19 Oct 2019 17:02:52 GMT
< Server: kitkat.2.0
< Last-Modified: Sat, 19 Oct 2019 17:02:44 GMT
< ETag: "73c0ac83c0c9026008bfde8098ffa338-yDmsJ4Yj31"
< Content-Length: 2539
< Content-Type: text/html
< Connection: close
< 
* [Payload redacted (2539 bytes)]

=================================== SUMMARY ====================================
Server: cs531-kgarg:80
Test Case Results:
PASSED: test_get_directory_listing
PASSED: test_redirect_to_trailing_slash_for_directory_url
PASSED: test_redirect_to_trailing_slash_for_directory_path
PASSED: test_get_default_index_file
PASSED: test_redirect_as_per_regexp_trailing_wildcard_capture
PASSED: test_redirect_as_per_regexp_trailing_specific_file
PASSED: test_dont_redirect_target_file
PASSED: test_conditional_head_fresh
PASSED: test_conditional_head_stale
PASSED: test_conditional_head_invalid_datetime
PASSED: test_conditional_head_unsupported_datetime_format
PASSED: test_include_etag
PASSED: test_valid_etag_ok
PASSED: test_etag_if_match_failure
PASSED: test_implicit_keep_alive_until_timeout
PASSED: test_explicit_keep_alive_until_timeout
PASSED: test_trace_unnecessary_conditionals
PASSED: test_pipeline_requests
PASSED: test_long_lived_connection
--------------------------------------------------------------------------------
TOTAL: 19, PASSED: 19, FAILED: 0
===============================================================================

Destroying server: cs531-kgarg
Server `cs531-kgarg` destroyed successfully.

Assignment 1 Report

================================================================================
Assignment: cs531a1
Student: Kritika Garg <[email protected]>
Time: 20191004-133403 UTC
Repository: https://github.com/kritikagarg/cs531/tree/a1
Server: cs531-kgarg
================================================================================

Deploying server: cs531-kgarg

Cloning the `https://github.com/kritikagarg/cs531.git` repo and checking the `a1` branch/tag out
500 Server Error: Internal Server Error ("error fetching: fatal: Couldn't find remote ref a1
: exit status 128")
Building image `cs531/kgarg:a1` failed
Ensure that the repo is accessible and contains a valid `Dockerfile`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.