1
0
silverbullet/mattermost-plugin/server/plugin.go
2022-07-22 13:44:45 +02:00

75 lines
2.0 KiB
Go

package main
import (
"fmt"
"io"
"net/http"
"strings"
"sync"
"github.com/mattermost/mattermost-server/v6/plugin"
"github.com/mattermost/mattermost-server/v6/shared/mlog"
)
// Plugin implements the interface expected by the Mattermost server to communicate between the server and plugin processes.
type Plugin struct {
plugin.MattermostPlugin
// configurationLock synchronizes access to the configuration.
configurationLock sync.RWMutex
// configuration is the active plugin configuration. Consult getConfiguration and
// setConfiguration for usage.
configuration *configuration
}
// ServeHTTP demonstrates a plugin that handles HTTP requests by greeting the world.
func (p *Plugin) ServeHTTP(c *plugin.Context, w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/fs") || strings.HasPrefix(r.URL.Path, "/plug/") {
p.httpProxy(w, r)
return
}
if r.URL.Path == "/global.plug.json" {
p.httpProxy(w, r)
return
}
r2, err := http.Get("http://localhost:8065")
if err != nil {
fmt.Println(err)
return
}
io.Copy(w, r2.Body)
// fmt.Fprint(w, "Hello, world!")
}
func (p *Plugin) httpProxy(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
mlog.Info(fmt.Sprintf("Got HTTP request: %s: %s Headers: %+v", r.Method, r.URL, r.Header))
req, err := http.NewRequest(r.Method, fmt.Sprintf("http://localhost:%d%s", 3000, r.URL), r.Body)
if err != nil {
http.Error(w, fmt.Sprintf("Proxy error: %s", err), http.StatusInternalServerError)
return
}
req.Header = r.Header
res, err := http.DefaultClient.Do(req)
if err != nil {
http.Error(w, fmt.Sprintf("Proxy error: %s", err), http.StatusInternalServerError)
return
}
for k, vs := range res.Header {
for _, v := range vs {
w.Header().Add(k, v)
}
}
w.WriteHeader(res.StatusCode)
_, err = io.Copy(w, res.Body)
if err != nil {
mlog.Error("Error proxying", mlog.Err(err))
}
res.Body.Close()
}
// See https://developers.mattermost.com/extend/plugins/server/reference/