Fiber WebSocket Örneği

Fiber'ın Fasthttp WebSocket bileşeni üzerinde çalıştığı, *fiber.Ctx yönteminin Locals, Params, Query ve Cookies gibi kullanıldığı bir örnektir. İşte Fiber'da WebSocket kullanımına dair bir örnek.

Not: Go sürümü 1.18 ve üzeri gereklidir.

Kurulum

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

Fonksiyon İmzası

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

Yapılandırma

Özellik Tür Açıklama Varsayılan Değer
Filtre func(*fiber.Ctx) bool Ara yazılımı atlamak için bir işlev tanımlar. nil
HandshakeTimeout time.Duration HandshakeTimeout, el sıkışmayı tamamlamak için süreyi belirtir. 0 (zaman sınırlaması yok)
Altprotokoller []string Altprotokoller, istemcinin istediği altprotokolleri belirtir. nil
Kaynaklar []string Origin başlığına göre izin verilen kökenler. Boşsa, herhangi bir kökene izin verir. nil
OkumaArabellekBoyutu int OkumaArabellekBoyutu, iletilerin alınması için G/Ç arabelleği boyutunu belirtir (byte cinsinden). 0 (varsayılan boyut)
YazmaArabellekBoyutu int YazmaArabellekBoyutu, iletilerin gönderilmesi için G/Ç arabelleği boyutunu belirtir (byte cinsinden). 0 (varsayılan boyut)
YazmaArabellekHavuzu websocket.BufferPool YazmaArabellekHavuzu, yazma işlemleri için kullanılan arabellek havuzu. nil
SıkıştırmayıEtkinleştir bool SıkıştırmayıEtkinleştir, istemcinin her ileti için sıkıştırma müzakere etmesinin belirtilmesini sağlar (RFC 7692). false
Kurtarmaİşleyicisi func(*websocket.Conn) void Kurtarmaİşleyicisi, bir panik durumundan kurtulmak için bir işleme işlevidir. defaultRecover

Örnek

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 {
		// İstemcinin WebSocket protokolüne yükseltme isteyip istemediğini kontrol eder
		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'e eklenir
		log.Println(c.Locals("allowed"))  // true
		log.Println(c.Params("id"))       // 123
		log.Println(c.Query("v"))         // 1.0
		log.Println(c.Cookies("session")) // ""

		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"))
	// WebSocket sunucusuna erişim: ws://localhost:3000/ws/123?v=1.0
	// https://www.websocket.org/echo.html
}

Ön Bellek Ara Yazılımı Kullanımı Notları

Önbellek ara yazılımı kullanırken websocket: bad handshake hatası ile karşılaşırsanız, WebSocket yolunu atlamak için config.Next kullanın.

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) {}))

Kurtarma ara yazılımını kullanma hususunda dikkate alınması gerekenler

Dahili uygulama nedenleriyle, kurtarma ara yazılımı şu anda WebSocket ara yazılımıyla uyumsuzdur. Lütfen WebSocket uç noktaları için bir kurtarma işleyicisi eklemek için config.RecoverHandler kullanın. Varsayılan olarak, RecoverHandler yapılandırması kaçınma durumlarını iyileştirir, stack izini stderr'e yazar ve ayrıca error alanında panik mesajını içeren bir yanıt döndürür.

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": "hata oluştu"})
        }
    },
}

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