Merge pull request #307 from cheeseandcereal/add_proxy_port

add proxy-port for port override when running behind a proxy
This commit is contained in:
Andrea Spacca 2020-05-17 19:28:21 +02:00 committed by GitHub
commit 9430e53689
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 23 deletions

View file

@ -90,6 +90,7 @@ ip-blacklist | comma separated list of ips not allowed to connect to the service
temp-path | path to temp folder | system temp | TEMP_PATH | temp-path | path to temp folder | system temp | TEMP_PATH |
web-path | path to static web files (for development or custom front end) | | WEB_PATH | web-path | path to static web files (for development or custom front end) | | WEB_PATH |
proxy-path | path prefix when service is run behind a proxy | | PROXY_PATH | proxy-path | path prefix when service is run behind a proxy | | PROXY_PATH |
proxy-port | port of the proxy when the service is run behind a proxy | | PROXY_PORT |
ga-key | google analytics key for the front end | | GA_KEY | ga-key | google analytics key for the front end | | GA_KEY |
uservoice-key | user voice key for the front end | | USERVOICE_KEY | uservoice-key | user voice key for the front end | | USERVOICE_KEY |
provider | which storage provider to use | (s3, gdrive or local) | PROVIDER | provider | which storage provider to use | (s3, gdrive or local) | PROVIDER |

View file

@ -91,6 +91,12 @@ var globalFlags = []cli.Flag{
Value: "", Value: "",
EnvVar: "PROXY_PATH", EnvVar: "PROXY_PATH",
}, },
cli.StringFlag{
Name: "proxy-port",
Usage: "port of the proxy when the service is run behind a proxy",
Value: "",
EnvVar: "PROXY_PORT",
},
cli.StringFlag{ cli.StringFlag{
Name: "ga-key", Name: "ga-key",
Usage: "key for google analytics (front end)", Usage: "key for google analytics (front end)",
@ -299,6 +305,10 @@ func New() *Cmd {
options = append(options, server.ProxyPath(v)) options = append(options, server.ProxyPath(v))
} }
if v := c.String("proxy-port"); v != "" {
options = append(options, server.ProxyPort(v))
}
if v := c.String("ga-key"); v != "" { if v := c.String("ga-key"); v != "" {
options = append(options, server.GoogleAnalytics(v)) options = append(options, server.GoogleAnalytics(v))
} }

View file

@ -158,9 +158,9 @@ func (s *Server) previewHandler(w http.ResponseWriter, r *http.Request) {
} }
relativeURL, _ := url.Parse(path.Join(s.proxyPath, token, filename)) relativeURL, _ := url.Parse(path.Join(s.proxyPath, token, filename))
resolvedURL := resolveURL(r, relativeURL) resolvedURL := resolveURL(r, relativeURL, s.proxyPort)
relativeURLGet, _ := url.Parse(path.Join(s.proxyPath, getPathPart, token, filename)) relativeURLGet, _ := url.Parse(path.Join(s.proxyPath, getPathPart, token, filename))
resolvedURLGet := resolveURL(r, relativeURLGet) resolvedURLGet := resolveURL(r, relativeURLGet, s.proxyPort)
var png []byte var png []byte
png, err = qrcode.Encode(resolvedURL, qrcode.High, 150) png, err = qrcode.Encode(resolvedURL, qrcode.High, 150)
if err != nil { if err != nil {
@ -170,8 +170,8 @@ func (s *Server) previewHandler(w http.ResponseWriter, r *http.Request) {
qrCode := base64.StdEncoding.EncodeToString(png) qrCode := base64.StdEncoding.EncodeToString(png)
hostname := getURL(r).Host hostname := getURL(r, s.proxyPort).Host
webAddress := resolveWebAddress(r, s.proxyPath) webAddress := resolveWebAddress(r, s.proxyPath, s.proxyPort)
data := struct { data := struct {
ContentType string ContentType string
@ -212,8 +212,8 @@ func (s *Server) previewHandler(w http.ResponseWriter, r *http.Request) {
func (s *Server) viewHandler(w http.ResponseWriter, r *http.Request) { func (s *Server) viewHandler(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r) // vars := mux.Vars(r)
hostname := getURL(r).Host hostname := getURL(r, s.proxyPort).Host
webAddress := resolveWebAddress(r, s.proxyPath) webAddress := resolveWebAddress(r, s.proxyPath, s.proxyPort)
data := struct { data := struct {
Hostname string Hostname string
@ -339,7 +339,7 @@ func (s *Server) postHandler(w http.ResponseWriter, r *http.Request) {
filename = url.PathEscape(filename) filename = url.PathEscape(filename)
relativeURL, _ := url.Parse(path.Join(s.proxyPath, token, filename)) relativeURL, _ := url.Parse(path.Join(s.proxyPath, token, filename))
fmt.Fprintln(w, getURL(r).ResolveReference(relativeURL).String()) fmt.Fprintln(w, getURL(r, s.proxyPort).ResolveReference(relativeURL).String())
cleanTmpFile(file) cleanTmpFile(file)
} }
@ -500,15 +500,15 @@ func (s *Server) putHandler(w http.ResponseWriter, r *http.Request) {
relativeURL, _ := url.Parse(path.Join(s.proxyPath, token, filename)) relativeURL, _ := url.Parse(path.Join(s.proxyPath, token, filename))
deleteURL, _ := url.Parse(path.Join(s.proxyPath, token, filename, metadata.DeletionToken)) deleteURL, _ := url.Parse(path.Join(s.proxyPath, token, filename, metadata.DeletionToken))
w.Header().Set("X-Url-Delete", resolveURL(r, deleteURL)) w.Header().Set("X-Url-Delete", resolveURL(r, deleteURL, s.proxyPort))
fmt.Fprint(w, resolveURL(r, relativeURL)) fmt.Fprint(w, resolveURL(r, relativeURL, s.proxyPort))
} }
func resolveURL(r *http.Request, u *url.URL) string { func resolveURL(r *http.Request, u *url.URL, proxyPort string) string {
r.URL.Path = "" r.URL.Path = ""
return getURL(r).ResolveReference(u).String() return getURL(r, proxyPort).ResolveReference(u).String()
} }
func resolveKey(key, proxyPath string) string { func resolveKey(key, proxyPath string) string {
@ -525,8 +525,8 @@ func resolveKey(key, proxyPath string) string {
return key return key
} }
func resolveWebAddress(r *http.Request, proxyPath string) string { func resolveWebAddress(r *http.Request, proxyPath string, proxyPort string) string {
url := getURL(r) url := getURL(r, proxyPort)
var webAddress string var webAddress string
@ -544,7 +544,7 @@ func resolveWebAddress(r *http.Request, proxyPath string) string {
return webAddress return webAddress
} }
func getURL(r *http.Request) *url.URL { func getURL(r *http.Request, proxyPort string) *url.URL {
u, _ := url.Parse(r.URL.String()) u, _ := url.Parse(r.URL.String())
if r.TLS != nil { if r.TLS != nil {
@ -555,16 +555,25 @@ func getURL(r *http.Request) *url.URL {
u.Scheme = "http" u.Scheme = "http"
} }
if u.Host != "" { if u.Host == "" {
} else if host, port, err := net.SplitHostPort(r.Host); err != nil { host, port, err := net.SplitHostPort(r.Host)
u.Host = r.Host if err != nil {
} else { host = r.Host
if port == "80" && u.Scheme == "http" { port = ""
u.Host = host }
} else if port == "443" && u.Scheme == "https" { if len(proxyPort) != 0 {
port = proxyPort
}
if len(port) == 0 {
u.Host = host u.Host = host
} else { } else {
u.Host = net.JoinHostPort(host, port) if port == "80" && u.Scheme == "http" {
u.Host = host
} else if port == "443" && u.Scheme == "https" {
u.Host = host
} else {
u.Host = net.JoinHostPort(host, port)
}
} }
} }
@ -1009,7 +1018,7 @@ func (s *Server) RedirectHandler(h http.Handler) http.HandlerFunc {
} else if r.Header.Get("X-Forwarded-Proto") == "https" { } else if r.Header.Get("X-Forwarded-Proto") == "https" {
} else if r.URL.Scheme == "https" { } else if r.URL.Scheme == "https" {
} else { } else {
u := getURL(r) u := getURL(r, s.proxyPort)
u.Scheme = "https" u.Scheme = "https"
http.Redirect(w, r, u.String(), http.StatusPermanentRedirect) http.Redirect(w, r, u.String(), http.StatusPermanentRedirect)

View file

@ -141,6 +141,12 @@ func ProxyPath(s string) OptionFn {
} }
} }
func ProxyPort(s string) OptionFn {
return func(srvr *Server) {
srvr.proxyPort = s
}
}
func TempPath(s string) OptionFn { func TempPath(s string) OptionFn {
return func(srvr *Server) { return func(srvr *Server) {
if s[len(s)-1:] != "/" { if s[len(s)-1:] != "/" {
@ -280,6 +286,7 @@ type Server struct {
webPath string webPath string
proxyPath string proxyPath string
proxyPort string
gaKey string gaKey string
userVoiceKey string userVoiceKey string