mirror of
https://github.com/kataras/iris.git
synced 2025-12-23 12:57:05 +00:00
Implement the websocket adaptor, a version of kataras/go-websocket, and refactor all of the previous websocket examples.
https://github.com/kataras/go-websocket/issues/27 Former-commit-id: 0b7e52e0a61150a8bba973ef653986d8b3ddd26b
This commit is contained in:
190
configuration.go
190
configuration.go
@@ -4,7 +4,6 @@ import (
|
||||
"crypto/tls"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
@@ -17,11 +16,12 @@ type (
|
||||
// OptionSetter sets a configuration field to the main configuration
|
||||
// used to help developers to write less and configure only what they really want and nothing else
|
||||
// example:
|
||||
// iris.New(iris.Configuration{Sessions:iris.SessionConfiguration{Cookie:"mysessionid"}, Websocket: iris.WebsocketConfiguration{Endpoint:"/my_endpoint"}})
|
||||
// iris.New(iris.Configuration{Charset: "UTF-8", Gzip:true})
|
||||
// now can be done also by using iris.Option$FIELD:
|
||||
// iris.New(irisOptionSessionsCookie("mycookieid"),iris.OptionWebsocketEndpoint("my_endpoint"))
|
||||
// iris.New(iris.OptionCharset("UTF-8"), iris.OptionGzip(true))
|
||||
// benefits:
|
||||
// 1. user/dev have no worries what option to pass, he/she can just press iris.Option and all options should be shown to her/his editor's autocomplete-popup window
|
||||
// 1. dev has no worries what option to pass,
|
||||
// he/she can just press iris.Option and all options should be shown to her/his editor's autocomplete-popup window
|
||||
// 2. can be passed with any order
|
||||
// 3. Can override previous configuration
|
||||
OptionSetter interface {
|
||||
@@ -177,9 +177,6 @@ type Configuration struct {
|
||||
// Sessions contains the configs for sessions
|
||||
Sessions SessionsConfiguration
|
||||
|
||||
// Websocket contains the configs for Websocket's server integration
|
||||
Websocket WebsocketConfiguration
|
||||
|
||||
// Other are the custom, dynamic options, can be empty
|
||||
// this fill used only by you to set any app's options you want
|
||||
// for each of an Iris instance
|
||||
@@ -443,7 +440,6 @@ func DefaultConfiguration() Configuration {
|
||||
Charset: DefaultCharset,
|
||||
Gzip: false,
|
||||
Sessions: DefaultSessionsConfiguration(),
|
||||
Websocket: DefaultWebsocketConfiguration(),
|
||||
Other: options.Options{},
|
||||
}
|
||||
}
|
||||
@@ -529,184 +525,6 @@ func DefaultSessionsConfiguration() SessionsConfiguration {
|
||||
}
|
||||
}
|
||||
|
||||
// WebsocketConfiguration the config contains options for the Websocket main config field
|
||||
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
|
||||
// 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 error)
|
||||
// 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.Default.Config.Websocket.CheckOrigin = iris.WebsocketCheckSameOrigin
|
||||
CheckOrigin func(r *http.Request) bool
|
||||
// IDGenerator used to create (and later on, set)
|
||||
// an ID for each incoming websocket connections (clients).
|
||||
// If empty then the ID is generated by the result of 64
|
||||
// random combined characters
|
||||
IDGenerator func(r *http.Request) string
|
||||
}
|
||||
|
||||
var (
|
||||
// OptionWebsocketWriteTimeout time allowed to write a message to the connection.
|
||||
// Default value is 15 * time.Second
|
||||
OptionWebsocketWriteTimeout = func(val time.Duration) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.WriteTimeout = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketPongTimeout allowed to read the next pong message from the connection
|
||||
// Default value is 60 * time.Second
|
||||
OptionWebsocketPongTimeout = func(val time.Duration) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.PongTimeout = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketPingPeriod send ping messages to the connection with this period. Must be less than PongTimeout
|
||||
// Default value is (PongTimeout * 9) / 10
|
||||
OptionWebsocketPingPeriod = func(val time.Duration) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.PingPeriod = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketMaxMessageSize max message size allowed from connection
|
||||
// Default value is 1024
|
||||
OptionWebsocketMaxMessageSize = func(val int64) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.MaxMessageSize = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketBinaryMessages 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
|
||||
OptionWebsocketBinaryMessages = func(val bool) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.BinaryMessages = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketEndpoint 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.
|
||||
OptionWebsocketEndpoint = func(val string) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.Endpoint = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketReadBufferSize is the buffer size for the underline reader
|
||||
OptionWebsocketReadBufferSize = func(val int) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.ReadBufferSize = val
|
||||
}
|
||||
}
|
||||
// OptionWebsocketWriteBufferSize is the buffer size for the underline writer
|
||||
OptionWebsocketWriteBufferSize = func(val int) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.WriteBufferSize = val
|
||||
}
|
||||
}
|
||||
|
||||
// OptionWebsocketError specifies the function for generating HTTP error responses.
|
||||
OptionWebsocketError = func(val func(*Context, int, error)) 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(*http.Request) bool) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.CheckOrigin = val
|
||||
}
|
||||
}
|
||||
|
||||
// OptionWebsocketIDGenerator used to create (and later on, set)
|
||||
// an ID for each incoming websocket connections (clients).
|
||||
// If empty then the ID is generated by the result of 64
|
||||
// random combined characters
|
||||
OptionWebsocketIDGenerator = func(val func(*http.Request) string) OptionSet {
|
||||
return func(c *Configuration) {
|
||||
c.Websocket.IDGenerator = val
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
// DefaultWebsocketWriteTimeout 15 * time.Second
|
||||
DefaultWebsocketWriteTimeout = 15 * time.Second
|
||||
// DefaultWebsocketPongTimeout 60 * time.Second
|
||||
DefaultWebsocketPongTimeout = 60 * time.Second
|
||||
// DefaultWebsocketPingPeriod (DefaultPongTimeout * 9) / 10
|
||||
DefaultWebsocketPingPeriod = (DefaultWebsocketPongTimeout * 9) / 10
|
||||
// DefaultWebsocketMaxMessageSize 1024
|
||||
DefaultWebsocketMaxMessageSize = 1024
|
||||
)
|
||||
|
||||
var (
|
||||
// DefaultWebsocketError is the default method to manage the handshake websocket errors
|
||||
DefaultWebsocketError = func(ctx *Context, status int, reason error) {
|
||||
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.Default.Config.Websocket.CheckOrigin = iris.WebsocketCheckSameOrigin
|
||||
DefaultWebsocketCheckOrigin = func(r *http.Request) bool {
|
||||
return true
|
||||
}
|
||||
// WebsocketCheckSameOrigin returns true if the origin is not set or is equal to the request host
|
||||
WebsocketCheckSameOrigin = func(r *http.Request) bool {
|
||||
origin := r.Header.Get("origin")
|
||||
if len(origin) == 0 {
|
||||
return true
|
||||
}
|
||||
u, err := url.Parse(origin)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return u.Host == r.Host
|
||||
}
|
||||
)
|
||||
|
||||
// DefaultWebsocketConfiguration returns the default config for iris-ws websocket package
|
||||
func DefaultWebsocketConfiguration() WebsocketConfiguration {
|
||||
return WebsocketConfiguration{
|
||||
WriteTimeout: DefaultWebsocketWriteTimeout,
|
||||
PongTimeout: DefaultWebsocketPongTimeout,
|
||||
PingPeriod: DefaultWebsocketPingPeriod,
|
||||
MaxMessageSize: DefaultWebsocketMaxMessageSize,
|
||||
BinaryMessages: false,
|
||||
ReadBufferSize: 4096,
|
||||
WriteBufferSize: 4096,
|
||||
Endpoint: "",
|
||||
// use the kataras/go-websocket default
|
||||
IDGenerator: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// Default values for base Server conf
|
||||
const (
|
||||
// DefaultServerHostname returns the default hostname which is 0.0.0.0
|
||||
|
||||
Reference in New Issue
Block a user