1
0
mirror of https://github.com/kataras/iris.git synced 2025-12-18 02:17:05 +00:00

add Context.ResponseWriter.IsHijacked to report whether the underline conn is already hijacked and a lot of cleanup and minor ws stress test example improvements

Former-commit-id: 444d4f0718d5c6d7544834c5e44dafb872980238
This commit is contained in:
Gerasimos (Makis) Maropoulos
2019-02-23 07:23:10 +02:00
parent bda36145e5
commit ddec78af0a
31 changed files with 124 additions and 100 deletions

View File

@@ -115,7 +115,7 @@ func main() {
// see the inline javascript code in the websockets.html, this endpoint is used to connect to the server.
app.Get("/echo", ws.Handler())
// serve the javascript built'n client-side library,
// serve the javascript builtin client-side library,
// see websockets.html script tags, this path is used.
app.Any("/iris-ws.js", func(ctx iris.Context) {
ctx.Write(websocket.ClientSource)

View File

@@ -40,7 +40,7 @@ func setupWebsocket(app *iris.Application) {
// see the inline javascript code in the websockets.html, this endpoint is used to connect to the server.
app.Get("/echo", ws.Handler())
// serve the javascript built'n client-side library,
// serve the javascript builtin client-side library,
// see websockets.html script tags, this path is used.
app.Any("/iris-ws.js", func(ctx iris.Context) {
ctx.Write(ws.ClientSource)

View File

@@ -25,7 +25,7 @@ func main() {
// see the inline javascript code i the websockets.html, this endpoint is used to connect to the server.
app.Get("/my_endpoint", ws.Handler())
// serve the javascript built'n client-side library,
// serve the javascript builtin client-side library,
// see websockets.html script tags, this path is used.
app.Any("/iris-ws.js", func(ctx iris.Context) {
ctx.Write(websocket.ClientSource)

View File

@@ -2,6 +2,7 @@ package main
import (
"bufio"
"context"
"log"
"math/rand"
"net"
@@ -19,7 +20,7 @@ var (
)
const totalClients = 16000 // max depends on the OS.
const verbose = true
const verbose = false
var connectionFailures uint64
@@ -43,7 +44,7 @@ func collectError(op string, err error) {
}
func main() {
log.Println("--Running...")
log.Println("-- Running...")
var err error
f, err = os.Open("./test.data")
if err != nil {
@@ -63,7 +64,7 @@ func main() {
wg.Add(1)
waitTime := time.Duration(rand.Intn(5)) * time.Millisecond
time.Sleep(waitTime)
go connect(wg, 7*time.Second+waitTime)
go connect(wg, 14*time.Second+waitTime)
}
for i := 0; i < totalClients/4; i++ {
@@ -77,7 +78,7 @@ func main() {
wg.Add(1)
waitTime := time.Duration(rand.Intn(5)) * time.Millisecond
time.Sleep(waitTime)
go connect(wg, 14*time.Second+waitTime)
go connect(wg, 7*time.Second+waitTime)
}
wg.Wait()
@@ -136,16 +137,19 @@ func main() {
log.Println("ALL OK.")
}
log.Println("--Finished.")
log.Println("-- Finished.")
}
func connect(wg *sync.WaitGroup, alive time.Duration) {
c, err := websocket.Dial(nil, url, websocket.ConnectionConfig{})
func connect(wg *sync.WaitGroup, alive time.Duration) error {
ctx, cancel := context.WithTimeout(context.Background(), alive)
defer cancel()
c, err := websocket.Dial(ctx, url, websocket.ConnectionConfig{})
if err != nil {
atomic.AddUint64(&connectionFailures, 1)
collectError("connect", err)
wg.Done()
return
return err
}
c.OnError(func(err error) {
@@ -167,23 +171,28 @@ func connect(wg *sync.WaitGroup, alive time.Duration) {
}
})
go func() {
time.Sleep(alive)
if err := c.Disconnect(); err != nil {
collectError("disconnect", err)
}
if alive > 0 {
go func() {
time.Sleep(alive)
if err := c.Disconnect(); err != nil {
collectError("disconnect", err)
}
wg.Done()
}()
wg.Done()
}()
}
scanner := bufio.NewScanner(f)
for !disconnected {
if !scanner.Scan() || scanner.Err() != nil {
break
if !scanner.Scan() {
return scanner.Err()
}
if text := scanner.Text(); len(text) > 1 {
c.Emit("chat", text)
}
}
return nil
}

View File

@@ -11,21 +11,24 @@ import (
"github.com/kataras/iris/websocket"
)
const totalClients = 16000 // max depends on the OS.
const verbose = true
const (
endpoint = "localhost:8080"
totalClients = 16000 // max depends on the OS.
verbose = false
maxC = 0
)
func main() {
ws := websocket.New(websocket.Config{})
ws.OnConnection(handleConnection)
// websocket.Config{PingPeriod: ((60 * time.Second) * 9) / 10}
go func() {
dur := 8 * time.Second
dur := 4 * time.Second
if totalClients >= 64000 {
// if more than 64000 then let's no check every 8 seconds, let's do it every 24 seconds,
// just for simplicity, either way works.
// if more than 64000 then let's perform those checks every 24 seconds instead,
// either way works.
dur = 24 * time.Second
}
t := time.NewTicker(dur)
@@ -40,12 +43,16 @@ func main() {
n := ws.GetTotalConnections()
if n > 0 {
started = true
if maxC > 0 && n > maxC {
log.Printf("current connections[%d] > MaxConcurrentConnections[%d]", n, maxC)
return
}
}
if started {
totalConnected := atomic.LoadUint64(&count)
if totalConnected == totalClients {
disconnectedN := atomic.LoadUint64(&totalDisconnected)
connectedN := atomic.LoadUint64(&totalConnected)
if disconnectedN == totalClients && connectedN == totalClients {
if n != 0 {
log.Println("ALL CLIENTS DISCONNECTED BUT LEFTOVERS ON CONNECTIONS LIST.")
} else {
@@ -53,7 +60,7 @@ func main() {
}
return
} else if n == 0 {
log.Printf("%d/%d CLIENTS WERE NOT CONNECTED AT ALL. CHECK YOUR OS NET SETTINGS. ALL OTHER CONNECTED CLIENTS DISCONNECTED SUCCESSFULLY.\n",
log.Printf("%d/%d CLIENTS WERE NOT CONNECTED AT ALL. CHECK YOUR OS NET SETTINGS. THE REST CLIENTS WERE DISCONNECTED SUCCESSFULLY.\n",
totalClients-totalConnected, totalClients)
return
@@ -64,11 +71,18 @@ func main() {
app := iris.New()
app.Get("/", ws.Handler())
app.Run(iris.Addr(":8080"))
app.Run(iris.Addr(endpoint), iris.WithoutServerError(iris.ErrServerClosed))
}
var totalConnected uint64
func handleConnection(c websocket.Connection) {
if c.Err() != nil {
log.Fatalf("[%d] upgrade failed: %v", atomic.LoadUint64(&totalConnected)+1, c.Err())
return
}
atomic.AddUint64(&totalConnected, 1)
c.OnError(func(err error) { handleErr(c, err) })
c.OnDisconnect(func() { handleDisconnect(c) })
c.On("chat", func(message string) {
@@ -76,12 +90,12 @@ func handleConnection(c websocket.Connection) {
})
}
var count uint64
var totalDisconnected uint64
func handleDisconnect(c websocket.Connection) {
atomic.AddUint64(&count, 1)
newC := atomic.AddUint64(&totalDisconnected, 1)
if verbose {
log.Printf("client [%s] disconnected!\n", c.ID())
log.Printf("[%d] client [%s] disconnected!\n", newC, c.ID())
}
}

View File

@@ -26,7 +26,7 @@ func main() {
// see the inline javascript code i the websockets.html, this endpoint is used to connect to the server.
app.Get("/my_endpoint", ws.Handler())
// serve the javascript built'n client-side library,
// serve the javascript builtin client-side library,
// see websockets.html script tags, this path is used.
app.Any("/iris-ws.js", func(ctx iris.Context) {
ctx.Write(websocket.ClientSource)