İki doğru parça birlikte yanlış kaynak olabilir

Ajan bir dosyanın ilk bölümünü aldı, bağlantı kesildi ve kalan bölümü sonra indirdi. Her parça tek başına doğru aktarılmış olabilir. Ancak arada kaynak değiştiyse birleştirilen metin hiçbir gerçek sürüme ait olmayabilir. Böyle bir belgeyi modele özetletmek, baştan karışmış bir kaynağı akıcı biçimde anlatmasına yol açar. Bütünlük kontrolünü özetin sonunda değil, parçaları birleştirirken yapmak gerekir.

Bu uygulama tek bir kaynağın HTTP bayt aralıklarıyla okunmasını ele alır. Sayfalı kayıt listesi veya birden çok belgeyi birleştirme işlemi değildir. Kaynak, sekiz ASCII bayttan oluşan sentetik bir metindir. ASCII seçimi, bu örnekte her karakterin bir bayt olmasını sağlar; Türkçe karakterli gerçek dosyalarda karakter sayısını doğrudan bayt aralığı sayamazsınız. Gerçek ağ isteği yapılmaz.

Özgün sentetik kaynak sürümleri
KaynakGüçlü ETagTam içerikBayt sayısıA+B
/demo.txt"v7"A=2;B=3;85
/demo.txt"v8"A=7;B=5;812

v7 ve v8 burada kolay okunması için seçilmiş doğrulayıcı etiketleridir. ETag metnini genel bir sürüm sayacı gibi büyüklük karşılaştırmasına sokmayın. Kullanılan değer, aynı kaynak temsilinin eşleşip eşleşmediğini kontrol etmek içindir. Örnekte sıkıştırma veya içerik dönüşümü yoktur; iki sürüm için de aynı kaynak ve aktarım sözleşmesi kullanılır.

Devam isteğine kaynak koşulunu ekleyin

HTTP aralık isteklerinde 206 yanıtı kısmi içeriği ve Content-Range bilgisiyle hangi aralığın geldiğini belirtir. Koşullu aralık isteği, daha önce alınan parçadan sonra kaynağın değişip değişmediğini dikkate alır. MDN’nin aralık istekleri rehberi, koşul tutmadığında tam kaynağın 200 yanıtıyla gönderilebileceğini açıklar. Bu yüzden yalnızca istekte bir aralık yazmış olmanız, gelen gövdenin mutlaka o aralık olduğu anlamına gelmez.Kaynak: MDN — HTTP range requests

Sentetik aktarım izi
AdımİstekYanıtGövde
1GET /demo.txt; Range: bytes=0-3206; ETag: "v7"; Content-Range: bytes 0-3/8A=2;
2Kaynak v8 olarak değişirİstemcide yalnız v7 ilk parçası varYeni tam kaynak A=7;B=5;
3GET /demo.txt; Range: bytes=4-7; If-Range: "v7"200; ETag: "v8"; tam gövdeA=7;B=5;

If-Range, koşul sağlandığında aralık yanıtını; sağlanmadığında tam kaynak yanıtını ayırır. MDN, bu başlıkta W/ ile başlayan zayıf ETag kullanılmaması gerektiğini de belirtir. Örneğimiz güçlü ETag ve bu davranışı destekleyen bir sunucu varsayar. Gerçek araç bu bilgileri göstermiyorsa, modelden görünmeyen sürüm garantisi üretmesini istemeyin.Kaynak: MDN — If-Range header

Üçüncü adımda 200 geldiği için gövdeyi “kalan dört bayt” diye ele alamazsınız. Sekiz baytlık tam v8 içeriği alınmıştır. Eski dört baytın yanına eklemek A=2;A=7;B=5; sonucunu üretir. Hem uzunluk on ikiye çıkar hem de A iki kez bulunur. Gelen gövde, eski eksik kopyanın yerine geçmelidir.

Yanıt türünü gördükten sonra birleştirme kararı verin

Kopyalanabilir parça bütünlüğü denetimi
/demo.txt için verilen v7/v8 içeriklerini ve üç adımlı sentetik izi kullan. Bayt aralıkları uçları dahil sayılır. İlk 206 gövdesini v7 ile sakla. Sonraki If-Range isteğine gelen 200 tam gövdeyi eski parçaya ekleme. Kaynak, ETag, Content-Range, gövde uzunluğu ve tam/kısmi durumunu ayrı değerlendir. Son kabul edilen metni ve A+B hesabını yaz. Gerçek indirme veya dosya yazma yapma; ETag değerlerini büyüklüğe göre sıralama.
Elle hazırlanmış beklenen sonuç
İlk kayıt: v7, bytes 0-3/8, A=2;, eksik kaynak.
Son yanıt: 200, v8, sekiz baytlık tam A=7;B=5; içeriği.
Karar: Eski v7 parçasını yeni tam gövdeye ekleme; aktif içerik olarak tam v8 kullan.
Son alanlar: A=7, B=5. Toplam: 12. Kaynak tek ve tutarlı temsilden oluşur.

Yalnızca son toplamı kontrol etmek de yeterli değildir. Bir uygulama A anahtarının ilk değerini seçebilir, diğeri son değerini seçebilir. İki farklı yorumun birinde beklenen toplam çıkması, yinelenen alanlı dosyayı doğru yapmaz. Önce aktarım bütünlüğü ve alanların tekilliği, ardından bu örnekteki basit hesap doğrulanmalıdır.

Koşulsuz ikinci aralık isteği v8’in B=5; parçasını döndürseydi, v7’in A=2; parçasıyla birleşen metin A=2;B=5; olurdu. Uzunluğu sekizdir ve her alan bir kez bulunur. Yine de ne v7 ne v8 budur. Bu karşı örnek, uzunluk ve alan sayısının tek başına aynı sürüm garantisi olmadığını gösterir.

İndirme kaydında hangi alanlar kalmalı?

  • Kaynak adresi ve kullanılan temsil koşulları her parçada aynı bağlamı göstermeli.
  • 206 için bildirilen aralık ile gelen bayt sayısı uyuşmalı; boşluk veya örtüşme varsa incelenmeli.
  • Parçalar birleştirilmeden önce aynı güçlü doğrulayıcıyla ilişkilendirilmeli.
  • 200 tam gövdesi, istenen aralığın uzunluğunda varsayılmamalı; eksik eski kopya üzerine körlemesine eklenmemeli.

Bazı sunucular aralık isteğini desteklemeyip baştan tam 200 yanıtı verebilir. Bu da yanıtı okumadan sadece istek planına göre dosya birleştirmenin yanlış olduğunu gösterir. Araç sözleşmesi aralık, doğrulayıcı veya toplam boyut hakkında yeterli bilgi taşımıyorsa aktarımı tamamlandı diye kapatmayın. Desteklenen tam okuma yolu veya sorumlu incelemesi gerekebilir.

Bu örnek, indirilen içeriğin doğruluğunu veya güvenilir kaynaktan geldiğini ayrıca kanıtlamaz. ETag eşleşmesi kimlik doğrulama ya da zararlı içerik denetimi değildir. Burada yalnızca bir kaynağın aktarım sırasında farklı temsillerden karışmamasını sınadık. Modelin cevabında kullanılacak belgenin yetkisi ve yürürlük durumu yine kendi kontrollerini gerektirir.

Gerçek dosyalarda bayt aralığı hesabını karakter indeksleriyle yapmak başka bir hataya yol açabilir. Bu eğitimde A, B, eşittir, noktalı virgül ve tek basamaklı sayılar ASCII olduğu için sınırlar elle izlenebiliyor. Daha karmaşık içerikte aktarım katmanının bayt bilgisi kullanılmalı; modelin metindeki harfleri sayması dosya bütünlüğü denetimi sayılmamalıdır.

Kaynak hiç değişmeseydi

İkinci adımda kaynak değişmesin. Üçüncü isteğe 206, ETag "v7", Content-Range bytes 4-7/8 ve B=3; gövdesi dönsün. İlk parçayla birleştirme koşullarını ve beklenen toplamı yazın. Sonra aynı gövdenin ETag "v8" ile geldiğini varsayın; yalnızca metin kısa diye kabul edip edemeyeceğinizi açıklayın.

Alıştırmanın cevabı
Değişmeyen v7 durumunda iki aralık 0-3 ve 4-7, aynı kaynağın aynı güçlü ETag değerini taşır; sekiz bayt kesintisiz tamamlanır. A=2;B=3; ve toplam 5 elde edilir. İkinci parça v8 etiketi taşıyorsa bu birleştirme koşulu sağlanmaz; karışık kaynak kabul edilmez.

Kendi belge akışınız için kısa bir kesilme ve devam etme izi hazırlayın. Teslimatınızda yalnızca dosya adı değil, hangi yanıtların hangi temsille tamamlandığı da bulunsun. Böylece asistanın düzgün bir özet üretmesinden önce, özetleyeceği kaynağın gerçekten tek bir kaynak sürümü olduğunu sınayabilirsiniz.

Kaynaklar ve doğrulama

  • MDN — HTTP range requests

    Kısmi içerik, Content-Range ve koşullu aralık isteğinde 200/206 farkı.

    Erişim ve kontrol:
  • MDN — If-Range header

    Koşul tutmazsa tam kaynağın dönmesi; If-Range içinde zayıf ETag kullanılmaması.

    Erişim ve kontrol:

İlgili okumalar

AI Ajanları ve İş Akışı Otomasyonu

AI Ajanları ve İş Akışı Otomasyonu programındaki belge akışlarına, yarıda kesilen bir aktarımın nasıl devam ettiğini gösteren kısa bir iz ekleyebilirsiniz. Kaynak bütünlüğü kontrolünü modelin özetinden önce konumlandırmak yararlı bir tasarım çalışmasıdır.

  • Kuruma özel planlanır