1
This commit is contained in:
@@ -232,23 +232,20 @@ func searchDockerHub(ctx context.Context, query string, page, pageSize int) (*Se
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 构建搜索URL
|
// 构建搜索URL
|
||||||
baseURL := "https://registry.hub.docker.com/v2/repositories/"
|
baseURL := "https://registry.hub.docker.com/v2"
|
||||||
var fullURL string
|
var fullURL string
|
||||||
var params url.Values
|
var params url.Values
|
||||||
|
|
||||||
if isUserRepo && namespace != "" {
|
if isUserRepo && namespace != "" {
|
||||||
// 如果是用户/仓库格式,直接搜索用户的仓库
|
// 如果是用户/仓库格式,使用repositories接口
|
||||||
fullURL = fmt.Sprintf("%s%s/", baseURL, namespace)
|
fullURL = fmt.Sprintf("%s/repositories/%s/", baseURL, namespace)
|
||||||
params = url.Values{
|
params = url.Values{
|
||||||
"page": {fmt.Sprintf("%d", page)},
|
"page": {fmt.Sprintf("%d", page)},
|
||||||
"page_size": {fmt.Sprintf("%d", pageSize)},
|
"page_size": {fmt.Sprintf("%d", pageSize)},
|
||||||
}
|
}
|
||||||
if repoName != "" {
|
|
||||||
params.Set("name", repoName)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// 普通搜索
|
// 普通搜索
|
||||||
fullURL = baseURL + "search/"
|
fullURL = baseURL + "/search/repositories/"
|
||||||
params = url.Values{
|
params = url.Values{
|
||||||
"query": {query},
|
"query": {query},
|
||||||
"page": {fmt.Sprintf("%d", page)},
|
"page": {fmt.Sprintf("%d", page)},
|
||||||
@@ -310,6 +307,10 @@ func searchDockerHub(ctx context.Context, query string, page, pageSize int) (*Se
|
|||||||
case http.StatusTooManyRequests:
|
case http.StatusTooManyRequests:
|
||||||
lastErr = fmt.Errorf("请求过于频繁,请稍后重试")
|
lastErr = fmt.Errorf("请求过于频繁,请稍后重试")
|
||||||
case http.StatusNotFound:
|
case http.StatusNotFound:
|
||||||
|
if isUserRepo && namespace != "" {
|
||||||
|
// 如果用户仓库搜索失败,尝试普通搜索
|
||||||
|
return searchDockerHub(ctx, repoName, page, pageSize)
|
||||||
|
}
|
||||||
lastErr = fmt.Errorf("未找到相关镜像")
|
lastErr = fmt.Errorf("未找到相关镜像")
|
||||||
case http.StatusBadGateway, http.StatusServiceUnavailable:
|
case http.StatusBadGateway, http.StatusServiceUnavailable:
|
||||||
lastErr = fmt.Errorf("Docker Hub服务暂时不可用,请稍后重试")
|
lastErr = fmt.Errorf("Docker Hub服务暂时不可用,请稍后重试")
|
||||||
@@ -349,10 +350,20 @@ func searchDockerHub(ctx context.Context, query string, page, pageSize int) (*Se
|
|||||||
for _, repo := range userRepos.Results {
|
for _, repo := range userRepos.Results {
|
||||||
// 如果指定了仓库名,只保留匹配的结果
|
// 如果指定了仓库名,只保留匹配的结果
|
||||||
if repoName == "" || strings.Contains(strings.ToLower(repo.Name), strings.ToLower(repoName)) {
|
if repoName == "" || strings.Contains(strings.ToLower(repo.Name), strings.ToLower(repoName)) {
|
||||||
|
// 确保设置正确的命名空间和名称
|
||||||
repo.Namespace = namespace
|
repo.Namespace = namespace
|
||||||
|
if !strings.Contains(repo.Name, "/") {
|
||||||
|
repo.Name = fmt.Sprintf("%s/%s", namespace, repo.Name)
|
||||||
|
}
|
||||||
result.Results = append(result.Results, repo)
|
result.Results = append(result.Results, repo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果没有找到结果,尝试普通搜索
|
||||||
|
if len(result.Results) == 0 {
|
||||||
|
return searchDockerHub(ctx, repoName, page, pageSize)
|
||||||
|
}
|
||||||
|
|
||||||
result.Count = len(result.Results)
|
result.Count = len(result.Results)
|
||||||
} else {
|
} else {
|
||||||
// 解析普通搜索响应
|
// 解析普通搜索响应
|
||||||
@@ -376,9 +387,22 @@ func searchDockerHub(ctx context.Context, query string, page, pageSize int) (*Se
|
|||||||
result.Results[i].Name = parts[1]
|
result.Results[i].Name = parts[1]
|
||||||
} else if result.Results[i].RepoOwner != "" {
|
} else if result.Results[i].RepoOwner != "" {
|
||||||
result.Results[i].Namespace = result.Results[i].RepoOwner
|
result.Results[i].Namespace = result.Results[i].RepoOwner
|
||||||
|
result.Results[i].Name = fmt.Sprintf("%s/%s", result.Results[i].RepoOwner, result.Results[i].Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果是用户/仓库搜索,过滤结果
|
||||||
|
if isUserRepo && namespace != "" {
|
||||||
|
filteredResults := make([]Repository, 0)
|
||||||
|
for _, repo := range result.Results {
|
||||||
|
if strings.EqualFold(repo.Namespace, namespace) {
|
||||||
|
filteredResults = append(filteredResults, repo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.Results = filteredResults
|
||||||
|
result.Count = len(filteredResults)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 成功获取结果,跳出重试循环
|
// 成功获取结果,跳出重试循环
|
||||||
|
|||||||
Reference in New Issue
Block a user