1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-07-05 00:58:54 +02:00

finish redirect middlewares

This commit is contained in:
Lee Brown
2019-07-12 11:41:41 -08:00
parent df86310a8b
commit 0efe444c05
7 changed files with 337 additions and 7 deletions

View File

@ -2,6 +2,7 @@ package web
import (
"encoding/json"
"net"
"net/http"
"reflect"
"strings"
@ -16,6 +17,22 @@ import (
en_translations "gopkg.in/go-playground/validator.v9/translations/en"
)
// Headers
const (
HeaderUpgrade = "Upgrade"
HeaderXForwardedFor = "X-Forwarded-For"
HeaderXForwardedProto = "X-Forwarded-Proto"
HeaderXForwardedProtocol = "X-Forwarded-Protocol"
HeaderXForwardedSsl = "X-Forwarded-Ssl"
HeaderXUrlScheme = "X-Url-Scheme"
HeaderXHTTPMethodOverride = "X-HTTP-Method-Override"
HeaderXRealIP = "X-Real-IP"
HeaderXRequestID = "X-Request-ID"
HeaderXRequestedWith = "X-Requested-With"
HeaderServer = "Server"
HeaderOrigin = "Origin"
)
// validate holds the settings and caches for validating request struct values.
var validate = validator.New()
@ -154,3 +171,44 @@ func RequestIsJson(r *http.Request) bool {
return false
}
func RequestIsTLS(r *http.Request) bool {
return r.TLS != nil
}
func RequestIsWebSocket(r *http.Request) bool {
upgrade := r.Header.Get(HeaderUpgrade)
return strings.ToLower(upgrade) == "websocket"
}
func RequestScheme(r *http.Request) string {
// Can't use `r.Request.URL.Scheme`
// See: https://groups.google.com/forum/#!topic/golang-nuts/pMUkBlQBDF0
if RequestIsTLS(r) {
return "https"
}
if scheme := r.Header.Get(HeaderXForwardedProto); scheme != "" {
return scheme
}
if scheme := r.Header.Get(HeaderXForwardedProtocol); scheme != "" {
return scheme
}
if ssl := r.Header.Get(HeaderXForwardedSsl); ssl == "on" {
return "https"
}
if scheme := r.Header.Get(HeaderXUrlScheme); scheme != "" {
return scheme
}
return "http"
}
func RequestRealIP(r *http.Request) string {
if ip := r.Header.Get(HeaderXForwardedFor); ip != "" {
return strings.Split(ip, ", ")[0]
}
if ip := r.Header.Get(HeaderXRealIP); ip != "" {
return ip
}
ra, _, _ := net.SplitHostPort(r.RemoteAddr)
return ra
}