func (h *tcpSyncHandler) Set(data *router.Route) error { route := data.TCPRoute() r := &tcpRoute{ TCPRoute: route, addr: h.l.IP + ":" + strconv.Itoa(route.Port), parent: h.l, } h.l.mtx.Lock() defer h.l.mtx.Unlock() if h.l.closed { return nil } service := h.l.services[r.Service] if service != nil && service.name != r.Service { service.refs-- if service.refs <= 0 { service.Close() delete(h.l.services, service.name) } service = nil } if service == nil { sc, err := cache.New(h.l.discoverd.Service(r.Service)) if err != nil { return err } service = newService(r.Service, sc, h.l.wm, r.DrainBackends) h.l.services[r.Service] = service } r.service = service var bf proxy.BackendListFunc if r.Leader { bf = service.sc.LeaderAddr } else { bf = service.sc.Addrs } r.rp = proxy.NewReverseProxy(bf, nil, false, service, logger) if listener, ok := h.l.listeners[r.Port]; ok { r.l = listener delete(h.l.listeners, r.Port) } started := make(chan error) go r.Serve(started) if err := <-started; err != nil { if r.l != nil { h.l.listeners[r.Port] = r.l } return err } service.refs++ h.l.routes[data.ID] = r h.l.ports[r.Port] = r go h.l.wm.Send(&router.Event{Event: router.EventTypeRouteSet, ID: data.ID, Route: r.ToRoute()}) return nil }
func (h *tcpSyncHandler) Set(data *router.Route) error { route := data.TCPRoute() r := &tcpRoute{ TCPRoute: route, addr: h.l.IP + ":" + strconv.Itoa(route.Port), parent: h.l, } h.l.mtx.Lock() defer h.l.mtx.Unlock() if h.l.closed { return nil } service := h.l.services[r.Service] if service != nil && service.name != r.Service { service.refs-- if service.refs <= 0 { service.sc.Close() delete(h.l.services, service.name) } service = nil } if service == nil { sc, err := NewDiscoverdServiceCache(h.l.discoverd.Service(r.Service)) if err != nil { return err } service = &tcpService{ name: r.Service, sc: sc, rp: proxy.NewReverseProxy(sc.Addrs, nil, false), } h.l.services[r.Service] = service } r.service = service if listener, ok := h.l.listeners[r.Port]; ok { r.l = listener delete(h.l.listeners, r.Port) } started := make(chan error) go r.Serve(started) if err := <-started; err != nil { if r.l != nil { h.l.listeners[r.Port] = r.l } return err } service.refs++ h.l.routes[data.ID] = r h.l.ports[r.Port] = r go h.l.wm.Send(&router.Event{Event: "set", ID: data.ID}) return nil }
func (h *httpSyncHandler) Set(data *router.Route) error { route := data.HTTPRoute() r := &httpRoute{HTTPRoute: route} if r.TLSCert != "" && r.TLSKey != "" { kp, err := tls.X509KeyPair([]byte(r.TLSCert), []byte(r.TLSKey)) if err != nil { return err } r.keypair = &kp r.TLSCert = "" r.TLSKey = "" } h.l.mtx.Lock() defer h.l.mtx.Unlock() if h.l.closed { return nil } service := h.l.services[r.Service] if service != nil && service.name != r.Service { service.refs-- if service.refs <= 0 { service.sc.Close() delete(h.l.services, service.name) } service = nil } if service == nil { sc, err := cache.New(h.l.discoverd.Service(r.Service)) if err != nil { return err } service = &httpService{ name: r.Service, sc: sc, rp: proxy.NewReverseProxy(sc.Addrs, h.l.cookieKey, r.Sticky), } h.l.services[r.Service] = service } service.refs++ r.service = service h.l.routes[data.ID] = r h.l.domains[strings.ToLower(r.Domain)] = r go h.l.wm.Send(&router.Event{Event: "set", ID: r.Domain}) return nil }
func (h *httpSyncHandler) Set(data *router.Route) error { route := data.HTTPRoute() r := &httpRoute{HTTPRoute: route} if r.TLSCert != "" && r.TLSKey != "" { kp, err := tls.X509KeyPair([]byte(r.TLSCert), []byte(r.TLSKey)) if err != nil { return err } r.keypair = &kp r.TLSCert = "" r.TLSKey = "" } h.l.mtx.Lock() defer h.l.mtx.Unlock() if h.l.closed { return nil } service := h.l.services[r.Service] if service != nil && service.name != r.Service { service.refs-- if service.refs <= 0 { service.sc.Close() delete(h.l.services, service.name) } service = nil } if service == nil { sc, err := cache.New(h.l.discoverd.Service(r.Service)) if err != nil { return err } service = &httpService{ name: r.Service, sc: sc, } h.l.services[r.Service] = service } service.refs++ r.rp = proxy.NewReverseProxy(service.sc.Addrs, h.l.cookieKey, r.Sticky) r.service = service h.l.routes[data.ID] = r if data.Path == "/" { if tree, ok := h.l.domains[strings.ToLower(r.Domain)]; ok { tree.backend = r } else { h.l.domains[strings.ToLower(r.Domain)] = NewTree(r) } } else { if tree, ok := h.l.domains[strings.ToLower(r.Domain)]; ok { tree.Insert(r.Path, r) } else { logger.Error("Failed insert of path based route, consistency violation.") } } go h.l.wm.Send(&router.Event{Event: "set", ID: r.Domain, Route: r.ToRoute()}) return nil }
func (h *httpSyncHandler) Set(data *router.Route) error { route := data.HTTPRoute() r := &httpRoute{HTTPRoute: route} cert := r.Certificate if cert != nil && cert.Cert != "" && cert.Key != "" { kp, err := tls.X509KeyPair([]byte(cert.Cert), []byte(cert.Key)) if err != nil { return err } r.keypair = &kp r.Certificate = nil } h.l.mtx.Lock() defer h.l.mtx.Unlock() if h.l.closed { return nil } service := h.l.services[r.Service] if service != nil && service.name != r.Service { service.refs-- if service.refs <= 0 { service.Close() delete(h.l.services, service.name) } service = nil } if service == nil { sc, err := cache.New(h.l.discoverd.Service(r.Service)) if err != nil { return err } service = newService(r.Service, sc, h.l.wm, r.DrainBackends) h.l.services[r.Service] = service } service.refs++ var bf proxy.BackendListFunc if r.Leader { bf = service.sc.LeaderAddr } else { bf = service.sc.Addrs } r.rp = proxy.NewReverseProxy(bf, h.l.cookieKey, r.Sticky, service, logger) r.service = service h.l.routes[data.ID] = r if data.Path == "/" { if tree, ok := h.l.domains[strings.ToLower(r.Domain)]; ok { tree.backend = r } else { h.l.domains[strings.ToLower(r.Domain)] = NewTree(r) } } else { if tree, ok := h.l.domains[strings.ToLower(r.Domain)]; ok { tree.Insert(r.Path, r) } else { logger.Error("Failed insert of path based route, consistency violation.") } } go h.l.wm.Send(&router.Event{Event: router.EventTypeRouteSet, ID: r.Domain, Route: r.ToRoute()}) return nil }