الخلاصة

  • تمنح خاصية download صفحة الويب وسيلة لطلب حفظ المورد واقتراح اسم له، بينما تستطيع استجابة الخادم اقتراح اسم عبر HTTP.
  • سجّل نقاش Mozilla في 2013 وWHATWG في 2017 الخلاف حول تنزيل محتوى يأتي من موقع مختلف عن صفحة الرابط.

حين ترى زر «تنزيل التقرير»، يبدو أن المهمة قد انتهت قبل أن تبدأ. التقرير جاهز، واسمه مكتوب، وما عليك إلا النقر. لكن المتصفح يتلقى ما يشبه طرداً عليه أكثر من بطاقة. الصفحة التي وضعت الزر تقترح اسماً. الخادم الذي يرسل البيانات قد يقترح اسماً آخر. والمتصفح هو من سيضع الطرد في نظام الملفات المحلي. يمكن للجميع الكتابة على الورق؛ واحد منهم فقط يملك مفتاح الخزانة.

قدّم RFC 6266 الصادر في يونيو 2011 لغة الخادم لهذه المهمة. ترويسة Content-Disposition تستطيع أن تقول attachment ليعامل المستلم الاستجابة كملف يُحفظ، وأن تقدم filename أو filename* للاسم؛ الصيغة الثانية تستوعب أحرفاً دولية. يصف النص الاسم بأنه إرشاد للمستلم. وعليه إزالة أجزاء المسار التي قد تشير إلى مجلد غير مقصود، والانتباه إلى الامتدادات الخطرة والرموز المربكة. حتى لو كتب الخادم مساراً كاملاً على البطاقة، لا يصبح ذلك تصريحاً بالكتابة حيث يشاء في جهاز الزائر.

ثم ظهر طلب الصفحة في HTML. يضع سجل منصة Chromium الخاصية a[download] ضمن ما أتيح في الإصدار M14. يستطيع محرر الصفحة أن يطلب حفظ هدف الرابط بدلاً من فتحه، وأن يقترح اسماً ضمن قيمة الخاصية. هذه فائدة واضحة للرسوم والوثائق والملفات التي تنشئها الصفحة نفسها. لكن الرابط قد يقود إلى ملف يستضيفه موقع آخر. عندها يختلف صاحب الزر عن صاحب البيانات.

تكشف تذكرة Mozilla من عام 2013 موضع الشد. رابط لصورة على أصل آخر يحمل download="filename.png": Firefox يعرض الصورة، وChrome ينزلها. صاحب التذكرة رأى اختلافاً يستحق الإصلاح. رد Mozilla اعتبر السلوك إجراءً أمنياً ضرورياً وأغلق البلاغ. خلف نقرة واحدة كانت هناك مسألة صلاحية: إلى أي مدى تستطيع صفحة أن تأمر المتصفح بحفظ محتوى يقدمه موقع آخر؟

وفي أبريل 2017، فصلت مناقشة WHATWG النتيجتين. في الحالة المذكورة آنذاك، تجاهل Firefox وSafari خاصية التنزيل عبر الأصول، بينما نفّذ Chrome التنزيل وتجاهل الاسم المقترح من الصفحة. أوضح محرر في المعيار أن الخوارزمية وقتها سمحت بالمسارين، ودعا إلى تقارب التنفيذ. صار واضحاً أن قرار «احفظ الملف» وقرار «سمّه هكذا» قد ينفصلان. وفي العام نفسه، أعلن WebKit دعم الخاصية في Safari 10.1 على macOS، بما في ذلك حفظ بيانات Blob التي تصنعها الصفحة. الفائدة وصلت إلى المستخدمين، والنقاش حول الحدود استمر.

يصف معيار HTML الحالي توزيع الأدوار: download يعلن نية الصفحة ويقترح الاسم، وقد يتقدم اسم Content-Disposition القادم من الاستجابة عليه. وعند عبور حدود المواقع، تصبح attachment من خادم المورد إشارة لازمة لتجنب تنزيلات مفاجئة تفرضها صفحة أخرى. بعدها يحدد المتصفح اسماً ومكاناً محليين آمنين.

وتظهر أهمية الاسم أكثر حين يكتب الخادم اسماً بلغة المستخدم عبر filename*. قد تقترح الصفحة اسماً مختصراً، ويرسل الخادم عنواناً عربياً كاملاً، ثم يضبط المتصفح المحارف التي لا يقبلها نظام الملفات. يصبح الاسم جزءاً من تجربة القراءة بعد انتهاء الاتصال بالشبكة: هو ما سيبحث عنه الشخص غداً، وما سيظهر حين يرسل الملف إلى زميله. هنا تنتهي نكتة البطاقات الثلاث وتبدأ مسؤولية تسليم شيء يمكن العثور عليه وفتحه بأمان.

هكذا يحمل زر صغير تاريخ تفاوض كامل. الصفحة صممت الواجهة، والخادم أرسل المحتوى، والمتصفح وقّع الاستلام على جهاز المستخدم. الاسم الظاهر في مجلد التنزيلات هو محضر هذا التفاوض؛ من يختار الحروف يحدد كيف سيعيش الملف خارج الصفحة.