package goxy import ( "errors" "fmt" "net/rpc" "net/url" ) var ( ErrNoHost = errors.New("Both Host and Upstream are required") ErrNoCert = errors.New("Certificate and Key are required") ErrEmptyHost = errors.New("Empty Host value") ) const RPCPort = ":8000" type GoXY struct { server *Server } func init() { rpc.HandleHTTP() } func registerRPC(s *Server) error { return rpc.Register(&GoXY{s}) } func DialRPC(server string) (*rpc.Client, error) { return rpc.DialHTTP("tcp", server) } // Add adds a new route func (s *GoXY) Add(r Route, _ *struct{}) error { if r.Host == "" || r.Upstream == "" { return ErrNoHost } slug, isTLS, err := Slug(r.Host) if err != nil { return err } if isTLS && (r.Cert == nil || r.Key == nil) { return ErrNoCert } s.server.Routes[slug] = r defer s.server.Save(s.server.DataFile) return s.server.UpdateMux() } // Del removes a route func (s *GoXY) Del(host string, _ *struct{}) error { slug, _, err := Slug(host) if err != nil { return err } delete(s.server.Routes, slug) defer s.server.Save(s.server.DataFile) return s.server.UpdateMux() } // List routes func (s GoXY) List(_ struct{}, ret *[]string) error { for _, v := range s.server.Routes { *ret = append(*ret, fmt.Sprint(v)) } return nil } func Slug(host string) (string, bool, error) { h, err := url.Parse(host) if err != nil { return "", false, err } if h.Path == "" { h.Path = "/" } return h.Host + h.Path, h.Scheme == "https", nil }