# HTTP مع ASPL 0.5.0

[English](guide.en.md) · [الدوال والحدود والأخطاء](reference.ar.md) · [التثبيت والنشر](deployment.ar.md) · [التكامل مع C](../c-interop/guide.ar.md)

تعمل الأمثلة على Linux x86-64 مع glibc 2.34 أو أحدث. توفر الأداة الأصلية
مكتبة HTTP. يرفضها المحرر على الإنترنت ونمط التضمين الخاص قبل التنفيذ.
الإصدار 0.5.0 مرشح محلي، والتنزيل المنشور 0.4.0 لا يوفر هذه الواجهة.
ابدأ [بدليل التثبيت](deployment.ar.md)، ثم عد إلى هذه الصفحة.

## خدمة نصية وحالة صريحة

انسخ [المصدر العربي](../examples/http/ar/service.لبات) مع
[settings.aspl](../examples/http/ar/settings.aspl) و
[handlers.لبات](../examples/http/ar/handlers.لبات) و
[requests.لبات](../examples/http/ar/requests.لبات) من المستودع.
احتفظ بأسماء الملفات ومساراتها النسبية. من جذر المستودع شغل أداة 0.5.0
المختارة في PATH:

```sh
aspl --version
aspl check docs/examples/http/ar/خدمة.لبات
aspl run docs/examples/http/ar/خدمة.لبات
```

يجب أن يكون الإصدار `aspl 0.5.0`. تبقى الخدمة في المقدمة على
`127.0.0.1:8080`. شغل [العميل](../examples/http/ar/client.aspl) في نافذة أخرى:

```sh
aspl check docs/examples/http/ar/عميل.لبات
aspl run docs/examples/http/ar/عميل.لبات
```

يطبع `checked text, JSON, 00 FF 41, and 404` وينتهي بالحالة 0.
يعيد GET `/hello` النص `مرحبا من ASPL` ونوع المحتوى
`text/plain; charset=utf-8`. يرسل POST `/submit` نص JSON الصريح
`{"message":"مرحبا"}` مع `application/json; charset=utf-8`.
تفحص الخدمة UTF-8 وتعيد النص. لا تحلل JSON، وعلى التطبيق التحقق من بنيته.

يعيد POST `/bytes` بايتات الطلب، ويعيد GET `/download` البايتات `00 FF 41`
تماما. يقارن العميل البايتات الثلاثة ويثبت فشل تحويل هذا المتن إلى نص
بالرمز `http.invalid_utf8`. الاستجابة المكتملة للمسار `/missing` تحمل الحالة
404 داخل نتيجة ناجحة، وتبقى حالتها ومتنها قابلين للقراءة.

يستورد كل ملف ما يستخدمه صراحة. يفعّل `استورد أساسي::ويب.` البادئة `ويب`،
ويفعّل `import core::http;` البادئة `http`. تتاح البادئة المكتوبة فقط،
وتسميات الأعضاء مثل `اطلب` / `request` تشير إلى التعريف نفسه. لا تترجم
أسماء المستخدم أو المسارات أو النصوص. تصلح `.aspl` و`.لبات` لجذر البرنامج
وللوحدات المستوردة. أمثلة اللغتين تحتفظ بأسماء المستخدم والملفات نفسها.

الدالة `handlers::handle` على المستوى الأعلى ولا تلتقط متغيرات محلية.
نوع سياقها `سياق<app::Config, app::State>` يطابق نوعي إعدادات الموجه وحالته.
تعيد `اقرأ_حالة` نسخة من القيمة، وتنشر `استبدل_حالة` قيمة جديدة كاملة.
يعرض GET `/count` العدد قبل زيادته لهذا الطلب. القراءة ثم الانتظار لطلب
صادر ثم الاستبدال ليست عملية ذرية. أعد قراءة الحالة بعد الانتظار إذا كان
التحديث يعتمد على تغييرات قد يجريها معالج آخر.

أوقف الخدمة من نافذة أخرى:

```sh
curl --http1.1 --request POST http://127.0.0.1:8080/stop
```

تطلب `أوقف(ctx)` تصريف العمل، وتكرارها لا يغير النتيجة. يمكن للاستجابة
الحالية أن تكتمل، ولا تعود `اخدم` قبل تحرير العمل المملوك لها. يطلب Ctrl+C
إلغاء التنفيذ. الإشارة الأولى تصرّف العمل، والثانية تتجاوز بقية التصريف.
يشرح المرجع المهل والنتائج النهائية.

## HTTPS موثّق وطلب صادر من معالج

يستخدم [جذر TLS المباشر](../examples/http/ar/direct-tls.لبات) المعالجات نفسها
على المنفذ 8443. اتبع دليل النشر لتوفير `server.pem` و`server.key` في مجلد
عمل العملية. شغله ثم شغل [عميل HTTPS](../examples/http/ar/client-tls.لبات)
في نافذة أخرى:

```sh
aspl check docs/examples/http/ar/اتصال-مشفر-مباشر.لبات
aspl run docs/examples/http/ar/اتصال-مشفر-مباشر.لبات
aspl check docs/examples/http/ar/عميل-مشفر.لبات
aspl run docs/examples/http/ar/عميل-مشفر.لبات
```

يختار العميل `server.pem` ملف CA خاصا. يجب أن يطابق `localhost` اسما في
SAN للشهادة. يحل الملف الخاص محل ثقة النظام ويظل التحقق إلزاميا.
أوقف الخدمة عبر طلب موثّق:

```sh
curl --http1.1 --cacert server.pem --request POST https://localhost:8443/stop
```

يجري GET `/upstream` في كلتا الخدمتين طلبا موثّقا إلى
`https://localhost:9443/hello` باستخدام ملف CA في `app::Config`.
لإنشاء خدمة محلية مقابلة، انسخ مجلد الأمثلة إلى `build/http-upstream/`،
وغيّر منفذ TLS في `settings.aspl` من 8443 إلى 9443، وشغل الجذر هناك.
استخدم شهادة التمرين المحلي نفسها:

```sh
mkdir -p build/http-upstream
cp docs/examples/http/ar/* build/http-upstream/
sed -i 's/8443/9443/g' build/http-upstream/settings.aspl
aspl check build/http-upstream/direct-tls.لبات
aspl run build/http-upstream/direct-tls.لبات
```

أثناء تشغيل الخدمة العادية، يعيد `curl --http1.1
http://127.0.0.1:8080/upstream` النص العربي. تتقدم المعالجات المقبولة الأخرى
أثناء انتظار هذا المعالج، مع بقاء تنفيذ ASPL متسلسلا. يعيد فشل الطلب الصادر
502 مع رمز الخطأ ما دام الاستدعاء الأب حيا. يلغي إلغاء الأب نتيجة الطلب
الصادر ولا يستأنف المعالج الملغى. أوقف الخدمة المقابلة بأمر curl الموثّق
نفسه على المنفذ 9443.

يستخدم [default-trust.aspl](../examples/http/ar/default-trust.aspl) ثقة النظام
للخدمة المقابلة. يبلغ `http.tls_verify_failed` للشهادة المحلية غير الموجودة
في تلك الثقة. يضع الاختبار الآلي CA التمرين داخل نظام ملفات اختبار مضبوط
ويثبت نجاح التحقق الافتراضي. لخدمة حقيقية، عدّل URL إلى عنوان HTTPS لها
واستخدم مخزن النظام الموثوق أو اختر CA خاصا صراحة كما سبق.

```sh
aspl check docs/examples/http/ar/ثقة-افتراضية.لبات
aspl run docs/examples/http/ar/ثقة-افتراضية.لبات
aspl check docs/examples/http/ar/رفض.لبات
aspl run docs/examples/http/ar/رفض.لبات
```

عندما لا يوجد مستمع على المنفذ 9، يطبع `refusal.aspl` الرمز
`http.connect_failed` ويعيد 0 بعد التحقق من النتيجة المتوقعة. وجود مستمع
يغيّر افتراض المثال، لذلك يحجز الاختبار منفذا محليا مغلقا بدلا منه.
اتخذ القرار وفق `الخطأ::الرمز`، فالرسالة نص تشخيصي.

## توليد برنامج أصلي ونقله

```sh
mkdir -p build/http-guide
aspl build -o build/http-guide/service docs/examples/http/ar/خدمة.لبات
aspl build -o build/http-guide/client docs/examples/http/ar/عميل.لبات
./build/http-guide/service --aspl-diagnostic-language=ar --aspl-color=never
```

شغل `./build/http-guide/client` في النافذة الأخرى ثم أرسل POST `/stop`.
يمكن نقل الملفين التنفيذيين إلى مضيف Linux مدعوم. يحتويان الوحدات المفحوصة
والآلة الافتراضية، ولا يحتاجان إلى ASPL أو ملفات المصدر أو مترجم C.
تبقى ملفات TLS ومكتبات C المشتركة المصرح بها مدخلات مستقلة للنشر.
يحذف `build` دون `-o` لاحقة المصدر المعروفة لتسمية الناتج. يقبل البرنامج
المولد خيارات التشخيص واللون المحجوزة فقط، ولا يقبل `run` أو `--help` أو
معاملات التطبيق.

## فحص التوثيق

من نسخة المستودع للمساهمين:

```sh
make test-http-documentation
```

يفحص الاختبار جميع الجذور باللغتين ويشغل حالات النص وJSON والبايتات والعملاء
وTLS والحالة والإيقاف والطلب من المعالج. يفحص الرفض القابل للاسترداد ويشغل
البرامج المولدة بعد إزالة وحدات مصدرها. يعيد استخدام النظراء المحليين
وشهادة الاختبار الموجودة، ويختار منافذ مؤقتة. يفحص الروابط والجداول المشتقة
من كتالوج الدوال والحدود. هذا تحقق من الدليل، والتحقق التجميعي النهائي
للإصدار مسؤولية التذكرة 18.
