27 KiB
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'}}
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'
src_8 is after exo 3.10
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
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>