mirror of
https://github.com/mayflower/docker-ls.git
synced 2025-11-26 12:03:12 +03:00
85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package lib
|
|
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
type repositoryListResponse struct {
|
|
repositories chan Repository
|
|
err error
|
|
}
|
|
|
|
func (r *repositoryListResponse) Repositories() <-chan Repository {
|
|
return (r.repositories)
|
|
}
|
|
|
|
func (r *repositoryListResponse) LastError() error {
|
|
return r.err
|
|
}
|
|
|
|
func (r *repositoryListResponse) setLastError(err error) {
|
|
r.err = err
|
|
}
|
|
|
|
func (r *repositoryListResponse) close() {
|
|
close(r.repositories)
|
|
}
|
|
|
|
type repositoryListJsonResponse struct {
|
|
Repositories []string `json:"repositories"`
|
|
}
|
|
|
|
func (r *repositoryListJsonResponse) validate() error {
|
|
if r.Repositories == nil {
|
|
return genericMalformedResponseError
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type repositoryListRequestContext struct{}
|
|
|
|
func (r *repositoryListRequestContext) path() string {
|
|
return "v2/_catalog"
|
|
}
|
|
|
|
func (r *repositoryListRequestContext) validateApiResponse(response *http.Response, initialRequest bool) error {
|
|
switch response.StatusCode {
|
|
case http.StatusUnauthorized, http.StatusForbidden:
|
|
return genericAuthorizationError
|
|
|
|
case http.StatusNotFound:
|
|
if initialRequest {
|
|
return NotImplementedByRemoteError("registry does not implement repository listings")
|
|
} else {
|
|
return newInvalidStatusCodeError(response.StatusCode)
|
|
}
|
|
|
|
case http.StatusOK:
|
|
return nil
|
|
|
|
default:
|
|
return newInvalidStatusCodeError(response.StatusCode)
|
|
}
|
|
}
|
|
|
|
func (r *repositoryListRequestContext) processPartialResponse(response paginatedRequestResponse, apiResponse interface{}) {
|
|
for _, repositoryName := range apiResponse.(*repositoryListJsonResponse).Repositories {
|
|
response.(*repositoryListResponse).repositories <- newRepository(repositoryName)
|
|
}
|
|
}
|
|
|
|
func (r *repositoryListRequestContext) createResponse(api *registryApi) paginatedRequestResponse {
|
|
return &repositoryListResponse{
|
|
repositories: make(chan Repository, api.pageSize()),
|
|
}
|
|
}
|
|
|
|
func (r *repositoryListRequestContext) createJsonResponse() validatable {
|
|
return new(repositoryListJsonResponse)
|
|
}
|
|
|
|
func (r *registryApi) ListRepositories() RepositoryListResponse {
|
|
return r.paginatedRequest(new(repositoryListRequestContext)).(*repositoryListResponse)
|
|
}
|