glider/proxy/grpc/grpc.go
2022-06-20 14:55:56 +08:00

70 lines
1.3 KiB
Go

package grpc
import (
"crypto/x509"
"fmt"
"github.com/nadoo/glider/proxy"
"net"
"net/url"
"strings"
)
func init() {
proxy.RegisterDialer("grpc", NewGRPCDialer)
}
// GRPC is the base gRPC proxy struct.
type GRPC struct {
dialer proxy.Dialer
addr string
certPool *x509.CertPool
serviceName string
serverName string
skipVerify bool
certFile string
}
// NewGRPC returns a websocket proxy.
func NewGRPC(s string, d proxy.Dialer, p proxy.Proxy) (*GRPC, error) {
u, err := url.Parse(s)
if err != nil {
return nil, fmt.Errorf("parse url err: %s", err)
}
addr := u.Host
if addr == "" && d != nil {
addr = d.Addr()
}
if _, p, _ := net.SplitHostPort(addr); p == "" {
addr = net.JoinHostPort(addr, "443")
}
query := u.Query()
g := &GRPC{
dialer: d,
addr: addr,
skipVerify: query.Get("skipVerify") == "true",
serviceName: query.Get("serviceName"),
serverName: query.Get("serverName"),
certFile: query.Get("cert"),
}
if g.serviceName == "" {
g.serviceName = "GunService"
}
if g.serverName == "" {
g.serverName = g.addr[:strings.LastIndex(g.addr, ":")]
}
return g, nil
}
func init() {
proxy.AddUsage("grpc", `
gRPC client scheme:
grpc://host:port[?serviceName=SERVICENAME][&serverName=SERVERNAME][&skipVerify=true][&cert=PATH]
`)
}