Added websocket header test and benchmark tool

This commit is contained in:
Toby Chui
2024-12-30 21:01:45 +08:00
parent 1d4c275db3
commit ad4721820b
7 changed files with 214 additions and 0 deletions

View File

@ -0,0 +1,5 @@
module aroz.org/zoraxy/websocket-echo
go 1.23.2
require github.com/gorilla/websocket v1.5.3

View File

@ -0,0 +1,2 @@
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=

View File

@ -0,0 +1,44 @@
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func echo(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Upgrade error:", err)
return
}
defer conn.Close()
for key, values := range r.Header {
for _, value := range values {
message := fmt.Sprintf("%s: %s", key, value)
if err := conn.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
log.Println("WriteMessage error:", err)
return
}
}
}
if err := conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")); err != nil {
log.Println("CloseMessage error:", err)
return
}
}
func main() {
http.HandleFunc("/echo", echo)
log.Fatal(http.ListenAndServe(":8888", nil))
}

View File

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebSocket Echo Test</title>
</head>
<body>
<h1>WebSocket Echo Test</h1>
<p>1. Go run main.go</p>
<p>2. Create a Zoraxy proxy rule (and add to hosts file) from ws.localhost (port 80) to 127.0.0.1:8888</p>
<p>3. Click the Connect button below to test if headers are correctly sent over</p>
<button id="connectBtn">Connect</button>
<button id="disconnectBtn" disabled>Disconnect</button>
<input type="text" id="messageInput" placeholder="Enter message">
<button id="sendBtn" disabled>Send</button>
<div id="output"></div>
<script>
let socket;
const connectBtn = document.getElementById('connectBtn');
const disconnectBtn = document.getElementById('disconnectBtn');
const sendBtn = document.getElementById('sendBtn');
const messageInput = document.getElementById('messageInput');
const output = document.getElementById('output');
connectBtn.addEventListener('click', () => {
output.innerHTML = '';
//socket = new WebSocket('ws://localhost:8888/echo');
socket = new WebSocket('ws://ws.localhost/echo');
socket.onopen = () => {
output.innerHTML += '<p>Connected to WebSocket server</p>';
connectBtn.disabled = true;
disconnectBtn.disabled = false;
sendBtn.disabled = false;
};
socket.onmessage = (event) => {
output.innerHTML += `<p>Received: ${event.data}</p>`;
};
socket.onclose = () => {
output.innerHTML += '<p>Disconnected from WebSocket server</p>';
connectBtn.disabled = false;
disconnectBtn.disabled = true;
sendBtn.disabled = true;
};
socket.onerror = (error) => {
output.innerHTML += `<p>Error: ${error.message}</p>`;
};
});
disconnectBtn.addEventListener('click', () => {
socket.close();
});
sendBtn.addEventListener('click', () => {
const message = messageInput.value;
socket.send(message);
output.innerHTML += `<p>Sent: ${message}</p>`;
messageInput.value = '';
});
</script>
</body>
</html>