add hop plugin

This commit is contained in:
ginuerzh
2023-09-28 21:02:11 +08:00
parent 4700171909
commit 8bc0679b5c
7 changed files with 576 additions and 13 deletions

80
hop/example/grpc/main.go Normal file
View File

@ -0,0 +1,80 @@
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"log"
"net"
"sync/atomic"
"github.com/go-gost/plugin/hop/proto"
"github.com/go-gost/x/config"
"google.golang.org/grpc"
)
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 server struct {
counter atomic.Uint64
proto.UnimplementedHopServer
}
func (s *server) Select(ctx context.Context, in *proto.SelectRequest) (*proto.SelectReply, error) {
node := nodes[s.counter.Add(1)%uint64(len(nodes))]
v, _ := json.Marshal(node)
reply := &proto.SelectReply{
Node: v,
}
return reply, nil
}
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
proto.RegisterHopServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}

93
hop/example/http/main.go Normal file
View File

@ -0,0 +1,93 @@
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: %s %s %s %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)
}
}