//PostBlobsV2Handler is //Initiate a resumable blob upload. If successful, an upload location will be provided to complete the upload. //Optionally, if the digest parameter is present, the request body will be used to complete the upload in a single request. func PostBlobsV2Handler(ctx *macaron.Context) (int, []byte) { //TODO: If standalone == true, Dockyard will check HEADER Authorization; if standalone == false, Dockyard will check HEADER TOEKN. namespace := ctx.Params(":namespace") repository := ctx.Params(":repository") r := new(models.DockerV2) if err := r.Put(namespace, repository); err != nil { log.Errorf("Put or search repository error: %s", err.Error()) result, _ := module.EncodingError(module.UNKNOWN, map[string]string{"namespace": namespace, "repository": repository}) return http.StatusBadRequest, result } uuid := utils.MD5(uuid.NewV4().String()) state := utils.MD5(fmt.Sprintf("%s/%s/%d", namespace, repository, time.Now().UnixNano()/int64(time.Millisecond))) random := fmt.Sprintf("https://%s/v2/%s/%s/blobs/uploads/%s?_state=%s", setting.Domains, namespace, repository, uuid, state) ctx.Resp.Header().Set("Content-Type", "text/plain; charset=utf-8") ctx.Resp.Header().Set("Docker-Upload-Uuid", uuid) ctx.Resp.Header().Set("Location", random) ctx.Resp.Header().Set("Range", "0-0") result, _ := json.Marshal(map[string]string{}) return http.StatusAccepted, result }