1
0
Fork 0
mirror of https://github.com/imjasonh/kontain.me synced 2026-07-12 19:00:13 +00:00

support HEAD for the rest of them

This commit is contained in:
Jason Hall 2021-01-28 22:15:47 -05:00
parent 6d00baaf15
commit d466ea0402
6 changed files with 128 additions and 7 deletions

View file

@ -118,12 +118,31 @@ func (s *server) serveBuildpackManifest(w http.ResponseWriter, r *http.Request)
}
ghOwner, ghRepo := parts[2], parts[3]
path := strings.Join(parts[4:len(parts)-2], "/")
revision := parts[len(parts)-1]
tagOrDigest := parts[len(parts)-1]
// If request is for image by digest, try to serve it from GCS.
if strings.HasPrefix(tagOrDigest, "sha256:") {
desc, err := s.storage.BlobExists(ctx, tagOrDigest)
if err != nil {
s.error.Printf("ERROR (storage.BlobExists): %s", err)
serve.Error(w, serve.ErrNotFound)
return
}
if r.Method == http.MethodHead {
w.Header().Set("Docker-Content-Digest", tagOrDigest)
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
serve.Blob(w, r, tagOrDigest)
return
}
// If the image tag looks like a commit SHA, see if we already have a
// manifest cached for that revision and serve it directly. Otherwise,
// resolve the branch/tag/whatever to a SHA and redirect to that SHA
// image tag.
revision := tagOrDigest
if commitRE.MatchString(revision) {
ck := cacheKey(path, revision)
if _, err := s.storage.BlobExists(ctx, ck); err == nil {

View file

@ -111,12 +111,31 @@ func (s *server) serveKanikoManifest(w http.ResponseWriter, r *http.Request) {
}
ghOwner, ghRepo := parts[2], parts[3]
path := strings.Join(parts[4:len(parts)-2], "/")
revision := parts[len(parts)-1]
tagOrDigest := parts[len(parts)-1]
// If request is for image by digest, try to serve it from GCS.
if strings.HasPrefix(tagOrDigest, "sha256:") {
desc, err := s.storage.BlobExists(ctx, tagOrDigest)
if err != nil {
s.error.Printf("ERROR (storage.BlobExists): %s", err)
serve.Error(w, serve.ErrNotFound)
return
}
if r.Method == http.MethodHead {
w.Header().Set("Docker-Content-Digest", tagOrDigest)
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
serve.Blob(w, r, tagOrDigest)
return
}
// If the image tag looks like a commit SHA, see if we already have a
// manifest cached for that revision and serve it directly. Otherwise,
// resolve the branch/tag/whatever to a SHA and redirect to that SHA
// image tag.
revision := tagOrDigest
if commitRE.MatchString(revision) {
ck := cacheKey(path, revision)
if _, err := s.storage.BlobExists(ctx, ck); err == nil {

View file

@ -82,8 +82,25 @@ func (s *server) serveKoManifest(w http.ResponseWriter, r *http.Request) {
ip := strings.Join(parts[:len(parts)-2], "/")
// "go get" the package
tag := parts[len(parts)-1]
s.info.Printf("requested image tag :%s", tag)
tagOrDigest := parts[len(parts)-1]
// If request is for image by digest, try to serve it from GCS.
if strings.HasPrefix(tagOrDigest, "sha256:") {
desc, err := s.storage.BlobExists(ctx, tagOrDigest)
if err != nil {
s.error.Printf("ERROR (storage.BlobExists): %s", err)
serve.Error(w, serve.ErrNotFound)
return
}
if r.Method == http.MethodHead {
w.Header().Set("Docker-Content-Digest", tagOrDigest)
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
serve.Blob(w, r, tagOrDigest)
return
}
// go get the package.
// TODO: Check image tag for version, resolve branches -> commits and redirect to img:<commit>

View file

@ -71,11 +71,30 @@ var randomTagRE = regexp.MustCompile("([0-9]{1,2})x([0-9]{1,8})")
// random.kontain.me:3x10mb
// random.kontain.me(:latest) -> 1x10mb
func (s *server) serveRandomManifest(w http.ResponseWriter, r *http.Request) {
tag := strings.TrimPrefix(r.URL.Path, "/v2/manifests/")
ctx := r.Context()
tagOrDigest := strings.TrimPrefix(r.URL.Path, "/v2/manifests/")
var num, size int64 = 1, 10000000 // 10MB
// If request is for image by digest, try to serve it from GCS.
if strings.HasPrefix(tagOrDigest, "sha256:") {
desc, err := s.storage.BlobExists(ctx, tagOrDigest)
if err != nil {
s.error.Printf("ERROR (storage.BlobExists): %s", err)
serve.Error(w, serve.ErrNotFound)
return
}
if r.Method == http.MethodHead {
w.Header().Set("Docker-Content-Digest", tagOrDigest)
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
serve.Blob(w, r, tagOrDigest)
return
}
// Captured requested num + size from tag.
all := randomTagRE.FindStringSubmatch(tag)
all := randomTagRE.FindStringSubmatch(tagOrDigest)
if len(all) >= 3 {
num, _ = strconv.ParseInt(all[1], 10, 64)
size, _ = strconv.ParseInt(all[2], 10, 64)

View file

@ -84,6 +84,25 @@ func (s *server) serveWaitManifest(w http.ResponseWriter, r *http.Request) {
parts := strings.Split(path, "/")
name := strings.Join(parts[:len(parts)-2], "/")
// If request is for image by digest, try to serve it from GCS.
tagOrDigest := parts[len(parts)-1]
if strings.HasPrefix(tagOrDigest, "sha256:") {
desc, err := s.storage.BlobExists(ctx, tagOrDigest)
if err != nil {
s.error.Printf("ERROR (storage.BlobExists): %s", err)
serve.Error(w, serve.ErrNotFound)
return
}
if r.Method == http.MethodHead {
w.Header().Set("Docker-Content-Digest", tagOrDigest)
w.Header().Set("Content-Type", string(desc.MediaType))
w.Header().Set("Content-Length", fmt.Sprintf("%d", desc.Size))
return
}
serve.Blob(w, r, tagOrDigest)
return
}
// The image has already been built; serve it.
ck := cacheKey(name)
if _, err := s.storage.BlobExists(ctx, ck); err == nil {
@ -102,7 +121,7 @@ func (s *server) serveWaitManifest(w http.ResponseWriter, r *http.Request) {
}
// No cached image or placeholder exists; enqueue a new task.
tag := strings.TrimPrefix(r.URL.Path, fmt.Sprintf("/v2/%s/manifests/", name))
tag := tagOrDigest
if tag == "latest" {
tag = "10s"
}

View file

@ -151,6 +151,18 @@ func (s *Storage) ServeIndex(w http.ResponseWriter, r *http.Request, idx v1.Imag
return err
}
// If it's just a HEAD request, serve that.
if r.Method == http.MethodHead {
s, err := idx.Size()
if err != nil {
return err
}
w.Header().Set("Docker-Content-Digest", digest.String())
w.Header().Set("Content-Type", string(mt))
w.Header().Set("Content-Length", fmt.Sprintf("%d", s))
return nil
}
// Redirect to manifest blob.
Blob(w, r, digest.String())
return nil
@ -238,6 +250,22 @@ func (s *Storage) ServeManifest(w http.ResponseWriter, r *http.Request, img v1.I
return err
}
// If it's just a HEAD request, serve that.
if r.Method == http.MethodHead {
mt, err := img.MediaType()
if err != nil {
return err
}
s, err := img.Size()
if err != nil {
return err
}
w.Header().Set("Docker-Content-Digest", digest.String())
w.Header().Set("Content-Type", string(mt))
w.Header().Set("Content-Length", fmt.Sprintf("%d", s))
return nil
}
// Redirect to manifest blob.
Blob(w, r, digest.String())
return nil