mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-10-31 10:37:24 -04:00 
			
		
		
		
	* 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 4a018888395b7a90c57faf9ebb8ef04c4e6fe702. * 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:
		
							parent
							
								
									5fcfdab6c7
								
							
						
					
					
						commit
						94af37087b
					
				| @ -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 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -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)) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user