mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-04 03:27:23 -05:00 
			
		
		
		
	Filter empty headers (#1239)
* Filter empty headers Some web servers (e.g. Jetty 9.3) don’t like HTTP headers with empty values. This commit filters header replacements with zero length. * Extend tests to verify removal of empty headers * Handle add-header case * Change - Use short variable assignment
This commit is contained in:
		
							parent
							
								
									c972ea39c8
								
							
						
					
					
						commit
						b783caaaed
					
				@ -287,12 +287,18 @@ func mutateHeadersByRules(headers, rules http.Header, repl httpserver.Replacer)
 | 
				
			|||||||
	for ruleField, ruleValues := range rules {
 | 
						for ruleField, ruleValues := range rules {
 | 
				
			||||||
		if strings.HasPrefix(ruleField, "+") {
 | 
							if strings.HasPrefix(ruleField, "+") {
 | 
				
			||||||
			for _, ruleValue := range ruleValues {
 | 
								for _, ruleValue := range ruleValues {
 | 
				
			||||||
				headers.Add(strings.TrimPrefix(ruleField, "+"), repl.Replace(ruleValue))
 | 
									replacement := repl.Replace(ruleValue)
 | 
				
			||||||
 | 
									if len(replacement) > 0 {
 | 
				
			||||||
 | 
										headers.Add(strings.TrimPrefix(ruleField, "+"), replacement)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if strings.HasPrefix(ruleField, "-") {
 | 
							} else if strings.HasPrefix(ruleField, "-") {
 | 
				
			||||||
			headers.Del(strings.TrimPrefix(ruleField, "-"))
 | 
								headers.Del(strings.TrimPrefix(ruleField, "-"))
 | 
				
			||||||
		} else if len(ruleValues) > 0 {
 | 
							} else if len(ruleValues) > 0 {
 | 
				
			||||||
			headers.Set(ruleField, repl.Replace(ruleValues[len(ruleValues)-1]))
 | 
								replacement := repl.Replace(ruleValues[len(ruleValues)-1])
 | 
				
			||||||
 | 
								if len(replacement) > 0 {
 | 
				
			||||||
 | 
									headers.Set(ruleField, replacement)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -407,8 +407,10 @@ func TestUpstreamHeadersUpdate(t *testing.T) {
 | 
				
			|||||||
		"Upgrade":    {"{>Upgrade}"},
 | 
							"Upgrade":    {"{>Upgrade}"},
 | 
				
			||||||
		"+Merge-Me":  {"Merge-Value"},
 | 
							"+Merge-Me":  {"Merge-Value"},
 | 
				
			||||||
		"+Add-Me":    {"Add-Value"},
 | 
							"+Add-Me":    {"Add-Value"},
 | 
				
			||||||
 | 
							"+Add-Empty": {"{}"},
 | 
				
			||||||
		"-Remove-Me": {""},
 | 
							"-Remove-Me": {""},
 | 
				
			||||||
		"Replace-Me": {"{hostname}"},
 | 
							"Replace-Me": {"{hostname}"},
 | 
				
			||||||
 | 
							"Clear-Me":   {""},
 | 
				
			||||||
		"Host":       {"{>Host}"},
 | 
							"Host":       {"{>Host}"},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// set up proxy
 | 
						// set up proxy
 | 
				
			||||||
@ -448,6 +450,11 @@ func TestUpstreamHeadersUpdate(t *testing.T) {
 | 
				
			|||||||
			headerKey, expect, got)
 | 
								headerKey, expect, got)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headerKey = "Add-Empty"
 | 
				
			||||||
 | 
						if _, ok := actualHeaders[headerKey]; ok {
 | 
				
			||||||
 | 
							t.Errorf("Request sent to upstream backend should not contain empty %v header", headerKey)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	headerKey = "Remove-Me"
 | 
						headerKey = "Remove-Me"
 | 
				
			||||||
	if _, ok := actualHeaders[headerKey]; ok {
 | 
						if _, ok := actualHeaders[headerKey]; ok {
 | 
				
			||||||
		t.Errorf("Request sent to upstream backend should not contain %v header", headerKey)
 | 
							t.Errorf("Request sent to upstream backend should not contain %v header", headerKey)
 | 
				
			||||||
@ -461,6 +468,11 @@ func TestUpstreamHeadersUpdate(t *testing.T) {
 | 
				
			|||||||
			headerKey, expect, got)
 | 
								headerKey, expect, got)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						headerKey = "Clear-Me"
 | 
				
			||||||
 | 
						if _, ok := actualHeaders[headerKey]; ok {
 | 
				
			||||||
 | 
							t.Errorf("Request sent to upstream backend should not contain empty %v header", headerKey)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if actualHost != expectHost {
 | 
						if actualHost != expectHost {
 | 
				
			||||||
		t.Errorf("Request sent to upstream backend should have value of Host with %s, but got %s", expectHost, actualHost)
 | 
							t.Errorf("Request sent to upstream backend should have value of Host with %s, but got %s", expectHost, actualHost)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user