diff --git a/HISTORY.md b/HISTORY.md
index 3a9318a4..b8963df8 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -2,6 +2,14 @@
**How to upgrade**: remove your `$GOPATH/src/github.com/kataras` folder, open your command-line and execute this command: `go get -u github.com/kataras/iris/iris`.
+## 6.0.7 -> 6.0.8
+
+- Add `iris.UseTemplateFunc(functionName string, function interface{})`. You could always set custom template funcs by using each of [template engine's](https://github.com/kataras/go-template) configuration but this function will help newcomers to start creating their custom template funcs.
+
+Example:
+
+- https://github.com/iris-contrib/examples/tree/master/template_funcmap
+
## 6.0.6 -> 6.0.7
- `iris.Config.DisablePathEscape` -> renamed to `iris.Config.EnablePathEscape`, which defaults to false. Path escape is turned off by-default now,
diff --git a/README.md b/README.md
index 1dd8b484..73aff2f2 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
-
+
@@ -943,7 +943,7 @@ I recommend testing your API using this new library, [httpexpect](https://github
Versioning
------------
-Current: **v6.0.7**
+Current: **v6.0.8**
Older: **[v5/fasthttp](https://github.com/kataras/iris/tree/5.0.0)**
diff --git a/context.go b/context.go
index 4f762c83..eb7c8484 100644
--- a/context.go
+++ b/context.go
@@ -248,6 +248,14 @@ func (ctx *Context) Path() string {
// RequestPath returns the requested path
func (ctx *Context) RequestPath(escape bool) string {
if escape {
+ // NOTE: for example:
+ // DecodeURI decodes %2F to '/'
+ // DecodeQuery decodes any %20 to whitespace
+ // here we choose to be query-decoded only
+ // and with context.ParamDecoded the user receives a URI decoded path parameter.
+ // see https://github.com/iris-contrib/examples/tree/master/named_parameters_pathescape
+ // and https://github.com/iris-contrib/examples/tree/master/pathescape
+
return DecodeQuery(ctx.Request.URL.EscapedPath())
}
return ctx.Request.URL.Path
diff --git a/iris.go b/iris.go
index bc5cd154..4b6e64d8 100644
--- a/iris.go
+++ b/iris.go
@@ -80,7 +80,7 @@ const (
// IsLongTermSupport flag is true when the below version number is a long-term-support version
IsLongTermSupport = false
// Version is the current version number of the Iris web framework
- Version = "6.0.7"
+ Version = "6.0.8"
banner = ` _____ _
|_ _| (_)
@@ -139,82 +139,92 @@ type (
// FrameworkAPI contains the main Iris Public API
FrameworkAPI interface {
MuxAPI
- Set(...OptionSetter)
- Must(error)
+ Set(options ...OptionSetter)
+ Must(err error)
+
Build()
- Serve(net.Listener) error
- Listen(string)
- ListenTLS(string, string, string)
- ListenLETSENCRYPT(string, ...string)
- ListenUNIX(string, os.FileMode)
+ Serve(ln net.Listener) error
+ Listen(addr string)
+ ListenTLS(addr string, certFilePath string, keyFilePath string)
+ ListenLETSENCRYPT(addr string, cacheOptionalStoreFilePath ...string)
+ ListenUNIX(fileOrAddr string, fileMode os.FileMode)
Close() error
Reserve() error
- AcquireCtx(http.ResponseWriter, *http.Request) *Context
- ReleaseCtx(*Context)
- CheckForUpdates(bool)
- UseSessionDB(sessions.Database)
+
+ AcquireCtx(w http.ResponseWriter, r *http.Request) *Context
+ ReleaseCtx(ctx *Context)
+
+ CheckForUpdates(check bool)
+
+ UseSessionDB(sessDB sessions.Database)
DestroySessionByID(sid string)
DestroyAllSessions()
- UseSerializer(string, serializer.Serializer)
- UseTemplate(template.Engine) *template.Loader
- UsePreRender(PreRender)
- UseGlobal(...Handler)
- UseGlobalFunc(...HandlerFunc)
- Lookup(string) Route
+
+ UseSerializer(contentType string, serializerEngine serializer.Serializer)
+ UsePreRender(prerenderFunc PreRender)
+ UseTemplateFunc(functionName string, function interface{})
+ UseTemplate(tmplEngine template.Engine) *template.Loader
+
+ UseGlobal(middleware ...Handler)
+ UseGlobalFunc(middleware ...HandlerFunc)
+
+ Lookup(routeName string) Route
Lookups() []Route
- Path(string, ...interface{}) string
- URL(string, ...interface{}) string
- TemplateString(string, interface{}, ...map[string]interface{}) string
- TemplateSourceString(string, interface{}) string
- SerializeToString(string, interface{}, ...map[string]interface{}) string
- Cache(HandlerFunc, time.Duration) HandlerFunc
+ Path(routeName string, optionalPathParameters ...interface{}) (routePath string)
+ URL(routeName string, optionalPathParameters ...interface{}) (routeURL string)
+
+ TemplateString(file string, binding interface{}, options ...map[string]interface{}) (parsedTemplate string)
+ TemplateSourceString(src string, binding interface{}) (parsedTemplate string)
+ SerializeToString(string, interface{}, ...map[string]interface{}) (serializedContent string)
+
+ Cache(handlerToCache HandlerFunc, expiration time.Duration) (cachedHandler HandlerFunc)
}
// MuxAPI the visible api for the serveMux
MuxAPI interface {
- Party(string, ...HandlerFunc) MuxAPI
+ Party(reqRelativeRootPath string, middleware ...HandlerFunc) MuxAPI
// middleware serial, appending
- Use(...Handler) MuxAPI
- UseFunc(...HandlerFunc) MuxAPI
- Done(...Handler) MuxAPI
- DoneFunc(...HandlerFunc) MuxAPI
+ Use(middleware ...Handler) MuxAPI
+ UseFunc(middleware ...HandlerFunc) MuxAPI
+ Done(middleware ...Handler) MuxAPI
+ DoneFunc(middleware ...HandlerFunc) MuxAPI
// main handlers
- Handle(string, string, ...Handler) RouteNameFunc
- HandleFunc(string, string, ...HandlerFunc) RouteNameFunc
- API(string, HandlerAPI, ...HandlerFunc)
+ Handle(method string, reqPath string, middleware ...Handler) RouteNameFunc
+ HandleFunc(method string, reqPath string, middleware ...HandlerFunc) RouteNameFunc
+ API(reqRelativeRootPath string, api HandlerAPI, middleware ...HandlerFunc)
// http methods
- Get(string, ...HandlerFunc) RouteNameFunc
- Post(string, ...HandlerFunc) RouteNameFunc
- Put(string, ...HandlerFunc) RouteNameFunc
- Delete(string, ...HandlerFunc) RouteNameFunc
- Connect(string, ...HandlerFunc) RouteNameFunc
- Head(string, ...HandlerFunc) RouteNameFunc
- Options(string, ...HandlerFunc) RouteNameFunc
- Patch(string, ...HandlerFunc) RouteNameFunc
- Trace(string, ...HandlerFunc) RouteNameFunc
- Any(string, ...HandlerFunc)
+ Get(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Post(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Put(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Delete(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Connect(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Head(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Options(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Patch(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Trace(reqRelativePath string, middleware ...HandlerFunc) RouteNameFunc
+ Any(reqRelativePath string, middleware ...HandlerFunc)
// static content
- StaticServe(string, ...string) RouteNameFunc
- StaticContent(string, string, []byte) RouteNameFunc
- StaticEmbedded(string, string, func(string) ([]byte, error), func() []string) RouteNameFunc
- Favicon(string, ...string) RouteNameFunc
+ StaticServe(systemFilePath string, optionalReqRelativePath ...string) RouteNameFunc
+ StaticContent(reqRelativePath string, contentType string, contents []byte) RouteNameFunc
+ StaticEmbedded(reqRelativePath string, contentType string, assets func(string) ([]byte, error), assetsNames func() []string) RouteNameFunc
+ Favicon(systemFilePath string, optionalReqRelativePath ...string) RouteNameFunc
// static file system
- StaticHandler(string, string, bool, bool) HandlerFunc
- StaticWeb(string, string) RouteNameFunc
+ StaticHandler(reqRelativePath string, systemPath string, showList bool, enableGzip bool) HandlerFunc
+ StaticWeb(reqRelativePath string, systemPath string) RouteNameFunc
// party layout for template engines
- Layout(string) MuxAPI
+ Layout(layoutTemplateFileName string) MuxAPI
// errors
- OnError(int, HandlerFunc)
- EmitError(int, *Context)
+ OnError(statusCode int, handler HandlerFunc)
+ EmitError(statusCode int, ctx *Context)
}
// RouteNameFunc the func returns from the MuxAPi's methods, optionally sets the name of the Route (*route)
- RouteNameFunc func(string)
+ RouteNameFunc func(customRouteName string)
)
// Framework is our God |\| Google.Search('Greek mythology Iris')
@@ -884,6 +894,34 @@ func (s *Framework) UsePreRender(pre PreRender) {
s.templates.usePreRender(pre)
}
+// UseTemplateFunc sets or replaces a TemplateFunc from the shared available TemplateFuncMap
+// defaults are the iris.URL and iris.Path, all the template engines supports the following:
+// {{ url "mynamedroute" "pathParameter_ifneeded"} }
+// {{ urlpath "mynamedroute" "pathParameter_ifneeded" }}
+// {{ render "header.html" }}
+// {{ render_r "header.html" }} // partial relative path to current page
+// {{ yield }}
+// {{ current }}
+//
+// See more https:/github.com/iris-contrib/examples/tree/master/template_engines/template_funcmap
+func UseTemplateFunc(functionName string, function interface{}) {
+ Default.UseTemplateFunc(functionName, function)
+}
+
+// UseTemplateFunc sets or replaces a TemplateFunc from the shared available TemplateFuncMap
+// defaults are the iris.URL and iris.Path, all the template engines supports the following:
+// {{ url "mynamedroute" "pathParameter_ifneeded"} }
+// {{ urlpath "mynamedroute" "pathParameter_ifneeded" }}
+// {{ render "header.html" }}
+// {{ render_r "header.html" }} // partial relative path to current page
+// {{ yield }}
+// {{ current }}
+//
+// See more https:/github.com/iris-contrib/examples/tree/master/template_engines/template_funcmap
+func (s *Framework) UseTemplateFunc(functionName string, function interface{}) {
+ s.templates.SharedFuncs[functionName] = function
+}
+
// UseTemplate adds a template engine to the iris view system
// it does not build/load them yet
func UseTemplate(e template.Engine) *template.Loader {