You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.2 KiB
99 lines
2.2 KiB
package main |
|
|
|
import ( |
|
"fmt" |
|
"log" |
|
"net" |
|
"net/http" |
|
"net/http/httputil" |
|
"os" |
|
"runtime" |
|
"time" |
|
|
|
"github.com/cr3a70r/shield/internal/management" |
|
"github.com/cr3a70r/shield/internal/proxy" |
|
"github.com/cr3a70r/shield/internal/utils" |
|
"github.com/xlab/closer" |
|
) |
|
|
|
func main() { |
|
logFile, err := os.OpenFile("runlog.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) |
|
if err != nil { |
|
log.Fatal(err) |
|
} else { |
|
log.SetOutput(logFile) |
|
} |
|
defer logFile.Close() |
|
|
|
closer.Bind(cleanup) |
|
|
|
logger := utils.New(os.Stdout, utils.LevelInfo) |
|
|
|
test := workingProxyForDomain(logger, "test.dev.corp.daydev.org", "10.10.20.40", "9090") |
|
http.HandleFunc("/", test.Handler) |
|
proxysrv := &http.Server{ |
|
Addr: ":8085", |
|
Handler: nil, |
|
} |
|
|
|
go func() { |
|
if err := proxysrv.ListenAndServe(); err != nil && err != http.ErrServerClosed { |
|
logger.PrintError(err, map[string]string{ |
|
"err": "failed to start proxy server", |
|
}) |
|
} |
|
}() |
|
|
|
management.Settings.Initialize() |
|
|
|
//Building hosts from configured domains |
|
for _, d := range management.Settings.Domains { |
|
management.Settings.Hosts = append(management.Settings.Hosts, d.DomainName) |
|
} |
|
|
|
fmt.Println(runtime.NumGoroutine()) |
|
|
|
go management.StartWebserver("0.0.0.0:8080") |
|
|
|
closer.Hold() |
|
} |
|
|
|
func cleanup() { |
|
fmt.Println("Closing Application") |
|
} |
|
|
|
func workingProxyForDomain(logger *utils.Logger, domain string, realServer string, port string) *proxy.ReverseProxy { |
|
transport := &http.Transport{ |
|
DialContext: (&net.Dialer{ |
|
Timeout: 5 * time.Second, |
|
}).DialContext, |
|
} |
|
|
|
conf := &proxy.Config{ |
|
Path: domain, |
|
Host: realServer, |
|
Override: proxy.Override{}, |
|
} |
|
|
|
director := &httputil.ReverseProxy{Director: func(req *http.Request) { |
|
originHost := conf.Host |
|
logger.PrintInfo("provided host", map[string]string{ |
|
"host": originHost, |
|
}) |
|
req.Header.Add("X-Forwarded-Host", req.Host) |
|
req.Header.Add("X-Origin-Host", originHost) |
|
req.Header.Add("Accept-Encoding", "") |
|
req.Host = originHost |
|
req.URL.Host = originHost |
|
req.URL.Scheme = "http" |
|
|
|
if conf.Override.Header != "" && conf.Override.Match != "" { |
|
if req.Header.Get(conf.Override.Header) == conf.Override.Match { |
|
req.URL.Path = conf.Override.Path |
|
} |
|
} |
|
}} |
|
|
|
prv := proxy.NewProxy(conf.Host, transport, director, logger, port) |
|
return prv |
|
}
|
|
|