//GetManifestsV2Handler is func GetManifestsV2Handler(ctx *macaron.Context) (int, []byte) { repository := ctx.Params(":repository") namespace := ctx.Params(":namespace") tag := ctx.Params(":tag") t := new(models.DockerTagV2) if _, err := t.Get(namespace, repository, tag); err != nil && err == gorm.ErrRecordNotFound { log.Info("Not found repository in tetting tag manifest: %s/%s:%s", namespace, repository, tag) result, _ := module.EncodingError(module.BLOB_UNKNOWN, fmt.Sprintf("%s/%s", namespace, repository)) return http.StatusNotFound, result } else if err != nil && err != gorm.ErrRecordNotFound { log.Info("Failed to get tag manifest %s/%s:%s : ", namespace, repository, tag, err.Error()) result, _ := module.EncodingError(module.UNKNOWN, err.Error()) return http.StatusBadRequest, result } digest, _ := signature.DigestManifest([]byte(t.Manifest)) ctx.Resp.Header().Set("Content-Type", "application/vnd.docker.distribution.manifest.v2+json") ctx.Resp.Header().Set("Docker-Content-Digest", digest) ctx.Resp.Header().Set("Content-Length", fmt.Sprint(len(t.Manifest))) return http.StatusOK, []byte(t.Manifest) }
//PutManifestsV2Handler is func PutManifestsV2Handler(ctx *macaron.Context) (int, []byte) { repository := ctx.Params(":repository") namespace := ctx.Params(":namespace") agent := ctx.Req.Header.Get("User-Agent") tag := ctx.Params(":tag") if data, err := ctx.Req.Body().String(); err != nil { log.Errorf("Get the manifest data error: %s", err.Error()) result, _ := json.Marshal(map[string]string{}) return http.StatusBadRequest, result } else { _, imageID, version, _ := module.GetTarsumlist([]byte(data)) digest, _ := signature.DigestManifest([]byte(data)) r := new(models.DockerV2) if err := r.PutAgent(namespace, repository, agent, strconv.FormatInt(version, 10)); err != nil { log.Errorf("Put the manifest data error: %s", err.Error()) result, _ := json.Marshal(map[string]string{}) return http.StatusBadRequest, result } t := new(models.DockerTagV2) if err := t.Put(namespace, repository, tag, imageID, data, strconv.FormatInt(version, 10)); err != nil { log.Errorf("Put the manifest data error: %s", err.Error()) result, _ := json.Marshal(map[string]string{}) return http.StatusBadRequest, result } random := fmt.Sprintf("https://%s/v2/%s/%s/manifests/%s", setting.Domains, namespace, repository, digest) ctx.Resp.Header().Set("Content-Type", "text/plain; charset=utf-8") ctx.Resp.Header().Set("Docker-Content-Digest", digest) ctx.Resp.Header().Set("Location", random) status := []int{http.StatusBadRequest, http.StatusAccepted, http.StatusCreated} result, _ := json.Marshal(map[string]string{}) return status[version], result } }