Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

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