Skip to content

Commit 23b9f79

Browse files
authored
Hw07 (#5)
* HW 07: init * HW 07: renaming
1 parent fb28e24 commit 23b9f79

File tree

8 files changed

+307
-1
lines changed

8 files changed

+307
-1
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ repos:
3636
rev: v1.10.0
3737
hooks:
3838
- id: mypy
39+
exclude: 'tests'
3940

4041
# run local pylint in venv
4142
- repo: local
@@ -50,7 +51,7 @@ repos:
5051
- --max-line-length=120
5152
- --ignore-imports=yes
5253
- -d duplicate-code
53-
- -d C0111,W0621,R0913,R1705, W0201
54+
- -d C0111,W0621,R0913,R1705,W0201,W0613
5455

5556

5657
- repo: https://github.com/asottile/pyupgrade

homework_07/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Задача
2+
Реализовать сервер, частично реализующий протокол HTTP, в частности методы GET и HEAD, добиться того, что код проходит предоставленные функциональны тесты. Архитектуру выбрать на свое усмотрение, исходя из вариантов, рассмотренных на занятии. Провести нагрузочное тестирование с помощью ab или wrk
3+
4+
# Запуск тестов
5+
```
6+
sh ab -n 1000 -c 10 http://localhost:8080/index.html
7+
8+
wrk -t12 -c400 -d30s http://localhost:8080/index.html
9+
```

homework_07/poetry.lock

Lines changed: 184 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

homework_07/pyproject.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[tool.poetry]
2+
name = "homework-07"
3+
version = "0.1.0"
4+
description = "Реализовать сервер, частично реализующий протокол HTTP. Провести нагрузочное тестирование"
5+
authors = ["Vladislav Kozlov <[email protected]>"]
6+
license = "MIT"
7+
readme = "README.md"
8+
9+
[tool.poetry.dependencies]
10+
python = "^3.12"
11+
requests = "^2.32.3"
12+
types-requests = "^2.32.0.20250328"
13+
14+
15+
[build-system]
16+
requires = ["poetry-core"]
17+
build-backend = "poetry.core.masonry.api"

homework_07/tests/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# flake8: noqa
2+
import web_server

homework_07/tests/test_server.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import threading
2+
import time
3+
4+
import pytest
5+
import requests
6+
from web_server import HOST, PORT, start_server
7+
8+
9+
@pytest.fixture(scope="module")
10+
def server():
11+
server_thread = threading.Thread(target=start_server)
12+
server_thread.start()
13+
time.sleep(1) # start delay
14+
yield
15+
16+
17+
def test_index_page(server):
18+
response = requests.get(f"http://{HOST}:{PORT}/", timeout=1)
19+
assert response.status_code == 200
20+
assert "index.html" in response.text
21+
22+
23+
def test_not_found_page(server):
24+
response = requests.get(f"http://{HOST}:{PORT}/noexist_page.html", timeout=1)
25+
assert response.status_code == 404
26+
assert "File Not Found" in response.text

homework_07/web_server.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import os
2+
import socket
3+
import threading
4+
5+
HOST = "localhost"
6+
PORT = 8080
7+
DOCUMENT_ROOT = "./www"
8+
9+
10+
def handle_request(client_socket):
11+
request = ""
12+
try:
13+
# while True:
14+
request = client_socket.recv(1024).decode()
15+
# 2. get headers
16+
headers = request.split("\r\n")
17+
# 3. split headers to methods
18+
method, path, protocol = headers[0].split(" ")
19+
# 4. give back response
20+
if method in ["GET", "HEAD"]:
21+
if path == "/":
22+
path = os.path.join(DOCUMENT_ROOT, "index.html")
23+
if os.path.exists(path):
24+
with open(path, "rb") as f:
25+
content = f.read()
26+
response = (
27+
f"{protocol} 200 OK\r\nContent-Length: {len(content)}\r\n".encode()
28+
)
29+
if method == "GET":
30+
response = response + content
31+
else:
32+
response = b"HTTP/1.1 404 Not Found\r\nFile Not Found"
33+
34+
client_socket.sendall(response)
35+
finally:
36+
client_socket.close()
37+
38+
39+
def start_server():
40+
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
41+
server_address = (HOST, PORT)
42+
server_socket.bind(server_address)
43+
server_socket.listen(5) # Allows up to 5 queued connections
44+
print(f"Server listening on {server_address}")
45+
try:
46+
while True:
47+
client_socket, _ = server_socket.accept()
48+
client_thread = threading.Thread(
49+
target=handle_request, args=(client_socket,)
50+
)
51+
client_thread.start()
52+
finally:
53+
server_socket.close()
54+
55+
56+
if __name__ == "__main__":
57+
start_server()

homework_07/www/index.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title> Hello from a simple web server! </title>
6+
</head>
7+
<body>
8+
9+
</body>
10+
</html>

0 commit comments

Comments
 (0)