func NoTransactionFilter(ctx maze.IContext) error { return TM.NoTransaction(func(DB db.IDb) error { appCtx := ctx.(*AppCtx) appCtx.Store = DB return ctx.Proceed() }) }
// Limit limits the body of a post, compress response and format eventual errors func Limit(ctx maze.IContext) (err error) { r := ctx.GetRequest() // https only -- redirect in openshift if HttpsOnly && !isHttps(r) { url := "https://" + r.Host + r.RequestURI logger.Debugf("redirecting to %s", url) http.Redirect(ctx.GetResponse(), r, url, http.StatusMovedPermanently) return } /* Very Important: Before compressing the response, the "Content-Type" header must be properly set! */ // encodes only text files var zip bool var ext = filepath.Ext(r.URL.Path) for _, v := range zipexts { if v == ext { zip = true break } } // TODO gzip encoding should occour only after a size threshold if zip && strings.Contains(fmt.Sprint(r.Header["Accept-Encoding"]), "gzip") { appCtx := ctx.(*AppCtx) w := appCtx.Response w.Header().Set("Content-Encoding", "gzip") // Get a Writer from the Pool gz := zippers.Get().(*gzip.Writer) // When done, put the Writer back in to the Pool defer zippers.Put(gz) // We use Reset to set the writer we want to use. gz.Reset(w) defer gz.Close() appCtx.Response = gzipResponseWriter{Writer: gz, ResponseWriter: w} } defer func() { if r := recover(); r != nil { if e, ok := r.(runtime.Error); ok { logger.Errorf("%s\n========== Begin Stack Trace ==========\n%s\n========== End Stack Trace ==========\n", e, debug.Stack()) } err = formatError(ctx.GetResponse(), r.(error)) } }() logger.Debugf("requesting %s", r.URL.Path) r.Body = http.MaxBytesReader(ctx.GetResponse(), r.Body, postLimit) err = ctx.Proceed() if err != nil { err = formatError(ctx.GetResponse(), err) } return err }
func TransactionFilter(ctx maze.IContext) error { return TM.Transaction(func(DB db.IDb) error { appCtx := ctx.(*AppCtx) appCtx.Store = DB p := appCtx.Principal if p != nil { appCtx.Store.SetAttribute(entity.ATTR_USERID, p.UserId) } return ctx.Proceed() }) }
func AuthenticationFilter(ctx maze.IContext) error { p := deserializePrincipal(ctx.GetRequest()) if p != nil { // for authorizations and business logic ctx.(*AppCtx).Principal = p return ctx.Proceed() } else { logger.Debugf("Unable to proceed: invalid token!") http.Error(ctx.GetResponse(), "Unauthorized", http.StatusUnauthorized) } return nil }