Friday, April 10, 2026

Python PROGRAMMING

AI Prompts Example

Задача. Есть два Proxy сервера на Python - Сервер 1 и Сервер 2 (под Ubuntu). Сервер 1 работает через сетевое подключение только с Сервером 2. Сервер 1 принимает запросы от браузера, пересылает их на Сервер 2. Сервер 2 обращается к веб серверу Apache за веб страницей. Ответ от Apache Сервер2 пересылает Серверу 1; который отправляет его веб браузеру. Вопрос. Можно ли на Сервере 1 добавлять в буфер информации, которая должна пересылаться на Сервер 2, какую-то служебную информацию? При этом начало информации как-то маркируется, чтобы Сервер 2 смог ее обнаружить, "вырезать" из буфера и НЕ пересылать на веб сервер Apache. Это возможно сделать на Python?

Да, это абсолютно возможно сделать на Python. Такая задача решается добавлением специального заголовка или префикса в начало данных, которые Сервер 1 отправляет Серверу 2, а затем — его удалением на Сервере 2 перед отправкой запроса к Apache.

Ниже приведу практическую схему реализации.

Общая идея

Буфер данных (например, HTTP-запрос от браузера) перед отправкой на Сервер 2 дополняется служебной информацией + уникальным маркером.
Сервер 2 читает данные, находит маркер, извлекает служебную информацию (логирует/использует), а «очищенный» оригинальный запрос отправляет дальше на Apache.

Пример реализации на Python

Сервер 1 (прокси, добавляет служебные данные)

python
import socket

# Служебная информация, которую нужно передать Серверу 2
SERVICE_INFO = b"SERVER1_ID:42;USER:test;TIMEOUT:30;\n"
# Маркер конца служебной информации
MARKER = b"---END-METADATA---\n"

def forward_to_server2(data_from_browser):
    # Формируем буфер: служебные данные + маркер + оригинальные данные
    new_buffer = SERVICE_INFO + MARKER + data_from_browser
    
    # Отправляем на Сервер 2
    sock_to_server2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock_to_server2.connect(("SERVER2_IP", 8888))
    sock_to_server2.sendall(new_buffer)
    # ... получение ответа от сервера 2 и отправка обратно браузеру

Сервер 2 (принимает, вырезает служебные данные, отправляет чистое на Apache)

python
import socket

MARKER = b"---END-METADATA---\n"

def handle_client_from_server1(client_socket):
    # Получаем буфер от Сервера 1
    data = client_socket.recv(65535)
    
    # Ищем маркер
    marker_pos = data.find(MARKER)
    if marker_pos != -1:
        # Извлекаем служебную информацию
        service_info = data[:marker_pos]
        # Остаток данных после маркера — чистый запрос для Apache
        clean_data = data[marker_pos + len(MARKER):]
        
        # Работаем со служебной информацией
        print("Получены служебные данные:", service_info.decode())
        # Например, извлечь параметры: parse_service_info(service_info)
    else:
        # Маркера нет — значит, данных без служебной части
        clean_data = data
    
    # Отправляем чистые данные на Apache (порт 80 или 8080)
    apache_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    apache_sock.connect(("127.0.0.1", 80))
    apache_sock.sendall(clean_data)
    
    # Получаем ответ от Apache
    response = apache_sock.recv(65535)
    
    # Отправляем ответ обратно Серверу 1 (без изменений)
    client_socket.sendall(response)

Важные нюансы и доработки

  1. Разделение буфера по маркеру — надежно, но неэффективно для больших запросов
    В реальности HTTP-запрос может приходить несколькими пакетами TCP. Нужно накапливать данные до обнаружения маркера.

    Улучшенный вариант для Сервера 2:

    python
    def recv_until_marker(sock, marker):
        buffer = b""
        while marker not in buffer:
            chunk = sock.recv(1024)
            if not chunk:
                break
            buffer += chunk
        # Разделяем
        meta, rest = buffer.split(marker, 1)
        return meta, rest
  2. Можно использовать структурированные форматы
    Вместо текстового маркера — передавать сначала длину служебной части (например, 4 байта в big‑endian), затем саму служебную информацию, затем остаток. Это быстрее и надёжнее:

    Сервер 1:

    python
    service_part = b"...служебные данные..."
    packet = len(service_part).to_bytes(4, "big") + service_part + original_data

    Сервер 2:

    python
    meta_len = int.from_bytes(data[:4], "big")
    service_data = data[4:4+meta_len]
    clean_data = data[4+meta_len:]
  3. HTTP может быть не чистым текстом (HTTPS, chunked encoding).
    Если Сервер 1 принимает HTTPS трафик (через CONNECT метод), то внутри шифрование. Тогда добавлять маркер в начало потока уже нельзя — он нарушит шифр.
    В таком случае нужно договариваться вне протокола — например, использовать отдельный TCP‑заголовок на уровне сокета (через setsockopt с IP options — сложно). Но если всё внутри локальной сети и вы контролируете оба прокси, можно работать до TLS‑handshake, т.е. Сервер 1 расшифровывает, добавляет служебную информацию, отправляет на Сервер 2 уже в открытом виде.

Итог

✅ Да, на Python это делается легко.
✅ Способ с маркером подходит для прототипа, но лучше использовать передачу длины служебных данных для надёжности.
✅ Главное — гарантировать, что маркер не встречается внутри оригинального запроса (маловероятно для уникальной строки типа \x00--SVC--\x00).



Vanishingly subtle humor

(c) by Valery Shmelev   If you want to have an advantage
The word Oflameron is an artificially created word by Valery Shmelev in 1994
https://www.tumblr.com/blog/sci-fi-screenplay

https://github.com/vallshmeleff/ai-prompts-for-screenplay-plan/tree/main

https://www.scriptrevolution.com/profiles/valery-shmelev




No comments:

Post a Comment