ws-log-proxy/README.md
2026-01-23 10:05:12 +07:00

184 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 запросов/ответов
- Поддерживает двунаправленный поток сообщений
- Логирует каждое сообщение отдельно
- Отслеживает события подключения и отключения