Merge pull request #934 from stevvooe/sanitize-url-correctly
Correctly sanitize location url preserving parametersmaster
						commit
						1927c6c0f2
					
				|  | @ -358,25 +358,18 @@ type blobs struct { | |||
| 	distribution.BlobDeleter | ||||
| } | ||||
| 
 | ||||
| func sanitizeLocation(location, source string) (string, error) { | ||||
| func sanitizeLocation(location, base string) (string, error) { | ||||
| 	baseURL, err := url.Parse(base) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 
 | ||||
| 	locationURL, err := url.Parse(location) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 
 | ||||
| 	if locationURL.Scheme == "" { | ||||
| 		sourceURL, err := url.Parse(source) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 		locationURL = &url.URL{ | ||||
| 			Scheme: sourceURL.Scheme, | ||||
| 			Host:   sourceURL.Host, | ||||
| 			Path:   location, | ||||
| 		} | ||||
| 		location = locationURL.String() | ||||
| 	} | ||||
| 	return location, nil | ||||
| 	return baseURL.ResolveReference(locationURL).String(), nil | ||||
| } | ||||
| 
 | ||||
| func (bs *blobs) Stat(ctx context.Context, dgst digest.Digest) (distribution.Descriptor, error) { | ||||
|  |  | |||
|  | @ -857,3 +857,49 @@ func TestCatalogInParts(t *testing.T) { | |||
| 		t.Fatalf("Got wrong number of repos") | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestSanitizeLocation(t *testing.T) { | ||||
| 	for _, testcase := range []struct { | ||||
| 		description string | ||||
| 		location    string | ||||
| 		source      string | ||||
| 		expected    string | ||||
| 		err         error | ||||
| 	}{ | ||||
| 		{ | ||||
| 			description: "ensure relative location correctly resolved", | ||||
| 			location:    "/v2/foo/baasdf", | ||||
| 			source:      "http://blahalaja.com/v1", | ||||
| 			expected:    "http://blahalaja.com/v2/foo/baasdf", | ||||
| 		}, | ||||
| 		{ | ||||
| 			description: "ensure parameters are preserved", | ||||
| 			location:    "/v2/foo/baasdf?_state=asdfasfdasdfasdf&digest=foo", | ||||
| 			source:      "http://blahalaja.com/v1", | ||||
| 			expected:    "http://blahalaja.com/v2/foo/baasdf?_state=asdfasfdasdfasdf&digest=foo", | ||||
| 		}, | ||||
| 		{ | ||||
| 			description: "ensure new hostname overidden", | ||||
| 			location:    "https://mwhahaha.com/v2/foo/baasdf?_state=asdfasfdasdfasdf", | ||||
| 			source:      "http://blahalaja.com/v1", | ||||
| 			expected:    "https://mwhahaha.com/v2/foo/baasdf?_state=asdfasfdasdfasdf", | ||||
| 		}, | ||||
| 	} { | ||||
| 		fatalf := func(format string, args ...interface{}) { | ||||
| 			t.Fatalf(testcase.description+": "+format, args...) | ||||
| 		} | ||||
| 
 | ||||
| 		s, err := sanitizeLocation(testcase.location, testcase.source) | ||||
| 		if err != testcase.err { | ||||
| 			if testcase.err != nil { | ||||
| 				fatalf("expected error: %v != %v", err, testcase) | ||||
| 			} else { | ||||
| 				fatalf("unexpected error sanitizing: %v", err) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if s != testcase.expected { | ||||
| 			fatalf("bad sanitize: %q != %q", s, testcase.expected) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue