package static import ( "net/http" "os" "path/filepath" ) func ExtensionDownloadHandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { path, ok := resolveExtensionZipPath() if !ok { http.Error(w, "extension package not found", http.StatusNotFound) return } w.Header().Set("Content-Type", "application/zip") w.Header().Set("Content-Disposition", `attachment; filename="haixun-threads-sync.zip"`) http.ServeFile(w, r, path) } } func resolveExtensionZipPath() (string, bool) { candidates := []string{ filepath.Join("web", "public", "downloads", "haixun-threads-sync.zip"), filepath.Join("backend", "web", "public", "downloads", "haixun-threads-sync.zip"), filepath.Join("..", "web", "public", "downloads", "haixun-threads-sync.zip"), filepath.Join("extension", "haixun-threads-sync.zip"), } if wd, err := os.Getwd(); err == nil { candidates = append(candidates, filepath.Join(wd, "web", "public", "downloads", "haixun-threads-sync.zip"), filepath.Join(wd, "backend", "web", "public", "downloads", "haixun-threads-sync.zip"), filepath.Join(wd, "..", "extension", "haixun-threads-sync.zip"), ) } for _, candidate := range candidates { if info, err := os.Stat(candidate); err == nil && !info.IsDir() && info.Size() > 0 { return candidate, true } } return "", false }