43 lines
908 B
Go
43 lines
908 B
Go
package server
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"net/http/httputil"
|
|
"net/url"
|
|
|
|
"git.secnex.io/secnex/api-gateway/config"
|
|
)
|
|
|
|
type Proxy struct {
|
|
proxies []config.ProxyConfiguration
|
|
handlers map[string]http.Handler
|
|
}
|
|
|
|
func NewProxy(proxies []config.ProxyConfiguration) *Proxy {
|
|
handlers := make(map[string]http.Handler)
|
|
for _, proxy := range proxies {
|
|
backend, err := url.Parse(proxy.Target)
|
|
if err != nil {
|
|
log.Fatalf("Failed to parse proxy target: %v", err)
|
|
}
|
|
p := httputil.NewSingleHostReverseProxy(backend)
|
|
originalDirector := p.Director
|
|
p.Director = func(r *http.Request) {
|
|
originalDirector(r)
|
|
r.Host = backend.Host
|
|
}
|
|
handlers[proxy.Host] = p
|
|
}
|
|
return &Proxy{proxies: proxies, handlers: handlers}
|
|
}
|
|
|
|
func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
handler, ok := p.handlers[r.Host]
|
|
if !ok {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
handler.ServeHTTP(w, r)
|
|
}
|