Update to 4.5.0

This commit is contained in:
Gerasimos Maropoulos 2016-10-09 21:09:53 +03:00
parent 14982891c5
commit f66b7e2eab
9 changed files with 167 additions and 113 deletions

View File

@ -10,12 +10,13 @@ Feel free to send **any** amount through paypal
[![](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=kataras2006%40hotmail%2ecom&lc=GR&item_name=Iris%20web%20framework&item_number=iriswebframeworkdonationid2016&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted&return=http://iris-go.com/assets/v4-book/iris.pdf&cancel_return=https://www.gitbook.com/book/kataras/iris/details) [![](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=kataras2006%40hotmail%2ecom&lc=GR&item_name=Iris%20web%20framework&item_number=iriswebframeworkdonationid2016&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted&return=http://iris-go.com/assets/v4-book/iris.pdf&cancel_return=https://www.gitbook.com/book/kataras/iris/details)
> Please check your e-mail after your donation, I will ask you if you want to public your donation > Please check your e-mail after your donation
Benefits: Benefits:
- Your github username is visible to the very-top of the README page - Your github username,after your approval, is visible here . I respect your privacy at any case.
- Access to the 'donors' [private chat room](https://kataras.rocket.chat/group/donors), real-time assistance by me. - Access to the 'donors' [private chat room](https://kataras.rocket.chat/group/donors), real-time assistance by me.
- Each donate gives lifetime to the Iris web framework. The author works full-time on this project, no time for any part-time job.
**Thank you**! **Thank you**!
@ -33,7 +34,7 @@ I'm grateful for all the generous donations. Iris is fully funded by these dona
- ANONYMOUS(Waiting For Approval) donated 6 EUR at October 1 - ANONYMOUS(Waiting For Approval) donated 6 EUR at October 1
- [Ankur Srivastava](https://github.com/ansrivas) donated 20 EUR at October 2 - [Ankur Srivastava](https://github.com/ansrivas) donated 20 EUR at October 2
> The name of the donator added after his/her permission. > The name or/and github username link added after donator's approvement.
#### Report, so far #### Report, so far

View File

@ -2,6 +2,62 @@
**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`. **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`.
## 4.4.9 -> 4.5.0
- **NEW**: Websocket configuration fields:
- `Error func(ctx *Context, status int, reason string)`. Manually catch any handshake errors. Default calls the `ctx.EmitError(status)` with a stored error message in the `WsError` key(`ctx.Set("WsError", reason)`), as before.
- `CheckOrigin func(ctx *Context)`. Manually allow or dissalow client's websocket access, ex: via header **Origin**. Default allow all origins(CORS-like) as before.
- `Headers bool`. Allow websocket handler to copy request's headers on the handshake. Default is true
With these in-mind the `WebsocketConfiguration` seems like this now :
```go
type WebsocketConfiguration struct {
// WriteTimeout time allowed to write a message to the connection.
// Default value is 15 * time.Second
WriteTimeout time.Duration
// PongTimeout allowed to read the next pong message from the connection
// Default value is 60 * time.Second
PongTimeout time.Duration
// PingPeriod send ping messages to the connection with this period. Must be less than PongTimeout
// Default value is (PongTimeout * 9) / 10
PingPeriod time.Duration
// MaxMessageSize max message size allowed from connection
// Default value is 1024
MaxMessageSize int64
// BinaryMessages set it to true in order to denotes binary data messages instead of utf-8 text
// see https://github.com/kataras/iris/issues/387#issuecomment-243006022 for more
// defaults to false
BinaryMessages bool
// Endpoint is the path which the websocket server will listen for clients/connections
// Default value is empty string, if you don't set it the Websocket server is disabled.
Endpoint string
// ReadBufferSize is the buffer size for the underline reader
ReadBufferSize int
// WriteBufferSize is the buffer size for the underline writer
WriteBufferSize int
// Headers if true then the client's headers are copy to the websocket connection
//
// Default is true
Headers bool
// Error specifies the function for generating HTTP error responses.
//
// The default behavior is to store the reason in the context (ctx.Set(reason)) and fire any custom error (ctx.EmitError(status))
Error func(ctx *Context, status int, reason string)
// CheckOrigin returns true if the request Origin header is acceptable. If
// CheckOrigin is nil, the host in the Origin header must not be set or
// must match the host of the request.
//
// The default behavior is to allow all origins
// you can change this behavior by setting the iris.Config.Websocket.CheckOrigin = iris.WebsocketCheckSameOrigin
CheckOrigin func(ctx *Context) bool
}
```
- **REMOVE**: `github.com/kataras/iris/context/context.go` , this is no needed anymore. Its only usage was inside `sessions` and `websockets`, a month ago I did improvements to the sessions as a standalone package, the IContext interface is not being used there. With the today's changes, the iris-contrib/websocket doesn't needs the IContext interface too, so the whole folder `./context` is useless and removed now. Users developers don't have any side-affects from this change.
[Examples](https://github.com/iris-contrib/examples), [Book](https://github.com/iris-contrib/gitbook) are up-to-date, just new configuration fields.
## 4.4.8 -> 4.4.9 ## 4.4.8 -> 4.4.9
- **FIX**: Previous CORS fix wasn't enough and produces error before server's startup[*](https://github.com/kataras/iris/issues/461) if many paths were trying to auto-register an `.OPTIONS` route, now this is fixed in combined with some improvements on the [cors middleware](https://github.com/iris-contrib/middleware/tree/master/cors) too. - **FIX**: Previous CORS fix wasn't enough and produces error before server's startup[*](https://github.com/kataras/iris/issues/461) if many paths were trying to auto-register an `.OPTIONS` route, now this is fixed in combined with some improvements on the [cors middleware](https://github.com/iris-contrib/middleware/tree/master/cors) too.

View File

@ -19,7 +19,7 @@
<br/> <br/>
<a href="https://github.com/kataras/iris/releases"><img src="https://img.shields.io/badge/%20version%20-%204.4.9%20-blue.svg?style=flat-square" alt="Releases"></a> <a href="https://github.com/kataras/iris/releases"><img src="https://img.shields.io/badge/%20version%20-%204.5.0%20-blue.svg?style=flat-square" alt="Releases"></a>
<a href="https://github.com/iris-contrib/examples"><img src="https://img.shields.io/badge/%20examples-repository-3362c2.svg?style=flat-square" alt="Examples"></a> <a href="https://github.com/iris-contrib/examples"><img src="https://img.shields.io/badge/%20examples-repository-3362c2.svg?style=flat-square" alt="Examples"></a>
@ -41,14 +41,6 @@ Ideally suited for both experienced and novice <b>Developers</b>.
- Check out [this](https://t.co/Y7bK0THScG) Meetup with GoLang User Group. Contains ~30 minutes talk about the Iris web framework. Happens at Thursday, October 13, 2016. - Check out [this](https://t.co/Y7bK0THScG) Meetup with GoLang User Group. Contains ~30 minutes talk about the Iris web framework. Happens at Thursday, October 13, 2016.
#### Donations
I'm grateful for all the generous donations. Iris is fully funded by these donations[*](DONATIONS.md).
- [Ryan Brooks](https://github.com/ryanbyyc) donated 50 EUR at May 11
- [Juan Sebastián Suárez Valencia](https://github.com/Juanses) donated 20 EUR at September 11
- [Bob Lee](https://github.com/li3p) donated 20 EUR at September 16
- [Celso Luiz](https://github.com/celsosz) donated 50 EUR at September 29
- [Ankur Srivastava](https://github.com/ansrivas) donated 20 EUR at October 2
## Feature Overview ## Feature Overview
@ -870,7 +862,7 @@ I recommend writing your API tests using this new library, [httpexpect](https://
Versioning Versioning
------------ ------------
Current: **v4.4.9** Current: **v4.5.0**
> Iris is an active project > Iris is an active project
@ -906,7 +898,7 @@ This project is licensed under the [MIT License](LICENSE), Copyright (c) 2016 Ge
[Travis]: http://travis-ci.org/kataras/iris [Travis]: http://travis-ci.org/kataras/iris
[License Widget]: https://img.shields.io/badge/license-MIT%20%20License%20-E91E63.svg?style=flat-square [License Widget]: https://img.shields.io/badge/license-MIT%20%20License%20-E91E63.svg?style=flat-square
[License]: https://github.com/kataras/iris/blob/master/LICENSE [License]: https://github.com/kataras/iris/blob/master/LICENSE
[Release Widget]: https://img.shields.io/badge/release-4.4.9%20-blue.svg?style=flat-square [Release Widget]: https://img.shields.io/badge/release-4.5.0%20-blue.svg?style=flat-square
[Release]: https://github.com/kataras/iris/releases [Release]: https://github.com/kataras/iris/releases
[Chat Widget]: https://img.shields.io/badge/community-chat%20-00BCD4.svg?style=flat-square [Chat Widget]: https://img.shields.io/badge/community-chat%20-00BCD4.svg?style=flat-square
[Chat]: https://kataras.rocket.chat/channel/iris [Chat]: https://kataras.rocket.chat/channel/iris

View File

@ -6,6 +6,7 @@ import (
"github.com/kataras/go-sessions" "github.com/kataras/go-sessions"
"github.com/valyala/fasthttp" "github.com/valyala/fasthttp"
"io" "io"
"net/url"
"os" "os"
"strconv" "strconv"
"time" "time"
@ -659,6 +660,21 @@ type WebsocketConfiguration struct {
ReadBufferSize int ReadBufferSize int
// WriteBufferSize is the buffer size for the underline writer // WriteBufferSize is the buffer size for the underline writer
WriteBufferSize int WriteBufferSize int
// Headers if true then the client's headers are copy to the websocket connection
//
// Default is true
Headers bool
// Error specifies the function for generating HTTP error responses.
//
// The default behavior is to store the reason in the context (ctx.Set(reason)) and fire any custom error (ctx.EmitError(status))
Error func(ctx *Context, status int, reason string)
// CheckOrigin returns true if the request Origin header is acceptable. If
// CheckOrigin is nil, the host in the Origin header must not be set or
// must match the host of the request.
//
// The default behavior is to allow all origins
// you can change this behavior by setting the iris.Config.Websocket.CheckOrigin = iris.WebsocketCheckSameOrigin
CheckOrigin func(ctx *Context) bool
} }
var ( var (
@ -717,6 +733,26 @@ var (
c.Websocket.WriteBufferSize = val c.Websocket.WriteBufferSize = val
} }
} }
// OptionWebsocketHeaders if true then the client's headers are copy to the websocket connection
OptionWebsocketHeaders = func(val bool) OptionSet {
return func(c *Configuration) {
c.Websocket.Headers = val
}
}
// OptionWebsocketError specifies the function for generating HTTP error responses.
OptionWebsocketError = func(val func(*Context, int, string)) OptionSet {
return func(c *Configuration) {
c.Websocket.Error = val
}
}
// OptionWebsocketCheckOrigin returns true if the request Origin header is acceptable. If
// CheckOrigin is nil, the host in the Origin header must not be set or
// must match the host of the request.
OptionWebsocketCheckOrigin = func(val func(*Context) bool) OptionSet {
return func(c *Configuration) {
c.Websocket.CheckOrigin = val
}
}
) )
const ( const (
@ -730,6 +766,31 @@ const (
DefaultMaxMessageSize = 1024 DefaultMaxMessageSize = 1024
) )
var (
// DefaultWebsocketError is the default method to manage the handshake websocket errors
DefaultWebsocketError = func(ctx *Context, status int, reason string) {
ctx.Set("WsError", reason)
ctx.EmitError(status)
}
// DefaultWebsocketCheckOrigin is the default method to allow websocket clients to connect to this server
// you can change this behavior by setting the iris.Config.Websocket.CheckOrigin = iris.WebsocketCheckSameOrigin
DefaultWebsocketCheckOrigin = func(ctx *Context) bool {
return true
}
// WebsocketCheckSameOrigin returns true if the origin is not set or is equal to the request host
WebsocketCheckSameOrigin = func(ctx *Context) bool {
origin := ctx.RequestHeader("origin")
if len(origin) == 0 {
return true
}
u, err := url.Parse(origin)
if err != nil {
return false
}
return u.Host == ctx.HostString()
}
)
// DefaultWebsocketConfiguration returns the default config for iris-ws websocket package // DefaultWebsocketConfiguration returns the default config for iris-ws websocket package
func DefaultWebsocketConfiguration() WebsocketConfiguration { func DefaultWebsocketConfiguration() WebsocketConfiguration {
return WebsocketConfiguration{ return WebsocketConfiguration{
@ -741,6 +802,7 @@ func DefaultWebsocketConfiguration() WebsocketConfiguration {
ReadBufferSize: 4096, ReadBufferSize: 4096,
WriteBufferSize: 4096, WriteBufferSize: 4096,
Endpoint: "", Endpoint: "",
Headers: true,
} }
} }

View File

@ -1,7 +1,3 @@
/*
Context.go Implements: ./context/context.go
*/
package iris package iris
import ( import (
@ -24,7 +20,6 @@ import (
"github.com/kataras/go-errors" "github.com/kataras/go-errors"
"github.com/kataras/go-fs" "github.com/kataras/go-fs"
"github.com/kataras/go-sessions" "github.com/kataras/go-sessions"
"github.com/kataras/iris/context"
"github.com/kataras/iris/utils" "github.com/kataras/iris/utils"
"github.com/valyala/fasthttp" "github.com/valyala/fasthttp"
) )
@ -109,8 +104,6 @@ type (
} }
) )
var _ context.IContext = &Context{}
// GetRequestCtx returns the current fasthttp context // GetRequestCtx returns the current fasthttp context
func (ctx *Context) GetRequestCtx() *fasthttp.RequestCtx { func (ctx *Context) GetRequestCtx() *fasthttp.RequestCtx {
return ctx.RequestCtx return ctx.RequestCtx

View File

@ -1,88 +0,0 @@
package context
import (
"bufio"
"github.com/kataras/go-sessions"
"github.com/valyala/fasthttp"
"io"
"time"
)
type (
// IContext the interface for the iris/context
// Used mostly inside packages which shouldn't be import ,directly, the kataras/iris.
IContext interface {
Param(string) string
ParamInt(string) (int, error)
ParamInt64(string) (int64, error)
URLParam(string) string
URLParamInt(string) (int, error)
URLParamInt64(string) (int64, error)
URLParams() map[string]string
MethodString() string
HostString() string
Subdomain() string
PathString() string
RequestPath(bool) string
RequestIP() string
RemoteAddr() string
RequestHeader(k string) string
IsAjax() bool
FormValueString(string) string
FormValues(string) []string
PostValuesAll() map[string][]string
PostValues(name string) []string
PostValue(name string) string
SetStatusCode(int)
SetContentType(string)
SetHeader(string, string)
Redirect(string, ...int)
RedirectTo(string, ...interface{})
NotFound()
Panic()
EmitError(int)
Write(string, ...interface{})
HTML(int, string)
Data(int, []byte) error
RenderWithStatus(int, string, interface{}, ...map[string]interface{}) error
Render(string, interface{}, ...map[string]interface{}) error
MustRender(string, interface{}, ...map[string]interface{})
TemplateString(string, interface{}, ...map[string]interface{}) string
MarkdownString(string) string
Markdown(int, string)
JSON(int, interface{}) error
JSONP(int, string, interface{}) error
Text(int, string) error
XML(int, interface{}) error
ServeContent(io.ReadSeeker, string, time.Time, bool) error
ServeFile(string, bool) error
SendFile(string, string)
Stream(func(*bufio.Writer))
StreamWriter(cb func(*bufio.Writer))
StreamReader(io.Reader, int)
ReadJSON(interface{}) error
ReadXML(interface{}) error
ReadForm(interface{}) error
Get(string) interface{}
GetString(string) string
GetInt(string) int
Set(string, interface{})
VisitAllCookies(func(string, string))
SetCookie(*fasthttp.Cookie)
SetCookieKV(string, string)
RemoveCookie(string)
GetFlashes() map[string]string
GetFlash(string) (string, error)
SetFlash(string, string)
Session() sessions.Session
SessionDestroy()
Log(string, ...interface{})
GetRequestCtx() *fasthttp.RequestCtx
Do()
Next()
StopExecution()
IsStopped() bool
GetHandlerName() string
}
)

View File

@ -79,7 +79,7 @@ import (
const ( const (
// Version is the current version of the Iris web framework // Version is the current version of the Iris web framework
Version = "4.4.9" Version = "4.5.0"
banner = ` _____ _ banner = ` _____ _
|_ _| (_) |_ _| (_)

2
ssh.go
View File

@ -27,6 +27,8 @@ package iris
// log // log
// help // help
// exit // exit
//
// Keep note that I will re-write this file, ssh.go because, as you can see, it's not well-written and not maintainable*
import ( import (
"bytes" "bytes"

View File

@ -23,6 +23,16 @@ type (
WebsocketServer struct { WebsocketServer struct {
websocket.Server websocket.Server
upgrader irisWebsocket.Upgrader upgrader irisWebsocket.Upgrader
// the only fields we need at runtime here for iris-specific error and check origin funcs
// they comes from WebsocketConfiguration
// Error specifies the function for generating HTTP error responses.
Error func(ctx *Context, status int, reason string)
// CheckOrigin returns true if the request Origin header is acceptable. If
// CheckOrigin is nil, the host in the Origin header must not be set or
// must match the host of the request.
CheckOrigin func(ctx *Context) bool
} }
) )
@ -40,17 +50,32 @@ func NewWebsocketServer() *WebsocketServer {
// If the upgrade fails, then Upgrade replies to the client with an HTTP error // If the upgrade fails, then Upgrade replies to the client with an HTTP error
// response. // response.
func (s *WebsocketServer) Upgrade(ctx *Context) error { func (s *WebsocketServer) Upgrade(ctx *Context) error {
return s.upgrader.Upgrade(ctx) return s.upgrader.Upgrade(ctx.RequestCtx)
} }
// Handler is the iris Handler to upgrade the request // Handler is the iris Handler to upgrade the request
// used inside RegisterRoutes // used inside RegisterRoutes
func (s *WebsocketServer) Handler(ctx *Context) { func (s *WebsocketServer) Handler(ctx *Context) {
// first, check origin
if !s.CheckOrigin(ctx) {
s.Error(ctx, StatusForbidden, "websocket: origin not allowed")
return
}
// all other errors comes from the underline iris-contrib/websocket
if err := s.Upgrade(ctx); err != nil { if err := s.Upgrade(ctx); err != nil {
if ctx.framework.Config.IsDevelopment { if ctx.framework.Config.IsDevelopment {
ctx.Log("Websocket error while trying to Upgrade the connection. Trace: %s", err.Error()) ctx.Log("Websocket error while trying to Upgrade the connection. Trace: %s", err.Error())
} }
ctx.EmitError(StatusBadRequest)
statusErrCode := StatusBadRequest
if herr, isHandshake := err.(irisWebsocket.HandshakeError); isHandshake {
statusErrCode = herr.Status()
}
// if not handshake error just fire the custom(if any) StatusBadRequest
// with the websocket's error message in the ctx.Get("WsError")
DefaultWebsocketError(ctx, statusErrCode, err.Error())
} }
} }
@ -64,7 +89,7 @@ func (s *WebsocketServer) RegisterTo(station *Framework, c WebsocketConfiguratio
s.Server = websocket.New() s.Server = websocket.New()
} }
// is just a conversional type for kataras/go-websocket.Connection // is just a conversional type for kataras/go-websocket.Connection
s.upgrader = irisWebsocket.Custom(s.Server.HandleConnection, c.ReadBufferSize, c.WriteBufferSize, false) s.upgrader = irisWebsocket.Custom(s.Server.HandleConnection, c.ReadBufferSize, c.WriteBufferSize, c.Headers)
// set the routing for client-side source (javascript) (optional) // set the routing for client-side source (javascript) (optional)
clientSideLookupName := "iris-websocket-client-side" clientSideLookupName := "iris-websocket-client-side"
@ -85,6 +110,17 @@ func (s *WebsocketServer) RegisterTo(station *Framework, c WebsocketConfiguratio
WriteBufferSize: c.WriteBufferSize, WriteBufferSize: c.WriteBufferSize,
}) })
s.Error = c.Error
s.CheckOrigin = c.CheckOrigin
if s.Error == nil {
s.Error = DefaultWebsocketError
}
if s.CheckOrigin == nil {
s.CheckOrigin = DefaultWebsocketCheckOrigin
}
// run the ws server // run the ws server
s.Server.Serve() s.Server.Serve()