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