gofiber / contrib

🧬 Repository for third party middlewares with dependencies
https://docs.gofiber.io/contrib/
MIT License
216 stars 115 forks source link

🐛 [Bug]: Can't close websocket connection #698

Open mxgnus-de opened 1 year ago

mxgnus-de commented 1 year ago

Bug Description

I want to close a websocket connection but nothing happens (no error etc.). The client remains connected and can also send messages.

How to Reproduce

Steps to reproduce the behavior:

  1. Run the code below
  2. Connect to the server with a websocket client

Expected Behavior

The server should close the connection after 5 seconds

Contrib package Version

websocket/v1.1.0

Code Snippet (optional)

package main

import (
    "log"
    "time"

    "github.com/gofiber/contrib/websocket"
    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New()
    app.Use("/ws", middleware)
    app.Get("/ws", websocket.New(handler))
    log.Fatal(app.Listen(":8080"))
}

func middleware(c *fiber.Ctx) error {
    if websocket.IsWebSocketUpgrade(c) {
        return c.Next()
    }
    return fiber.ErrUpgradeRequired
}

func handler(conn *websocket.Conn) {
    go func() {
        time.Sleep(5 * time.Second)
        if err := conn.Close(); err != nil {
            log.Fatal(err)
        }
    }()

    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
        log.Printf("msg: %s", msg)
    }
}

Checklist:

gaby commented 1 year ago

@mstrYoda Any idea what may be causing this?

mstrYoda commented 1 year ago

Hi, you can not close a hijacked connection in this way. It is basically do nothings.

You can just return from the websocket handler function and it closes underlying connection after exiting handler.

mxgnus-de commented 1 year ago

Returning directly from the websocket handler worked. But for what purpose is the (*websocket.Conn).Close() func if it can't close the connection?