diff --git a/act/artifactcache/handler.go b/act/artifactcache/handler.go index 29b15e8c..c5bb0376 100644 --- a/act/artifactcache/handler.go +++ b/act/artifactcache/handler.go @@ -325,10 +325,6 @@ func (h *Handler) openDB() (*bolthold.Store, error) { func (h *Handler) find(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { cred := credFromContext(r.Context()) keys := strings.Split(r.URL.Query().Get("keys"), ",") - // cache keys are case insensitive - for i, key := range keys { - keys[i] = strings.ToLower(key) - } version := r.URL.Query().Get("version") db, err := h.openDB() @@ -371,8 +367,6 @@ func (h *Handler) reserve(w http.ResponseWriter, r *http.Request, _ httprouter.P h.responseJSON(w, r, 400, err) return } - // cache keys are case insensitive - api.Key = strings.ToLower(api.Key) cache := api.ToCache() cache.Repo = cred.Repo diff --git a/act/artifactcache/handler_test.go b/act/artifactcache/handler_test.go index a3fe16ac..7cca691c 100644 --- a/act/artifactcache/handler_test.go +++ b/act/artifactcache/handler_test.go @@ -459,17 +459,20 @@ func TestHandler(t *testing.T) { assert.Equal(t, contents[except], content) }) - t.Run("case insensitive", func(t *testing.T) { + t.Run("case preserved", func(t *testing.T) { + // Some actions (e.g. actions/setup-go, actions/setup-node) build cache keys that contain mixed-case fragments such as RUNNER_OS=Linux, + // then compare the cacheKey returned by the cache server to their original key with case-sensitive equality to decide whether the + // cache was a complete hit. The server must therefore preserve the original key case. + version := "c19da02a2bd7e77277f1ac29ab45c09b7d46a4ee758284e26bb3045ad11d9d20" - key := strings.ToLower(t.Name()) + key := strings.ToLower(t.Name()) + "_ABC" content := make([]byte, 100) _, err := rand.Read(content) require.NoError(t, err) - uploadCacheNormally(t, base, key+"_ABC", version, content) + uploadCacheNormally(t, base, key, version, content) { - reqKey := key + "_aBc" - resp, err := testClient.Get(fmt.Sprintf("%s/cache?keys=%s&version=%s", base, reqKey, version)) + resp, err := testClient.Get(fmt.Sprintf("%s/cache?keys=%s&version=%s", base, key, version)) require.NoError(t, err) defer resp.Body.Close() require.Equal(t, 200, resp.StatusCode) @@ -480,7 +483,8 @@ func TestHandler(t *testing.T) { }{} require.NoError(t, json.NewDecoder(resp.Body).Decode(&got)) assert.Equal(t, "hit", got.Result) - assert.Equal(t, key+"_abc", got.CacheKey) + assert.Equal(t, key, got.CacheKey) + assert.NotEqual(t, strings.ToLower(key), got.CacheKey) } }) @@ -643,7 +647,7 @@ func uploadCacheNormally(t *testing.T, base, key, version string, content []byte }{} require.NoError(t, json.NewDecoder(resp.Body).Decode(&got)) assert.Equal(t, "hit", got.Result) - assert.Equal(t, strings.ToLower(key), got.CacheKey) + assert.Equal(t, key, got.CacheKey) archiveLocation = got.ArchiveLocation } {