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:
parent
6d00baaf15
commit
d466ea0402
6 changed files with 128 additions and 7 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue