Skip to content

Commit 34a1739

Browse files
committed
added X-Forwarded-Protocol, X-Forwarded-Ssl, X-Url-Scheme improve more coverage on identifying request scheme
1 parent 001dd41 commit 34a1739

File tree

5 files changed

+50
-27
lines changed

5 files changed

+50
-27
lines changed

ahttp.go

+24-13
Original file line numberDiff line numberDiff line change
@@ -96,24 +96,35 @@ func WrapGzipWriter(w io.Writer) ResponseWriter {
9696
return gr
9797
}
9898

99-
// IdentifyScheme method is to identify value of protocol value. It's is derived
99+
// Scheme method is to identify value of protocol value. It's is derived
100100
// one, Go language doesn't provide directly.
101-
// - `X-Forwarded-Proto` is not empty return value as is
102-
// - `http.Request.TLS` is not nil value is `https`
103-
// - `http.Request.TLS` is nil value is `http`
104-
func IdentifyScheme(r *http.Request) string {
105-
scheme := r.Header.Get("X-Forwarded-Proto")
106-
if scheme == "" {
107-
if r.TLS == nil {
108-
return "http"
109-
}
101+
// - `X-Forwarded-Proto` is not empty, returns as-is
102+
// - `X-Forwarded-Protocol` is not empty, returns as-is
103+
// - `http.Request.TLS` is not nil or `X-Forwarded-Ssl == on` returns `https`
104+
// - `X-Url-Scheme` is not empty, returns as-is
105+
// - returns `http`
106+
func Scheme(r *http.Request) string {
107+
if scheme := r.Header.Get(HeaderXForwardedProto); scheme != "" {
108+
return scheme
109+
}
110+
111+
if scheme := r.Header.Get(HeaderXForwardedProtocol); scheme != "" {
112+
return scheme
113+
}
114+
115+
if r.TLS != nil || r.Header.Get(HeaderXForwardedSsl) == "on" {
110116
return "https"
111117
}
112-
return scheme
118+
119+
if scheme := r.Header.Get(HeaderXUrlScheme); scheme != "" {
120+
return scheme
121+
}
122+
123+
return "http"
113124
}
114125

115-
// IdentifyHost method is to correct Hosyt source value from HTTP request.
116-
func IdentifyHost(r *http.Request) string {
126+
// Host method is to correct Hosyt source value from HTTP request.
127+
func Host(r *http.Request) string {
117128
if r.URL.Host == "" {
118129
return r.Host
119130
}

content_type_test.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package ahttp
66

77
import (
88
"net/url"
9+
"runtime"
910
"testing"
1011

1112
"aahframework.org/essentials.v0"
@@ -41,8 +42,11 @@ func TestHTTPNegotiateContentType(t *testing.T) {
4142
req := createRawHTTPRequest(HeaderAccept, "application/json")
4243
req.URL, _ = url.Parse("http://localhost:8080/testpath.json")
4344
contentType = NegotiateContentType(req)
44-
assert.True(t, contentType.IsEqual("application/json"))
45-
assert.Equal(t, ".json", contentType.Exts[0])
45+
if runtime.GOOS != "windows" { // due to mime types not exists
46+
assert.NotNil(t, contentType)
47+
assert.True(t, contentType.IsEqual("application/json"))
48+
assert.Equal(t, ".json", contentType.Exts[0])
49+
}
4650

4751
req = createRawHTTPRequest(HeaderAccept, "application/json")
4852
req.URL, _ = url.Parse("http://localhost:8080/testpath.html")

header.go

+3
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ const (
7979
HeaderXForwardedHost = "X-Forwarded-Host"
8080
HeaderXForwardedPort = "X-Forwarded-Port"
8181
HeaderXForwardedProto = "X-Forwarded-Proto"
82+
HeaderXForwardedProtocol = "X-Forwarded-Protocol"
83+
HeaderXForwardedSsl = "X-Forwarded-Ssl"
84+
HeaderXUrlScheme = "X-Url-Scheme"
8285
HeaderXForwardedServer = "X-Forwarded-Server"
8386
HeaderXFrameOptions = "X-Frame-Options"
8487
HeaderXHTTPMethodOverride = "X-HTTP-Method-Override"

request.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ var requestPool = &sync.Pool{New: func() interface{} { return &Request{} }}
3333
// ParseRequest method populates the given aah framework `ahttp.Request`
3434
// instance from Go HTTP request.
3535
func ParseRequest(r *http.Request, req *Request) *Request {
36-
req.Scheme = IdentifyScheme(r)
37-
req.Host = IdentifyHost(r)
36+
req.Scheme = Scheme(r)
37+
req.Host = Host(r)
3838
req.Proto = r.Proto
3939
req.Method = r.Method
4040
req.Path = r.URL.Path

request_test.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func TestHTTPRequestParams(t *testing.T) {
158158
f, fh, err := aahReq3.FormFile("testfile.txt")
159159
assert.Nil(t, f)
160160
assert.Equal(t, "testfile.txt", fh.Filename)
161-
assert.Equal(t, "open : no such file or directory", err.Error())
161+
assert.True(t, strings.HasPrefix(err.Error(), "open :"))
162162
ReleaseRequest(aahReq3)
163163
}
164164

@@ -185,20 +185,25 @@ func TestHTTPRequestCookies(t *testing.T) {
185185

186186
func TestRequestSchemeDerived(t *testing.T) {
187187
req := httptest.NewRequest("GET", "http://127.0.0.1:8080/welcome.html", nil)
188-
scheme1 := IdentifyScheme(req)
189-
assert.Equal(t, "http", scheme1)
188+
assert.Equal(t, "http", Scheme(req))
189+
190+
req.Header.Set(HeaderXUrlScheme, "http")
191+
assert.Equal(t, "http", Scheme(req))
192+
193+
req.Header.Set(HeaderXForwardedSsl, "on")
194+
assert.Equal(t, "https", Scheme(req))
190195

191196
req.TLS = &tls.ConnectionState{}
192-
scheme2 := IdentifyScheme(req)
193-
assert.Equal(t, "https", scheme2)
197+
assert.Equal(t, "https", Scheme(req))
198+
199+
req.Header.Set(HeaderXForwardedProtocol, "https")
200+
assert.Equal(t, "https", Scheme(req))
194201

195202
req.Header.Set(HeaderXForwardedProto, "https")
196-
scheme3 := IdentifyScheme(req)
197-
assert.Equal(t, "https", scheme3)
203+
assert.Equal(t, "https", Scheme(req))
198204

199205
req.Header.Set(HeaderXForwardedProto, "http")
200-
scheme4 := IdentifyScheme(req)
201-
assert.Equal(t, "http", scheme4)
206+
assert.Equal(t, "http", Scheme(req))
202207
}
203208

204209
func TestRequestSaveFile(t *testing.T) {
@@ -298,7 +303,7 @@ func TestRequestSaveFileForExistingFile(t *testing.T) {
298303

299304
size, err := saveFile(&buf, "testdata/file1.txt")
300305
assert.NotNil(t, err)
301-
assert.Equal(t, "ahttp: open testdata/file1.txt: file exists", err.Error())
306+
assert.True(t, strings.HasPrefix(err.Error(), "ahttp: open testdata/file1.txt:"))
302307
assert.Equal(t, int64(0), size)
303308
}
304309

0 commit comments

Comments
 (0)