Commit b76b35e0 authored by Chunchi Che's avatar Chunchi Che

finish basic function and test pass

parent 7de56999
package main
import (
"bufio"
"fmt"
"log"
"net"
"net/http"
"sync"
"github.com/gorilla/websocket"
)
const TARGET_PORT = ":8000"
const PROXY_PORT = ":3344"
const CHANNEL_SIZE = 0x1000
const BUFFER_SIZE = 0x1000
var upgrader = websocket.Upgrader{
ReadBufferSize: 0x1000,
......@@ -21,6 +26,8 @@ func homePage(w http.ResponseWriter, r *http.Request) {
}
func ygoEndpoint(w http.ResponseWriter, r *http.Request) {
var wg sync.WaitGroup
upgrader.CheckOrigin = wsChecker
ws, err := upgrader.Upgrade(w, r, nil)
......@@ -31,31 +38,67 @@ func ygoEndpoint(w http.ResponseWriter, r *http.Request) {
log.Println("Websocket connected")
proxyHandler(ws)
}
tcp, err := net.Dial("tcp", "127.0.0.1"+PROXY_PORT)
if err != nil {
log.Fatal(err)
}
defer tcp.Close()
func proxyHandler(ws *websocket.Conn) {
// todo: spawn channel
wg.Add(2)
go wsProxy(ws, &tcp, &wg)
go tcpProxy(&tcp, ws, &wg)
wg.Wait()
}
func wsProxy(ws *websocket.Conn, tcp *net.Conn, wg *sync.WaitGroup) {
for {
messageType, buf, err := ws.ReadMessage()
if err != nil {
log.Fatal(err)
return
break
}
if messageType == websocket.CloseMessage {
log.Println("Websocket closed")
return
break
}
fmt.Println(string(buf))
log.Println("websocket to tcp: " + string(buf))
if err := ws.WriteMessage(messageType, buf); err != nil {
writer := bufio.NewWriter(*tcp)
buffer := make([]byte, BUFFER_SIZE)
_, err = writer.Write(buffer)
if err != nil {
log.Fatal(err)
return
break
}
}
wg.Done()
}
func tcpProxy(tcp *net.Conn, ws *websocket.Conn, wg *sync.WaitGroup) {
for {
reader := bufio.NewReader(*tcp)
buffer := make([]byte, BUFFER_SIZE)
_, err := reader.Read(buffer)
if err != nil {
log.Fatal(err)
break
}
log.Println("tcp to websocket: " + string(buffer))
err = ws.WriteMessage(websocket.TextMessage, buffer) // temporary TextMessage, should be BinaryMessage in ygopro
if err != nil {
log.Fatal(err)
break
}
}
wg.Done()
}
func wsChecker(r *http.Request) bool { return true }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment