Files
filestash/server/ctrl/plugin.go
2025-09-15 13:54:11 +10:00

84 lines
1.8 KiB
Go

package ctrl
import (
"io"
"net/http"
"os"
"path/filepath"
"strings"
. "github.com/mickael-kerjean/filestash/server/common"
"github.com/mickael-kerjean/filestash/server/model"
"github.com/gorilla/mux"
)
func PluginExportHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
plgExports := map[string][]string{}
for name, plg := range model.PLUGINS {
for _, module := range plg.Modules {
if module["type"] == "xdg-open" {
index := module["entrypoint"]
if index == "" {
index = "/index.js"
}
plgExports[module["mime"]] = []string{
module["application"],
WithBase(JoinPath("/assets/"+BUILD_REF+"/plugin/", filepath.Join(name+".zip", index))),
}
}
}
}
SendSuccessResultWithEtagAndGzip(res, req, plgExports)
}
func PluginStaticHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
path := mux.Vars(req)["path"]
mtype := GetMimeType(path)
staticConfig := []struct {
ContentType string
FileExt string
}{
{"br", ".br"},
{"gzip", ".gz"},
{"", ""},
}
var (
b []byte
err error
)
head := res.Header()
acceptEncoding := req.Header.Get("Accept-Encoding")
for _, cfg := range staticConfig {
if strings.Contains(acceptEncoding, cfg.ContentType) == false {
continue
}
b, err = model.GetPluginFile(mux.Vars(req)["name"], path+cfg.FileExt)
if err != nil {
break
}
head.Set("Content-Type", mtype)
if cfg.ContentType != "" {
head.Set("Content-Encoding", cfg.ContentType)
}
res.Write(b)
return
}
SendErrorResult(res, err)
return
}
func PluginDownloadHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
f, err := os.Open(JoinPath(
GetAbsolutePath(PLUGIN_PATH),
mux.Vars(req)["name"]+".zip",
))
if err != nil {
SendErrorResult(res, err)
return
}
io.Copy(res, f)
f.Close()
}