2023-02-26 22:26:09 +00:00
|
|
|
package proxy
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
2023-04-18 15:50:12 +00:00
|
|
|
"net/http/httputil"
|
2023-02-26 22:26:09 +00:00
|
|
|
"net/url"
|
2023-05-27 12:58:33 +00:00
|
|
|
"crypto/tls"
|
2023-03-31 19:19:38 +00:00
|
|
|
spa "github.com/roberthodgen/spa-server"
|
2023-03-25 20:15:00 +00:00
|
|
|
"github.com/azukaar/cosmos-server/src/utils"
|
2023-02-26 22:26:09 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// NewProxy takes target host and creates a reverse proxy
|
2023-05-27 12:58:33 +00:00
|
|
|
func NewProxy(targetHost string, AcceptInsecureHTTPSTarget bool) (*httputil.ReverseProxy, error) {
|
2023-02-26 22:26:09 +00:00
|
|
|
url, err := url.Parse(targetHost)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
proxy := httputil.NewSingleHostReverseProxy(url)
|
|
|
|
|
2023-05-27 12:58:33 +00:00
|
|
|
if AcceptInsecureHTTPSTarget && url.Scheme == "https" {
|
|
|
|
proxy.Transport = &http.Transport{
|
|
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-26 22:26:09 +00:00
|
|
|
proxy.ModifyResponse = func(resp *http.Response) error {
|
2023-03-10 20:59:56 +00:00
|
|
|
utils.Debug("Response from backend: " + resp.Status)
|
|
|
|
utils.Debug("URL was " + resp.Request.URL.String())
|
2023-04-18 15:50:12 +00:00
|
|
|
|
2023-02-26 22:26:09 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return proxy, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2023-04-18 15:50:12 +00:00
|
|
|
func RouteTo(route utils.ProxyRouteConfig) http.Handler {
|
2023-02-26 22:26:09 +00:00
|
|
|
// initialize a reverse proxy and pass the actual backend server url here
|
|
|
|
|
2023-03-31 19:19:38 +00:00
|
|
|
destination := route.Target
|
|
|
|
routeType := route.Mode
|
|
|
|
|
|
|
|
if(routeType == "SERVAPP" || routeType == "PROXY") {
|
2023-05-27 12:58:33 +00:00
|
|
|
proxy, err := NewProxy(destination, route.AcceptInsecureHTTPSTarget)
|
2023-03-31 19:19:38 +00:00
|
|
|
if err != nil {
|
|
|
|
utils.Error("Create Route", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// create a handler function which uses the reverse proxy
|
|
|
|
return proxy
|
|
|
|
} else if (routeType == "STATIC") {
|
|
|
|
return http.FileServer(http.Dir(destination))
|
|
|
|
} else if (routeType == "SPA") {
|
|
|
|
return spa.SpaHandler(destination, "index.html")
|
|
|
|
} else if(routeType == "REDIRECT") {
|
|
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
http.Redirect(w, r, destination, 302)
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
utils.Error("Invalid route type", nil)
|
|
|
|
return nil
|
|
|
|
}
|
2023-02-26 22:26:09 +00:00
|
|
|
}
|