# WebSocket Log Proxy - Логирующий WebSocket прокси для анализа WebSocket соединений WebSocket реверс-прокси на Go, который логирует все WebSocket соединения и сообщения для анализа WebSocket API. ## Возможности - ✅ Перехват и логирование WebSocket подключений (connect/disconnect) - ✅ Логирование всех входящих сообщений (от клиента к серверу) - ✅ Логирование всех исходящих сообщений (от сервера к клиенту) - ✅ Поддержка текстовых и бинарных сообщений - ✅ Автоматическое форматирование JSON в логах - ✅ Красивый консольный вывод и JSON формат - ✅ Сохранение оригинальных заголовков и путей - ✅ Двунаправленная пересылка сообщений в реальном времени ## Установка ```bash go mod download ``` ## Использование ### Способ 1: Через аргументы командной строки ```bash go run main.go ws://echo.websocket.org ``` ### Способ 2: Через переменные окружения ```bash export TARGET_URL=ws://echo.websocket.org export PORT=8080 # опционально, по умолчанию 8020 go run main.go ``` ### Способ 3: Сборка и запуск ```bash go build -o ws-log-proxy ./ws-log-proxy ws://echo.websocket.org ``` ## Примеры ### Базовое использование ```bash # Запуск прокси на порту 8020, перенаправление на ws://echo.websocket.org go run main.go ws://echo.websocket.org # В другом терминале подключаемся через прокси # Используя wscat (npm install -g wscat) wscat -c ws://localhost:8020 # Или используя Python python3 -c "import websocket; ws = websocket.create_connection('ws://localhost:8020'); ws.send('Hello'); print(ws.recv())" ``` ### С кастомным портом ```bash PORT=3000 go run main.go ws://echo.websocket.org ``` ### С защищенным WebSocket (WSS) ```bash go run main.go wss://secure-websocket-server.com ``` ### Логирование в файл ```bash go run main.go ws://echo.websocket.org 2>&1 | tee ws-logs.txt ``` ## Формат логов Прокси выводит логи в двух форматах: 1. **Человекочитаемый формат** - красивый вывод в консоль с разделителями 2. **JSON формат** - структурированные данные для дальнейшей обработки Каждая запись содержит: - Временную метку - События подключения/отключения - Направление сообщений (incoming/outgoing) - Тип сообщения (text/binary) - Содержимое сообщений - Заголовки HTTP запроса ## Пример вывода ``` ================================================================================ [2024-01-15 10:30:45] WebSocket CONNECT Remote: 127.0.0.1:52341 URL: /echo Headers: Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== ================================================================================ -------------------------------------------------------------------------------- [2024-01-15 10:30:46] ← INCOMING Message (Text) Remote: 127.0.0.1:52341 Message: { "type": "hello", "message": "Hello, WebSocket!" } -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- [2024-01-15 10:30:46] → OUTGOING Message (Text) Remote: 127.0.0.1:52341 Message: { "type": "echo", "message": "Hello, WebSocket!" } -------------------------------------------------------------------------------- ================================================================================ [2024-01-15 10:30:50] WebSocket DISCONNECT Remote: 127.0.0.1:52341 URL: /echo ================================================================================ ``` ## JSON формат лога В конце каждой сессии выводится полный JSON лог со всеми сообщениями: ```json { "connection": { "timestamp": "2024-01-15T10:30:45Z", "event": "connect", "remote_addr": "127.0.0.1:52341", "url": "/echo", "headers": {...} }, "messages": [ { "timestamp": "2024-01-15T10:30:46Z", "direction": "incoming", "message": "{\"type\":\"hello\"}", "message_type": 1, "remote_addr": "127.0.0.1:52341" }, { "timestamp": "2024-01-15T10:30:46Z", "direction": "outgoing", "message": "{\"type\":\"echo\"}", "message_type": 1, "remote_addr": "127.0.0.1:52341" } ] } ``` ## Примечания - JSON сообщения автоматически форматируются для лучшей читаемости - Бинарные сообщения отображаются как `[Binary: N bytes]` - Все оригинальные заголовки сохраняются и передаются на целевой сервер - Прокси поддерживает как обычные WebSocket (ws://), так и защищенные (wss://) - Сообщения логируются в реальном времени по мере их передачи ## Отличия от HTTP версии - Логирует WebSocket соединения вместо HTTP запросов/ответов - Поддерживает двунаправленный поток сообщений - Логирует каждое сообщение отдельно - Отслеживает события подключения и отключения