61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
# http_socket_client.py
|
|
import socket
|
|
import logging
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
|
|
|
|
|
|
def http_get_socket():
|
|
"""HTTP GET запрос через низкоуровневый socket"""
|
|
|
|
HOST = 'vyatsu.ru'
|
|
PORT = 80
|
|
|
|
# HTTP запрос вручную
|
|
request = f"""GET / HTTP/1.1
|
|
Host: {HOST}
|
|
User-Agent: PyCharm-Socket-Client
|
|
Accept: text/html
|
|
Connection: close
|
|
|
|
"""
|
|
# Заменяем переносы строк на \r\n как требует HTTP
|
|
request = request.replace('\n', '\r\n')
|
|
|
|
try:
|
|
# Создаем TCP соединение
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
|
|
logging.info(f"Подключение к {HOST}:{PORT}")
|
|
client_socket.connect((HOST, PORT))
|
|
|
|
logging.info("Отправка HTTP запроса...")
|
|
client_socket.sendall(request.encode())
|
|
|
|
# Получаем ответ
|
|
response = b''
|
|
while True:
|
|
chunk = client_socket.recv(4096)
|
|
if not chunk:
|
|
break
|
|
response += chunk
|
|
|
|
# Разбираем ответ
|
|
response_str = response.decode('utf-8', errors='replace')
|
|
|
|
# Разделяем заголовки и тело
|
|
if '\r\n\r\n' in response_str:
|
|
headers, body = response_str.split('\r\n\r\n', 1)
|
|
else:
|
|
headers = response_str
|
|
body = ''
|
|
|
|
logging.info(f"Статус: {headers.split(chr(10))[0]}")
|
|
logging.info(f"Заголовков получено: {len(headers)} символов")
|
|
logging.info(f"Тело ответа (первые 300 символов):\n{body[:300]}")
|
|
|
|
except Exception as e:
|
|
logging.error(f"Ошибка: {e}")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
http_get_socket() |