支持模板渲染 / 修复 bug
This commit is contained in:
44
pkg/renders/gotemplate.go
Normal file
44
pkg/renders/gotemplate.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package renders
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
sprig "github.com/go-task/slim-sprig/v3"
|
||||
)
|
||||
|
||||
type GoTemplate struct{}
|
||||
|
||||
func init() {
|
||||
RegisterRender("gotemplate", &GoTemplate{})
|
||||
}
|
||||
|
||||
func (g GoTemplate) Render(w http.ResponseWriter, r *http.Request, input io.Reader) error {
|
||||
dataB, err := io.ReadAll(input)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
out := &bytes.Buffer{}
|
||||
parse, err := template.New("tmpl").Funcs(sprig.FuncMap()).Option("missingkey=error").Parse(string(dataB))
|
||||
headers := make(map[string]string)
|
||||
for k, vs := range r.Header {
|
||||
headers[k] = strings.Join(vs, ",")
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = parse.Execute(out, map[string]interface{}{
|
||||
"Request": map[string]any{
|
||||
"Method": r.Method,
|
||||
"Headers": headers,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = out.WriteTo(w)
|
||||
return err
|
||||
}
|
||||
29
pkg/renders/render.go
Normal file
29
pkg/renders/render.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package renders
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
renders = make(map[string]Render)
|
||||
lock = &sync.Mutex{}
|
||||
)
|
||||
|
||||
type Render interface {
|
||||
Render(w http.ResponseWriter, r *http.Request, input io.Reader) error
|
||||
}
|
||||
|
||||
func RegisterRender(fType string, r Render) {
|
||||
lock.Lock()
|
||||
defer lock.Unlock()
|
||||
if renders[fType] != nil {
|
||||
panic("duplicate render type: " + fType)
|
||||
}
|
||||
renders[fType] = r
|
||||
}
|
||||
|
||||
func GetRender(key string) Render {
|
||||
return renders[key]
|
||||
}
|
||||
Reference in New Issue
Block a user