Go Programınıza Chrome Gibi Konuşmayı Öğretmek

Textbook mükemmelliğinde bir ifadeyle yurt dışında kahve sipariş ettiyseniz, baristanın size verdiği bakışı bilirsiniz. Dilbilgisi doğrudur. Her kelime sözlükte bulunur. Yine de yarım saniye içinde kafedeki herkes sizin şehir dışından geldiğinizi anlar.
Go'nun standart HTTP istemcisi de benzer bir sorunla karşı karşıyadır. Güvenilir, temiz ve kutudan çıktığı gibi ciddi işler için hazır olan harika bir varsayılandır. Ancak programınız bir sunucuya ulaştığında, bunun bir Go programı olduğu açıkça anlaşılır. Çoğu zaman bu kimsenin umurunda olmaz. Yine de bazı web siteleri, CDN'ler ve test düzenekleri kapıyı kimin çaldığına büyük dikkat gösterir ve karşılarındaki istemcinin türüne göre oldukça farklı davranır.
Bu nedenle gosuda.org/chromenet paketini geliştirdik. Go'nun standart istemcisini geçerli bir tarayıcı taklidi yapmaya yönlendirmek yerine, chromenet bir Go programının Google Chrome'un kullandığı ağ motoruyla, yani Chromium'un kendi ağ koduyla web ile iletişim kurmasına olanak tanır. Test düzeneklerinizin tarayıcı trafiğini nasıl ele aldığını incelemek ya da seçici bir CDN arkasındaki bir siteyle iletişim kurmak isteyin, Chrome'un motoru üzerinden konuşmak tahmin yürütmenin bir katmanını tamamen ortadan kaldırır.
Uygulamanızı kullanmak için yeniden yazmanız gerekmez. Kodunuzda bu paket http.Transport yerine doğrudan kullanılabilen bir bileşen olarak çalışır. http.Client'ı her zamanki gibi kullanmaya devam edersiniz, iletişimin altyapısını ise chromenet yönetir.
En son sürümü denemek için go get komutuyla kurun:
1go get gosuda.org/chromenet@v0.2.10157081033800
Ardından taşıyıcısını (transport) istemcinize verin:
1client := http.Client{
2 Transport: chromenet.NewTransport(chromenet.Options{}),
3}
Bu sürümle birlikte modern web trafiğinin tamamı Chrome'un motoru üzerinden geçer. Artık sıradan web istekleri, WebSocket ve WebTransport'u kapsamaktadır. Önceki sürümler yalnızca sıradan istekleri düzgün şekilde işliyordu, WebSocket ve WebTransport ise geçici çözümlerdi. Bu, kapıda yaptığınız ilk selamlamanın Chrome gibi duyulduğu, ancak konuşma tarzını değiştirdiğinizde kılığınızın ortaya çıkabileceği anlamına geliyordu. Bu sürüm, bu geçici çözümleri gerçek olanlarla değiştirir.
Peki, Chromium'un kendi ağ kodunu kullanıyorsak, sessiz Go derlemeniz çok büyük bir C derleyicisi baş ağrısına dönüşmez mi? Neyse ki hayır. Go kodunuz düz Go olarak kalır; cgo gerekmez ve bir C derleyicisine ihtiyaç duyulmaz.
chromenet, tarayıcı kodunu doğrudan ikili dosyanıza gömmek yerine motoru Go programınızın yanında çalışan küçük ayrı bir program olarak çalıştırır. Bunu, kendi ses tellerinizi yeniden inşa etmeye çalışmak yerine yanınızda yürüyen akıcı bir yerel tercümana benzetebilirsiniz. Motor ayrı bir programda çalıştığı için, içindeki bir çökme hizmetinizi durduramaz.

Go programınız düz Go olarak kalırken, küçük bir yardımcı program trafiği Chromium'un ağ motoru üzerinden taşır.
İş istasyonunuzda ya da sunucularınızda ayrıca kurmanız gereken bir şey yoktur. Intel/AMD ve ARM mimarilerinde Linux, macOS ve Windows için motor ikili dosyaları doğrudan Go modülünün içinde gelir ve çalıştırılmadan önce doğrulanır.
Modül içinde ikili dosyalar taşımak, güven konusunu önemseyen herkes için doğal olarak bir soru doğurur ve biz bunun açık bir yanıtını vermek istedik. İkili dosyalar belirli bir Chromium sürümünden (şu an Chromium 157) yeniden üretilebilir bir biçimde derlenir; dolayısıyla herkes bunları yeniden oluşturup tam olarak aynı baytları elde edebilir ve her sürüm GitHub tarafından onaylanır. Tarayıcı dünyasını manuel bir iş yükü olmadan takip etmek için, zamanlanmış bir görev Chromium'un kararlı kanalını izler ve yeni bir Chrome sürümü yayımlandığında sürümü otomatik olarak günceller.
uTLS hakkında ne demek?
Daha önce bir Go istemcisini tarayıcı gibi göstermeyi denediyseniz, büyük ihtimalle uTLS ile karşılaşmışsınızdır. Bu, güzel bir çalışmadır: Go kütüphanesi, güvenli bir bağlantının ilk mesajını Chrome, Firefox ya da istediğiniz başka bir tarayıcıya benzeyecek şekilde kılık değiştirmenize olanak tanır. Küçüktür, saf Go'dur ve programınızın yanında ek bir şey çalışmaz.
Sorun, kılığın ne kadar ileri gittiğindedir. uTLS yalnızca el sıkışmayı, yani konuşmanın ilk birkaç sözünü kapsar. Bundan sonrası hâlâ sizin inşa etmeniz gereken şeydir: HTTP/2 katmanını elle bağlayıp ayarlamanız gerekir, HTTP/3 ayrı bir maceradır ve WebSocket ya da WebTransport ise daha fazla yapıştırıcı kod anlamına gelir. Chrome ön ayarları da kopyalardır; Chrome alışkanlıklarını her değiştirdiğinde birilerinin bunları güncel tutması gerekir. Bu, bir kişinin aksanını taklit etmeye benzer; ancak vücut dili hâlâ sizi ele verir.
chromenet ise tersi yolu izler. Chrome'u taklit etmez, konuşmayı Chrome'un kendi motoruna bırakır. Böylece el sıkışma, bağlantıların yeniden kullanım biçimi, protokol yükseltmeleri ve taşıyıcılar tek bir yerden gelir ve Chromium değiştikçe birlikte değişir.
Bu bir takastır ve bunu açıkça söylemek isteriz. uTLS daha hafiftir ve hayal edebileceğiniz her selamlamayı tasarlamanıza izin verir; chromenet ise 25 MB'lık bir yardımcı program getirir ve özel bir davranış yerine Chrome'un davranışını sunar. Küçük bir bağımlılık ve el sıkışma üzerinde tam kontrol istiyorsanız, uTLS hâlâ harika bir seçimdir.
Her tasarımın bedelleri vardır ve buradaki sınırları baştan belirtmek istiyoruz. Gerçek bir tarayıcı ağ motorunu paketlemek küçük bir iş değildir: her motor ikili dosyası yaklaşık 25 MB'dır. macOS'te ikili dosyalar notarize edilmemiştir. Linux'ta ise sisteminizde glibc 2.31 veya daha yeni bir sürüm bulunmalıdır. Bu sınırlar kurulumunuza uyuyorsa, tek bir taşıyıcı alanını değiştirerek gerçek Chrome ağ özelliklerine sahip olursunuz.
Proje github.com/gosuda/chromenet adresinde yer almaktadır. gosuda açık kaynak ailesindeki kardeş projeleri, yani gosuda.org/hqq ve gosuda.org/sqlite3'ü biliyorsanız, ruh hali tanıdık gelecektir: yazılım dünyasının daha geniş alanından güçlü ama ağır araçları alıp düz Go'da kendi evindeymiş gibi hissettirmek.
Bu nedenle, Go programınızın bir tarayıcı gibi görünmesi gerektiği için uTLS'e uzanıyorsanız, chromenet'i deneyin. Özellikle yalnızca HTTPS isteklerinden fazlasına ihtiyaç duyduğunuzda iyi bir alternatif olabilir: HTTP/2, HTTP/3, WebSocket ve WebTransport, sizin tarafınızda yapıştırıcı kod olmadan aynı Chrome motoru üzerinden geçer.