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