0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2024-12-23 22:27:38 -05:00

Fix for fastcgi deletion of Caddy-Rewrite-Original-URI header #1153 (#1184)

* Very simple fix for #1153

* Prevent  Caddy-Rewrite-Original-URI being added as  an HTTP ENV variable passed to FastCGI

part of fix for #1153

* Changes to Markdown to fix travis CI build.

#1955.2

* Revert "Changes to Markdown to fix travis CI build."

This reverts commit 4a01888839.

* fail fast and fmt changes

* Create test for existance of Caddy-Rewrite-Original-URI header value #1153

* updated test comment

* const moved outside function so available to tests
This commit is contained in:
Toby Allen 2016-10-16 19:11:52 +01:00 committed by Matt Holt
parent 5fcfdab6c7
commit 94af37087b
3 changed files with 44 additions and 4 deletions

View file

@ -31,6 +31,11 @@ type Handler struct {
ServerPort string ServerPort string
} }
// When a rewrite is performed, a header field of this name
// is added to the request
// It contains the original request URI before the rewrite.
const internalRewriteFieldName = "Caddy-Rewrite-Original-URI"
// ServeHTTP satisfies the httpserver.Handler interface. // ServeHTTP satisfies the httpserver.Handler interface.
func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
for _, rule := range h.Rules { for _, rule := range h.Rules {
@ -201,11 +206,9 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]
// or it might have been rewritten internally by the rewrite middleware (see issue #256). // or it might have been rewritten internally by the rewrite middleware (see issue #256).
// If it was rewritten, there will be a header indicating the original URL, // If it was rewritten, there will be a header indicating the original URL,
// which is needed to get the correct RequestURI value for PHP apps. // which is needed to get the correct RequestURI value for PHP apps.
const internalRewriteFieldName = "Caddy-Rewrite-Original-URI"
reqURI := r.URL.RequestURI() reqURI := r.URL.RequestURI()
if origURI := r.Header.Get(internalRewriteFieldName); origURI != "" { if origURI := r.Header.Get(internalRewriteFieldName); origURI != "" {
reqURI = origURI reqURI = origURI
r.Header.Del(internalRewriteFieldName)
} }
// Some variables are unused but cleared explicitly to prevent // Some variables are unused but cleared explicitly to prevent
@ -258,13 +261,15 @@ func (h Handler) buildEnv(r *http.Request, rule Rule, fpath string) (map[string]
env[envVar[0]] = replacer.Replace(envVar[1]) env[envVar[0]] = replacer.Replace(envVar[1])
} }
// Add all HTTP headers to env variables // Add all HTTP headers (except Caddy-Rewrite-Original-URI ) to env variables
for field, val := range r.Header { for field, val := range r.Header {
if strings.ToLower(field) == strings.ToLower(internalRewriteFieldName) {
continue
}
header := strings.ToUpper(field) header := strings.ToUpper(field)
header = headerNameReplacer.Replace(header) header = headerNameReplacer.Replace(header)
env["HTTP_"+header] = strings.Join(val, ", ") env["HTTP_"+header] = strings.Join(val, ", ")
} }
return env, nil return env, nil
} }

View file

@ -7,6 +7,7 @@ import (
"net/http/httptest" "net/http/httptest"
"net/url" "net/url"
"strconv" "strconv"
"strings"
"sync" "sync"
"testing" "testing"
) )
@ -230,6 +231,9 @@ func TestBuildEnv(t *testing.T) {
Host: "localhost:2015", Host: "localhost:2015",
RemoteAddr: "[2b02:1810:4f2d:9400:70ab:f822:be8a:9093]:51688", RemoteAddr: "[2b02:1810:4f2d:9400:70ab:f822:be8a:9093]:51688",
RequestURI: "/fgci_test.php", RequestURI: "/fgci_test.php",
Header: map[string][]string{
"Foo": {"Bar", "two"},
},
} }
} }
@ -293,4 +297,24 @@ func TestBuildEnv(t *testing.T) {
envExpected["CUSTOM_URI"] = "custom_uri/fgci_test.php?test=blabla" envExpected["CUSTOM_URI"] = "custom_uri/fgci_test.php?test=blabla"
envExpected["CUSTOM_QUERY"] = "custom=true&test=blabla" envExpected["CUSTOM_QUERY"] = "custom=true&test=blabla"
testBuildEnv(r, rule, fpath, envExpected) testBuildEnv(r, rule, fpath, envExpected)
// 6. Test Caddy-Rewrite-Original-URI header is not removed
r = newReq()
rule.EnvVars = [][2]string{
{"HTTP_HOST", "{host}"},
{"CUSTOM_URI", "custom_uri{uri}"},
{"CUSTOM_QUERY", "custom=true&{query}"},
}
envExpected = newEnv()
envExpected["HTTP_HOST"] = "localhost:2015"
envExpected["CUSTOM_URI"] = "custom_uri/fgci_test.php?test=blabla"
envExpected["CUSTOM_QUERY"] = "custom=true&test=blabla"
httpFieldName := strings.ToUpper(internalRewriteFieldName)
envExpected["HTTP_"+httpFieldName] = ""
r.Header.Add(internalRewriteFieldName, "/apath/torewrite/index.php")
testBuildEnv(r, rule, fpath, envExpected)
if r.Header.Get(internalRewriteFieldName) == "" {
t.Errorf("Error: Header Expected %v", internalRewriteFieldName)
}
} }

View file

@ -125,6 +125,17 @@ func TestFastcgiParse(t *testing.T) {
dialer: &persistentDialer{size: 5, network: network, address: address}, dialer: &persistentDialer{size: 5, network: network, address: address},
IndexFiles: []string{}, IndexFiles: []string{},
}}}, }}},
{`fastcgi / ` + defaultAddress + ` {
split .php
}`,
false, []Rule{{
Path: "/",
Address: defaultAddress,
Ext: "",
SplitPath: ".php",
dialer: basicDialer{network: network, address: address},
IndexFiles: []string{},
}}},
} }
for i, test := range tests { for i, test := range tests {
actualFastcgiConfigs, err := fastcgiParse(caddy.NewTestController("http", test.inputFastcgiConfig)) actualFastcgiConfigs, err := fastcgiParse(caddy.NewTestController("http", test.inputFastcgiConfig))