TUN-1736: Missing headers when passing an invalid path
This commit is contained in:
		
							parent
							
								
									3c0ea0db65
								
							
						
					
					
						commit
						3c93d9b300
					
				|  | @ -45,16 +45,7 @@ func H2RequestHeadersToH1Request(h2 []h2mux.Header, h1 *http.Request) error { | |||
| 			// Otherwise the host header will be based on the origin URL
 | ||||
| 			h1.Host = header.Value | ||||
| 		case ":path": | ||||
| 			u, err := url.Parse(header.Value) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("unparseable path") | ||||
| 			} | ||||
| 			resolved := h1.URL.ResolveReference(u) | ||||
| 			// prevent escaping base URL
 | ||||
| 			if !strings.HasPrefix(resolved.String(), h1.URL.String()) { | ||||
| 				return fmt.Errorf("invalid path") | ||||
| 			} | ||||
| 			h1.URL = resolved | ||||
| 			h1.URL.Path = header.Value | ||||
| 		case "content-length": | ||||
| 			contentLength, err := strconv.ParseInt(header.Value, 10, 64) | ||||
| 			if err != nil { | ||||
|  |  | |||
|  | @ -0,0 +1,77 @@ | |||
| package streamhandler | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/cloudflare/cloudflared/h2mux" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
| 
 | ||||
| func TestH2RequestHeadersToH1Request_RegularHeaders(t *testing.T) { | ||||
| 	request, err := http.NewRequest(http.MethodGet, "http://example.com", nil) | ||||
| 	assert.NoError(t, err) | ||||
| 
 | ||||
| 	headersConversionErr := H2RequestHeadersToH1Request( | ||||
| 		[]h2mux.Header{ | ||||
| 			h2mux.Header{ | ||||
| 				Name:  "Mock header 1", | ||||
| 				Value: "Mock value 1", | ||||
| 			}, | ||||
| 			h2mux.Header{ | ||||
| 				Name:  "Mock header 2", | ||||
| 				Value: "Mock value 2", | ||||
| 			}, | ||||
| 		}, | ||||
| 		request, | ||||
| 	) | ||||
| 
 | ||||
| 	assert.Equal(t, http.Header{ | ||||
| 		"Mock header 1": []string{"Mock value 1"}, | ||||
| 		"Mock header 2": []string{"Mock value 2"}, | ||||
| 	}, request.Header) | ||||
| 
 | ||||
| 	assert.NoError(t, headersConversionErr) | ||||
| } | ||||
| 
 | ||||
| func TestH2RequestHeadersToH1Request_NoHeaders(t *testing.T) { | ||||
| 	request, err := http.NewRequest(http.MethodGet, "http://example.com", nil) | ||||
| 	assert.NoError(t, err) | ||||
| 
 | ||||
| 	headersConversionErr := H2RequestHeadersToH1Request( | ||||
| 		[]h2mux.Header{}, | ||||
| 		request, | ||||
| 	) | ||||
| 
 | ||||
| 	assert.Equal(t, http.Header{}, request.Header) | ||||
| 
 | ||||
| 	assert.NoError(t, headersConversionErr) | ||||
| } | ||||
| 
 | ||||
| func TestH2RequestHeadersToH1Request_InvalidHostPath(t *testing.T) { | ||||
| 	request, err := http.NewRequest(http.MethodGet, "http://example.com", nil) | ||||
| 	assert.NoError(t, err) | ||||
| 
 | ||||
| 	headersConversionErr := H2RequestHeadersToH1Request( | ||||
| 		[]h2mux.Header{ | ||||
| 			h2mux.Header{ | ||||
| 				Name:  ":path", | ||||
| 				Value: "//bad_path/", | ||||
| 			}, | ||||
| 			h2mux.Header{ | ||||
| 				Name:  "Mock header", | ||||
| 				Value: "Mock value", | ||||
| 			}, | ||||
| 		}, | ||||
| 		request, | ||||
| 	) | ||||
| 
 | ||||
| 	assert.Equal(t, http.Header{ | ||||
| 		"Mock header": []string{"Mock value"}, | ||||
| 	}, request.Header) | ||||
| 
 | ||||
| 	assert.Equal(t, request.URL.String(), "http://example.com//bad_path/") | ||||
| 
 | ||||
| 	assert.NoError(t, headersConversionErr) | ||||
| } | ||||
		Loading…
	
		Reference in New Issue