- New Feature: 新增stringx.CompletionRight\CompletionLeft,用于指定长度两侧补齐字符串
- Update: 完善dotweb/routers系统页,输出method+router格式,类似:"GET /dotweb/routers"
- 2019-07-27 08:00 at ShangHai
- New Feature: 新增NotifyPlugin插件,默认集成监控配置文件变化热重启
- New Feature: 新增DotWeb.ReSetConfig用于运行时重载配置
- About NotifyPlugin:
- 通过NewDefaultNotifyPlugin创建默认集成的NotifyPlugin
- 仅当Dotweb通过配置文件启动方式下有效,监测默认的配置文件
- 当热重启配置文件时,Dotweb本身监听端口以及pprod设置不会重载
- 感谢@地蛋对该插件的支持
- 2019-07-22 14:00 at ShangHai
- New Feature: 增加插件机制-Plugin,随App启动一起执行,不会阻塞App启动过程,如需持续运行,在Plugin的Run中自行处理即可。
- Architecture: 修正BaseMiddlware命名错误,增加BaseMiddleware,保留BaseMiddlware至2.0版本前
- About Plugin:
- 通过dotweb.UsePlugin注册插件
- 自定义插件需事先Plugin接口
- 即将发布集成插件 - 监控配置文件变化热重启插件
- 2019-07-12 12:00 at ShangHai
- Architecture: Remove OfflineServer
- Example: Remove render\developmode\start examples
- Bug fix: update latest tag to v1.6.8 for go modules
- About examples:
- You can visit https://github.com/devfeel/dotweb-example to know more examples for dotweb.
- 2019-06-29 21:00 at ShangHai.Home
- New Feature: Add Go Module Support
- Architecture: Remove vendor
- 2019-06-29 15:00 at ShangHai.Home
- New Feature: Add AccessLog middleware for logging HTTP requests in the Apache Common Log Format.
- New Feature: Add Raw() in dotweb.Logger
- About AccessLog:
- implement the Apache Common Log Format
- log file name like "dotweb_accesslog_2017_06_09.log"
- log-example: 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
- How to use AccessLog middleware:
app.Use(accesslog.Middleware())
server.GET("/", Index).Use(accesslog.Middleware())
- 2019-06-27 23:00 at 深圳华安大酒店
- Architecture: move core.GlobalState to dotweb.StateInfo()
- Architecture: add HttpServer.StateInfo() who is a shortcut for DotWeb.StateInfo()
- Remove: remove unused property valueNodePool in router
- About dotweb.StateInfo:
- you can use ctx.HttpServer().StateInfo() to get this object
- you can visit /virtualPath/dotweb/state to list all state info
- 2019-06-26 08:00
- Architecture: add dotweb_sysgroup.go to implement IncludeDotwebGroup
- New Feature: add /virtualPath/dotweb/routers to list all router express
- New Feature: add Router.GetAllRouterExpress to return router.allRouterExpress
- Bug Fixed: update example on dotweb version 1.6.4
- About dotweb.IncludeDotwebGroup:
- if use dotweb.New(), in default it will not call IncludeDotwebGroup
- if use dotweb.Classic(), in default it will call IncludeDotwebGroup
- 2019-06-22 16:00
- Architecture: move logger.Logger() to DotWeb.Logger()
- Architecture: add HttpServer.Logger who is a shortcut for DotWeb.Logger()
- Architecture: remove logger.Logger()
- How to use dotweb.Logger in your app:
func TestLog(ctx dotweb.Context) error { ctx.HttpServer().Logger().Info(dotweb.LogTarget_Default, "test log") return ctx.WriteString("log page") }
- 2019-06-13 12:00
- Bug fixed: cryptos.GetRandString used to returns randominzed string with given length
- Detail:
- default character set is "0123456789abcdefghijklmnopqrstuvwxyz"
- Demo:
func main() { fmt.Println(cryptos.GetRandString(10)) }
- 2019-02-20 14:00
- New Feature: RouterNode add RouterNode.Path() to get routing path for the request
- Detail:
- you can use ctx.RouterNode().Path() to get routing path for the request
- you can use ctx.HttpServer().Router().MatchPath to match request and routing path
- Demo:
func main() { app := dotweb.Classic("/home/logs/wwwroot/") // if use this, all router will auto add "HEAD" method support // default is false app.HttpServer.SetEnabledAutoHEAD(true) app.HttpServer.GET("/index", func(ctx dotweb.Context) error{ flag := ctx.HttpServer().Router().MatchPath(ctx, "/index") return ctx.WriteString("welcome to my first web!" + ctx.RouterNode().Path() + " - " + fmt.Sprint(flag)) }) err := app.StartServer(80) fmt.Println("dotweb.StartServer error => ", err) }
- 2019-02-12 16:00
- Remove: remove all features in dotweb!
- Remove: remove ServerConfig().EnabledAutoCORS.
- Add: add example/README.md
- Demo for how to use ConfigSet tools?
- first define config file named 'user-conf.xml'
<?xml version="1.0" encoding="UTF-8"?> <config> <set key="set1" value="1" /> <set key="set2" value="2" /> <set key="set3" value="3" /> <set key="set4" value="4" /> </config>
- include config file
err := app.Config.IncludeConfigSet("/home/your/user-conf.xml", config.ConfigType_XML)
- use it in your HttpContext
value := ctx.ConfigSet().GetString("set1")
- 2019-02-02 12:00
- New Feature: HttpServer add SetIndexPage used to config default index-page name, default is "index.html"
- Remove: remove example/basemiddleware demo, more examples you can see "https://github.com/devfeel/dotweb-example"
- About: if you set IgnoreFavicon Enabled, app will auto register IgnoreFaviconModule, more info you can see "module.go"
- Update: update README.md
- Important: We will remove feature.go in dotweb, so will remove ServerConfig().EnabledAutoCORS on version 1.6.
- 2019-01-31 12:00
- Fix Bug for HttpServer.EnabledAutoOPTIONS, use DefaultAutoOPTIONSHandler replace user-handler to bind auto-options router
- Enabled AutoOPTIONS\AutoHEAD flag when app is on RunMode_Development mode
- Important: We will remove feature.go in dotweb, so will remove ServerConfig().EnabledAutoCORS on version 1.6.
- 2019-01-30 12:00
- Fix Bug for #184 ServerFile不能正确获取SessionID()
- Remove Init Session & Gzip in feature.go
- Important: We will remove feature.go in dotweb, so will remove ServerConfig().EnabledAutoCORS on version 1.6.
- 2019-01-28 12:00
- New Feature: Fix UT and add scripts for UT
- Detail:
- Put config files under testdata. Removed test for ConfigSet because it does not exist in config files
- The MD5Encoding changes the length of the original string so this test has no meaning
- Fix UT for core and framework etc.
- Add script for UT, This script also generates coverage.out in scripts folder which can be used for coverage analysis
- Fix UT for framework/file
- Use WG for syncing in testing
- Disable test cases related to redis
- 2019-01-22 12:00
- New Feature: Add IDGenerate define the handler for create Unique Id
- New Feature: Add dotweb.DefaultUniqueIDGenerater which is default generater used to create Unique Id
- Update: Add "GlobalUniqueID : XXXXXXXXXXXXXXXXXXX" on state page, you can view "host/dotweb/state"
- Detail:
- default requestId & app.GlobalUniqueID use uuid.V1
- if you enabled HttpServer.SetEnabledRequestID, you can read requestId in Response-Header "d_request_id"
- 2019-01-18 18:00
- New Feature: HttpServer & Router add RegisterServerFile use to register ServerFile router with routeMethod method on http.FileServer
- Update: ServerFile add support for EnabledAutoHEAD\EnabledAutoOPTIONS
- Detail:
- when use ServerFile, default routeMethod is GET
- you can use RegisterServerFile specify other HttpMethod, like "POST"
- Example:
server.RegisterServerFile(dotweb.RouteMethod_POST, "/dst/*", "/home/www/")
- How To:
- how to add support "HEAD" method for all requests in your httpserver?
func main() { app := dotweb.Classic("/home/logs/wwwroot/") // if use this, all router will auto add "HEAD" method support // default is false app.HttpServer.SetEnabledAutoHEAD(true) app.HttpServer.GET("/index", func(ctx dotweb.Context) error{ return ctx.WriteString("welcome to my first web!") }) err := app.StartServer(80) fmt.Println("dotweb.StartServer error => ", err) }
- 2019-01-03 10:00
- Fixed Bug: Request.IsAJAX check X-Requested-With Contains XMLHttpRequest
- New Feature: Response support http2 Push
- How To:
- how to query slow response in your app?
func main() { app := dotweb.Classic("/home/logs/wwwroot/") // deal slow response, use default handler // default Handler will write timeout-response in dotweb's log file // also you can implement your own handlers, like write logs with http api app.UseTimeoutHook(dotweb.DefaultTimeoutHookHandler, time.Second * 10) app.HttpServer.GET("/index", func(ctx dotweb.Context) error{ return ctx.WriteString("welcome to my first web!") }) //begin server err := app.StartServer(80) fmt.Println("dotweb.StartServer error => ", err) }
- 2019-01-02 18:00
- Fix UT in cache/runtime
- Remove invalid lock in cache/runtime
- 2018-12-29 12:00
- Translate Chinse to English
- Update by @yangbor
- 2018-12-28 10:00
- Fix typo and translate Chinse to English
- Reformat code
- Update by @yangbor
- 2018-12-19 18:00
- New Feature: Add Request.RealIP used to returns the first ip from 'X-Forwarded-For' or 'X-Real-IP' header key, fixed for #164
- New Feature: route.ServerFile support 'filepath' or '/', to simplify register static file router, fixed for #125
- Example:
app.HttpServer.ServerFile("/*", "D:/gotmp")
- update example/main
- 2018-12-03 15:00
- New Feature: Add HttpServer.SetEnabledStaticFileMiddleware, used to set flag which enabled or disabled middleware for static-file route
- Detail:
- if enabled, when visit static file route, will use middlewares like other router
- the execute order: App -> Group -> Router
- default is not enabled
- Example:
app.HttpServer.SetEnabledStaticFileMiddleware(true)
- New Feature: Add Group.ServerFile used to registe static file router in group
- New Feature: Add ping check when init redis session, if can not ping successful, it will panic error info, like "panic: redis session [redis] ping error"
- update dotweb-example/static
- 2018-10-30 15:00
- New Feature: Add HttpServer.SetBinder, used to set custom Binder on HttpServer
- Detail:
- Custom binder must implement dotweb.Binder interface
- Example:
app.HttpServer.SetBinder(newUserBinder())
- update example/bind
- 2018-10-24 21:00
- Improve Comments about session Maxlifetime
- Session.StoreConfig.Maxlifetime: session life time, with second
- 2018-09-20 15:00
- New Feature: Add HttpServer.SetEnabledAutoOPTIONS, used to set route use auto options
- Detail:
- ignore auto set if register router is options method
- you can view example on example/router
- Example:
app.HttpServer.SetEnabledAutoOPTIONS(true)
- Fixed Bug: When use HttpServer.SetEnabledAutoHead, ignore auto set if register router is head method
- Log output: Add debug log when AutoOPTIONS and AutoHead doing
- Like:
2018-09-19 15:44:42.8189 [DEBUG] [router.go:437] DotWeb:Router:RegisterRoute success [GET] [/] [main.Index] 2018-09-19 15:44:42.8199 [DEBUG] [router.go:462] DotWeb:Router:RegisterRoute AutoHead success [HEAD] [/] [main.Index] 2018-09-19 15:44:42.8199 [DEBUG] [router.go:474] DotWeb:Router:RegisterRoute AutoOPTIONS success [OPTIONS] [/] [main.Index]
- 2018-09-19 18:00
- New Feature: Add Renderer.RegisterTemplateFunc, used to register template func in renderer
- Detail:
- now inner support inner func like unescaped
- you can view example on example/render
- Example:
app.HttpServer.Renderer().RegisterTemplateFunc("echo", func(x string) interface{}{ return "echo:" + x })
- 2018-09-07
- Fixed Bug: return err from Next() in RequestLogMiddleware & TimeoutHookMiddleware
- 2018-08-30 10:00
- Fixed Bug: Remove auto set NotFound http status when happened 404, if auto set, it will ignore any ContentType set
- For issue #149 router middleware handle http 404,405. cann`t response content-type:application/json, Thanks for @lyw1995
- Update: Add HostName in State page
- 2018-08-28 13:00
- New Feature: Add HttpServer.VirtualPath, used to set virtual path when deploy on no root path
- Detail:
- when set virtual path "/vpath", if set route "/index", it will auto register "vpath/index"
- in effect on group & route
- 2018-08-24 19:00
- Fixed Bug: App.RunMode always is RunMode_Development
- Update: Add RunMode log output
- 2018-08-24 10:00
- Add DotWeb Mock log
- Mock support Register\RegisterString\RegisterJson
- Update README
- 2018-08-22 10:00
- New Feature: Add integration Timeout Middleware, support DotWeb.UseTimeoutHook to use it
- Detail:
- Provide DefaultTimeoutHookHandler to simplify use, it will auto write log the req info which time out
- Example:
app.UseTimeoutHook(dotweb.DefaultTimeoutHookHandler, time.Second * 2)
- New Feature: Add Mock module, support DotWeb.SetMock to use it
- Detail:
- Provide StandardMock to simplify use, it implement Mock interface
- also you can create custom implement
- you can register MockHandle or register return string
- register key only support route
- special: mock mode only effective in DevelopMode
- Example:
func AppMock() dotweb.Mock{ m := dotweb.NewStandardMock() m.RegisterString("/", "mock data") return m } app.SetMock(AppMock())
- 2018-08-22 10:00
- BugFixed: hystrix add doCleanHistoryCounter, used to clean history counter
- 2018-08-18 10:00
- New feature: add hystrix module, now is used to auto switch to backup redis session store
- New feature: Session.StoreConfig support BackupServerUrl, used to store session when default ServerIP redis is not available
- Detail:
- hystrix default MaxFailedNumber is 20 per 2 minutes
- Example:
sessionConf := session.NewDefaultRedisConfig("redis://10.10.0.1:6322/1") sessionConf.BackupServerUrl = "redis://10.10.0.1:6379/1"
- 2018-08-17 15:00
- New feature: /dotweb/state add CurrentRequestCount data
- Update: improve 30% performance on app's metric
- 2018-08-09 15:00
- New feature: Session.StoreConfig support CookieName, used to set custom cookie name which sessionid store, default is dotweb_sessionId
- Update: Config.SessionNode add CookieName, used to set custom cookie name which sessionid store
- Update: default log format update to "Time [LogLevel] [FileName:Line] Content"
- BugFixed: remove init session which exec on dotweb.initAppConfig
- 2018-08-02 15:00
- New feature: HttpServer add Validator which be called by Context.Validate()
- New feature: Context add Validate(interface{}) used to validate data with HttpServer::Validator
- Update: use routerExpressSplit replace "_" when padding data to Router::RouterExpress
- 2018-07-12 12:00
- New feature: dotweb.innerRenderer add cache mode, default is enabled
- New feature: dotweb.innerRenderer add NewInnerRendererNoCache() used to disabled cache
- Update for app run_mode: if it's develop run mode, the default renderer will use no cache mode
- 2018-06-22 14:00
- Fixed Bug: double sprintf on logger.xlog
- 2018-06-15 14:00
- New feature:UploadFile.RandomFileName used to get random file name from uuid
- New feature: encodes.base64x used to quickly use base64 EncodeString and DecodeString
- New feature: session.NewRedisConfig use to create redis session config include serverUrl and storeKeyPre
- if you set custom storeKeyPre, it will be store key start with custom set, default is "dotweb:session:"
- 2018-06-08 17:00
- fixed bug for #114 dotweb: fix error found by vet
- 2018-06-04 09:00
- 调整DevelopmentMode设置:默认开启Log,默认启用RequestLogMiddleware,默认Console Print日志内容
- fixed for #122 - dotweb没有打出 access log
- 合并const目录内容至consts文件,统一const定义文件
- 移除example/static
- 新增example/developmode,便于对developmode的理解
- 2018-06-04 09:00
- framewrok.RedisClient增加Ping接口,用于检查服务是否可用
- GetSessionStore增加Redis ServerUrl的ping检查,若不可用直接panic异常信息
- 2018-05-23 13:30
- 调整: dotweb.Classic移除自动UseRequestLog逻辑
- 调整:Session Redis模式时,新增sessionReExpire用于重置有效期,避免调用SessionUpdate导致不必要的redis数据交换
- 调整:Cache.Runtime调整map为sync.Map
- 调整:Session Redis模式时,gob.EncodeMap逻辑调整,移除自动注册interface{}
- 状态页:访问/dotweb/state时增加CurrentTime字段输出
- BUG: 修正Reponse自动释放时未重置body字段,导致内存溢出BUG
- 2018-05-10 13:30
- 重要:go版本适配升级为1.9+
- 调整UploadFile.Size实现方法,直接返回Header.Size数据
- 调整dotweb.Classic签名为Classic(logPath string),若传入logPath为空,则默认以"bin-root/logs"为日志目录
- 新增dotweb.ClassicWithConf(config *config.Config),支持初始化传入config设置
- 调整默认Log目录由"bin-root"为"bin-root/logs"
- 2018-04-24 08:30
- 修复BUG for #112
- 调整CharsetUTF8值为"charset=utf-8"
- 2018-03-28 09:00
- 内置Vendor目录仅保留 golang.org/x/net包,移除redis与yaml包
- 完善RedisClient接口能力
- 2018-03-13 12:00
- 新增: ConcurrenceMap增加GetTimeDuration接口,用于直接返回time.Duration类型数据
- 新增: ReadonlyMap增加GetTimeDuration接口,用于直接返回time.Duration类型数据
- 新增: dotweb增加UseTimeoutHook接口,用于设置请求处理超过设置时间钩子函数
- 调整:dotweb内建集成三类中间件,无需单独引用Middleware库
- RequestLogMiddleware
- TimeoutHookMiddleware
- dotweb.SetExceptionHandle
- 新增 example/basemiddleware
- 集成vendor: gopkg.in/yaml.v2
- 2018-02-12 12:00
- 调整:ItemContext更名为ItemMap,新增ConcurrenceMap、ReadonlyMap接口
- 调整:Dotweb.AppContext变更为Dotweb.Items
- 调整:HttpContext.AppContext变更为HttpContext.AppItems
- 调整:HttpContext.AppSetConfig变更为HttpContext.ConfigSet
- 调整:config.AppSet变更为config.ConfigSet
- 新增: config.ParseConfigSetXML\ParseConfigSetJSON\ParseConfigSetYaml,用于解析常规Key\Value格式的配置文件
- 新增:config.Config.IncludeConfigSet,用于向config.ConfigSet中导入Key\Value格式的配置文件,通过HttpContext.ConfigSet获取相关设置信息
- ParseConfigSetXML:支持xml格式文件解析,返回core.ConcurrenceMap
- ParseConfigSetJSON:支持json格式文件解析,返回core.ConcurrenceMap
- ParseConfigSetYaml:支持yaml格式文件解析,返回core.ConcurrenceMap
- 具体配置文件格式可参考example/configset
- 新增示例代码 example/configset
- 2018-01-24 22:00
- BUG Fixed: 修复Middleware特定场景下无效问题
- 新增dotweb.IncludeDotwebGroup,用于自动集成dotweb相关路由
- /dotweb/state 增加 ServerVersion输出
- 2018-01-22 22:00
- BUG Fixed: UploadFile废弃Bytes接口,新增ReadBytes接口,用于返回上传文件本身
- 需要特别注意,由于io.read具有一次性特性,UploadFile.SaveFile与UploadFile.ReadBytes只能使用其中一个,另外一个将无法正常获取数据
- 增加dotweb.Version,用于输出框架版本号
- 2018-01-21 09:00
- 新增yaml格式配置文件支持,具体参考 example/config/dotweb.yaml
- config新增UnmarshalYaml\MarshalYaml\MarshalYamlString,提供针对Yaml的常规处理
- config新增UnmarshalXML\MarshalXML\MarshalXMLString,提供针对Xml的常规处理
- config新增UnmarshalJSON\MarshalJSON\MarshalJSONString,提供针对Json的常规处理
- UploadFile新增Bytes接口,用于返回上传文件本身
- 完善 example/config
- 移除 example/session,查看更多示例,请移步https://github.com/devfeel/dotweb-example
- 2018-01-20 23:40
- 调整Bind模块内部获取req.Body为HttpContext.PostBody,避免因为Bind后无法再次获取Post内容
- 完善debug log 输出
- 更新example/static, 该示例目前为实现一个纯静态文件服务器功能
-
- 2018-01-08 12:00
- 调整dotweb内部路由注册逻辑,New模式默认不开启,Classic模式默认开启,可通过app.UseDotwebRouter手动开启
- 修复 issue #100, 解决特定场景下Exclude不生效问题
- Use filepath.Ext to replace file.GetFileExt, update for issue #99
- 移除 framework/file.GetFileExt 函数
- 同步更新example代码
- 2018-01-07 22:00
- Context新增QueryInt\QueryInt64接口,用于简化获取Int类型的Get参数,如果参数未传入或不是合法整形,返回0
- Context接口调整:除Write外,其他WriteXXX接口,返回值从(int, error)调整为error
- 带来的变化:
app.HttpServer.GET("/index", func(ctx dotweb.Context) error{
_, err := ctx.WriteString("welcome to my first web!")
return err
})
简化为
app.HttpServer.GET("/index", func(ctx dotweb.Context) error{
return ctx.WriteString("welcome to my first web!")
})
- 同步更新example代码
- 2018-01-03 22:00
- dotweb新增ExcludeUse接口,用于设置指定排除路由的中间件,fixed for #94 建议增加exuse方法用来实现exclude uri功能
- 调整dotweb部分内部函数名称
- 重构Middleware实现,优化代码结构,使流程更清晰
- Node新增AppMiddlewares与GroupMiddlewares,用于存储App级、Group级的中间件实例
- Middleware新增Exclude相关接口
- Exclude(routers ...string)函数,用于指定不生效的路由
- HasExclude() bool函数,用于判定当前中间件实例是否存在排除路由
- ExistsExcludeRouter(router string) bool函数,用于判定当前中间件实例的排除路由中是否存在指定路由
- middleware执行优先级:
- 优先级1:app级别middleware
- 优先级2:group级别middleware
- 优先级:router级别middleware
- 更新example/middleware
- 2018-01-01 23:00:00
- 强化Bind能力,添加BindJsonBody接口,不对Content-Type进行判定,直接获取req.Body进行json序列化
- 基础Bind机制: 1)如果识别到Content-Type = application/json 会尝试使用json序列化到struct 2)如果识别到Content-Type = application/xml 会尝试使用xml序列化到struct 3)非以上类型,会默认识别form的key/value模式匹配
- Context.Request()新增PostValues接口,包含 POST, PATCH, or PUT请求集合,以map[string][]string返回
- 更正Readme部分文字描述
- 完善example/bind
- 2017-12-29 16:00:00
- Request新增FormFiles接口,用于支持多文件上传
- fixed #92 支持多文件同时上传
- Server支持SetEnabledBindUseJsonTag接口,用于设置bind是否启用json标签,默认为false
- fixed #91 GET方式请求,根据传参执行bind方法,字段tag目前只支持form,可以考虑兼容json标签
- 感谢 @githubityu
- 完善 example/bind
- 2017-11-30 17:00:00
- 完善redisutil,增加对hset、set的操作支持
- 感谢 @chacha923 的pr
- 2017-11-23 00:00
- 新增Classic初始化App方式,调整New初始化内容
- 调整日志启用开关默认为false,可以通过SetEnabledLog(true)或者SetDevelopmentMode()启用
- dotweb.New()仅初始化必要的组件,移除打印Logo,移除启动日志
- dotweb.Classic()方式下,默认启用日志,默认启用RequestLog中间件,默认打印logo以及启动日志
- dotweb.SetDevelopmentMode()在原有启用屏幕打印的基础上,增加默认开启日志开关
- 新增 example/start
- 2017-11-10 21:30
- 升级Redis库,当前版本为redigo V1.2.0
- 修改Redis工具类中,pool的创建方法由Dial调整为DialUrl
- 废弃:Redis连接字符串形式10.0.1.11:6379 不可再使用
- 变更:Redis连接字符串形式变更为:redis://:password@10.0.1.11:6379/0
- 更新 example/session
- 2017-11-08 09:00
- 提升UUID性能,调整UUID算法,新增UUID包
- HttpServer新增设置是否启用唯一请求ID,默认不开启,开启后使用32位UUID,通过ctx.RequestID获取
- 提供HttpServer.SetEnabledRequestID()函数
- 提供uuid.V1\V2\V3\V4四类算法
- move example/exception to devfeel/dotweb-example
- move example/uploadfile to devfeel/dotweb-example
- add cookbook link
- 2017-11-02 16:00
- 增强Render实现,新增多模板支持
- Context新增AddView接口,用于传入多模板
- 模板统一基于Renderer().SetTemplatePath设置的相对文件名
- 特别的:布局模板需放在第一个被解析,比如:
- ctx.AddView("_layout/layout.html") err := ctx.View("dashbord/index.html")
- 2017-10-31 10:00
- 增强Render实现,新增多模板支持
- Context新增AddView接口,用于传入多模板
- 模板统一基于Renderer().SetTemplatePath设置的相对文件名
- 特别的:布局模板需放在第一个被解析,比如:
- ctx.AddView("_layout/layout.html") err := ctx.View("dashbord/index.html")
- 2017-10-31 10:00
- fixed for #70 UPDATE default http port 80 to 8080
- 增加StandardHandle,统一自定义Handle场景
- 2017-10-14 20:00
- 主要新增设置启用详细请求数据控制,新增MethodNotAllowedHandler自定义能力,完善数据统计逻辑
- 新增设置启用详细请求数据控制:
-
- ServerStateInfo增加EnabledDetailRequestData,用于控制是否启用详细请求数据统计
-
- config.ServerConfig增加EnabledDetailRequestData设置,支持配置文件控制
-
- HttpServer增加SetEnabledDetailRequestData函数,用于代码设置是否启用详细请求数据统计
-
- fixed #63 状态数据,当url较多时,导致内存占用过大
- 新增MethodNotAllowedHandler自定义能力
-
- dotweb增加DefaultMethodNotAllowedHandler、SetMethodNotAllowedHandle函数
-
- fixed #64 增加MethodNotAllowed自定义处理
- 完善数据统计逻辑
-
- 404请求不计入详细请求数据统计
- 2017-10-13 12:00
- 增加HttpServer.ServerFile,以支持server快捷设置静态文件目录
- 2017-10-11 22:00
- 国庆迭代第三波
- 增加TLS支持
- 1)ServerConfig增加EnabledTLS\TLSCertFile\TLSKeyFile三个配置项
- 2)HttpServer增加SetEnabledTLS方法
- 3)增加example/tls目录
- 移除:移除DotWeb.StartWithConfig方法,使用配置方式时需显式调用dotweb.SetConfig方法
- 进一步完善默认日志输出
- 2017-10-07 22:00
- 启动日志增加dotweb ASCII art logo
- 调整默认日志的时间毫秒段为4位
- 2017-10-05 22:00
- 国庆特别版 - 2017年的国庆,恰逢中秋双节,祝愿国家繁荣昌盛,祝愿代码艺术家们双节快乐!
- 主要新增HttpModule模块、新增ServerConfig:EnabledIgnoreFavicon、完善HttpContext、完善debug日志输出
- 【新增】HttpModule模块,提供路由之前全局级别的自定义代码能力
- 1、新增module文件,将原dotweb文件中HttpMoule定义转移至module文件,新增Name属性
- 2、新增getIgnoreFaviconModule函数用于创建基础Module用于EnabledIgnoreFavicon特性
- 3、HttpServer新增RegisterModule函数,用于注册自定义HttpModule
- 4、增加代码示例-根据参数动态变更访问路由 - package: example/httpmodule
- 【新增】忽视favicon文件请求能力
- 1、通过ServerConfig:EnabledIgnoreFavicon设置,默认不启用
- 2、当启用该选项时,请求/facicon.ico文件时,将默认反馈空
- 3、配置文件server节点增加enabledignorefavicon设置项
- 【完善】HttpContext,使相关接口更清晰
- 1、新增WriteHtml、WriteHtmlC函数,默认设置Context-Type:text/html; charset=utf-8
- 3、注意,若在同一个请求期间,多次调用WriteHtml与WriteString,以最后一次调用的Context-Type为准
- 【完善】debug日志输出,使dotweb启动过程更清晰
- 1、新增Group创建日志
- 2、新增ServerConfig设置日志
- 3、新增设置Session参数日志
- 4、新增Session初始化日志
- 5、新增RegisterModule日志
- 2017-10-03 14:00
- 主要新增集成基础统计数据
- 【新增】dotweb/state接口,提供基础统计数据,主要数据说明:
- 1、ServerStartTime 服务启动时间
- 2、TotalRequestCount 服务启动以来累计请求数(排除了"/dotweb/"下系统自有页面的访问数)
- 3、TotalErrorCount 服务启动以来累计错误数
- 4、IntervalRequestData 按1分钟为间隔,默认保存最近60分钟,每分钟的请求数(排除了"/dotweb/"下系统自有页面的访问数)
- 5、DetailRequestPageData 服务启动以来,每个页面的累计请求数(排除了"/dotweb/"下系统自有页面的访问数)
- 6、IntervalErrorData 按1分钟为间隔,默认保存最近60分钟,每分钟的错误数
- 7、DetailErrorPageData 服务启动以来,每个页面的累计错误数
- 8、DetailErrorData 服务启动以来,每个异常的累计数
- 9、DetailHttpCodeData 服务启动以来,每个Http状态码的累计数
- 10、可通过 {host}/dotweb/state 获取数据
- 【新增】dotweb/state/interval接口,提供按分钟级的基础数据查询
- 主要数据说明:
- 1、Time 表示查询时间的字符串,最小单位为分钟,例如:201709251200
- 2、RequestCount 单位时间内累计请求数(排除了"/dotweb/"下系统自有页面的访问数)
- 3、ErrorCount 单位时间内累计错误数
- 2017-09-25 13:00
- 新增logger.SetEnabledConsole,当设置SetDevelopmentMode时自动开启
- SetEnabledConsole:自动向console输出dotweb基础日志,便于开发人员调试阶段实时查看
- 完善日志、注释
- 2017-08-31 08:30
- dotweb正式进入1.0时代,感谢大家!
- HttpServer新增IndexPage(),返回当前Server默认首页名称,支持配置文件配置,如果未配置,自动读取默认值:DefaultIndexPage = "index.html"
- Context增加File、Attachment、Inline接口 感谢@esap issue #39
- Context.File(file string),将指定文件响应到客户端,如果指定为目录,则根据HttpServer.IndexPage,默认寻找该目录下同名文件,不存在则返回404
- Context.Attachment(file, name string),将指定文件响应到客户端下载,具体参考MIME协议扩展"Content-disposition"说明
- Context.Inline(file, name string),将指定文件响应到客户端输出,具体参考MIME协议扩展"Content-disposition"说明
- 新增example\file目录,提供对Context.File、Attachment、Inline三个接口的demo
- 2017-07-29 17:00
- 新增DotWeb & HttpServer.ListenAndServer(addr string) 支持原生host监听
- 新增DotWeb Close() & Shutdown() 支持优雅关闭服务
- Context增加Context() & SetTimeoutContext() & WithContext()
- Request增加自动生成unique RequestID,通过RequestID()获取,默认置入dotweb.Context.context中,以RequestID为key
- 新增test目录,提供test公共方法,完善bind_test,感谢@zouyx
- 2017-06-14 23:10
- 新增Gzip中间件,参考https://github.com/devfeel/middleware/tree/master/gzip
- 统一:所有中间件的New方式统一为package.Middleware()
- 2017-06-11 17:00
- 新增AccessLog中间件,参考https://github.com/devfeel/middleware/tree/master/accesslog
- use dotweb.logger
- use debug level
- logtarget is "dotweb_accesslog", like "dotweb_accesslog_debug_2017_06_09.log"
- logformat: method userip proto status reqbytelen resbytelen timetaken
- log-example: [debug] 2017-06-09 08:38:10.416369 [middleware.go:49] / GET 127.0.0.1 HTTP/1.1 200 0 19 10
- 统一:所有中间件的New方式统一为package.Middleware()
- 2017-06-09 08:00
- 新增cros中间件,参考 https://github.com/devfeel/middleware/tree/master/cros
- 支持较为丰富的option选项,可以根据实际业务场景自定义
- 支持设置Header:
- 1)Access-Control-Allow-Origin
- 2)Access-Control-Allow-Methods
- 3)Access-Control-Allow-Headers
- 4)Access-Control-Allow-Credentials
- 5)Access-Control-Expose-Headers
- 6)Access-Control-Max-Age
- 7)P3P
- HttpServer增加路由快捷方法:GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE\HiJack\WebSocket\ANY
- Rsponse增加QueryHeader方法
- 完善一些注释
- Demo: https://github.com/devfeel/middleware/tree/master/example/cros
- 2017-06-08 20:00
- 新增jwt中间件,参考demo:example/jwt
- 支持较为丰富的option选项,可以根据实际业务场景自定义
- 可配置通过Cookie、Header、QueryString三类token存储方式
- 支持自定义非法token处理函数
- 支持token通过jwt基础验证后的扩展处理接口
- 新增依赖 引入 github.com/dgrijalva/jwt-go
- 新增 example/jwt 目录
- 2017-06-06 13:00
- 配置文件加载优化,加载解析配置文件失败的情况下返回error对象 × 配置文件匹配完善,依次按三个目录匹配:1按绝对路径检查,2进程根目录下寻找,3进程根目录/config/下寻找
- 配置文件增加AppSet,用于应用自定义简单配置节点,配置文件增加appset节点,通过Context.AppSetConfig()访问
- 更新 example/config 目录
<appset>
<set key="email-host" value="mail.xx.com" />
<set key="email-account" value="username" />
<set key="email-password" value="password" />
<set key="limit-per-ip" value="10" />
</appset>
//查询方式
ctx.AppSetConfig().GetString("email-host"))
ctx.AppSetConfig().GetInt("limit-per-ip"))
- 2017-05-22 17:30
- 重要更新:HttpHandle增加error返回值,有error再也不用panic啦!
- 重要更新:新增Context接口
- ExceptionHandle func(*HttpContext, error) 调整为 ExceptionHandle func(Context, error)
- HttpHandle func(*HttpContext) 调整为 HttpHandle func(Context) error
- Middleware.Handle(ctx *HttpContext) error调整为Handle(ctx Context) error
- Middleware.Next(ctx *HttpContext)调整为Next(ctx Context)
- 为使Context设计与理解更清晰,做以下重要变更:
- 迁移Context.QueryStrings()至Context.Request().QueryStrings()
- 迁移Context.RawQuery()至Context.Request().RawQuery()
- 迁移Context.FormFile()至Context.Request().FormFile()
- 迁移Context.FormValues()至Context.Request().FormValues()
- 迁移Context.PostBody()至Context.Request().PostBody()
- 迁移Context.QueryHeader()至Context.Request().QueryHeader()
- 迁移Context.Url()至Context.Request().Url()
- 迁移Context.ContentType()至Context.Request().ContentType()
- 迁移Context.DelHeader()至Context.Response().DelHeader()
- 迁移Context.SetHeader()至Context.Response().SetHeader()
- 迁移Context.SetContentType()至Context.Response().SetContentType()
- 迁移Context.SetStatusCode()至Context.Response().SetStatusCode()
- 废弃Context.PostString(key string) string
- 通过在handler内返回相应的error,框架自动命中并通过设置的ExceptionHandle处理
- 更新 example/下所有代码,以支持error返回值,支持Context接口
- 2017-05-20 15:00
- 配置文件支持Middleware,支持App\Group\Router三个级别
- DotWeb增加RegisterMiddlewareFunc\GetMiddlewareFunc方法,用于创建中间件的方法注册
- 默认日志增加文件名与行号输出 - logger/xlog.go - [贡献者: @淡定]
- 更新 example/config 目录
- 2017-05-17 15:00
- ExceptionHandle定义由ExceptionHandle func(*HttpContext, interface{})调整为ExceptionHandle func(*HttpContext, error)
- HttpContext.SetCookie定义由SetCookie(cookie http.Cookie)调整为SetCookie(cookie *http.Cookie)
- HttpModule去除*Server属性
- Group新增RegisterRoute(method, path string, h HttpHandle) 方法
- 配置文件增加Group支持,可参考 example/config目录下xml与json示例配置文件
- 更新 example/main 文件、example/config 目录
- 2017-05-15 22:10
- 新增Group支持,可通过HttpServer.Group()或者NewGroup()创建,目前Group支持HEAD\GET\POST\PUT\OPTIONS\PATCH\DELETE路由方法
- Middleware支持三个级别Use:DotWeb.Use\Group.Use\RouterNode.Use
- 优化Router实现,移除router目录,整合xRouter和router.Router
- 废弃:移除RouterNode级别的Feature支持,原RouterNode.Features.SetEnabledCROS 可通过自实现Middleware实现
- 更新 example/middleware 目录
func InitRoute(server *dotweb.HttpServer) {
server.Router().GET("/", Index)
server.Router().GET("/use", Index).Use(NewAccessFmtLog("Router-use"))
g := server.Group("/group").Use(NewAccessFmtLog("group"))
g.GET("/", Index)
g.GET("/use", Index).Use(NewAccessFmtLog("group-use"))
}
- 2017-05-6 00:30
- 新增Middleware支持,通过DotWeb.Use引入中间件,处理请求顺序在HttpModule之后,响应请求顺序在HttpModule之前
- 用户实现Middleware interface开发自定义middleware,为简化代码,可基于BaseMiddlware开发
- 内建支持RequestLogMiddleware,通过DotWeb.UseRequestLog()引入
- 优化路由注册日志,添加Handler名称,例如:main.Index
- 更新 example/middleware 目录
- 2017-04-23 09:00
- 新增Json格式配置文件支持
- 更新 example/config 目录
- 2017-04-19 09:00
- 优化精简HttpContext,移除部分非常用冗余方法,迁移至新增Request类型
- Request增加PostBody缓存,可通过Request.PostBody()重复获取
- 迁移:HttpContext.Proto()\Method()\FullRemoteIP()\Referer()\UserAgent()\Path()\Host()\IsAJAX 迁移至HttpContext.Request
- BUG修复:修复HttpContext释放时,Response释放不彻底问题
- 2017-04-12 09:00
- 新增Feature模块,目前支持CROS特性,可通过HttpServer全局设置、RouterNode路由级别设置
- 新增CROS设置,设置是否允许跨域访问,并可设置AllowedOrigins、、AllowedMethods、AllowedHeaders、AllowCredentials、AllowedP3P属性
- PProfServer调整为属性设置,通过SetPProfConfig设置,移除StartPProf方法
- HttpContext新增RouterNode属性,可通过该属性获取路由信息
- 迁移:原DotWeb中SetSessionConfig函数迁移至HttpServer
- 废弃:DotWeb.SetSessionConfig、DotWeb.StartPProfServer
- 配置App节点新增EnabledPProf\PProfPort设置,用于设置PProfServer
- 完善配置文件与代码,完善代码,完善example
- 2017-04-09 20:00
- 新增Logger接口,增加内置文件日志xlog实现
- 配置新增app节点,支持LogPath、EnabledLog、RunMode,DotWeb增加SetEnabledLog方法;
- 新增RunMode,目前支持development、production,相关特性后续完善,默认为development
- 迁移:原DotWeb中SetEnabledListDir、SetEnabledSession、SetEnabledGzip函数迁移至HttpServer
- 完善配置文件与代码,完善代码,完善example
- 2017-04-04 18:00
- 调整Cache接口,Exists\Get\GetString\GetInt\GetInt64增加error返回值,影响Cache模块、Session模块
- Redis连接异常信息将从接口error返回,取消原来的panic设计
- 2017-04-04 16:00
- Render增加SetTemplatePath接口,用于设置模板默认目录, 默认添加base、base/templates、base/views
- 模板查找顺序从最后一个插入的元素开始往前找
- SetTemplatePath(path ...string)
- 2017-04-01 10:30
- Router增加MatchPath接口,用于检查指定请求与指定路由是否匹配,一般用于HttpModule中
- ctx.HttpServer.Router().MatchPath(ctx, "/user")
- 2017-03-31 22:30
- 增强静态文件处理,增加设置目录浏览开关,通过Router.ServerFile使用
- Router增加Any路由方式,如果设置为Any,则自动匹配:GET\HEAD\POST\PUT\PATCH\OPTIONS\DELETE
- ServerConfig增加EnabledListDir选项,仅对Router.ServerFile有效,若设置该项,则可以浏览目录文件,默认不开启
- ServerConfig增加EnabledAutoHEAD选项,如果设置该选项,则会为除Websocket\HEAD外所有路由方式默认添加HEAD路由,默认不开启
- 优化部分代码,增加example\static、example\router
- 2017-03-26 19:30
- 新增模板渲染支持,新增Renderer接口,需实现Render(io.Writer, string, interface{}, *HttpContext) error
- 支持接入第三方模板引擎,默认使用http/template内建引擎
- HttpContext增加ViewData,用于向模板传递值
- HttpContext增加View()方法,传入模板文件名,用于简化模板使用:View(name string) error
- 增加example\render
- 2017-03-26 11:10
- 新增Cache模块,支持runtime、redis,常规支持Get\Set\GetString\GetInt\GetInt64\Incr\Decr\Exists\Clear操作
- Cache通过app.SetCache启用,通过HttpContext.Cache()使用
- ItemContext增加Remove、Once接口,影响HttpContext.AppContext、HttpContext.Items
- 增加example\cache,优化部分代码
- 2017-03-25 22:30
- App、Server、Session配置代码梳理优化
- 新增Server接口,新增OfflineServer实现
- 新增Router接口,将原HttpServer路由操作转移至HttpServer.Router()
- 2017-03-24 14:00
- 新增Config支持, 支持Server、Session、Router三类配置
- 新增HttpServer.RegisterHandler、HttpServer.GetHandler用于注册HttpHandle
- 新增Offline配置,可设置Offline欢迎语或者默认跳转维护页
- 新增example\config
- 2017-03-23 22:00
- 新增ItemContext支持 - 单次请求完整通道内共享容器,通过HttpContext.Items().Get\Set操作
- 可在OnBeginRequest、UserHandler、OnEndRequest三个环节使用
- 新增example\httpmodule
- 2017-03-21 15:00
- 新增AppContext支持 - 进程内共享容器,通过HttpContext.AppContext.Get\Set操作
- 新增文件上传支持, 新增HttpContext.FormFile("key"),返回*UploadFile
- 新增example\appcontext & example\uploadfile
- 2017-03-21 15:00
- 新增Bind支持 - HttpContext.Bind(interface{}) 支持json、xml、Form数据
- 2017-03-16 11:00
- 新增Gzip支持,通过app.SetEnabledGzip(true)开启,默认关闭
- 2017-03-14 13:00
- 新增Session模块实现 - runtime\redis 两种模式
- 2017-03-13 14:00
- 新增HttpServer.RegisterRoute函数,新增example目录
- 2017-03-09 10:00
- 新增Hijack支持
- 2017-01-10 16:00
- 新增WebSocket协议支持
- 2016-11-29 16:00
- 新增HttpContext对Cookie的操作函数:WriteCookie\WriteCookieObj\RemoveCookie\ReadCookie\ReadCookieObj
- 启用pool优化对象管理,节约GC压力
- 2016-11-23 15:00
- 将fasthttp引擎变更为原生nethttp引擎
- 升级go版本从1.6->1.7.3
- 2016-11-15 16:00
- 增加HttpModule、ExceptionHandle、NotFound、Error特性支持
- 2016-11-14 15:00
- 扩展HttpContext支持方法
- 2016-11-10 11:00
- 初始版本,基于fasthttp引擎
- 2016-11-09 11:00