Bir süredir Go ile haşır neşir oluyorum ve son 1-2 gündür de websocket üzerinde çalışıyorum. Go ile websocket destekli bir uygulama yazmak için ek paketler kullanmanız şart olmasa da, hem Amerikayı yeniden keşfetmemek, hem de benim gibi yeniyseniz kendinize fazla yüklenmemek için kullanabileceğiniz çeşitli kütüphaneler var.

Bu kütüphaneler arasında go topluluğu tarafından en yaygın kabul gören ve popüler olanı gorilla/websocket kütüphanesi. Ben kendi adıma örnekleri ve dokümantasyonu geniş olduğu için önce bu kütüphaneyle birşeyler yapmayı, ardından nhooyr/websocket kütüphanesine geçiş yapmayı düşünüyorum.

Websocket.upgrader nedir?

Siz de Gorilla/websocket kütüphanesinde daha başlarken websocket.upgrader kullanıldığını gördünüz ve ne olduğunu merak ederek Google’a yazdınız. Upgrader standart bir HTTP bağlantısını Websocket bağlantısına ‘upgrade’ eden gorilla kütüphanesi metodu. Aslına bakarsanız bir HTTP bağlatısının Websocket bağlantısına upgrade edilmesi işlemi Gorilla’ya özel bir durum değil, ama bu yazının konusu bu kütüphanenin upgrade metodu.

Temen mantık ve upgrader’ın da yaptığu şu; İstemci belirlenen HTTP adresine bir istek yaparak bağlantının Websocket bağlantısına ‘upgrade’ edilmesini istiyor, sunucu da istek gereken şartları (belirlenen kuralları) karşılıyorsa bir websocket bağlantısı oluşturup istemciye “tamamdır websocket bağlantısını açıyorum” diyor.

Upgrader tanımlanırken genelde sadece aşağıdaki gibi ReadBuffer ve WriteBuffer parametreleri ile tanımlanıyor ama oluşturma sırasında kullanabileceğiniz bir kaç parametresi daha var.

var upgrader = websocket.Upgrader{
	ReadBufferSize:  4096,
	WriteBufferSize: 4096,
}

Upgrader yapısının tüm parametrelerini aşağıda listeleyerek, hangisinin ne işe yaradığını da yorum/comment olarak belirteceğim.

type Upgrader struct {

// HandshakeTimeout 'tokalaşma' - 'handshake' süresi için bir azami süre belirler

HandshakeTimeout time.Duration

// ReadBufferSize ve WriteBufferSize specify I/O tampon büyüklüklerini bayt olarak
// belirlemek içindir. Tampon (buffer) boyutu sıfırsa HTTP sunucusu tarafından
// belirlenen tampon kuullanılır. I/O tampon boyutları gönderilecek veya alınacak
// mesajların boyutunu sınırlandırmaz.

ReadBufferSize, WriteBufferSize int

//WriteBufferPool yazma işlemleri için bir tampon havuzudur. Değer belirtilmezse
// yazma tamponları bağlantı yaşam süresi boyunca tahsis edilir. Bir havuz en çok,
// düşük miktarda ama çok sayıda bağlantı içeren uygulamalar için faydalıdır.
// Uygulamalar her benzersiz WriteBufferSize parametresi için tek bir havuz kullanmalıdır.

WriteBufferPool BufferPool

// Subprotocols sunucunun desteklediği protokolleri tercih sırasına göre belirtir.
// Bu alan nil değilse Upgrade metodu bu listenin başından balayarak istemcinin
// istediği prtokole göre bir tercih yapar. Eğer uygun sonuç yoksa protokol
// belirlenmez. (Sec-Websocket-Protokol başlığı handshake cevabında yer almaz).

Subprotocols []string

// Error HTTP hata yanıtlarını oluşturacak fonksiyonu belirler. Error nil ise
// http yanıtını oluşturmak için http.Error kullanılır.

Error func(w http.ResponseWriter, r *http.Request, status int, reason error)

// İsteğin origin başlığı kabul edilme kriterlerini saplıyorsa true döndürür.
// Eğer CheckOrigin nil ise varsayılan olarak origin header'ı varsa ve origin
// host değeri request host başlık değerinden farklıysa false döndürür. 
//
// CheckOrigin fonksiyonu cross-site istek saldırılarından korunmak için
// isteği dikkatli bir şekidle doğrulamalıdır.

CheckOrigin func(r *http.Request) bool

// EnableCompression sunucu mesaj sıkıştırmayı (RFC 7692) etkinleştirmeyi
// denemeli mi bunu belirler. Bu değeri true olarak ayarlamak sıkıştırma
// yapılacağını garanti etmez. Mevcut desteklenen modlar "no context" ve
"takeover modlarıdır.

EnableCompression bool
}

Kapak görseli Hamish Kale Unsplash

Bu Yazıda Yapılan Değişiklikler
  • 11.05.2022: Yazı özeti düzenlendi.