|
@@ -24,7 +24,7 @@ func (m *RouteManager) GetRequestUpstreamTarget(w http.ResponseWriter, r *http.R
|
|
|
if useStickySession {
|
|
|
|
|
|
targetOriginId, err := m.getSessionHandler(r, origins)
|
|
|
- if err != nil || !m.IsTargetOnline(origins[targetOriginId].OriginIpOrDomain) {
|
|
|
+ if err != nil {
|
|
|
|
|
|
|
|
|
origins = m.FilterOfflineOrigins(origins)
|
|
@@ -39,14 +39,18 @@ func (m *RouteManager) GetRequestUpstreamTarget(w http.ResponseWriter, r *http.R
|
|
|
targetOrigin = origins[0]
|
|
|
index = 0
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
m.setSessionHandler(w, r, targetOrigin.OriginIpOrDomain, index)
|
|
|
return targetOrigin, nil
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
return origins[targetOriginId], nil
|
|
|
}
|
|
|
|
|
|
+ m.clearSessionHandler(w, r)
|
|
|
|
|
|
|
|
|
origins = m.FilterOfflineOrigins(origins)
|
|
@@ -89,6 +93,20 @@ func (m *RouteManager) setSessionHandler(w http.ResponseWriter, r *http.Request,
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+func (m *RouteManager) clearSessionHandler(w http.ResponseWriter, r *http.Request) error {
|
|
|
+ session, err := m.SessionStore.Get(r, "STICKYSESSION")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ session.Options.MaxAge = -1
|
|
|
+ session.Options.Path = "/"
|
|
|
+ err = session.Save(r, w)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
func (m *RouteManager) getSessionHandler(r *http.Request, upstreams []*Upstream) (int, error) {
|
|
|
|
|
@@ -105,15 +123,22 @@ func (m *RouteManager) getSessionHandler(r *http.Request, upstreams []*Upstream)
|
|
|
return -1, errors.New("no session has been set")
|
|
|
}
|
|
|
originDomain := originDomainRaw.(string)
|
|
|
- originID := originIDRaw.(int)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for i, upstream := range upstreams {
|
|
|
+ if upstream.OriginIpOrDomain == originDomain {
|
|
|
+ if !m.IsTargetOnline(originDomain) {
|
|
|
+
|
|
|
+ return -1, errors.New("origin is offline")
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
- if len(upstreams) < originID || upstreams[originID].OriginIpOrDomain != originDomain {
|
|
|
-
|
|
|
- return -1, errors.New("upstreams has been changed")
|
|
|
+
|
|
|
+ return i, nil
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return originID, nil
|
|
|
+ return -1, errors.New("origin is no longer exists")
|
|
|
}
|
|
|
|
|
|
|