diff --git a/cmd/gost/main.go b/cmd/gost/main.go index ae15b9e..528d420 100644 --- a/cmd/gost/main.go +++ b/cmd/gost/main.go @@ -2,51 +2,64 @@ package main import ( "crypto/tls" + "encoding/json" "flag" "fmt" "github.com/ginuerzh/gost" "github.com/golang/glog" "golang.org/x/net/http2" + "io/ioutil" "os" "runtime" "sync" ) var ( - chainNodes stringlist - serverNodes stringlist - pv bool + options struct { + ChainNodes, ServeNodes flagStringList + } ) func init() { - flag.Var(&serverNodes, "L", "listen address, can listen on multiple ports") - flag.Var(&chainNodes, "F", "forward address, can make a forward chain") - flag.BoolVar(&pv, "V", false, "print version") + var ( + configureFile string + printVersion bool + ) + + flag.StringVar(&configureFile, "C", "", "configure file") + flag.Var(&options.ChainNodes, "F", "forward address, can make a forward chain") + flag.Var(&options.ServeNodes, "L", "listen address, can listen on multiple ports") + flag.BoolVar(&printVersion, "V", false, "print version") flag.Parse() + if err := loadConfigureFile(configureFile); err != nil { + glog.Fatal(err) + } + if glog.V(5) { http2.VerboseLogs = true } -} -func main() { if flag.NFlag() == 0 { flag.PrintDefaults() return } - if pv { - fmt.Fprintf(os.Stderr, "gost %s (%s)\n", gost.Version, runtime.Version()) + + if printVersion { + fmt.Fprintf(os.Stderr, "GOST %s (%s)\n", gost.Version, runtime.Version()) return } +} +func main() { chain := gost.NewProxyChain() - if err := chain.AddProxyNodeString(chainNodes...); err != nil { + if err := chain.AddProxyNodeString(options.ChainNodes...); err != nil { glog.Fatal(err) } chain.Init() var wg sync.WaitGroup - for _, ns := range serverNodes { + for _, ns := range options.ServeNodes { serverNode, err := gost.ParseProxyNode(ns) if err != nil { glog.Fatal(err) @@ -73,12 +86,26 @@ func main() { wg.Wait() } -type stringlist []string - -func (list *stringlist) String() string { - return fmt.Sprintf("%s", *list) -} -func (list *stringlist) Set(value string) error { - *list = append(*list, value) +func loadConfigureFile(configureFile string) error { + if configureFile == "" { + return nil + } + content, err := ioutil.ReadFile(configureFile) + if err != nil { + return err + } + if err := json.Unmarshal(content, &options); err != nil { + return err + } + return nil +} + +type flagStringList []string + +func (this *flagStringList) String() string { + return fmt.Sprintf("%s", *this) +} +func (this *flagStringList) Set(value string) error { + *this = append(*this, value) return nil } diff --git a/ws.go b/ws.go index 1a1a826..4018531 100644 --- a/ws.go +++ b/ws.go @@ -1,14 +1,12 @@ package gost import ( - //"github.com/ginuerzh/gosocks5" "crypto/tls" "github.com/golang/glog" "github.com/gorilla/websocket" "net" "net/http" "net/http/httputil" - //"net/url" "time" ) @@ -28,6 +26,7 @@ func NewWebsocketServer(base *ProxyServer) *WebsocketServer { WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, }, + CompressionSupported: true, } } @@ -83,6 +82,7 @@ func WebsocketClientConn(url string, conn net.Conn, config *tls.Config) (*Websoc NetDial: func(net, addr string) (net.Conn, error) { return conn, nil }, + CompressionSupported: true, } c, resp, err := dialer.Dial(url, nil) @@ -90,7 +90,7 @@ func WebsocketClientConn(url string, conn net.Conn, config *tls.Config) (*Websoc return nil, err } resp.Body.Close() - + c.EnableWriteCompression(true) return &WebsocketConn{conn: c}, nil }