-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserve.go
39 lines (31 loc) · 900 Bytes
/
serve.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package stargate
import "net/http"
func serve(lb LoadBalancer) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var server OriginServer
if lb.Length() > 0 {
serverCount := 0
for sv := lb.NextServer(); serverCount < lb.Length(); sv = lb.NextServer() {
if !sv.Healthy() {
Log.Debug("origin %q is not healthy", sv.Address())
serverCount++
continue
}
server = sv
break
}
}
if server == nil {
Log.Error("No alive server available for downstreamRoute %s", r.URL)
w.Header().Add("Content-Type", "text/html")
w.WriteHeader(http.StatusServiceUnavailable)
_, err := w.Write([]byte(`<h1>503 Service Unavailable</h1>"`))
if err != nil {
Log.Error("Unable to write response to client: %v\n", err)
}
return
}
Log.Debug("Resolved backend %s", server.Address())
server.ServeHTTP(w, r)
})
}