Websocket


Fiber를 위한 Fasthttp WebSocket 기반으로, Locals, Params, Query, Cookies와 같은 사용 가능한 *fiber.Ctx 메서드들이 있습니다.

참고: Go 1.18 이상 버전 필요

설치

go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/websocket

시그니처

func New(handler func(*websocket.Conn), config ...websocket.Config) fiber.Handler {

설정

프로퍼티
타입
설명
기본값

Filter

func(*fiber.Ctx) bool

미들웨어를 스킵할 함수를 정의합니다.

nil

HandshakeTimeout

time.Duration

HandshakeTimeout은 핸드셰이크가 완료되는 시간을 지정합니다.

0 (타임아웃 없음)

Subprotocols

[]string

Subprotocols는 클라이언트가 요청한 하위 프로토콜을 지정합니다.

nil

Origins

[]string

Origin 헤더를 기반으로 허용되는 출처입니다. 비어있다면 모든 것이 허용됩니다.

nil

ReadBufferSize

int

ReadBufferSize는 들어오는 메시지의 I/O 버퍼 크기를 바이트 단위로 지정합니다.

0 (기본 크기 사용)

WriteBufferSize

int

WriteBufferSize는 나가는 메시지의 I/O 버퍼 크기를 바이트 단위로 지정합니다.

0 (기본 크기 사용)

WriteBufferPool

websocket.BufferPool

WriteBufferPool은 쓰기 작업을 위한 버퍼 풀입니다.

nil

EnableCompression

bool

EnableCompression은 클라이언트가 메시지 단위 압축(RFC 7692)을 협상해야 하는지 여부를 지정합니다.

false

RecoverHandler

func(*websocket.Conn) void

RecoverHandler는 패닉에서 복구하는 패닉 핸들러 함수입니다.

defaultRecover

예제

package main
import (
	"log"

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

func main() {
	app := fiber.New()

	app.Use("/ws", func(c *fiber.Ctx) error {
		// IsWebSocketUpgrade는 클라이언트가 
		// WebSocket 프로토콜로 업그레이드를 요청했는지 여부를 반환합니다.
		if websocket.IsWebSocketUpgrade(c) {
			c.Locals("allowed", true)
			return c.Next()
		}
		return fiber.ErrUpgradeRequired
	})

	app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {
		// c.Locals는 *websocket.Conn에 추가됩니다
		log.Println(c.Locals("allowed"))  // true
		log.Println(c.Params("id"))       // 123
		log.Println(c.Query("v"))         // 1.0
		log.Println(c.Cookies("session")) // ""

		// websocket.Conn 바인딩 https://pkg.go.dev/github.com/fasthttp/websocket?tab=doc#pkg-index
		var (
			mt  int
			msg []byte
			err error
		)
		for {
			if mt, msg, err = c.ReadMessage(); err != nil {
				log.Println("read:", err)
				break
			}
			log.Printf("recv: %s", msg)

			if err = c.WriteMessage(mt, msg); err != nil {
				log.Println("write:", err)
				break
			}
		}

	}))

	log.Fatal(app.Listen(":3000"))
	// 웹소켓 서버 접속: ws://localhost:3000/ws/123?v=1.0 
	// https://www.websocket.org/echo.html
}

캐시 미들웨어 사용시 주의사항

캐시 미들웨어를 사용할 때 websocket: bad handshake 에러가 발생하면 config.Next를 사용하여 웹소켓 경로를 건너뛰십시오.

app := fiber.New()
app.Use(cache.New(cache.Config{
		Next: func(c *fiber.Ctx) bool {
			return strings.Contains(c.Route().Path, "/ws")
		},
}))

app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {}))

복구 미들웨어 사용시 주의사항

내부 구현상의 이유로 현재 복구 미들웨어는 웹소켓 미들웨어와 함께 작동하지 않습니다. config.RecoverHandler를 사용하여 웹소켓 엔드포인트에 복구 핸들러를 추가하십시오. 기본적으로 RecoverHandler 설정은 패닉에서 복구하고 스택 트레이스를 stderr에 기록하며, error 필드에 패닉 메시지를 포함하는 응답을 반환합니다.

app := fiber.New()

app.Use(cache.New(cache.Config{
    Next: func(c *fiber.Ctx) bool {
        return strings.Contains(c.Route().Path, "/ws")
    },
}))

cfg := Config{
    RecoverHandler: func(conn *Conn) {
        if err := recover(); err != nil {
            conn.WriteJSON(fiber.Map{"customError": "error occurred"})
        }
    },
}

app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {}, cfg))

Last updated