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 {
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())
secret := ctx.Config().GetString(configAuthJwtSecretKey, "kepler")
var jwtClaims sessionClaims
@ -250,7 +250,7 @@ func KeepAliveSessionHandler(next restlet.RequestHandler) restlet.RequestHandler
}
}
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("example", restlet.RestletFunc(handlers.ExampleHandler))
svr.RegisterRequest("persons", restlet.RestletFunc(restlet.NewCURDHandler("", handlers.PersonKind{}).Handle))
svr.SetSessionKeeper(handlers.SessionKeeper)
//svr.RegisterMessage()
svr.RegisterMessage("tasks.example", restlet.TaskletFunc(tasks.ExampleMessageTask))
//svr.RegisterSchedule()

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

@ -1,6 +1,8 @@
package handlers
import (
"net/http"
log "github.com/Sirupsen/logrus"
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) {
log.Debugln("ExampleHandler:>", params, queries)
v, b := ctx.Get("demo_session")
log.Debugln("ExampleHandler:> CTX:", v, b)
return &restlet.RestletResult{
Code: restlet.SuccessOk,
Data: "OK",
}, 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 {
}

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

@ -1,6 +1,8 @@
package handlers
import (
"net/http"
log "github.com/Sirupsen/logrus"
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) {
log.Debugln("ExampleHandler:>", params, queries)
v, b := ctx.Get("demo_session")
log.Debugln("ExampleHandler:> CTX:", v, b)
return &restlet.RestletResult{
Code: restlet.SuccessOk,
Data: "OK",
@ -25,8 +29,16 @@ func (personKind) Entity() xql.TableIdentified {
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() {
//svr.RegisterRequest()
service.RegisterRequest("example", restlet.RestletFunc(exampleHandler))
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 {
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)
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)
return nil
}
type RestletHandler interface {
@ -127,7 +128,7 @@ type RestletHandler interface {
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 queries = GetUrlQueries(r)
var data []byte
@ -139,7 +140,7 @@ func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.R
if r.Body != nil {
if bs, e := ioutil.ReadAll(r.Body); nil != e {
FailureResponse(w, http.StatusBadRequest, e.Error())
return
return e
} else {
data = bs
_ = r.Body.Close()
@ -151,6 +152,7 @@ func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.R
} else {
FailureResponse(w, http.StatusInternalServerError, ee.Error())
}
return e
} else if nil != ret {
var retCode int
var data interface{}
@ -173,15 +175,17 @@ func (f RestletFunc) Handle(ctx RequestContext, w http.ResponseWriter, r *http.R
default:
JsonReponse(data, retCode, w)
}
return nil
} else {
FailureResponse(w, http.StatusInternalServerError, "nil return")
return e
}
}
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
if c, d, e := f(ctx, params, queries, data); nil != e {
return nil, e
@ -194,12 +198,12 @@ func (f RestletFuncEx) Handle(ctx RequestContext, w http.ResponseWriter, r *http
}).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 queries = GetUrlQueries(r)
f(ctx, params, queries, w, r)
return f(ctx, params, queries, w, r)
}
type TaskContext interface {

+ 10
- 10
service/decorators.go View File

@ -7,36 +7,36 @@ import (
)
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)
}
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)
}
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)
}
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)
}
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)
}

+ 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 {
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 {
switch h := handler.(type) {
case http.Handler:
@ -41,7 +41,7 @@ func (p Predictor) Next(handler interface{}) restlet.RequestHandler {
case http.HandlerFunc:
h(w, r)
case restlet.RequestHandleFunc:
h(ctx, w, r)
return h(ctx, w, r)
default:
panic("unsupported handler")
}
@ -50,6 +50,7 @@ func (p Predictor) Next(handler interface{}) restlet.RequestHandler {
w.WriteHeader(http.StatusForbidden)
_, _ = w.Write([]byte(s))
}
return nil
}
return restlet.RequestHandleFunc(f)
}

+ 22
- 20
service/service.go View File

@ -48,7 +48,7 @@ type KeplerService struct {
prefix string
config config.Config
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
cache map[string]cache.Cache
kvstore map[string]kv.KV
@ -195,7 +195,7 @@ func (svr *KeplerService) Initialize() error {
// 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
}
@ -255,18 +255,20 @@ func (svr *KeplerService) messageProc() {
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) {
if !validateMethod(r, strings.Split(handler.Methods, ",")...) {
if !validateMethod(r, strings.Split(methods, ",")...) {
handleFailure(w, r, http.StatusMethodNotAllowed, "method not allowed")
}
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)
}
}
handler.Handler.Handle(ctx, w, r)
if e := handler.Handle(ctx, w, r); nil != e {
}
}
return http.HandlerFunc(f)
}
@ -304,20 +306,16 @@ func (svr *KeplerService) Serve() error {
for _, h := range svr.requestHandlers {
fullPrefix := path.Join(svr.prefix, h.Prefix)
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")
logRequestFile := svr.config.GetString("service.log_request_file", "")
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") {
var logIO io.Writer
if logRequestFile == "" {
@ -330,9 +328,9 @@ func (svr *KeplerService) Serve() error {
defer f.Close()
}
}
return http.ListenAndServe(listenAddr, handlers.CombinedLoggingHandler(logIO, rootHandler))
return http.ListenAndServe(listenAddr, handlers.CombinedLoggingHandler(logIO, svr.router))
} 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 {
return builtinService.Serve()
}
@ -415,7 +417,7 @@ func Initialize() error {
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)
}

Loading…
Cancel
Save