From 7f523d52e15270efc2469138ddb7e16176e7fd1b Mon Sep 17 00:00:00 2001 From: "Gerasimos (Makis) Maropoulos" Date: Fri, 6 Nov 2020 14:19:53 +0200 Subject: [PATCH] thank you @dtrifonov for your donation :heart: --- HISTORY.md | 2 +- README.md | 7 +- README_ZH.md | 2 +- _examples/README.md | 1 - .../request-logger/accesslog-simple/main.go | 6 +- _examples/logging/request-logger/main.go | 90 -------------- .../request-logger-file-json/main.go | 110 ------------------ versioning/group.go | 7 +- 8 files changed, 16 insertions(+), 209 deletions(-) delete mode 100644 _examples/logging/request-logger/main.go delete mode 100644 _examples/logging/request-logger/request-logger-file-json/main.go diff --git a/HISTORY.md b/HISTORY.md index fcccde5f..5de66125 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -29,7 +29,7 @@ The codebase for Dependency Injection, Internationalization and localization and ## Fixes and Improvements - A generic User interface, see the `Context.SetUser/User` methods in the New Context Methods section for more. In-short, the basicauth middleware's stored user can now be retrieved through `Context.User()` which provides more information than the native `ctx.Request().BasicAuth()` method one. Third-party authentication middleware creators can benefit of these two methods, plus the Logout below. -- A `Context.Logout` method is added, can be used to invalidate [basicauth](https://github.com/kataras/iris/blob/master/_examples/auth/basicauth/main.go) or [jwt](https://github.com/kataras/iris/blob/master/_examples/auth/jwt/overview/main.go) client credentials. +- A `Context.Logout` method is added, can be used to invalidate [basicauth](https://github.com/kataras/iris/blob/master/_examples/auth/basicauth/main.go) or [jwt](https://github.com/kataras/iris/blob/master/_examples/auth/jwt/blocklist/main.go) client credentials. - Add the ability to [share functions](https://github.com/kataras/iris/tree/master/_examples/routing/writing-a-middleware/share-funcs) between handlers chain and add an [example](https://github.com/kataras/iris/tree/master/_examples/routing/writing-a-middleware/share-services) on sharing Go structures (aka services). - Add the new `Party.UseOnce` method to the `*Route` diff --git a/README.md b/README.md index 0631facc..444e5ea9 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ # Iris Web Framework -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=for-the-badge&logo=travis)](https://travis-ci.org/kataras/iris) [![view examples](https://img.shields.io/badge/examples%20-173-a83adf.svg?style=for-the-badge&logo=go)](https://github.com/kataras/iris/tree/master/_examples) [![chat](https://img.shields.io/gitter/room/iris_go/community.svg?color=cc2b5e&logo=gitter&style=for-the-badge)](https://gitter.im/iris_go/community) [![donate](https://img.shields.io/badge/support-Iris-blue.svg?style=for-the-badge&logo=paypal)](https://iris-go.com/donate) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=for-the-badge&logo=travis)](https://travis-ci.org/kataras/iris) [![view examples](https://img.shields.io/badge/examples%20-253-a83adf.svg?style=for-the-badge&logo=go)](https://github.com/kataras/iris/tree/master/_examples) [![chat](https://img.shields.io/gitter/room/iris_go/community.svg?color=cc2b5e&logo=gitter&style=for-the-badge)](https://gitter.im/iris_go/community) [![donate](https://img.shields.io/badge/support-Iris-blue.svg?style=for-the-badge&logo=paypal)](https://iris-go.com/donate) @@ -31,6 +31,7 @@ With your help, we can improve Open Source web development for everyone! > Donations from **China** are now accepted!

+ Dimitar Trifonov Midhubalan Balasubramanian AANAND NATARAJAN Edsongley Almeida @@ -110,9 +111,11 @@ For a more detailed technical documentation you can head over to our [godocs](ht Book cover +[![follow author on twitter](https://img.shields.io/twitter/follow/makismaropoulos?color=3D8AA3&logoColor=3D8AA3&style=for-the-badge&logo=twitter)](https://twitter.com/intent/follow?screen_name=makismaropoulos) + [![follow Iris web framework on twitter](https://img.shields.io/twitter/follow/iris_framework?color=ee7506&logoColor=ee7506&style=for-the-badge&logo=twitter)](https://twitter.com/intent/follow?screen_name=iris_framework) -[![follow Iris web framework on facebook](https://img.shields.io/badge/Follow%20%40Iris.framework-460-2D88FF.svg?style=for-the-badge&logo=facebook)](https://www.facebook.com/iris.framework) +[![follow Iris web framework on facebook](https://img.shields.io/badge/Follow%20%40Iris.framework-482-2D88FF.svg?style=for-the-badge&logo=facebook)](https://www.facebook.com/iris.framework) You can [request](https://www.iris-go.com/#ebookDonateForm) a PDF and online access of the **Iris E-Book** (New Edition, **future v12.2.0+**) today and be participated in the development of Iris. diff --git a/README_ZH.md b/README_ZH.md index 8a9ba794..5318d0f2 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -10,7 +10,7 @@ # Iris Web Framework -[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=for-the-badge&logo=travis)](https://travis-ci.org/kataras/iris) [![view examples](https://img.shields.io/badge/examples%20-173-a83adf.svg?style=for-the-badge&logo=go)](https://github.com/kataras/iris/tree/master/_examples) [![chat](https://img.shields.io/gitter/room/iris_go/community.svg?color=cc2b5e&logo=gitter&style=for-the-badge)](https://gitter.im/iris_go/community) [![donate](https://img.shields.io/badge/support-Iris-blue.svg?style=for-the-badge&logo=paypal)](https://iris-go.com/donate) +[![build status](https://img.shields.io/travis/kataras/iris/master.svg?style=for-the-badge&logo=travis)](https://travis-ci.org/kataras/iris) [![view examples](https://img.shields.io/badge/examples%20-253-a83adf.svg?style=for-the-badge&logo=go)](https://github.com/kataras/iris/tree/master/_examples) [![chat](https://img.shields.io/gitter/room/iris_go/community.svg?color=cc2b5e&logo=gitter&style=for-the-badge)](https://gitter.im/iris_go/community) [![donate](https://img.shields.io/badge/support-Iris-blue.svg?style=for-the-badge&logo=paypal)](https://iris-go.com/donate) diff --git a/_examples/README.md b/_examples/README.md index f744c8d1..7764b9b1 100644 --- a/_examples/README.md +++ b/_examples/README.md @@ -86,7 +86,6 @@ * [The CSV Formatter](logging/request-logger/accesslog-csv/main.go) * [Create your own Formatter](logging/request-logger/accesslog-formatter/main.go) * [Root and Proxy AccessLog instances](logging/request-logger/accesslog-proxy/main.go) - * API Documentation * [Yaag](apidoc/yaag/main.go) * [Swagger](https://github.com/iris-contrib/swagger/tree/master/example) diff --git a/_examples/logging/request-logger/accesslog-simple/main.go b/_examples/logging/request-logger/accesslog-simple/main.go index 77880c8b..b2d677d3 100644 --- a/_examples/logging/request-logger/accesslog-simple/main.go +++ b/_examples/logging/request-logger/accesslog-simple/main.go @@ -5,9 +5,6 @@ import ( "github.com/kataras/iris/v12/middleware/accesslog" ) -// Default line format: -// Time|Latency|Code|Method|Path|IP|Path Params Query Fields|Bytes Received|Bytes Sent|Request|Response| -// // Read the example and its comments carefully. func makeAccessLog() *accesslog.AccessLog { // Initialize a new access log middleware. @@ -28,6 +25,9 @@ func makeAccessLog() *accesslog.AccessLog { ac.KeepMultiLineError = true ac.PanicLog = accesslog.LogHandler + // Default line format if formatter is missing: + // Time|Latency|Code|Method|Path|IP|Path Params Query Fields|Bytes Received|Bytes Sent|Request|Response| + // // Set Custom Formatter: ac.SetFormatter(&accesslog.JSON{ Indent: " ", diff --git a/_examples/logging/request-logger/main.go b/_examples/logging/request-logger/main.go deleted file mode 100644 index bf66726c..00000000 --- a/_examples/logging/request-logger/main.go +++ /dev/null @@ -1,90 +0,0 @@ -package main - -import ( - "github.com/kataras/iris/v12" - "github.com/kataras/iris/v12/middleware/logger" -) - -func main() { - app := iris.New() - - customLogger := logger.New(logger.Config{ - // Status displays status code - Status: true, - // IP displays request's remote address - IP: true, - // Method displays the http method - Method: true, - // Path displays the request path - Path: true, - // Query appends the url query to the Path. - Query: true, - // Shows information about the executed route. - TraceRoute: true, - - // if !empty then its contents derives from `ctx.Values().Get("logger_message") - // will be added to the logs. - MessageContextKeys: []string{"logger_message"}, - - // if !empty then its contents derives from `ctx.GetHeader("User-Agent") - MessageHeaderKeys: []string{"User-Agent"}, - }) - - // Runs first on every request: parties & subdomains, route match or not and all http errors. - app.UseRouter(customLogger) - - // Runs first on each matched route of this Party and its children on every request. - app.Use(routesMiddleware) - - app.Get("/", indexMiddleware, index) - app.Get("/list", listMiddleware, list) - - app.Get("/1", hello) - app.Get("/2", hello) - - app.OnAnyErrorCode(customLogger, func(ctx iris.Context) { - // this should be added to the logs, at the end because of the `logger.Config#MessageContextKey` - ctx.Values().Set("logger_message", - "a dynamic message passed to the logs") - ctx.Writef("My Custom error page") - }) - - // http://localhost:8080 - // http://localhost:8080/list - // http://localhost:8080/list?stop=true - // http://localhost:8080/1 - // http://localhost:8080/2 - // http://lcoalhost:8080/notfoundhere - // see the output on the console. - app.Listen(":8080") -} - -func routesMiddleware(ctx iris.Context) { - ctx.Writef("Executing Route: %s\n", ctx.GetCurrentRoute().MainHandlerName()) - ctx.Next() -} - -func indexMiddleware(ctx iris.Context) { - ctx.WriteString("Index Middleware\n") - ctx.Next() -} - -func index(ctx iris.Context) { - ctx.WriteString("Index Handler") -} - -func listMiddleware(ctx iris.Context) { - ctx.WriteString("List Middleware\n") - - if simulateStop, _ := ctx.URLParamBool("stop"); !simulateStop { - ctx.Next() - } -} - -func list(ctx iris.Context) { - ctx.WriteString("List Handler") -} - -func hello(ctx iris.Context) { - ctx.Writef("Hello from %s", ctx.Path()) -} diff --git a/_examples/logging/request-logger/request-logger-file-json/main.go b/_examples/logging/request-logger/request-logger-file-json/main.go deleted file mode 100644 index 67480502..00000000 --- a/_examples/logging/request-logger/request-logger-file-json/main.go +++ /dev/null @@ -1,110 +0,0 @@ -package main - -import ( - "fmt" - "io" - "os" - "strings" - "time" - - "github.com/kataras/iris/v12" - "github.com/kataras/iris/v12/middleware/logger" -) - -const deleteFileOnExit = false - -func newRequestLogger(newWriter io.Writer) iris.Handler { - c := logger.Config{} - c.AddSkipper(func(ctx iris.Context) bool { - path := ctx.Path() - for _, ext := range excludeExtensions { - if strings.HasSuffix(path, ext) { - return true - } - } - return false - }) - - c.LogFuncCtx = func(ctx iris.Context, latency time.Duration) { - datetime := time.Now().Format(ctx.Application().ConfigurationReadOnly().GetTimeFormat()) - customHandlerMessage := ctx.Values().GetString("log_message") - - file, line := ctx.HandlerFileLine() - source := fmt.Sprintf("%s:%d", file, line) - - // this will just append a line without an array of javascript objects, readers of this file should read one line per log javascript object, - // however, you can improve it even more, this is just a simple example on how to use the `LogFuncCtx`. - jsonStr := fmt.Sprintf(`{"datetime":"%s","level":"%s","source":"%s","latency": "%s","status": %d,"method":"%s","path":"%s","message":"%s"}`, - datetime, "INFO", source, latency.String(), ctx.GetStatusCode(), ctx.Method(), ctx.Path(), customHandlerMessage) - - fmt.Fprintln(newWriter, jsonStr) - } - - return logger.New(c) -} - -func h(ctx iris.Context) { - ctx.Values().Set("log_message", "something to give more info to the request logger") - - ctx.Writef("Hello from %s", ctx.Path()) -} - -func main() { - app := iris.New() - - logFile := newLogFile() - defer func() { - logFile.Close() - if deleteFileOnExit { - os.Remove(logFile.Name()) - } - }() - - r := newRequestLogger(logFile) - app.Use(r) - - app.OnAnyErrorCode(r, func(ctx iris.Context) { - ctx.HTML("

Error: Please try this instead.

") - }) - - app.Get("/", h) - - app.Get("/1", h) - - app.Get("/2", h) - - app.Get("/", h) - - // http://localhost:8080 - // http://localhost:8080/1 - // http://localhost:8080/2 - // http://lcoalhost:8080/notfoundhere - app.Listen(":8080") -} - -var excludeExtensions = [...]string{ - ".js", - ".css", - ".jpg", - ".png", - ".ico", - ".svg", -} - -// get a filename based on the date, file logs works that way the most times -// but these are just a sugar. -func todayFilename() string { - today := time.Now().Format("Jan 02 2006") - return today + ".json" -} - -func newLogFile() *os.File { - filename := todayFilename() - // open an output file, this will append to the today's file if server restarted. - f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - if err != nil { - panic(err) - } - - return f -} diff --git a/versioning/group.go b/versioning/group.go index 171d2af9..9e7f0e06 100644 --- a/versioning/group.go +++ b/versioning/group.go @@ -18,7 +18,12 @@ type Group struct { // NewGroup returns a ptr to Group based on the given "version". // It sets the API Version for the "r" Party. // -// See `Handle` and `RegisterGroups` for more. +// See `Handle` for more. +// +// Example: _examples/routing/versioning +// Usage: +// api := versioning.NewGroup(Parent_Party, ">= 1, < 2") +// api.Get/Post/Put/Delete... func NewGroup(r router.Party, version string) *Group { // Note that this feature alters the RouteRegisterRule to RouteOverlap // the RouteOverlap rule does not contain any performance downside