-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxginx.go
More file actions
53 lines (45 loc) · 1.15 KB
/
Copy pathxginx.go
File metadata and controls
53 lines (45 loc) · 1.15 KB
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package xginx
import (
"fmt"
"log"
"net/http"
"net/url"
"github.com/xSaCh/xginx/pkg"
"github.com/xSaCh/xginx/pkg/schedulers"
)
type LoadBalancer struct {
ServerPool pkg.ServerPool
Config LoadBalancerConfig
scheduler schedulers.Scheduler
}
func NewLoadBalancer(config *LoadBalancerConfig) *LoadBalancer {
lb := &LoadBalancer{
ServerPool: pkg.ServerPool{},
Config: *config,
}
lb.scheduler = schedulers.NewScheduler(config.Scheduler, &lb.ServerPool)
if lb.scheduler == nil {
return nil
}
return lb
}
func (lb *LoadBalancer) AddBackend(url *url.URL) {
lb.ServerPool.Servers = append(lb.ServerPool.Servers, pkg.NewBackend(url))
}
func (lb *LoadBalancer) Router(w http.ResponseWriter, r *http.Request) {
lg := fmt.Sprintf("Received request from %s\n", r.RemoteAddr)
lg += fmt.Sprintf("%s %s %s\n", r.Method, r.RequestURI, r.Proto)
for key, values := range r.Header {
for _, value := range values {
lg += fmt.Sprintf("%s: %s\n", key, value)
}
}
log.Print(lg)
b := lb.scheduler.GetNextBackend()
if b == nil {
fmt.Println("NILL")
http.Error(w, "Service Unavailable", http.StatusServiceUnavailable)
return
}
b.Serve(w, r)
}