mirror of
https://github.com/amitbet/vncproxy.git
synced 2025-04-27 10:50:47 +00:00
105 lines
1.9 KiB
Go
105 lines
1.9 KiB
Go
package server
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"vncproxy/logger"
|
|
|
|
"bytes"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type WsServer1 struct {
|
|
cfg *ServerConfig
|
|
}
|
|
|
|
type WsHandler1 func(io.ReadWriter, *ServerConfig)
|
|
|
|
var upgrader = websocket.Upgrader{
|
|
ReadBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
CheckOrigin: func(r *http.Request) bool {
|
|
return true
|
|
}}
|
|
|
|
type WsConnection struct {
|
|
Reader WsReader
|
|
Writer WsWriter
|
|
}
|
|
|
|
func NewWsConnection(c *websocket.Conn) *WsConnection {
|
|
return &WsConnection{
|
|
WsReader{},
|
|
WsWriter{c},
|
|
}
|
|
}
|
|
|
|
type WsWriter struct {
|
|
conn *websocket.Conn
|
|
}
|
|
|
|
type WsReader struct {
|
|
Buff bytes.Buffer
|
|
}
|
|
|
|
func (wr WsReader) Read(p []byte) (n int, err error) {
|
|
return wr.Buff.Read(p)
|
|
}
|
|
|
|
func (wr WsWriter) Write(p []byte) (int, error) {
|
|
err := wr.conn.WriteMessage(websocket.BinaryMessage, p)
|
|
return len(p), err
|
|
}
|
|
|
|
func handleConnection(w http.ResponseWriter, r *http.Request) {
|
|
log.Print("got connection:", r.URL)
|
|
c, err := upgrader.Upgrade(w, r, nil)
|
|
|
|
if err != nil {
|
|
log.Print("upgrade:", err)
|
|
return
|
|
}
|
|
defer c.Close()
|
|
|
|
myConn := NewWsConnection(c)
|
|
|
|
for {
|
|
mt, message, err := c.ReadMessage()
|
|
if err != nil {
|
|
log.Println("read:", err)
|
|
break
|
|
}
|
|
if mt == websocket.BinaryMessage {
|
|
myConn.Reader.Buff.Write(message)
|
|
}
|
|
log.Printf("recv: %s", message)
|
|
// err = c.WriteMessage(mt, message)
|
|
// if err != nil {
|
|
// log.Println("write:", err)
|
|
// break
|
|
// }
|
|
}
|
|
}
|
|
|
|
// This example demonstrates a trivial echo server.
|
|
func (wsServer *WsServer1) Listen(urlStr string, handlerFunc WsHandler) {
|
|
//http.Handle("/", websocket.Handler(EchoHandler))
|
|
if urlStr == "" {
|
|
urlStr = "/"
|
|
}
|
|
url, err := url.Parse(urlStr)
|
|
if err != nil {
|
|
logger.Errorf("error while parsing url: ", err)
|
|
}
|
|
|
|
http.HandleFunc(url.Path, handleConnection)
|
|
|
|
err = http.ListenAndServe(url.Host, nil)
|
|
if err != nil {
|
|
panic("ListenAndServe: " + err.Error())
|
|
}
|
|
}
|