Browse Source

Updated.

v0.6 v0.5.3
Mingcai SHEN 5 years ago
parent
commit
a911db5122
8 changed files with 77 additions and 46 deletions
  1. +2
    -2
      auth/auth.go
  2. +1
    -0
      demo1/cmd/serve.go
  3. +11
    -0
      demo1/handlers/handlers.go
  4. +12
    -0
      demo2/handlers/handlers.go
  5. +16
    -12
      restlet/types.go
  6. +10
    -10
      service/decorators.go
  7. +3
    -2
      service/predictor.go
  8. +22
    -20
      service/service.go

+ 2
- 2
auth/auth.go View File

@ -205,7 +205,7 @@ type UserActionLog struct {
} }
func KeepAliveSessionHandler(next restlet.RequestHandler) restlet.RequestHandler { func KeepAliveSessionHandler(next restlet.RequestHandler) restlet.RequestHandler {
return restlet.RequestHandleFunc(func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
return restlet.RequestHandleFunc(func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
log.Debugln("keepAliveSessionHandler:>", r.URL.String()) log.Debugln("keepAliveSessionHandler:>", r.URL.String())
secret := ctx.Config().GetString(configAuthJwtSecretKey, "kepler") secret := ctx.Config().GetString(configAuthJwtSecretKey, "kepler")
var jwtClaims sessionClaims var jwtClaims sessionClaims
@ -250,7 +250,7 @@ func KeepAliveSessionHandler(next restlet.RequestHandler) restlet.RequestHandler
} }
} }
log.Debugln("keepAliveSessionHandler:> Done") log.Debugln("keepAliveSessionHandler:> Done")
next.Handle(ctx, w, r)
return next.Handle(ctx, w, r)
}) })
} }

+ 1
- 0
demo1/cmd/serve.go View File

@ -40,6 +40,7 @@ var serveCmd = &cobra.Command{
//svr.RegisterRequest() //svr.RegisterRequest()
svr.RegisterRequest("example", restlet.RestletFunc(handlers.ExampleHandler)) svr.RegisterRequest("example", restlet.RestletFunc(handlers.ExampleHandler))
svr.RegisterRequest("persons", restlet.RestletFunc(restlet.NewCURDHandler("", handlers.PersonKind{}).Handle)) svr.RegisterRequest("persons", restlet.RestletFunc(restlet.NewCURDHandler("", handlers.PersonKind{}).Handle))
svr.SetSessionKeeper(handlers.SessionKeeper)
//svr.RegisterMessage() //svr.RegisterMessage()
svr.RegisterMessage("tasks.example", restlet.TaskletFunc(tasks.ExampleMessageTask)) svr.RegisterMessage("tasks.example", restlet.TaskletFunc(tasks.ExampleMessageTask))
//svr.RegisterSchedule() //svr.RegisterSchedule()

+ 11
- 0
demo1/handlers/handlers.go View File

@ -1,6 +1,8 @@
package handlers package handlers
import ( import (
"net/http"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
xql "github.com/archsh/go.xql" xql "github.com/archsh/go.xql"
@ -11,12 +13,21 @@ import (
func ExampleHandler(ctx restlet.RequestContext, params restlet.Parameters, queries restlet.Parameters, data []byte) (*restlet.RestletResult, error) { func ExampleHandler(ctx restlet.RequestContext, params restlet.Parameters, queries restlet.Parameters, data []byte) (*restlet.RestletResult, error) {
log.Debugln("ExampleHandler:>", params, queries) log.Debugln("ExampleHandler:>", params, queries)
v, b := ctx.Get("demo_session")
log.Debugln("ExampleHandler:> CTX:", v, b)
return &restlet.RestletResult{ return &restlet.RestletResult{
Code: restlet.SuccessOk, Code: restlet.SuccessOk,
Data: "OK", Data: "OK",
}, nil }, nil
} }
func SessionKeeper(next restlet.RequestHandler) restlet.RequestHandler {
return restlet.RequestHandleFunc(func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
_ = ctx.Set("demo_session", "Hello")
return next.Handle(ctx, w, r)
})
}
type PersonKind struct { type PersonKind struct {
} }

+ 12
- 0
demo2/handlers/handlers.go View File

@ -1,6 +1,8 @@
package handlers package handlers
import ( import (
"net/http"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
xql "github.com/archsh/go.xql" xql "github.com/archsh/go.xql"
@ -12,6 +14,8 @@ import (
func exampleHandler(ctx restlet.RequestContext, params restlet.Parameters, queries restlet.Parameters, data []byte) (*restlet.RestletResult, error) { func exampleHandler(ctx restlet.RequestContext, params restlet.Parameters, queries restlet.Parameters, data []byte) (*restlet.RestletResult, error) {
log.Debugln("ExampleHandler:>", params, queries) log.Debugln("ExampleHandler:>", params, queries)
v, b := ctx.Get("demo_session")
log.Debugln("ExampleHandler:> CTX:", v, b)
return &restlet.RestletResult{ return &restlet.RestletResult{
Code: restlet.SuccessOk, Code: restlet.SuccessOk,
Data: "OK", Data: "OK",
@ -25,8 +29,16 @@ func (personKind) Entity() xql.TableIdentified {
return &models.Person{} return &models.Person{}
} }
func sessionKeeper(next restlet.RequestHandler) restlet.RequestHandler {
return restlet.RequestHandleFunc(func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
_ = ctx.Set("demo_session", "Hello")
return next.Handle(ctx, w, r)
})
}
func init() { func init() {
//svr.RegisterRequest() //svr.RegisterRequest()
service.RegisterRequest("example", restlet.RestletFunc(exampleHandler)) service.RegisterRequest("example", restlet.RestletFunc(exampleHandler))
service.RegisterRequest("persons", restlet.RestletFunc(restlet.NewCURDHandler("", personKind{}).Handle)) service.RegisterRequest("persons", restlet.RestletFunc(restlet.NewCURDHandler("", personKind{}).Handle))
service.SetSessionKeeper(sessionKeeper)
} }

+ 16
- 12
restlet/types.go View File

@ -106,19 +106,20 @@ type CacheController struct {
*/ */
type RequestHandler interface { type RequestHandler interface {
Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request)
Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) error
} }
type RequestHandleFunc func(ctx RequestContext, w http.ResponseWriter, r *http.Request)
type RequestHandleFunc func(ctx RequestContext, w http.ResponseWriter, r *http.Request) error
func (f RequestHandleFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) {
f(ctx, w, r)
func (f RequestHandleFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) error {
return f(ctx, w, r)
} }
type SimpleHandleFunc func(w http.ResponseWriter, r *http.Request) type SimpleHandleFunc func(w http.ResponseWriter, r *http.Request)
func (f SimpleHandleFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) {
func (f SimpleHandleFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) error {
f(w, r) f(w, r)
return nil
} }
type RestletHandler interface { type RestletHandler interface {
@ -127,7 +128,7 @@ type RestletHandler interface {
type RestletFunc func(ctx RequestContext, params Parameters, queries Parameters, data []byte) (*RestletResult, error) type RestletFunc func(ctx RequestContext, params Parameters, queries Parameters, data []byte) (*RestletResult, error)
func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) {
func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) error {
var params = GetUrlParams(r) var params = GetUrlParams(r)
var queries = GetUrlQueries(r) var queries = GetUrlQueries(r)
var data []byte var data []byte
@ -139,7 +140,7 @@ func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.R
if r.Body != nil { if r.Body != nil {
if bs, e := ioutil.ReadAll(r.Body); nil != e { if bs, e := ioutil.ReadAll(r.Body); nil != e {
FailureResponse(w, http.StatusBadRequest, e.Error()) FailureResponse(w, http.StatusBadRequest, e.Error())
return
return e
} else { } else {
data = bs data = bs
_ = r.Body.Close() _ = r.Body.Close()
@ -151,6 +152,7 @@ func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.R
} else { } else {
FailureResponse(w, http.StatusInternalServerError, ee.Error()) FailureResponse(w, http.StatusInternalServerError, ee.Error())
} }
return e
} else if nil != ret { } else if nil != ret {
var retCode int var retCode int
var data interface{} var data interface{}
@ -173,15 +175,17 @@ func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.R
default: default:
JsonReponse(data, retCode, w) JsonReponse(data, retCode, w)
} }
return nil
} else { } else {
FailureResponse(w, http.StatusInternalServerError, "nil return") FailureResponse(w, http.StatusInternalServerError, "nil return")
return e
} }
} }
type RestletFuncEx func(ctx RequestContext, params Parameters, queries Parameters, data []byte) (int, interface{}, error) type RestletFuncEx func(ctx RequestContext, params Parameters, queries Parameters, data []byte) (int, interface{}, error)
func (f RestletFuncEx) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) {
RestletFunc(func(ctx RequestContext, params Parameters, queries Parameters, data []byte) (*RestletResult, error) {
func (f RestletFuncEx) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) error {
return RestletFunc(func(ctx RequestContext, params Parameters, queries Parameters, data []byte) (*RestletResult, error) {
var ret RestletResult var ret RestletResult
if c, d, e := f(ctx, params, queries, data); nil != e { if c, d, e := f(ctx, params, queries, data); nil != e {
return nil, e return nil, e
@ -194,12 +198,12 @@ func (f RestletFuncEx) Handle(ctx RequestContext, w http.ResponseWriter, r *http
}).Handle(ctx, w, r) }).Handle(ctx, w, r)
} }
type RawletFunc func(ctx RequestContext, params Parameters, queries Parameters, w http.ResponseWriter, r *http.Request)
type RawletFunc func(ctx RequestContext, params Parameters, queries Parameters, w http.ResponseWriter, r *http.Request) error
func (f RawletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) {
func (f RawletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.Request) error {
var params = GetUrlParams(r) var params = GetUrlParams(r)
var queries = GetUrlQueries(r) var queries = GetUrlQueries(r)
f(ctx, params, queries, w, r)
return f(ctx, params, queries, w, r)
} }
type TaskContext interface { type TaskContext interface {

+ 10
- 10
service/decorators.go View File

@ -7,36 +7,36 @@ import (
) )
func JSON(handler interface{}) restlet.RequestHandler { func JSON(handler interface{}) restlet.RequestHandler {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
return nil
} }
return restlet.RequestHandleFunc(f) return restlet.RequestHandleFunc(f)
} }
func XML(handler interface{}) restlet.RequestHandler { func XML(handler interface{}) restlet.RequestHandler {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
return nil
} }
return restlet.RequestHandleFunc(f) return restlet.RequestHandleFunc(f)
} }
func YAML(handler interface{}) restlet.RequestHandler { func YAML(handler interface{}) restlet.RequestHandler {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
return nil
} }
return restlet.RequestHandleFunc(f) return restlet.RequestHandleFunc(f)
} }
func BSON(handler interface{}) restlet.RequestHandler { func BSON(handler interface{}) restlet.RequestHandler {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
return nil
} }
return restlet.RequestHandleFunc(f) return restlet.RequestHandleFunc(f)
} }
func Format(handler interface{}, defaults ...string) restlet.RequestHandler { func Format(handler interface{}, defaults ...string) restlet.RequestHandler {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
return nil
} }
return restlet.RequestHandleFunc(f) return restlet.RequestHandleFunc(f)
} }

+ 3
- 2
service/predictor.go View File

@ -33,7 +33,7 @@ func (p Predictor) Predicate(ctx restlet.RequestContext) (string, bool) {
} }
func (p Predictor) Next(handler interface{}) restlet.RequestHandler { func (p Predictor) Next(handler interface{}) restlet.RequestHandler {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) {
var f = func(ctx restlet.RequestContext, w http.ResponseWriter, r *http.Request) error {
if s, b := p.Predicate(ctx); b { if s, b := p.Predicate(ctx); b {
switch h := handler.(type) { switch h := handler.(type) {
case http.Handler: case http.Handler:
@ -41,7 +41,7 @@ func (p Predictor) Next(handler interface{}) restlet.RequestHandler {
case http.HandlerFunc: case http.HandlerFunc:
h(w, r) h(w, r)
case restlet.RequestHandleFunc: case restlet.RequestHandleFunc:
h(ctx, w, r)
return h(ctx, w, r)
default: default:
panic("unsupported handler") panic("unsupported handler")
} }
@ -50,6 +50,7 @@ func (p Predictor) Next(handler interface{}) restlet.RequestHandler {
w.WriteHeader(http.StatusForbidden) w.WriteHeader(http.StatusForbidden)
_, _ = w.Write([]byte(s)) _, _ = w.Write([]byte(s))
} }
return nil
} }
return restlet.RequestHandleFunc(f) return restlet.RequestHandleFunc(f)
} }

+ 22
- 20
service/service.go View File

@ -48,7 +48,7 @@ type KeplerService struct {
prefix string prefix string
config config.Config config config.Config
router *mux.Router router *mux.Router
sessionKeeper func(ctx restlet.Context, next http.Handler) http.Handler
sessionKeeper func(next restlet.RequestHandler) restlet.RequestHandler
db map[string]database.DBI db map[string]database.DBI
cache map[string]cache.Cache cache map[string]cache.Cache
kvstore map[string]kv.KV kvstore map[string]kv.KV
@ -195,7 +195,7 @@ func (svr *KeplerService) Initialize() error {
// sessionKeeper = ff // sessionKeeper = ff
//} //}
func (svr *KeplerService) SetSessionKeeper(ff func(ctx restlet.Context, next http.Handler) http.Handler) {
func (svr *KeplerService) SetSessionKeeper(ff func(next restlet.RequestHandler) restlet.RequestHandler) {
svr.sessionKeeper = ff svr.sessionKeeper = ff
} }
@ -255,18 +255,20 @@ func (svr *KeplerService) messageProc() {
wg.Wait() wg.Wait()
} }
func (svr *KeplerService) runRequestHandler(handler *RequestHandler) http.Handler {
func (svr *KeplerService) runRequestHandler(handler restlet.RequestHandler, predictor restlet.RequestPredictor, methods string) http.Handler {
var f = func(w http.ResponseWriter, r *http.Request) { var f = func(w http.ResponseWriter, r *http.Request) {
if !validateMethod(r, strings.Split(handler.Methods, ",")...) {
if !validateMethod(r, strings.Split(methods, ",")...) {
handleFailure(w, r, http.StatusMethodNotAllowed, "method not allowed") handleFailure(w, r, http.StatusMethodNotAllowed, "method not allowed")
} }
ctx := svr.NewContext(r) ctx := svr.NewContext(r)
if handler.Predictor != nil {
if s, b := handler.Predictor.Predicate(ctx); !b {
if predictor != nil {
if s, b := predictor.Predicate(ctx); !b {
handleFailure(w, r, http.StatusForbidden, s) handleFailure(w, r, http.StatusForbidden, s)
} }
} }
handler.Handler.Handle(ctx, w, r)
if e := handler.Handle(ctx, w, r); nil != e {
}
} }
return http.HandlerFunc(f) return http.HandlerFunc(f)
} }
@ -304,20 +306,16 @@ func (svr *KeplerService) Serve() error {
for _, h := range svr.requestHandlers { for _, h := range svr.requestHandlers {
fullPrefix := path.Join(svr.prefix, h.Prefix) fullPrefix := path.Join(svr.prefix, h.Prefix)
log.Infoln("Routing :", fullPrefix, h.Methods) log.Infoln("Routing :", fullPrefix, h.Methods)
svr.router.Handle(fullPrefix, svr.runRequestHandler(h))
if svr.sessionKeeper != nil {
svr.router.Handle(fullPrefix, svr.runRequestHandler(svr.sessionKeeper(h.Handler), h.Predictor, h.Methods))
} else {
svr.router.Handle(fullPrefix, svr.runRequestHandler(h.Handler, h.Predictor, h.Methods))
}
} }
listenAddr := svr.config.GetString("service.listen", ":8080") listenAddr := svr.config.GetString("service.listen", ":8080")
logRequestFile := svr.config.GetString("service.log_request_file", "") logRequestFile := svr.config.GetString("service.log_request_file", "")
log.Infoln("Service:> Listening on ", listenAddr) log.Infoln("Service:> Listening on ", listenAddr)
//if svr.sessionKeeper == nil && sessionKeeper != nil {
// svr.sessionKeeper = sessionKeeper
//}
var rootHandler http.Handler
if svr.sessionKeeper != nil {
rootHandler = svr.sessionKeeper(NewTaskContext(svr), svr.router)
} else {
rootHandler = svr.router
}
if svr.config.GetBool("service.log_request") { if svr.config.GetBool("service.log_request") {
var logIO io.Writer var logIO io.Writer
if logRequestFile == "" { if logRequestFile == "" {
@ -330,9 +328,9 @@ func (svr *KeplerService) Serve() error {
defer f.Close() defer f.Close()
} }
} }
return http.ListenAndServe(listenAddr, handlers.CombinedLoggingHandler(logIO, rootHandler))
return http.ListenAndServe(listenAddr, handlers.CombinedLoggingHandler(logIO, svr.router))
} else { } else {
return http.ListenAndServe(listenAddr, rootHandler)
return http.ListenAndServe(listenAddr, svr.router)
} }
} }
@ -403,6 +401,10 @@ var (
} }
) )
func Router() *mux.Router {
return builtinService.router
}
func Serve() error { func Serve() error {
return builtinService.Serve() return builtinService.Serve()
} }
@ -415,7 +417,7 @@ func Initialize() error {
return builtinService.Initialize() return builtinService.Initialize()
} }
func SetSessionKeeper(ff func(ctx restlet.Context, next http.Handler) http.Handler) {
func SetSessionKeeper(ff func(next restlet.RequestHandler) restlet.RequestHandler) {
builtinService.SetSessionKeeper(ff) builtinService.SetSessionKeeper(ff)
} }

Loading…
Cancel
Save