}
var backIs []*Back
+
if t, e := r.Cookie("_psign_" + cookie); e == nil {
- if backP, ok := route.backMap.Load(t.Value); ok && backP.(*Back).IsLive() && HeaderMatchs(backP.(*Back).ReqHeader, r) {
+ if backP, ok := route.backMap.Load(t.Value); ok && HeaderMatchs(backP.(*Back).ReqHeader, r) {
backP.(*Back).cloneDealer()
for i := 0; i < backP.(*Back).Weight; i++ {
backIs = append(backIs, backP.(*Back))
backIs = append(backIs, route.FiliterBackByRequest(r)...)
if len(backIs) == 0 {
- logger.Warn(`W:`, fmt.Sprintf("%v > %v %v", route.config.Addr, route.Path, ErrAllBacksFail))
- w.Header().Add(header+"Error", ErrAllBacksFail.Error())
- w.WriteHeader(http.StatusServiceUnavailable)
+ logger.Warn(`W:`, fmt.Sprintf("%v > %v %v %v", route.config.Addr, route.Path, r.URL.RequestURI(), ErrNoRoute))
+ w.Header().Add(header+"Error", ErrNoRoute.Error())
+ w.WriteHeader(http.StatusNotFound)
return
}
func (t *Route) FiliterBackByRequest(r *http.Request) []*Back {
var backLink []*Back
for i := 0; i < len(t.Backs); i++ {
- if t.Backs[i].IsLive() && HeaderMatchs(t.Backs[i].ReqHeader, r) {
+ if HeaderMatchs(t.Backs[i].ReqHeader, r) {
t.Backs[i].cloneDealer()
for k := 0; k < t.Backs[i].Weight; k++ {
backLink = append(backLink, &t.Backs[i])
chosenBack = backs[0]
backs = backs[1:]
+ if !chosenBack.IsLive() {
+ continue
+ }
+
url := chosenBack.To
if chosenBack.PathAdd {
- url += r.URL.String()
+ url += r.URL.RequestURI()
}
url = "http" + url
}
}
- if 0 == len(backs) && resp == nil {
+ if resp == nil {
logger.Warn(`W:`, fmt.Sprintf("%v > %v > %v http %v %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, ErrAllBacksFail, time.Since(opT)))
return ErrAllBacksFail
- } else if resp == nil {
- return ErrBacksFail
}
if chosenBack.ErrToSec != 0 && time.Since(opT).Seconds() > chosenBack.ErrToSec {
ErrHeaderCheckFail = errors.New("ErrHeaderCheckFail")
ErrBodyCheckFail = errors.New("ErrBodyCheckFail")
ErrAllBacksFail = errors.New("ErrAllBacksFail")
- ErrBacksFail = errors.New("ErrBacksFail")
+ ErrNoRoute = errors.New("ErrNoRoute")
)
chosenBack = backs[0]
backs = backs[1:]
+ if !chosenBack.IsLive() {
+ continue
+ }
+
_, e := BodyMatchs(chosenBack.tmp.ReqBody, r)
if e != nil {
logger.Warn(`W:`, fmt.Sprintf("%v > %v > %v ws %v %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, e, time.Since(opT)))
url := chosenBack.To
if chosenBack.PathAdd {
- url += r.URL.String()
+ url += r.URL.RequestURI()
}
url = "ws" + url
}
}
- if 0 == len(backs) && (resp == nil || conn == nil) {
+ if resp == nil || conn == nil {
logger.Warn(`W:`, fmt.Sprintf("%v > %v > %v ws %v %v", chosenBack.route.config.Addr, routePath, chosenBack.Name, ErrAllBacksFail, time.Since(opT)))
return ErrAllBacksFail
- } else if resp == nil || conn == nil {
- return ErrBacksFail
}
if chosenBack.ErrToSec != 0 && time.Since(opT).Seconds() > chosenBack.ErrToSec {