Это учебный проект, демонстрирующий создание простого HTTP-клиента с использованием стандартной библиотеки Python (socket). Скрипт способен выполнять базовые веб-запросы, обрабатывать ответы и сохранять результаты в файл.
- Поддержка HTTP и HTTPS: Клиент автоматически определяет схему (
httpилиhttps://) и устанавливает соответствующее соединение (обычное или защищенное с помощью SSL). - Методы GET и POST: Возможность отправлять как простые
GET-запросы для получения данных, так иPOST-запросы с телом. - Обработка Redirect'ов: Автоматическое следование за перенаправлениями (коды ответа
3xx, например,302 Found). - Работа с Cookies: Клиент умеет отправлять куки (
Cookie) и получать новые (Set-Cookie), сохраняя их между редиректами. - Декодирование
chunked-ответов: Корректная обработка потоковых ответов, передаваемых по частям (Transfer-Encoding: chunked). - Сохранение результата: Тело ответа сервера сохраняется в указанный файл в виде байтов, что позволяет работать с любым контентом (HTML, JSON, изображения и т.д.).
Основная логика заключена в функции get_do в файле http_client.py. Чтобы использовать клиент, импортируйте эту функцию в свой скрипт.
# Импортируем нашу функцию
from http_client import get_do
# URL, который мы хотим запросить
url = "https://httpbin.org/html"
output_file = "result.html"
print(f"Запрашиваем {url}...")
# Выполняем запрос
cookies = get_do(
url=url,
method="GET",
headers={},
body="",
timeout=10,
file_name=output_file,
cookie={}
)
print(f"Ответ сохранен в файл: {output_file}")
print(f"Полученные куки: {cookies}")Этот пример демонстрирует, как клиент сначала получит редирект, а затем автоматически перейдет по новому адресу, сохранив куки.
from http_client import get_do
# Этот URL сначала установит куки, а затем перенаправит на /cookies
url = "https://httpbin.org/cookies/set?my_cookie=12345"
output_file = "cookies_result.json"
print("Выполняем запрос с редиректом...")
final_cookies = get_do(
url=url,
method="GET",
headers={},
body="",
timeout=10,
file_name=output_file,
cookie={'initial_cookie': 'hello'} # Можем отправить начальные куки
)
print(f"Ответ сохранен в файл: {output_file}")
print(f"Итоговые куки после всех переходов: {final_cookies}")
# Ожидаемый вывод кук: {'initial_cookie': 'hello', 'my_cookie': '12345'}def get_do(url: str, headers: dict, body: str, method: str, timeout: float, file_name: str, cookie: dict) -> dict:url(str): Полный URL-адрес для запроса (например,"https://example.com/path").headers(dict): Словарь с заголовками запроса (например,{'User-Agent': 'MyClient/1.0'}).body(str): Тело запроса, используется дляPOST. ДляGETпередается пустая строка.method(str): HTTP-метод,'GET'или'POST'.timeout(float): Время ожидания ответа от сервера в секундах.file_name(str): Имя файла, в который будет сохранено тело ответа.cookie(dict): Словарь с куками для отправки на сервер.
dict: Словарь, содержащий все куки, полученные от сервера в ходе выполнения запроса и всех редиректов.