func (a *RegistryAPI) GetRepoJsonHandler(w http.ResponseWriter, r *http.Request) { namespace, repo, _ := parseRepo(r, "") logger.Debug("[GetRepoJson] namespace=%s; repository=%s", namespace, repo) content, err := a.Storage.Get(storage.RepoJsonPath(namespace, repo)) if err != nil { // docker-registry has this error ignored. so i guess we will too... a.response(w, EMPTY_REPO_JSON, http.StatusOK, EMPTY_HEADERS) return } var data map[string]interface{} if err := json.Unmarshal(content, &data); err != nil { // docker-registry has this error ignored. so i guess we will too... a.response(w, EMPTY_REPO_JSON, http.StatusOK, EMPTY_HEADERS) return } a.response(w, data, http.StatusOK, EMPTY_HEADERS) return }
func (a *RegistryAPI) PutRepoTagHandler(w http.ResponseWriter, r *http.Request) { namespace, repo, tag := parseRepo(r, "tag") logger.Debug("[PutRepoTag] namespace=%s; repository=%s; tag=%s", namespace, repo, tag) data, err := ioutil.ReadAll(r.Body) if err != nil { a.response(w, "Error reading request body: "+err.Error(), http.StatusBadRequest, EMPTY_HEADERS) return } else if len(data) == 0 { a.response(w, "Empty data", http.StatusBadRequest, EMPTY_HEADERS) return } logger.Debug("[PutRepoTag] body:\n%s", data) imageID := strings.Trim(string(data), "\"") // trim quotes if exists, err := a.Storage.Exists(storage.ImageJsonPath(imageID)); err != nil || !exists { a.response(w, "Image not found: "+err.Error(), http.StatusNotFound, EMPTY_HEADERS) return } err = a.Storage.Put(storage.RepoTagPath(namespace, repo, tag), []byte(imageID)) if err != nil { a.internalError(w, err.Error()) return } uaStrings := r.Header["User-Agent"] uaString := "" if len(uaStrings) > 0 { // just use the first one. there *should* only be one to begin with. uaString = uaStrings[0] } dataMap := CreateRepoJson(uaString) jsonData, err := json.Marshal(&dataMap) if err != nil { a.internalError(w, err.Error()) return } a.Storage.Put(storage.RepoTagJsonPath(namespace, repo, tag), jsonData) if tag == "latest" { a.Storage.Put(storage.RepoJsonPath(namespace, repo), jsonData) } a.response(w, true, http.StatusOK, EMPTY_HEADERS) }