geri

Play! Framework ile indirmeyi durdur/sürdür desteği

09/02/2012
Şu sıralar geliştirmekte olduğum bir uygulamada kullanıcıların oldukça büyük dosyaları indirebilmelerini sağlıyorum. Dosya boyutları sıklıkla 1GB'ın üzerinde olabiliyor. Her indirme isteğinden önce uygulama, kullanıcının o dosyayı indirme yetkisi olduğunu doğruluyor ve doğrulama başarılı ise indirmeye izin veriyor. Diğer bir deyişle dosyalar statik olarak değil aksine dinamik olarak sunuluyor. Web sunucu olarak Apache HTTP proxy arkasında çalışan ve Play! Framework 1.2.4 içerisinde gelen Netty HTTP sunucuyu kullanıyorum. Dosya boyutlarının oldukça fazla olduğundan bahsetmiştim. Bu durumda kullanıcıların indirme işlemine herhangi bir sebeple oluşan kesintinin ardından kaldıkları yerden devam etmeleri büyük önem kazanıyor. Flashget ya da DownThemAll! gibi indirme yöneticileri kullanıcılarına bu imkanı veriyorlar. Fakat söz konusu süreç yalnızca istemci tarafında bitmiyor. Eğer web sunucu bu desteği vermiyorsa durdur/sürdür(pause/resume) işlemi gerçekleşemiyor. Bu işlem için HTTP protokolünün Range başlığı kullanılıyor. Ayrıca sunucunun istemciye Range başlığını kabul ettiğini belirtmek için Accept-Ranges başlığını göndermesi gerekiyor. Aslında tüm bu süreç hem Apache HTTP server hem de Netty server tarafından destekleniyor. Fakat dosyaları statik sunmadığınız zaman durum ne yazık ki değişiyor. Play! Framework ile gelen renderBinary() metodu binary dosyaları istemciye gönderebilmeniz için hem yalın hem de çok kullanışlı bir özellik olsa da Range başlığı desteği sunmuyor. Konu üzerinde biraz araştırma yaptığımda kuyrukta bekleyen bir pull isteğine rastladım. Söz konusu yama renderBinary metoduna Range başlığı desteği ekliyor. Ancak yama henüz kuyrukta olduğundan en erken bir sonraki Play! Framework sürümüne dahil edilecek. Durum böyle olunca kendi başımın çaresine bakmak durumunda kaldım. HTTP protokolüne uygun şekilde bir gerçekleme yaptım ve DownThemAll! ile başarılı sonuç aldım. Böylece kullanıcılarım birden fazla thread ile dosya indirme ve indirmeyi durdurup sürdürme imkanına kavuştular. Gereken kodları içeren bir gist hazırladım. Aşağıda paylaşıyorum.

Follow me on Twitter

yorumlar Disqus aracılığıyla sunulmaktadır