Commit b76b35e0 authored by Chunchi Che's avatar Chunchi Che

finish basic function and test pass

parent 7de56999
package main package main
import ( import (
"bufio"
"fmt" "fmt"
"log" "log"
"net"
"net/http" "net/http"
"sync"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
const TARGET_PORT = ":8000" const TARGET_PORT = ":8000"
const PROXY_PORT = ":3344" const PROXY_PORT = ":3344"
const CHANNEL_SIZE = 0x1000
const BUFFER_SIZE = 0x1000
var upgrader = websocket.Upgrader{ var upgrader = websocket.Upgrader{
ReadBufferSize: 0x1000, ReadBufferSize: 0x1000,
...@@ -21,6 +26,8 @@ func homePage(w http.ResponseWriter, r *http.Request) { ...@@ -21,6 +26,8 @@ func homePage(w http.ResponseWriter, r *http.Request) {
} }
func ygoEndpoint(w http.ResponseWriter, r *http.Request) { func ygoEndpoint(w http.ResponseWriter, r *http.Request) {
var wg sync.WaitGroup
upgrader.CheckOrigin = wsChecker upgrader.CheckOrigin = wsChecker
ws, err := upgrader.Upgrade(w, r, nil) ws, err := upgrader.Upgrade(w, r, nil)
...@@ -31,31 +38,67 @@ func ygoEndpoint(w http.ResponseWriter, r *http.Request) { ...@@ -31,31 +38,67 @@ func ygoEndpoint(w http.ResponseWriter, r *http.Request) {
log.Println("Websocket connected") 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) { wg.Add(2)
// todo: spawn channel go wsProxy(ws, &tcp, &wg)
go tcpProxy(&tcp, ws, &wg)
wg.Wait()
}
func wsProxy(ws *websocket.Conn, tcp *net.Conn, wg *sync.WaitGroup) {
for { for {
messageType, buf, err := ws.ReadMessage() messageType, buf, err := ws.ReadMessage()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
return break
} }
if messageType == websocket.CloseMessage { if messageType == websocket.CloseMessage {
log.Println("Websocket closed") 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) 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 } 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