128 lines
2.7 KiB
Go
128 lines
2.7 KiB
Go
package gosh
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"git.kingecg.top/kingecg/gosh/interceptor"
|
|
"github.com/mattn/anko/env"
|
|
)
|
|
|
|
const (
|
|
GET = "GET"
|
|
POST = "POST"
|
|
PUT = "PUT"
|
|
DEL = "DELETE"
|
|
PATCH = "PATCH"
|
|
)
|
|
|
|
type SHMux struct {
|
|
*http.ServeMux
|
|
ankoEnv *env.Env
|
|
getScripts map[string]string
|
|
postScripts map[string]string
|
|
putScripts map[string]string
|
|
delScripts map[string]string
|
|
patchScripts map[string]string
|
|
}
|
|
|
|
func NewSHMux() *SHMux {
|
|
s := &SHMux{
|
|
ServeMux: http.NewServeMux(),
|
|
ankoEnv: env.NewEnv(),
|
|
}
|
|
//s.executor = interceptor.NewAnkointerceptor(s.ankoEnv)
|
|
return s
|
|
}
|
|
|
|
func (s *SHMux) RegistFunction(name string, function interface{}) {
|
|
if s.ankoEnv != nil {
|
|
_ = s.ankoEnv.Define(name, function)
|
|
}
|
|
}
|
|
|
|
func (s *SHMux) register(method, pattern, script string) {
|
|
switch method {
|
|
case GET:
|
|
if s.getScripts == nil {
|
|
s.getScripts = make(map[string]string)
|
|
}
|
|
s.getScripts[pattern] = script
|
|
case POST:
|
|
if s.postScripts == nil {
|
|
s.postScripts = make(map[string]string)
|
|
}
|
|
s.postScripts[pattern] = script
|
|
case PUT:
|
|
if s.putScripts == nil {
|
|
s.putScripts = make(map[string]string)
|
|
}
|
|
s.putScripts[pattern] = script
|
|
case DEL:
|
|
if s.delScripts == nil {
|
|
s.delScripts = make(map[string]string)
|
|
}
|
|
s.delScripts[pattern] = script
|
|
case PATCH:
|
|
if s.patchScripts == nil {
|
|
s.patchScripts = make(map[string]string)
|
|
}
|
|
s.patchScripts[pattern] = script
|
|
}
|
|
}
|
|
func (s *SHMux) GET(pattern, script string) {
|
|
s.register(GET, pattern, script)
|
|
}
|
|
func (s *SHMux) POST(pattern, script string) {
|
|
s.register(POST, pattern, script)
|
|
}
|
|
func (s *SHMux) PUT(pattern, script string) {
|
|
s.register(PUT, pattern, script)
|
|
}
|
|
func (s *SHMux) DELETE(pattern, script string) {
|
|
s.register(DEL, pattern, script)
|
|
}
|
|
func (s *SHMux) PATCH(pattern, script string) {
|
|
s.register(PATCH, pattern, script)
|
|
}
|
|
|
|
func (s *SHMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
var script string
|
|
switch r.Method {
|
|
case GET:
|
|
script = s.getScripts[r.URL.Path]
|
|
case POST:
|
|
script = s.postScripts[r.URL.Path]
|
|
case PUT:
|
|
script = s.putScripts[r.URL.Path]
|
|
case DEL:
|
|
script = s.delScripts[r.URL.Path]
|
|
case PATCH:
|
|
script = s.patchScripts[r.URL.Path]
|
|
}
|
|
s.handle(w, r, script)
|
|
}
|
|
|
|
func (s *SHMux) handle(w http.ResponseWriter, r *http.Request, script string) {
|
|
if script == "" {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
reqHelper := &RequestHelper{
|
|
r: r,
|
|
}
|
|
resHelper := &ResponseHelper{
|
|
w: w,
|
|
}
|
|
renv := s.ankoEnv.Copy()
|
|
_ = renv.Define("Req", reqHelper)
|
|
_ = renv.Define("Res", resHelper)
|
|
rinterceptor := interceptor.NewAnkointerceptor(renv)
|
|
|
|
_, err := rinterceptor.ExecContent(script)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
// w.Write([]byte(script))
|
|
}
|