func HeadBlobsV2Handler(ctx *macaron.Context, log *logs.BeeLogger) (int, []byte) { digest := ctx.Params(":digest") tarsum := strings.Split(digest, ":")[1] i := new(models.Image) if has, _ := i.HasTarsum(tarsum); has == false { log.Info("[REGISTRY API V2] Tarsum not found: %v", tarsum) result, _ := json.Marshal(map[string]string{"message": "Tarsum not found"}) return http.StatusNotFound, result } ctx.Resp.Header().Set("Content-Type", "application/x-gzip") ctx.Resp.Header().Set("Docker-Content-Digest", digest) ctx.Resp.Header().Set("Content-Length", fmt.Sprint(i.Size)) result, _ := json.Marshal(map[string]string{}) return http.StatusOK, result }
func GetBlobsV2Handler(ctx *macaron.Context, log *logs.BeeLogger) (int, []byte) { digest := ctx.Params(":digest") tarsum := strings.Split(digest, ":")[1] i := new(models.Image) has, _ := i.HasTarsum(tarsum) if has == false { log.Error("[REGISTRY API V2] Digest not found: %v", tarsum) result, _ := json.Marshal(map[string]string{"message": "Digest not found"}) return http.StatusNotFound, result } layerfile := i.Path if _, err := os.Stat(layerfile); err != nil { log.Error("[REGISTRY API V2] File path is invalid: %v", err.Error()) result, _ := json.Marshal(map[string]string{"message": "File path is invalid"}) return http.StatusBadRequest, result } file, err := ioutil.ReadFile(layerfile) if err != nil { log.Error("[REGISTRY API V2] Read file failed: %v", err.Error()) result, _ := json.Marshal(map[string]string{"message": "Read file failed"}) return http.StatusBadRequest, result } ctx.Resp.Header().Set("Content-Type", "application/x-gzip") ctx.Resp.Header().Set("Docker-Content-Digest", digest) ctx.Resp.Header().Set("Content-Length", fmt.Sprint(len(file))) return http.StatusOK, file }
func (n *notification) Handler(ctx *macaron.Context) { namespace := ctx.Params(":namespace") repository := ctx.Params(":repository") actor := ActorRecord{Name: namespace} repo := fmt.Sprintf("%v/%v", namespace, repository) switch ctx.Req.Method { case "HEAD": digest := ctx.Params(":digest") tarsum := strings.Split(digest, ":")[1] i := new(models.Image) if has, _ := i.HasTarsum(tarsum); has == false { return } desc := Descriptor{ MediaType: DefaultMedisType, Size: i.Size, Digest: digest, } req := newReqRecord(utils.EncodeBasicAuth(namespace, "headblobsv2"), ctx.Req.Request) requrl, err := module.NewURLBuilderFromRequest(ctx.Req.Request).BuildBlobURL(repo, desc.Digest) if err != nil { fmt.Errorf("[REGISTRY API V2] Head blobs and get request URL failed, error:: %v", err.Error()) } b := newBridge(requrl, actor, req, notice) Err := b.createBlobEventAndWrite(EventActionPull, repo, desc) if Err.Err != nil { ctx.Resp.WriteHeader(http.StatusForbidden) return } else if Err.StatusCode >= 300 { ctx.Resp.WriteHeader(Err.StatusCode) return } case "GET": if flag := utils.Compare(ctx.Req.RequestURI, "/v2/"); flag == 0 { return } if flag := strings.Contains(ctx.Req.RequestURI, "/blobs/"); flag == true { digest := ctx.Params(":digest") tarsum := strings.Split(digest, ":")[1] i := new(models.Image) if has, _ := i.HasTarsum(tarsum); has == false { return } desc := Descriptor{ MediaType: BlobMediaType, Size: i.Size, Digest: digest, } req := newReqRecord(utils.EncodeBasicAuth(namespace, "getblobsv2"), ctx.Req.Request) requrl, err := module.NewURLBuilderFromRequest(ctx.Req.Request).BuildBlobURL(repo, desc.Digest) if err != nil { fmt.Errorf("[REGISTRY API V2] Get blobs and get request URL failed, error:: %v", err.Error()) } b := newBridge(requrl, actor, req, notice) Err := b.createBlobEventAndWrite(EventActionPull, repo, desc) if Err.Err != nil { ctx.Resp.WriteHeader(http.StatusForbidden) return } else if Err.StatusCode >= 300 { ctx.Resp.WriteHeader(Err.StatusCode) return } return } if flag := strings.Contains(ctx.Req.RequestURI, "/manifests/"); flag == true { t := new(models.Tag) if err := t.Get(namespace, repository, ctx.Params(":tag")); err != nil { return } digest, err := utils.DigestManifest([]byte(t.Manifest)) if err != nil { fmt.Errorf("[REGISTRY API V2] Get manifest digest failed: %v", err.Error()) return } var sm SignedManifest if err := json.Unmarshal([]byte(t.Manifest), &sm); err != nil { fmt.Errorf("Unmarshal manifest error") } sm.Raw = make([]byte, len(t.Manifest), len(t.Manifest)) copy(sm.Raw, []byte(t.Manifest)) req := newReqRecord(utils.EncodeBasicAuth(namespace, "getmanifestv2"), ctx.Req.Request) requrl, err := module.NewURLBuilderFromRequest(ctx.Req.Request).BuildManifestURL(sm.Name, digest) if err != nil { fmt.Errorf("[REGISTRY API V2] Get manifest and get request URL failed, error:: %v", err.Error()) } b := newBridge(requrl, actor, req, notice) Err := b.createManifestEventAndWrite(EventActionPull, repo, &sm) if Err.Err != nil { ctx.Resp.WriteHeader(http.StatusForbidden) return } else if Err.StatusCode >= 300 { ctx.Resp.WriteHeader(Err.StatusCode) return } return } case "PUT": if flag := strings.Contains(ctx.Req.RequestURI, "/blobs/uploads/"); flag == true { param := ctx.Params(":uuid") uuid := strings.Split(param, "?")[0] layer, _ := ioutil.ReadFile(fmt.Sprintf("%v/%v/layer", setting.ImagePath, uuid)) digest := ctx.Query("digest") desc := Descriptor{ MediaType: DefaultMedisType, Size: int64(len(layer)), Digest: digest, } req := newReqRecord(utils.EncodeBasicAuth(namespace, "putblobsv2"), ctx.Req.Request) requrl, err := module.NewURLBuilderFromRequest(ctx.Req.Request).BuildBlobURL(repo, desc.Digest) if err != nil { fmt.Errorf("[REGISTRY API V2] Get blobs and get request URL failed, error:: %v", err.Error()) } b := newBridge(requrl, actor, req, notice) Err := b.createBlobEventAndWrite(EventActionPush, repo, desc) if Err.Err != nil { ctx.Resp.WriteHeader(http.StatusForbidden) return } else if Err.StatusCode >= 300 { ctx.Resp.WriteHeader(Err.StatusCode) return } return } if flag := strings.Contains(ctx.Req.RequestURI, "/manifests/"); flag == true { buf, _ := ctx.Req.Body().Bytes() handler.ManifestCtx = buf var sm SignedManifest if err := json.Unmarshal(buf, &sm); err != nil { fmt.Errorf("Unmarshal manifest error") } sm.Raw = make([]byte, len(buf), len(buf)) copy(sm.Raw, buf) digest, err := utils.DigestManifest(buf) if err != nil { fmt.Errorf("[REGISTRY API V2] Get manifest digest failed: %v", err.Error()) //return http.StatusBadRequest, result } req := newReqRecord(utils.EncodeBasicAuth(namespace, "putmanifestv2"), ctx.Req.Request) requrl, err := module.NewURLBuilderFromRequest(ctx.Req.Request).BuildManifestURL(sm.Name, digest) if err != nil { fmt.Errorf("[REGISTRY API V2] Put manifest and get request URL failed, error:: %v", err.Error()) } b := newBridge(requrl, actor, req, notice) Err := b.createManifestEventAndWrite(EventActionPush, repo, &sm) if Err.Err != nil { ctx.Resp.WriteHeader(http.StatusForbidden) return } else if Err.StatusCode >= 300 { ctx.Resp.WriteHeader(Err.StatusCode) return } return } default: return } }