Laravel ile günlük olarak çalışıyorum ve bir noktada aynı projeye birden fazla ödeme geçidi entegre etmeye başladım. Her bir geçit web kancalarını farklı şekillerde gönderiyor: farklı yük, farklı başlıklar ve imza doğrulama farklı yollarla gerçekleşiyor. Bu durumu yaşayan herkes için sürpriz değil, ancak manuel test yapma hacmi hızla büyüyordu.
Kullandığım araçlar
Günlük çalıştığım Laravel ekosisteminin bir parçası olan expose.dev kullanmaya başladım. Temel işler için iyi çalıştı: bir tünel açmak, sağlayıcıyı ona yönlendirmek ve web kancasını almak. Daha tutarlı test yapma ihtiyacı hissetmeye başladıkça, her oturumda sağlayıcıda son noktayı yeniden yapılandırmak zorunda kalmamak için sabit bir alt alan adı olan versiyonunu satın aldım.
Sürekli erişim problemi ortaya çıktı. İstekler sadece konsol açıkken görünüyordu. Terminali kapattığımda veya oturumu kapattığımda, geçmişi kaybediyordum. Bir saat önce gerçekleşen bir olayı hata ayıklamak için geriye gidecek hiç bir şey yoktu.
Bunu çözmek için, tarihçeyi koruyan webhook.site’i paralel olarak kullanmaya başladım. Sorun, tünellemesinin oldukça ilkel olmasıydı: sabit otomatik yeniden bağlantı yoktu ve sık sık yönlendirme bağlantısını kaybediyordum, bu da testi ortada kesiyordu.
Sonuç: Her biri sorunun yarısını kapsayan iki aboneliğim oldu.
Karar
Bir noktada basit bir matematik formülüne dönüştü: Zaten iki eksik araca ödeme yapıyordum. İkisiyle birlikte ödenen maliyet, bir sunucu çalıştıracak kadar yeterliydi. Bu bir ürün geliştirme planı değildi, sadece bunun için ödeme yaparken, neden her iki sorunu da birden çözen bir şey yapmayayım ki?
Teknik kararlar
İlk karar, tünelleme yaklaşımıydı. Sağlayıcıdan tekrar denemesini beklemek yerine, yerel CLI ve sunucu arasında sürekli bir WebSocket bağlantısı kurmayı tercih ettim: genel istek sunucuya geliyor, soket üzerinden CLI’ye çerçeve olarak yönlendiriliyor, CLI yerel uygulamaya vuruyor ve gerçek yanıtı sunucuya geri gönderiyor, bu da orijinal sağlayıcıya iletiliyor. Bu, sağlayıcının tekrar denemesini bekleme gerekliliğini ortadan kaldırıyor ve gerçek zamanlı bağlantı durumunu sağlıyor (tünelin koptuğunu hemen biliyorum).
İkincisi, yakalamayı manipülasyondan ayırmaktı. İlk başta hedef sadece istekleri incelemek ve tünellemekti, ancak isteğin yerel ortamıma ulaşmadan önce değiştirilmesi gerektiğini fark ettim: bir başlığı düzeltmek, farklı bir yükü simüle etmek, geçmeye izin vermeden bir imzayı doğrulamak. Bunun test kodlarına sertleştirilmesi yerine, bir akış sistemi haline geldi: istek geldiği anda sırayla çalışan düğümler, tünelden önce. HMAC imza doğrulaması, yük alanına göre geçiş, başlık/varlık/yöntem dönüştürmesi, harici çağrı ile zenginleştirme, bir zaman penceresi ile idempotans, basit koşullar. Bunu görsel olarak, her test senaryosu için yeniden dağıtım gerektirmeden inşa edebilirsiniz.
Zorluklar
En zor kısım tünel değildi, hızlı ardışık gelen birkaç istekte kullanıcı arayüzünü dondurmadan “gerçek zamanlı” hissini korumak oldu, özellikle eşzamanlılık testlerinde. Diğer bir nokta ise neyi kalıcı hale getireceğinizi kararlaştırmaktı: her şeyi sonsuza dek saklamak ölçeklenmiyor, bu yüzden korumayı sınırlandırdım (bugün her hesap için son 1000 isteği saklıyorum) sonsuz bir geçmişi sürdürmek yerine.
Her geliştiricinin beğeneceği şey
Başından beri istediğim bir şey, günlük çalışmalarda web kontrol paneline bağımlı olmaktı. Terminal açıkken çalışmayı seviyorum ve web uygulamasını açarak bir web kancasının gelip gelmediğini kontrol etmek bu akışı bozuyor. Bu yüzden, ana işlev çalıştıktan sonra, CLI’da istekler için bir tail inşa ettim: her isteği gerçek zamanlı olarak, durum, gecikme ve renkli bir tablo ile izleyebilirsiniz, tarayıcıyı hiç açmadan. Terminalde yaşayan biri için bu bile testi epey değiştirdi.
Kıyaslama
webhook.site ile karşılaştırıldığında: inceleme ve saklamayı iyi yönetiyor ama tünellemeyi istikrarlı bir şekilde gerçekleştiremiyor ve gönderimden önce yükü manipüle etme özelliği yok. Üç parçayı (inceleme, stabil tünelleme ve teslimat öncesi manipülasyon) bir arada bağlayan bir araç hiç bulamadım, bu yüzden bir tane inşa ettim. Bugün her gün ödeme entegrasyonlarını test etmek için kullanıyorum ve bunu isteyen herkes için kullanılabilir hale getirdim: routely.me.
Kaynak: Orijinal Makale


