//HeadBlobsV2Handler is func HeadBlobsV2Handler(ctx *macaron.Context) (int, []byte) { digest := ctx.Params(":digest") tarsum := strings.Split(digest, ":")[1] i := new(models.DockerImageV2) if err := i.Get(tarsum); err != nil && err == gorm.ErrRecordNotFound { log.Info("Not found blob: %s", tarsum) result, _ := module.EncodingError(module.BLOB_UNKNOWN, digest) return http.StatusNotFound, result } else if err != nil && err != gorm.ErrRecordNotFound { log.Info("Failed to get blob %s: %s", tarsum, err.Error()) result, _ := module.EncodingError(module.UNKNOWN, err.Error()) return http.StatusBadRequest, result } ctx.Resp.Header().Set("Content-Type", "application/json; charset=utf-8") ctx.Resp.Header().Set("Content-Type", "application/octet-stream") 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 }
//GetBlobsV2Handler is func GetBlobsV2Handler(ctx *macaron.Context) { digest := ctx.Params(":digest") tarsum := strings.Split(digest, ":")[1] i := new(models.DockerImageV2) if err := i.Get(tarsum); err != nil && err == gorm.ErrRecordNotFound { log.Info("Not found blob: %s", tarsum) result, _ := module.EncodingError(module.BLOB_UNKNOWN, digest) ctx.Resp.Write(result) ctx.Resp.WriteHeader(http.StatusBadRequest) return } else if err != nil && err != gorm.ErrRecordNotFound { log.Info("Failed to get blob %s: %s", tarsum, err.Error()) result, _ := module.EncodingError(module.UNKNOWN, err.Error()) ctx.Resp.Write(result) ctx.Resp.WriteHeader(http.StatusBadRequest) return } if file, err := os.Open(i.Path); err != nil { log.Info("Failed to get blob %s: %s", tarsum, err.Error()) result, _ := module.EncodingError(module.UNKNOWN, err.Error()) ctx.Resp.Write(result) ctx.Resp.WriteHeader(http.StatusBadRequest) return } else { stat, _ := file.Stat() size := strconv.FormatInt(stat.Size(), 10) ctx.Resp.Header().Set("Content-Description", "File Transfer") ctx.Resp.Header().Set("Content-Type", "application/octet-stream") ctx.Resp.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", i.ImageID)) ctx.Resp.Header().Set("Content-Length", size) ctx.Resp.Header().Set("Docker-Content-Digest", digest) ctx.Resp.Header().Set("Expires", "0") ctx.Resp.Header().Set("Cache-Control", "must-revalidate") ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") ctx.Resp.Header().Set("Pragma", "public") file.Seek(0, 0) defer file.Close() io.Copy(ctx.Resp, file) ctx.Resp.WriteHeader(http.StatusOK) return } }