package goxy import ( "encoding/json" "errors" "fmt" "net/rpc" "os" ) 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 Entries map[string]Entry // Entry holds routing settings type Entry struct { Host string // URL Upstream string // URL Cert []byte // PEM Key []byte // PEM } 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(e Entry, _ *struct{}) error { return s.server.AddEntry(e) } // Del removes a route func (s *GoXY) Del(host string, _ *struct{}) error { return s.server.DelEntry(host) } // 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 (e Entries) Save(fname string) error { fd, err := os.Create(fname) if err != nil { return err } defer fd.Close() return json.NewEncoder(fd).Encode(e) } func (e *Entries) Load(fname string) error { fd, err := os.Open(fname) if err != nil { return err } defer fd.Close() return json.NewDecoder(fd).Decode(e) }