ue_pe_web/scripts/03_server/README.md
2024-03-21 21:43:16 +01:00

27 KiB

My web server

UE PE web, TP3

Conventions

TODO

  • Differentiate document types
  • [maybe] Encode and decode files appropriately

Link between exos and steps

src_0 is the start of the TP.

src_1 is after exo 3.3

src_2 is after exo 3.4

Using the browser to test our code, printing the request:

$ python -m myserver -p 8000 -r tests/resources/www/
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nSec-Fetch-User: ?1\r\nDNT: 1\r\nSec-GPC: 1\r\n\r\n'

src_3 is after exo 3.5

Executing the tests after implementation:

$ pytest tests/test_http_request.py 
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.11.2, pytest-8.0.2, pluggy-1.4.0
rootdir: /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server
collected 14 items                                                                                                                                                                          

tests/test_http_request.py ....FFFFFFFFFF                                                                                                                                             [100%]

With verbose output:

$ pytest -v tests/test_http_request.py 
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.11.2, pytest-8.0.2, pluggy-1.4.0 -- /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server
collected 14 items                                                                                                                                                                          

tests/test_http_request.py::test_parse_request_head[GET / HTTP/1.1-expected0] PASSED                                                                                                  [  7%]
tests/test_http_request.py::test_parse_request_head[options /assets/style.css HTTP/1.1-expected1] PASSED                                                                              [ 14%]
tests/test_http_request.py::test_parse_request_head_invalid PASSED                                                                                                                    [ 21%]
tests/test_http_request.py::test_parse_request_params[params0-expected0] PASSED                                                                                                       [ 28%]
tests/test_http_request.py::test_parse_request_params[params1-expected1] FAILED                                                                                                       [ 35%]
tests/test_http_request.py::test_parse_request_params[params2-expected2] FAILED                                                                                                       [ 42%]
tests/test_http_request.py::test_parse_request_params_invalid[params0] FAILED                                                                                                         [ 50%]
tests/test_http_request.py::test_parse_request_params_invalid[params1] FAILED                                                                                                         [ 57%]
tests/test_http_request.py::test_parse_request_params_invalid[params2] FAILED                                                                                                         [ 64%]
tests/test_http_request.py::test_parse_request[GET /index.html HTTP/1.1\nHost: example.org\nUser-Agent: curl/7.81.0\nAccept: */*\n\n-expected0] FAILED                                [ 71%]
tests/test_http_request.py::test_parse_request[\n\nOPTIONS /assets/style.css HTTP/1.1\n\n-expected1] FAILED                                                                           [ 78%]
tests/test_http_request.py::test_parse_request_invalid[Host: example.org\nUser-Agent: curl/7.81.0\n\n] FAILED                                                                         [ 85%]
tests/test_http_request.py::test_parse_request_invalid[\nGET HTTP/1.1\n\n] FAILED                                                                                                     [ 92%]
tests/test_http_request.py::test_parse_request_invalid[GET / HTTP/1.1\nHost example.org\n\nGET / HTTP/1.1\nHost: example.org\n\nUser-Agent: curl/7.81.0\n\n] FAILED                   [100%]

src_4 is after exo 3.6

$ pytest -v tests/test_http_request.py 
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.11.2, pytest-8.0.2, pluggy-1.4.0 -- /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server
collected 14 items                                                                                                                                                                          

tests/test_http_request.py::test_parse_request_head[GET / HTTP/1.1-expected0] PASSED                                                                                                  [  7%]
tests/test_http_request.py::test_parse_request_head[options /assets/style.css HTTP/1.1-expected1] PASSED                                                                              [ 14%]
tests/test_http_request.py::test_parse_request_head_invalid PASSED                                                                                                                    [ 21%]
tests/test_http_request.py::test_parse_request_params[params0-expected0] PASSED                                                                                                       [ 28%]
tests/test_http_request.py::test_parse_request_params[params1-expected1] PASSED                                                                                                       [ 35%]
tests/test_http_request.py::test_parse_request_params[params2-expected2] PASSED                                                                                                       [ 42%]
tests/test_http_request.py::test_parse_request_params_invalid[params0] PASSED                                                                                                         [ 50%]
tests/test_http_request.py::test_parse_request_params_invalid[params1] PASSED                                                                                                         [ 57%]
tests/test_http_request.py::test_parse_request_params_invalid[params2] PASSED                                                                                                         [ 64%]
tests/test_http_request.py::test_parse_request[GET /index.html HTTP/1.1\nHost: example.org\nUser-Agent: curl/7.81.0\nAccept: */*\n\n-expected0] FAILED                                [ 71%]
tests/test_http_request.py::test_parse_request[\n\nOPTIONS /assets/style.css HTTP/1.1\n\n-expected1] FAILED                                                                           [ 78%]
tests/test_http_request.py::test_parse_request_invalid[Host: example.org\nUser-Agent: curl/7.81.0\n\n] FAILED                                                                         [ 85%]
tests/test_http_request.py::test_parse_request_invalid[\nGET HTTP/1.1\n\n] FAILED                                                                                                     [ 92%]
tests/test_http_request.py::test_parse_request_invalid[GET / HTTP/1.1\nHost example.org\n\nGET / HTTP/1.1\nHost: example.org\n\nUser-Agent: curl/7.81.0\n\n] FAILED                   [100%]

[SNIP]

================================================================================== short test summary info ==================================================================================
FAILED tests/test_http_request.py::test_parse_request[GET /index.html HTTP/1.1\nHost: example.org\nUser-Agent: curl/7.81.0\nAccept: */*\n\n-expected0] - AssertionError: assert 0 == 2
FAILED tests/test_http_request.py::test_parse_request[\n\nOPTIONS /assets/style.css HTTP/1.1\n\n-expected1] - AssertionError: assert 0 == 2
FAILED tests/test_http_request.py::test_parse_request_invalid[Host: example.org\nUser-Agent: curl/7.81.0\n\n] - Failed: DID NOT RAISE <class 'ValueError'>
FAILED tests/test_http_request.py::test_parse_request_invalid[\nGET HTTP/1.1\n\n] - Failed: DID NOT RAISE <class 'ValueError'>
FAILED tests/test_http_request.py::test_parse_request_invalid[GET / HTTP/1.1\nHost example.org\n\nGET / HTTP/1.1\nHost: example.org\n\nUser-Agent: curl/7.81.0\n\n] - Failed: DID NOT RAISE <class 'ValueError'>
================================================================================ 5 failed, 9 passed in 0.08s ================================================================================

src_5 is after exo 3.7

$ pytest -v tests/test_http_request.py 
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.11.2, pytest-8.0.2, pluggy-1.4.0 -- /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server
collected 14 items                                                                                                                                                                          

tests/test_http_request.py::test_parse_request_head[GET / HTTP/1.1-expected0] PASSED                                                                                                  [  7%]
tests/test_http_request.py::test_parse_request_head[options /assets/style.css HTTP/1.1-expected1] PASSED                                                                              [ 14%]
tests/test_http_request.py::test_parse_request_head_invalid PASSED                                                                                                                    [ 21%]
tests/test_http_request.py::test_parse_request_params[params0-expected0] PASSED                                                                                                       [ 28%]
tests/test_http_request.py::test_parse_request_params[params1-expected1] PASSED                                                                                                       [ 35%]
tests/test_http_request.py::test_parse_request_params[params2-expected2] PASSED                                                                                                       [ 42%]
tests/test_http_request.py::test_parse_request_params_invalid[params0] PASSED                                                                                                         [ 50%]
tests/test_http_request.py::test_parse_request_params_invalid[params1] PASSED                                                                                                         [ 57%]
tests/test_http_request.py::test_parse_request_params_invalid[params2] PASSED                                                                                                         [ 64%]
tests/test_http_request.py::test_parse_request[GET /index.html HTTP/1.1\nHost: example.org\nUser-Agent: curl/7.81.0\nAccept: */*\n\n-expected0] PASSED                                [ 71%]
tests/test_http_request.py::test_parse_request[\n\nOPTIONS /assets/style.css HTTP/1.1\n\n-expected1] PASSED                                                                           [ 78%]
tests/test_http_request.py::test_parse_request_invalid[Host: example.org\nUser-Agent: curl/7.81.0\n\n] PASSED                                                                         [ 85%]
tests/test_http_request.py::test_parse_request_invalid[\nGET HTTP/1.1\n\n] PASSED                                                                                                     [ 92%]
tests/test_http_request.py::test_parse_request_invalid[GET / HTTP/1.1\nHost example.org\n\nGET / HTTP/1.1\nHost: example.org\n\nUser-Agent: curl/7.81.0\n\n] PASSED                   [100%]

==================================================================================== 14 passed in 0.03s =====================================================================================

src_6 is after exo 3.8

$ python -m myserver -p 8000 -r tests/resources/www/
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}

See screenshot exo 3.8: Screenshot exo 3.8

src_7 is after exo 3.9

$ python -m myserver -p 8000 -r tests/resources/www/
b'GET / HTTP/1.1\r\nHost: localhost:8000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-GB,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\nDNT: 1\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: cross-site\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n'

See screenshot exo 3.9: Screenshot exo 3.8

src_8 is after exo 3.10

See screenshot exo 3.10 200: Screenshot exo 3.10 200

See screenshot exo 3.10 404: Screenshot exo 3.10 404

pytest

$ pytest
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.11.2, pytest-8.0.2, pluggy-1.4.0
rootdir: /home/boris/Projects/deuxfleurs/ue_pe_web/scripts/03_server
collected 33 items                                                                                                                                                                          

tests/test_file.py FFFF                                                                                                                                                               [ 12%]
tests/test_http_request.py ..............                                                                                                                                             [ 54%]
tests/test_log.py FFFFFFF                                                                                                                                                             [ 75%]
tests/test_server.py .FFFFFFF                                                                                                                                                         [100%]

501

Server:

$ python -m myserver -p 8000 -r tests/resources/www/
{'head': {'verb': 'POST', 'resource': '/'}, 'params': {}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-User': '?1', 'DNT': '1', 'Sec-GPC': '1'}}
{'head': {'verb': 'GET', 'resource': '/'}, 'params': {'Host': 'localhost:8000', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'en-GB,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'cross-site', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache'}}


Client:

$ netcat localhost 8000
POST / HTTP/1.0
HTTP/1.0 501 Not Implemented
Server: RegardeMamanJeFaisUnServeurWeb/0.1
Date: Wed, 20 Mar 2024 16:36:42 GMT
Content-type: text/plain
Content-Length: 20

501 Not Implemented

src_9 is after exo 3.11

See screenshot exo 3.11 200: Screenshot exo 3.11 200

See screenshot exo 3.11 404: Screenshot exo 3.11 404

Client:

$ netcat localhost 8000
POST / HTTP/1.0
HTTP/1.0 501 Not implemented
Content-Type: text/html; charset=utf-8
Date: Thu, 21 Mar 2024 20:11:42 GMT
Content-Length: 156
Server: RegardeMamanJeFaisUnServeurWeb/0.1

<html>
<body>
    <h1>Erreur 501 : Non implémenté</h1>
    <p>Ce que vous demandez est acceptable, mais on ne fait pas ça chez nous.</p>
</body>
</html>