#!/bin/bash

# WebSocket 连接配置
HOST="ppt-ws.lcpj.svc.cluster.local"
PORT=8091
PATH="/im_chat?imtoken=e827ae2236184e6b962810b7068af4b6"

# 生成固定的 Sec-WebSocket-Key（无 openssl 时使用）
WEBSOCKET_KEY="dGhlIHNhbXBsZSBub25jZQ=="

# 计算预期的 Sec-WebSocket-Accept 值（用于验证响应）
GUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
EXPECTED_ACCEPT=$(echo -n "${WEBSOCKET_KEY}${GUID}" | sha1sum | tr -d ' -' | xxd -r -p | base64)

# 构建 HTTP 请求
REQUEST=$(cat <<EOF
GET ${PATH} HTTP/1.1
Host: ${HOST}:${PORT}
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: ${WEBSOCKET_KEY}
Sec-WebSocket-Version: 13

EOF
)

# 使用 /dev/tcp 连接并发送请求
if [[ ! -e /dev/tcp ]]; then
    echo "错误: 当前 shell 不支持 /dev/tcp (需要 bash 或 zsh)" >&2
    exit 1
fi

exec 3<>/dev/tcp/${HOST}/${PORT} || { echo "无法连接到 ${HOST}:${PORT}" >&2; exit 1; }
echo -en "$REQUEST" >&3

# 读取响应头
echo "WebSocket 握手响应:"
response=""
while IFS= read -r line; do
    response+="$line"$'\n'
    [[ -z "$line" ]] && break  # 空行表示头结束
done <&3
echo "$response"

# 检查响应状态
if grep -q "101 Switching Protocols" <<< "$response"; then
    echo "WebSocket 连接成功!"
    
    # 验证 Sec-WebSocket-Accept
    if grep -q "Sec-WebSocket-Accept: $EXPECTED_ACCEPT" <<< "$response"; then
        echo "Sec-WebSocket-Accept 验证通过"
    else
        echo "警告: Sec-WebSocket-Accept 验证失败"
    fi
    
    # 示例: 发送简单消息 (需要手动编码)
    # 注意: 这只是演示，实际 WebSocket 消息需要按 RFC 6455 格式编码
    message="Hello from bash!"
    echo -n "$message" >&3
    
    # 接收响应 (需要解析 WebSocket 帧格式)
    echo "等待服务器响应..."
    read -r -t 5 server_response <&3
    echo "收到: $server_response"
    
else
    echo "WebSocket 连接失败!"
fi

# 关闭连接
exec 3>&-
