Go ile Websockets. Websocket.upgrader nedir?

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.


Go ile Websockets. Websocket.upgrader nedir?

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.

Bir soru, öneri ya da yorumunuz mu var?

Evren Bal

Ben Evren BAL

1996'dan beri ‘Internet canlısıyım!’

Evren Bal Hakkında daha fazla bilgi.

Tanışmak isterseniz hemen sosyal medyadan iletişime geçebilirsiniz.

Bana Ulaşın

Bana Ulaşın

  • Bir sorunuz mu var?
  • Yazıda bir hata mı farkettiniz?
  • Sayfa ile ilgili bir öneriniz mi var?
  • Yazmamı önereceğiniz bir konu mu var?

Lütfen iletişim formunu kullanarak veya sosyal medya hesaplarımdan bana ulaşın.

Digital Ocean Logo

VPS sunucusu denemek ister misiniz?

Digital Ocean'a referans bağlantımdan kayıt olarak yeni oluşturacağınız hesabınızı 60 gün geçerli 100$ kredi ile açabilirsiniz. Bu miktar yüksek performanslı VPS'leri bile denemeniz için yeterlidir.

Yapacağınız onca kurulumun boşa gitmemesi için benim tavsiyem uzun vadede kullanabileceğiniz özellik ve maliyetlerde bir sunucu oluşturmanızdır.

Ücretsiz 100$ kredi bağlantısı

60 günlük denemeniz sonunda eğer devam etmek istemezseniz hiç bir ücret ödemeyeceksiniz. Hizmeti kullanmaya devam etmek isterseniz harcamanız 25$'a ulaştığında benim hesabıma da 25$ kredi yüklenecektir.

Diğer bir deyişle, siz 100$ ücretsiz krediyi her halükarda kazanırken, daha sonra ücretli devam etmeye karar verirseniz ben de 25$ kredi kazanacağım.

Copyright © 2022 - Evren BAL