const
TsaMaxResponseBytes = 4 * 1024 * 1024;
TsaRequestTimeoutSeconds = 30;
TsaConnectTimeoutSeconds = 30;
function TsaHttpAvailable: Boolean;
function TsaHttpBackendName: string;
function PostTimeStampQuery(const TsaUrl: string; const ReqDer: TBytes;
out RespDer: TBytes): Boolean;
FPdfTsaFpc هو نقل الطوابع الزمنية لغير Windows الذي تستهلكه FPdfTsa، وهو نظير FPdfTsaWin. يرسل TimeStampReq مرمَّزًا بأسلوب POST إلى عنوان URL لسلطة طابع زمني عبر HTTP أو HTTPS ويجمع بايتات TimeStampResp؛ ويبقى بناء DER وتحليله في FPdfTsa
النقل يتم عبر libcurl مربوط في وقت التشغيل لا مرتبط وقت البناء، فالمكتبة ليست تبعية بناء وغيابها يُبلَّغ عنه بدل أن يُخفق التحميل. والمرور عبر libcurl يُبقي أيضًا رزمة TLS خارج هذه الوحدة: يختار libcurl خلفيته الخاصة ويتحقق من سلسلة الخادم مقابل مخزن ثقة المنصة
يُبلِّغ TsaHttpAvailable عمّا إذا وُجدت libcurl وحُلَّت نقاط الدخول المطلوبة؛ ويسمي TsaHttpBackendName الخلفية المحلولة؛ وتجري PostTimeStampQuery تبادل HTTP وتعيد False (بدل إطلاق استثناء) عند أي إخفاق في النقل، ما يتيح للمستدعي إضافة سياقه الخاص وسياسة إعادة المحاولة
قسم الواجهة بأكمله يُترجَم تحت FPC وحده. وتحت Delphi تكون الوحدة فارغة، لأن Delphi يستهدف Windows و FPdfTsaWin هي الخلفية هناك. ومع ذلك تُترجَم الوحدة على كل أهداف FPC بما في ذلك Windows، حيث تفضّل FPdfTsa خلفية WinHttp ولا يستدعي أحد هذه الوحدة
تقطع أنواع مقابض libcurl وروابط نقاط الدخول وثوابت الخيارات في قسم التنفيذ؛ ولا يكشف قسم الواجهة سوى فحص التوافر واسم الخلفية ومساعد الإرسال وحدود النقل الثلاثة
| الدالة | الوصف |
|---|---|
TsaHttpAvailable | تعيد True عندما يُعثر على libcurl وتُحل كل نقطة دخول مطلوبة في وقت التشغيل |
TsaHttpBackendName | تعيد اسم الخلفية المحلولة، وهي libcurl عندما يكون النقل صالحًا للاستخدام وسلسلة فارغة غير ذلك |
PostTimeStampQuery | ترسل ReqDer بأسلوب POST إلى TsaUrl وتملأ RespDer بمتن TimeStampResp الخام؛ وتعيد False عند إخفاق النقل |
| الثابت | القيمة | الوصف |
|---|---|---|
TsaMaxResponseBytes | 4 * 1024 * 1024 | الحد الأعلى لمتن TimeStampResp المقبول؛ والاستجابة الأكبر تُجهض النقل بدل تنمية المخزن بلا حدود. ويُبقى هذا الثابت متطابقًا مع مثيله في FPdfTsaWin |
TsaRequestTimeoutSeconds | 30 | ميزانية الطلب الكامل بالثواني، مطابقة لمهلات WinHttp حتى لا يعلّق TSA ميت خيط توقيع على أي من المنصتين |
TsaConnectTimeoutSeconds | 30 | ميزانية الاتصال بالثواني، وتُطبَّق قبل ميزانية الطلب |
Content-Type: application/timestamp-query ويتوقع application/timestamp-reply؛ ويُكبَح العنوان Expect: 100-continue حتى لا يعطِّل مستجيب صامت متنًا أكبر من 1 كيلوبايتhttp و https، ولا تُتبع إعادة التوجيهات: المستجيب الذي يجيب بإعادة توجيه يُعامل كأنه سيئ الإعداد بدل إعادة المحاولة بصمت على نقطة نهاية لم يسمِّها المستدعي أصلًاTsaHttpAvailable ويُبقى المقبض عمدًا مفتوحًا طوال عمر العملية، لأن إلغاء تحميلها أثناء وجود خيط آخر داخل نقل سيُسقط المضيف. وتبقى مهلات الحلال المعتمدة على الإشارات معطلة حتى يعمل التوقيع على خيوط عاملةTsaHttpAvailable القيمة False وتُبلِّغ FPdfTsa عن PadesTsaAvailable = False ما لم يكن هناك نقل آخر مسجل عبر PadesTimestampOverride