plugin/hop/example/http/main.go
2023-09-30 17:49:33 +08:00

94 lines
1.7 KiB
Go

package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"net"
"net/http"
"sync/atomic"
"github.com/go-gost/x/config"
)
var (
port = flag.Int("port", 8000, "The server port")
)
var (
nodes = []*config.NodeConfig{
{
Name: "node-0",
Addr: ":8888",
Connector: &config.ConnectorConfig{
Type: "socks5",
Auth: &config.AuthConfig{
Username: "user",
Password: "pass",
},
},
Dialer: &config.DialerConfig{
Type: "tcp",
},
},
{
Name: "node-1",
Addr: ":9999",
Connector: &config.ConnectorConfig{
Type: "http",
Auth: &config.AuthConfig{
Username: "user",
Password: "pass",
},
},
Dialer: &config.DialerConfig{
Type: "tcp",
},
},
}
)
type hopRequest struct {
Network string `json:"network"`
Addr string `json:"addr"`
Host string `json:"host"`
Client string `json:"client"`
}
type hopResponse struct {
Node string `json:"node"`
}
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
log.Printf("server listening at %v", lis.Addr())
var counter atomic.Uint64
http.HandleFunc("/hop", func(w http.ResponseWriter, r *http.Request) {
rb := hopRequest{}
if err := json.NewDecoder(r.Body).Decode(&rb); err != nil {
log.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
log.Printf("hop: network=%s addr=%s host=%s client=%s", rb.Network, rb.Addr, rb.Host, rb.Client)
node := nodes[counter.Add(1)%uint64(len(nodes))]
v, _ := json.Marshal(node)
resp := hopResponse{Node: string(v)}
json.NewEncoder(w).Encode(resp)
})
if err := http.Serve(lis, nil); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}