diff --git a/internal/define/centos.go b/internal/define/centos.go index ade1046..c8ff935 100644 --- a/internal/define/centos.go +++ b/internal/define/centos.go @@ -2,7 +2,7 @@ package define import "regexp" -var CENTOS_HOST_PATTERN = regexp.MustCompile(`https?://.+/centos/(.+)$`) +var CENTOS_HOST_PATTERN = regexp.MustCompile(`/centos/(.+)$`) const CENTOS_BENCHMAKR_URL = "TIME" @@ -24,7 +24,16 @@ var CENTOS_OFFICAL_MIRRORS = []string{ } var CENTOS_CUSTOM_MIRRORS = []string{ - "http://mirrors.aliyun.com/centos/", + "mirrors.aliyun.com/centos/", } var BUILDIN_CENTOS_MIRRORS = GenerateBuildInList(CENTOS_OFFICAL_MIRRORS, CENTOS_CUSTOM_MIRRORS) + +var CENTOS_DEFAULT_CACHE_RULES = []Rule{ + {Pattern: regexp.MustCompile(`repomd.xml$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TYPE_LINUX_DISTROS_CENTOS}, + {Pattern: regexp.MustCompile(`filelist.gz$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TYPE_LINUX_DISTROS_CENTOS}, + {Pattern: regexp.MustCompile(`dir_sizes$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TYPE_LINUX_DISTROS_CENTOS}, + {Pattern: regexp.MustCompile(`TIME$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TYPE_LINUX_DISTROS_CENTOS}, + {Pattern: regexp.MustCompile(`timestamp.txt$`), CacheControl: `max-age=3600`, Rewrite: true, OS: TYPE_LINUX_DISTROS_CENTOS}, + {Pattern: regexp.MustCompile(`.*`), CacheControl: `max-age=100000`, Rewrite: true, OS: TYPE_LINUX_DISTROS_CENTOS}, +} diff --git a/internal/mirrors/mirrors.go b/internal/mirrors/mirrors.go index 4978ccc..1d1ad06 100644 --- a/internal/mirrors/mirrors.go +++ b/internal/mirrors/mirrors.go @@ -33,6 +33,7 @@ func GenerateMirrorListByPredefined(osType int) (mirrors []string) { var BUILDIN_UBUNTU_MIRRORS = GenerateMirrorListByPredefined(Define.TYPE_LINUX_DISTROS_UBUNTU) var BUILDIN_DEBIAN_MIRRORS = GenerateMirrorListByPredefined(Define.TYPE_LINUX_DISTROS_DEBIAN) var BUILDIN_CENTOS_MIRRORS = GenerateMirrorListByPredefined(Define.TYPE_LINUX_DISTROS_CENTOS) +var BUILDIN_ALPINE_MIRRORS = GenerateMirrorListByPredefined(Define.TYPE_LINUX_DISTROS_ALPINE) func GetGeoMirrorUrlsByMode(mode int) (mirrors []string) { if mode == Define.TYPE_LINUX_DISTROS_UBUNTU { @@ -51,36 +52,51 @@ func GetGeoMirrorUrlsByMode(mode int) (mirrors []string) { return BUILDIN_CENTOS_MIRRORS } + if mode == Define.TYPE_LINUX_DISTROS_ALPINE { + return BUILDIN_ALPINE_MIRRORS + } + mirrors = append(mirrors, BUILDIN_UBUNTU_MIRRORS...) mirrors = append(mirrors, BUILDIN_DEBIAN_MIRRORS...) mirrors = append(mirrors, BUILDIN_CENTOS_MIRRORS...) + mirrors = append(mirrors, BUILDIN_ALPINE_MIRRORS...) return mirrors } +func GetFullMirrorURL(mirror Define.UrlWithAlias) string { + if mirror.Http { + return "http://" + mirror.URL + } + if mirror.Https { + return "https://" + mirror.URL + } + return "https://" + mirror.URL +} + func GetMirrorURLByAliases(osType int, alias string) string { switch osType { case Define.TYPE_LINUX_DISTROS_UBUNTU: for _, mirror := range Define.BUILDIN_UBUNTU_MIRRORS { if mirror.Alias == alias { - return mirror.URL + return GetFullMirrorURL(mirror) } } case Define.TYPE_LINUX_DISTROS_DEBIAN: for _, mirror := range Define.BUILDIN_DEBIAN_MIRRORS { if mirror.Alias == alias { - return mirror.URL + return GetFullMirrorURL(mirror) } } case Define.TYPE_LINUX_DISTROS_CENTOS: for _, mirror := range Define.BUILDIN_CENTOS_MIRRORS { if mirror.Alias == alias { - return mirror.URL + return GetFullMirrorURL(mirror) } } case Define.TYPE_LINUX_DISTROS_ALPINE: for _, mirror := range Define.BUILDIN_ALPINE_MIRRORS { if mirror.Alias == alias { - return mirror.URL + return GetFullMirrorURL(mirror) } } } diff --git a/internal/rewriter/rewriter.go b/internal/rewriter/rewriter.go index c03d977..081ad4a 100644 --- a/internal/rewriter/rewriter.go +++ b/internal/rewriter/rewriter.go @@ -31,9 +31,13 @@ func GetRewriteRulesByMode(mode int) (rules []Define.Rule) { if mode == Define.TYPE_LINUX_DISTROS_DEBIAN { return Define.DEBIAN_DEFAULT_CACHE_RULES } + if mode == Define.TYPE_LINUX_DISTROS_CENTOS { + return Define.CENTOS_DEFAULT_CACHE_RULES + } rules = append(rules, Define.UBUNTU_DEFAULT_CACHE_RULES...) rules = append(rules, Define.DEBIAN_DEFAULT_CACHE_RULES...) + rules = append(rules, Define.CENTOS_DEFAULT_CACHE_RULES...) return rules } @@ -173,22 +177,29 @@ func CreateNewRewriters(mode int) *URLRewriters { func RewriteRequestByMode(r *http.Request, rewriters *URLRewriters, mode int) { uri := r.URL.String() + var rewriter *URLRewriter - if mode == Define.TYPE_LINUX_DISTROS_UBUNTU { + switch mode { + case Define.TYPE_LINUX_DISTROS_UBUNTU: rewriter = rewriters.ubuntu - } else { - // mode == TYPE_LINUX_DISTROS_DEBIAN + case Define.TYPE_LINUX_DISTROS_DEBIAN: rewriter = rewriters.debian + case Define.TYPE_LINUX_DISTROS_CENTOS: + rewriter = rewriters.centos + case Define.TYPE_LINUX_DISTROS_ALPINE: + rewriter = rewriters.alpine } if rewriter.mirror != nil && rewriter.pattern.MatchString(uri) { r.Header.Add("Content-Location", uri) m := rewriter.pattern.FindAllStringSubmatch(uri, -1) // Fix the problem of double escaping of symbols - unescapedQuery, err := url.PathUnescape(m[0][3]) + queryRaw := m[0][len(m[0])-1] + unescapedQuery, err := url.PathUnescape(queryRaw) if err != nil { - unescapedQuery = m[0][3] + unescapedQuery = queryRaw } + r.URL.Scheme = rewriter.mirror.Scheme r.URL.Host = rewriter.mirror.Host r.URL.Path = rewriter.mirror.Path + unescapedQuery } diff --git a/internal/server/internal.go b/internal/server/internal.go index 29d9c07..bcc641c 100644 --- a/internal/server/internal.go +++ b/internal/server/internal.go @@ -49,8 +49,8 @@ func RenderInternalUrls(url string) (string, int) { cacheSize, err := system.DirSize("./.aptcache") if err == nil { cacheSizeLabel = system.ByteCountDecimal(cacheSize) - } else { - return "Get Cache Size Failed", http.StatusBadGateway + // } else { + // return "Get Cache Size Failed", http.StatusBadGateway } filesNumberLabel := LABEL_NO_VALID_VALUE @@ -58,19 +58,19 @@ func RenderInternalUrls(url string) (string, int) { files, err := os.ReadDir(CACHE_META_DIR) if err == nil { filesNumberLabel = strconv.Itoa(len(files)) - } else { - return "Get Cache Meta Dir Failed", http.StatusBadGateway + // } else { + // return "Get Cache Meta Dir Failed", http.StatusBadGateway } - } else { - return "Get Cache Meta Failed", http.StatusBadGateway + // } else { + // return "Get Cache Meta Failed", http.StatusBadGateway } diskAvailableLabel := LABEL_NO_VALID_VALUE available, err := system.DiskAvailable() if err == nil { diskAvailableLabel = system.ByteCountDecimal(available) - } else { - return "Get Disk Available Failed", http.StatusBadGateway + // } else { + // return "Get Disk Available Failed", http.StatusBadGateway } memoryUsageLabel := LABEL_NO_VALID_VALUE