mirror of
https://github.com/nadoo/glider.git
synced 2025-04-21 03:32:07 +08:00
70 lines
1.3 KiB
Go
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]
|
|
`)
|
|
}
|