# History ## 3.0.0-beta.3, 3.0.0-beta.4 -> 3.0.0-rc.1 This version took me many days because the whole framework's underline code is rewritten after many many many 'yoga'. Iris is not so small anymore, so I (tried) to organized it a little better. Note that, today, you can just go to [iris.go](https://github.com/kataras/iris/tree/master/iris.go) and [context.go](https://github.com/kataras/iris/tree/master/context/context.go) and look what functions you can use. You had some 'bugs' to subdomains, mail service, basic authentication and logger, these are fixed also, see below... All [examples](https://github.com/iris-contrib/examples) are updated, and I tested them one by one. Many underline changes but the public API didn't changed much, of course this is relative to the way you use this framework, because that: - Configuration changes: **0** - iris.Iris pointer -> **iris.Framework** pointer - iris.DefaultIris -> **iris.Default** - iris.Config() -> **iris.Config** is field now - iris.Websocket() -> **iris.Websocket** is field now - iris.Logger() -> **iris.Logger** is field now - iris.Plugins() -> **iris.Plugins** is field now - iris.Server() -> **iris.HTTPServer** is field now - iris.Rest() -> **REMOVED** - iris.Mail() -> **REMOVED** - iris.Mail().Send() -> **iris.SendMail()** - iris.Templates() -> **REMOVED** - iris.Templates().RenderString() -> **iris.TemplateString()** - iris.StaticHandlerFunc -> **iris.StaticHandler** - iris.URIOf() -> **iris.URL()** - iris.PathOf() -> **iris.Path()** - context.RenderString() returned string,error -> **context.TemplateString() returns only string, which is empty on any parse error** - context.WriteHTML() -> **context.HTML()** - context.HTML() -> **context.RenderWithStatus()** Entirely new - -> **iris.ListenUNIX(addr string, socket os.Mode)** - -> **context.MustRender, same as Render but send response 500 and logs the error on parse error** - -> **context.Log(format string, a...interface{})** - -> **context.PostFormMulti(name string) []string** - -> **iris.Lookups() []Route** - -> **iris.Lookup(routeName string) Route** - -> **iris.Plugins.On(eventName string, ...func())** and fire all by **iris.Plugins.Call(eventName)** - iris.Wildcard() **REMOVED**, subdomains and dynamic(wildcard) subdomains can only be registered with **iris.Party("mysubdomain.") && iris.Party("*.")** Semantic change for static subdomains **1** **BEFORE** : ```go apiSubdomain := iris.Party("api.mydomain.com") { //.... } iris.Listen("mydomain.com:80") ``` **NOW** just subdomain part, no need to duplicate ourselves: ```go apiSubdomain := iris.Party("api.") { //.... } iris.Listen("mydomain.com:80") ``` **2** Before you couldn't set dynamic subdomains and normal subdomains at the same iris station, now you can. **NOW, this is possible** ```go /* admin.mydomain.com, and for other subdomains the Party(*.) */ admin := iris.Party("admin.") { // admin.mydomain.com admin.Get("/", func(c *iris.Context) { c.Write("INDEX FROM admin.mydomain.com") }) // admin.mydomain.com/hey admin.Get("/hey", func(c *iris.Context) { c.Write("HEY FROM admin.mydomain.com/hey") }) // admin.mydomain.com/hey2 admin.Get("/hey2", func(c *iris.Context) { c.Write("HEY SECOND FROM admin.mydomain.com/hey") }) } // other.mydomain.com, otadsadsadsa.mydomain.com and so on.... dynamicSubdomains := iris.Party("*.") { dynamicSubdomains.Get("/", dynamicSubdomainHandler) dynamicSubdomains.Get("/something", dynamicSubdomainHandler) dynamicSubdomains.Get("/something/:param1", dynamicSubdomainHandlerWithParam) } ``` Minor change for listen **BEFORE you could just listen to a port** ```go iris.Listen("8080") ``` **NOW you have set a HOSTNAME:PORT** ```go iris.Listen(":8080") ``` Relative issues/features: https://github.com/kataras/iris/issues/166 , https://github.com/kataras/iris/issues/176, https://github.com/kataras/iris/issues/183, https://github.com/kataras/iris/issues/184 **Plugins** PreHandle and PostHandle are removed, no need to use them anymore you can take routes by **iris.Lookups()**, but add support for custom event listeners by **iris.Plugins.On("event",func(){})** and fire all callbacks by **iris.Plugins.Call("event")** . **FOR TESTERS** **BEFORE** : ```go api := iris.New() //... api.PreListen(config.Server{ListeningAddr: ""}) e := httpexpect.WithConfig(httpexpect.Config{ Reporter: httpexpect.NewAssertReporter(t), Client: fasthttpexpect.NewBinder(api.ServeRequest), }) ``` **NOW**: ```go api := iris.New() //... e := httpexpect.WithConfig(httpexpect.Config{ Reporter: httpexpect.NewAssertReporter(t), Client: fasthttpexpect.NewBinder(api.NoListen().Handler), }) ``` ## 3.0.0-beta.2 -> 3.0.0-beta.3 - Complete the Jade Template Engine support, {{ render }} and {{ url }} done also. - Fix Mail().Send - Iriscontrol plugin: Replace login using session to basic authentication And other not-too-important fixes ## 3.0.0-beta -> 3.0.0-beta.2 - NEW: Wildcard(dynamic) subdomains, read [here](https://kataras.gitbooks.io/iris/content/subdomains.html) - NEW: Implement feature request [#165](https://github.com/kataras/iris/issues/165). Routes can now be selected by `a custom name`, and this allows us to use the {{ url "custom-name" "any" "named" "parameters"}}``: For HTML & Amber engines, example [here](https://github.com/iris-contrib/examples/tree/master/templates_9). For PongoEngine, example [here](https://github.com/iris-contrib/examples/tree/master/templates_10_pongo) - Remove the [x/net/context](https://godoc.org/golang.org/x/net/context), it has been useless after v2. ## 3.0.0-alpha.beta -> 3.0.0-beta - New iris.API for easy API declaration, read more [here](https://kataras.gitbooks.io/iris/content/using-handlerapi.html), example [there](https://github.com/iris-contrib/examples/tree/master/api_handler_2). - Add [example](https://github.com/iris-contrib/examples/tree/master/middleware_basicauth_2) and fix the Basic Authentication middleware ## 3.0.0-alpha.6 -> 3.0.0-alpha.beta - [Implement feature request to add Globals on the pongo2](https://github.com/kataras/iris/issues/145) - [Implement feature request for static Favicon ](https://github.com/kataras/iris/issues/141) - Implement a unique easy only-websocket support: ```go OnConnection(func(c websocket.Connection){}) ``` websocket.Connection ```go // Receive from the client On("anyCustomEvent", func(message string) {}) On("anyCustomEvent", func(message int){}) On("anyCustomEvent", func(message bool){}) On("anyCustomEvent", func(message anyCustomType){}) On("anyCustomEvent", func(){}) // Receive a native websocket message from the client // compatible without need of import the iris-ws.js to the .html OnMessage(func(message []byte){}) // Send to the client Emit("anyCustomEvent", string) Emit("anyCustomEvent", int) Emit("anyCustomEvent", bool) Emit("anyCustomEvent", anyCustomType) // Send via native websocket way, compatible without need of import the iris-ws.js to the .html EmitMessage([]byte("anyMessage")) // Send to specific client(s) To("otherConnectionId").Emit/EmitMessage... To("anyCustomRoom").Emit/EmitMessage... // Send to all opened connections/clients To(websocket.All).Emit/EmitMessage... // Send to all opened connections/clients EXCEPT this client(c) To(websocket.NotMe).Emit/EmitMessage... // Rooms, group of connections/clients Join("anyCustomRoom") Leave("anyCustomRoom") // Fired when the connection is closed OnDisconnect(func(){}) ``` - [Example](https://github.com/iris-contrib/examples/tree/master/websocket) - [E-book section](https://kataras.gitbooks.io/iris/content/package-websocket.html) We have some base-config's changed, these configs which are defaulted to true renamed to 'Disable+$oldName' ```go // DisablePathCorrection corrects and redirects the requested path to the registed path // for example, if /home/ path is requested but no handler for this Route found, // then the Router checks if /home handler exists, if yes, // (permant)redirects the client to the correct path /home // // Default is false DisablePathCorrection bool // DisablePathEscape when is false then its escapes the path, the named parameters (if any). // Change to true it if you want something like this https://github.com/kataras/iris/issues/135 to work // // When do you need to Disable(true) it: // accepts parameters with slash '/' // Request: http://localhost:8080/details/Project%2FDelta // ctx.Param("project") returns the raw named parameter: Project%2FDelta // which you can escape it manually with net/url: // projectName, _ := url.QueryUnescape(c.Param("project"). // Look here: https://github.com/kataras/iris/issues/135 for more // // Default is false DisablePathEscape bool // DisableLog turn it to true if you want to disable logger, // Iris prints/logs ONLY errors, so be careful when you enable it DisableLog bool // DisableBanner outputs the iris banner at startup // // Default is false DisableBanner bool ``` ## 3.0.0-alpha.5 -> 3.0.0-alpha.6 Changes: - config/iris.Config().Render.Template.HTMLTemplate.Funcs typeof `[]template.FuncMap` -> `template.FuncMap` Added: - iris.AmberEngine [Amber](https://github.com/eknkc/amber). [View an example](https://github.com/iris-contrib/examples/tree/master/templates_7_html_amber) - iris.JadeEngine [Jade](https://github.com/Joker/jade). [View an example](https://github.com/iris-contrib/examples/tree/master/templates_6_html_jade) Book section [Render/Templates updated](https://kataras.gitbooks.io/iris/content/render_templates.html) ## 3.0.0-alpha.4 -> 3.0.0-alpha.5 - [NoLayout support for particular templates](https://github.com/kataras/iris/issues/130#issuecomment-219754335) - [Raw Markdown Template Engine](https://kataras.gitbooks.io/iris/content/render_templates.html) - [Markdown to HTML](https://kataras.gitbooks.io/iris/content/render_rest.html) > `context.Markdown(statusCode int, markdown string)` , `context.MarkdownString(markdown string) (htmlReturn string)` - [Simplify the plugin registration](https://github.com/kataras/iris/issues/126#issuecomment-219622481) ## 3.0.0-alpha.3 -> 3.0.0-alpha.4 Community suggestions implemented: - [Request: Rendering html template to string](https://github.com/kataras/iris/issues/130) > New RenderString(name string, binding interface{}, layout ...string) added to the Context & the Iris' station (iris.Templates().RenderString) - [Minify Templates](https://github.com/kataras/iris/issues/129) > New config field for minify, defaulted to true: iris.Config().Render.Template.Minify = true > 3.0.0-alpha5+ this has been removed because the minify package has bugs, one of them is this: https://github.com/tdewolff/minify/issues/35. Bugfixes and enhancements: - [Static not allowing configuration of `IndexNames`](https://github.com/kataras/iris/issues/128) - [Processing access error](https://github.com/kataras/iris/issues/125) - [Invalid header](https://github.com/kataras/iris/issues/123) ## 3.0.0-alpha.2 -> 3.0.0-alpha.3 The only change here is a panic-fix on form bindings. Now **no need to make([]string,0)** before form binding, new example: ```go //./main.go package main import ( "fmt" "github.com/kataras/iris" ) type Visitor struct { Username string Mail string Data []string `form:"mydata"` } func main() { iris.Get("/", func(ctx *iris.Context) { ctx.Render("form.html", nil) }) iris.Post("/form_action", func(ctx *iris.Context) { visitor := Visitor{} err := ctx.ReadForm(&visitor) if err != nil { fmt.Println("Error when reading form: " + err.Error()) } fmt.Printf("\n Visitor: %v", visitor) }) fmt.Println("Server is running at :8080") iris.Listen(":8080") } ``` ```html