برای ادامهٔ دانلود،نیمهٔ ذخیرهشده باید به همان نسخهٔ پاسخ تعلق داشته باشد. If-Rangeاز سرور میخواهد در صورتِ تطبیقِ validator،بازه را پردازش کند و در صورتِ تغییر،Rangeرا کنار بگذارد و نسخهٔ کامل را بدهد. بنابراین پاسخِ۲۰۰کامل را نباید به قطعهٔ قدیمی چسباند. تمرینِ محلی دو نسخهٔ اصیل میسازد و تفاوتِappendوreplaceرا با برابریِ دقیقِ بایت آزمایش میکند.
یک قطعه از نسخهٔ اول نگه داشتهایم
نسخهٔ قدیمی رشتهٔ بایتیِOLD-0123456789-ENDاست. کلِ آن۱۸بایت دارد و هفت بایتِ اول،یعنیOLD-012،ذخیره شده است. درمدل،ETagقوی ازSHA-256همینrepresentationساخته میشود؛این قراردادِ نویسنده است و روشِ ساختِ همهٔETagهای واقعی نیست.
در مسیرِ بدونِ تغییر،درخواستِ ادامه از بایت۷باهمانETagبهپاسخ۲۰۶میرسد. بازهٔ پاسخ۷تا۱۷،شاملِ دو انتهاست؛بدنه۱۱بایت دارد. پس از کنترلِ مرزها و هویتِ قطعهٔ ذخیرهشده،چسباندنِ آنها دقیقاً نسخهٔ اول را بازسازی میکند.
با تغییرِ نسخه،کلِ پاسخ جایگزین شود
نسخهٔ جدیدِNEW-abcdefghij-ENDمحتوایِ دیگری وETagدیگری دارد. چونIf-Rangeِکلاینت هنوزtagقدیمی است،مدل پاسخ۲۰۰وتمامِ بایتهای نسخهٔ جدید را میدهد. کلاینت این بدنه را جایِ فایلِ قبلی میگذارد؛نتیجه باید دقیقاً همان نسخهٔ جدید باشد.
| حالتِ تمرین | پاسخ | تصمیمِ کلاینت |
|---|---|---|
| tagتطبیق،Rangeپشتیبانی | ۲۰۶با بازهٔ سازگار | کنترل،سپس append |
| tagتغییرکرده | ۲۰۰کامل | replace |
| Rangeنادیدهگرفتهشده | ۲۰۰کامل | replace،حتی باtagهمسان |
مسیرِ اشتباه هم واقعاً حساب میشود:چسباندنِ قطعهٔ قدیمی به پاسخِ کاملِ جدید،OLD-012NEW-abcdefghij-ENDمیسازد. این مقدار نه نسخهٔ اول است و نه دوم؛داشتنِ پاسخِ موفقِHTTPبهتنهایی یک فایلِ درست نمیسازد.
۲۰۶هم بدونِ کنترل،مجوزِ چسباندن نیست
کلاینتِ نمونه،برابریِtagبا قراردادِ ذخیرهشده وSHAِپیشوندِ موجود را کنترل میکند. شروع باید برابرِ طولِ پیشوند باشد،پایان با طولِ کل سازگار بماند و طولِ بدنه با اختلافِ دو سرِ بازه تطبیق کند. طولِ مورد انتظار نیز متعلق به همان نسخهٔ ذخیرهشده است؛برای پاسخ۲۰۰جدید از آن برایappendاستفاده نمیشود.
پنج پاسخِ ناسازگار واقعاً رد میشوند:شروعِ اشتباه،بدنهٔ کوتاه،طولِ کلِ ناهماهنگ،پیشوندِ تغییرکرده وtagاشتباه. ورودیِ validatorضعیف هم حالتِ ششمِ ردشده است. این بررسیها subsetِاعلامیاند؛parserِکاملِسربرگ،فایلسیستم،امضایِ ناشر یا تمامِ سیاستِ کش در آن پیاده نشده است.
ETagضعیف برای If-Range نفرستیم
RFC9110برایIf-Rangeِکلاینت،entity-tagضعیف را مجاز نمیداند. مدل فقط strong-tagرا پوشش میدهد؛HTTP-dateاز دامنه بیرون مانده است. نداشتنِtagقوی را با حذفِحرفِWازtagضعیف حل نمیکنیم؛دراینکد چنین تبدیلِ حدسی وجود ندارد.
همچنین تطبیقِ شرط،تضمینِ عمومیِ۲۰۶نیست؛سرور ممکن استRangeرا پردازش نکند. برای همین یک مسیرِ واقعیِ مدل،باtagهمسان وrange_supported=falseپاسخ۲۰۰میدهد وکلاینت باز همreplaceمیکند. مقدارِAccept-Rangesدریکزمان،قولِ همیشگیِپاسخِجزئی نیست.
با If-Matchاشتباه نشود
If-Matchدر ویرایش برای پیششرطِ نوشتن و جلوگیری از overwriteِنسخهٔ کهنه کاربرد دارد. If-RangeدراینمثالِGET،باعدمِتطبیق،دریافتِکامل را انتخاب میکند؛آن را همان مسیرِ۴۱۲ِنوشتن نمینامیم. راهنمایRangeصوت نیز مرزِ بایت و زمان را جدا بررسی میکند.
نسخهٔ اجراPython۳٫۱۲٫۱۴است. هر دوrepresentationفقط بایتهای ساختگیِحافظهاند؛شبکه،CDN،سرورِسایت،فایلِمشتری،multipartوفشردهسازی اجرا نشدهاند. نتیجه،کیفیتِپخش یا توانِدانلودِمحصول را اندازه نمیگیرد.
قراردادِ تحویل را همراهِ نسخه روشن کنیم
اگر برای خروجیِ اپراگو مسیرِتحویل یا دانلودِقابلِادامه لازم دارید،میزبان،validatorورفتارِ۲۰۰/۲۰۶را درهمانپروژه مشخص کنید. اینمقاله وجودِچنینمیزبانی یاپشتیبانیِRangeدرمحصول رااعلام نمیکند. ارزشِتمرین،قابلبررسیکردنِتصمیمِجایگزینیِنسخه است تا دو فایلِمتفاوت بیصدا یک فایل فرض نشوند.
فایل تمرین و منبع
کدِ کاملِ محلیِ تمرین و کنترلهایش · دادهٔ اصیل و نتیجهٔ اجرای واقعی؛ نویسههای کنترلی escape شدهاند
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.