بناء عملاء HTTP وخوادمه أصليا
لبات 0.7.0 · الإصدار الحالي
شغّل عملاء وخدمات النص وJSON والبايتات وTLS وانشر الحالة وأغلقها عبر لبات 0.7.0.
محتويات الصفحة
تجهيز HTTP الأصلي
المضيف الأصلي فقط، لبات 0.7.0 المنشور. ثبّت الأداة الأصلية على Linux x86-64 مع glibc 2.34 أو أحدث. يجب أن يطبع aspl --version النص aspl 0.7.0. يرفض المتصفح والتضمين الخاص HTTP قبل التنفيذ. تحفظ التنزيلات المصدر المورّد ولا تفتح مسودة متصفح أو تشغّل برنامجا.
نزّل الجذر ووحداته المطلوبة من مجموعة HTTP. احفظ النسختين العربية والإنجليزية في مجلدين منفصلين بأسماء الملفات الأصلية. تستخدم المصادر العربية أسماء ملفات ومعرفات وتسلسلات هروب عربية، وتستخدم المصادر الإنجليزية أسماء وتسلسلات هروب إنجليزية. يستورد كل ملف ما يستخدمه؛ يفعّل استورد أساسي::ويب. البادئة ويب وimport core::http; البادئة http. تتاح البادئة المكتوبة فقط ولأعضاء المكتبة تسميات مكافئة دقيقة. تصلح .aspl و.لبات للجذور والوحدات المستوردة.
يسرد مرجع الواجهة الأنواع والتواقيع والقيم الافتراضية والحدود ورموز الأخطاء. اتبع دليل النشر لتجهيز الشهادات وثقة النظام والنشر. يحتفظ الدليل الخام السابق (يفتح في نافذة جديدة) ومصدر النشر الخام (يفتح في نافذة جديدة) بنطاق إصدارهما السابق.
خدمة النص وJSON والبايتات
نزّل عائلة الخدمة مع إعدادات.لبات ومعالجات.لبات من نسخة المصدر المختارة وضعها معا. من مجلد المصدر شغّل:
aspl check خدمة.لبات
aspl run خدمة.لباتاستخدم service.aspl للمصدر الإنجليزي. تبقى الخدمة في المقدمة على 127.0.0.1:8080؛ وفّر المنفذ أولا. لا تحتاج أسطر إدخال أو أصول بيانات لتمرين العميل العادي. يحتاج مسار /upstream أيضا server.pem الموثوق في مجلد عمل العملية ونظيرا موثقا على https://localhost:9443/hello.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 المنشور على Linux x86-64 مع glibc 2.34 أو أحدث. لا أسطر إدخال. استمع على 127.0.0.1:8080 وشغّل العميل في نافذة أخرى. يقرأ /count الحالة ثم يزيدها. يصرّف POST /stop الخدمة. يحتاج /upstream أيضا server.pem ونظيرا موثقا على localhost:9443/hello.
الإدخال: لا يحتاج إلى أسطر إدخال.
مصدر عربي · وحدات المصدر المطلوبة، احفظ كل نسخة في مجلد منفصل:
مصدر إنجليزي · وحدات المصدر المطلوبة، احفظ كل نسخة في مجلد منفصل:
استورد أساسي::ويب.
استورد إعدادات.لبات بسم تطبيق.
استورد معالجات.لبات بسم معالجات.
دالة ابدأ_الرئيسية() -> ص64 {
دع نتيجة_الحساب = ويب::اخدم(تطبيق::خادم(خطأ), معالجات::وجهات(),
تطبيق::إعدادات { خادم_بعيد: "https://localhost:9443/hello", مرجع: "server.pem" },
تطبيق::حالة { عدد: 0 }).
إذا ليس نتيجة_الحساب::نجاح { اطبع(نتيجة_الحساب::الخطأ::الرمز). أرجع 1. }
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل خدمة.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": ""
}
}الدالة معالجات::عالج مسماة على المستوى الأعلى ولا تلتقط متغيرات محلية. يطابق طلبها وسياق<تطبيق::إعدادات,تطبيق::حالة> هويات أنواع الموجه. يرفض المدقق مسارات المعالج غير الآمنة والحاجبة، بما فيها استدعاءات C العادية وإدخال السطر والملف عبر دوال مساعدة. تتقدم المعالجات المقبولة الأخرى أثناء انتظار طلب HTTP تابع، مع بقاء تنفيذ لبات متسلسلا.
يعيد GET /hello النص مرحبا من ASPL. يفحص POST /submit صلاحية UTF-8 ويعيد نص JSON الصريح مع application/json; charset=utf-8 دون تحليل بنيته أو التحقق منها. يعيد POST /bytes البايتات، ويعيد GET /download البايتات 00 FF 41 تماما. يعرض /count الحالة قبل زيادتها. تعيد اقرأ_حالة نسخة قيمة وتنشر استبدل_حالة استبدالا كاملا. القراءة والانتظار والاستبدال ليست ذرية؛ أعد القراءة بعد الانتظار أو استخدم لقطات الإصدار.
يجري GET /upstream طلبا تابعا موثقا بإعدادات تطبيق::إعدادات. يتحول فشل الابن إلى 502 يحوي رمزه المستقر ما دام الأب حيا. ينهي إلغاء الأب العمل التابع ويلغي الخرج والنشر المتأخرين ولا يستأنف المعالج الملغى بنتيجة فاشلة. مرّر بايتات المتن عن قصد؛ قد تكون بيانات طول الضغط وترميزه لدى الطرف المقابل غير مناسبة للاستجابة الجديدة.
فحص نتائج العميل
ضع جذر العميل بجوار طلبات.لبات المطابق. شغّل الخدمة ثم افتح نافذة أخرى في مجلد المصدر:
aspl check عميل.لبات
aspl run عميل.لباتالتنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 المنشور على Linux x86-64 مع glibc 2.34 أو أحدث. لا أسطر إدخال. شغّل الخدمة العادية المطابقة على 127.0.0.1:8080 أولا. ضع requests.لبات من نسخة المصدر نفسها بجوار الجذر.
الإدخال: لا يحتاج إلى أسطر إدخال.
مصدر عربي · وحدات المصدر المطلوبة، احفظ كل نسخة في مجلد منفصل:
مصدر إنجليزي · وحدات المصدر المطلوبة، احفظ كل نسخة في مجلد منفصل:
استورد طلبات.لبات بسم طلبات.
دالة ابدأ_الرئيسية() -> ص64 { أرجع طلبات::جرب("http://127.0.0.1:8080", خطأ). }
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل عميل.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": "checked text, JSON, 00 FF 41, and 404"
}
}يفحص العميل النص وإعادة JSON والبايتات الدقيقة واستجابة 404 مكتملة. يطبع checked text, JSON, 00 FF 41, and 404 بلا سطر جديد أخير ويعيد 0. تعيد ويب::اطلب نتيجة ناجحة للاستجابة المكتملة 404 أو 500؛ افحص حالة منفصلة. يعيد فك UTF-8 غير الصالح http.invalid_utf8 وتبقى بايتات المتن متاحة. لا محلل أو مولد JSON ضمني.
يفترض مثال الرفض عدم وجود مستمع على 127.0.0.1:9 ويطبع http.connect_failed ويعيد 0 بعد فحص الفشل. يغيّر وجود نظير الافتراض. اتخذ القرار وفق الخطأ::الرمز لا نص التشخيص البشري. تختلف النتائج القابلة للاسترداد عن أخطاء المصدر والفخاخ النهائية وإلغاء التنفيذ.
توثيق HTTPS ومراعاة الحدود
تستخدم خدمة TLS المباشر الوحدات نفسها على 127.0.0.1:8443. وفّر server.pem وserver.key المطابق غير المشفر في مجلد العمل. يستخدم عميل HTTPS العنوان https://localhost:8443 ويثق صراحة في server.pem، مع localhost في DNS SAN للشهادة. يحل CA الخاص محل ثقة النظام ويبقي فحص السلسلة والتواريخ والهوية إلزاميا. يعيد غياب مواد الخادم أو فسادها http.tls_config_failed قبل الاستماع.
aspl check اتصال-مشفر-مباشر.لبات
aspl run اتصال-مشفر-مباشر.لباتفي نافذة العميل المنفصلة:
aspl check عميل-مشفر.لبات
aspl run عميل-مشفر.لباتيطلب عميل ثقة النظام العنوان https://localhost:9443/hello. يشترط النجاح شهادة نظير موثوقة عند المضيف. تنتج الشهادة المحلية غير الموثوقة http.tls_verify_failed وخرج الرمز وحالة 1. تعيد الثقة المفقودة أو التالفة http.ca_load_failed. راجع تجهيز الشهادة واختيار الثقة.
اتبع تمرين نشر الطرف العلوي الكامل للنظير المطابق ومجلد العمل والطلبات الموثقة ونتائج الإخفاق.
اتباع التحويلات وفك gzip معطّلان افتراضيا. تبقى التحويلات المفعّلة ضمن origin واحد وتشترك في المهلة الكلية الأصلية. يفحص gzip حدي المتن المرمز والمفكوك. لا إعادة محاولة نقل تلقائية. يثبت مثال الحدود أن خفض سعة الصادر إلى أقل من 16 اتصالا خاملا افتراضيا يستلزم خفض سعة الخامل أيضا. لا تحجز الإعدادات العددية موارد. راجع حدود التنفيذ والرسائل والمهل.
تقدم الجلسة ونشر الحالة المنسوخة
استخدم اخدم حين تدير الخدمة تدفق التطبيق. استخدم ابدأ للحصول على جلسة<C,S> واستدعِ تقدم صراحة من التطبيق. يعني نجاح البدء جاهزية المستمعين؛ لا تعمل المعالجات العادية إلا عبر التقدم. لا تعمل دوال الجلسة الخاصة بالتطبيق داخل المعالج. تنتهي صلاحية سياق المعالج مع استدعائه.
يحتاج مثال الجلسة المنفذ الحر 127.0.0.1:8081 دون نظير أو ملفات TLS. ينسخ الحالة دون نشر التعديل المحلي وينشر 11 وفق لقطة حالية ويفحص نجاحا بقيمة خطأ للنشر القديم. ثم يطلب التصريف ويتقدم حتى جلسة_مغلقة ويكرر إغلاق النسخ ويفحص http.closed_session. تبقى اللقطة المحفوظة بقيمة 10. لا خرج للنجاح وحالته 0.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 المنشور على Linux x86-64 مع glibc 2.34 أو أحدث. لا أسطر إدخال. وفّر 127.0.0.1:8081. لا طلبات خارجية أو وحدات مصدر أو أصول TLS. ينسخ البرنامج الحالة وينشر 11 شرطيا ويرفض النشر القديم بنجاح ذي قيمة خطأ ثم يصرّف الجلسة ويغلق نسخها المشتركة.
الإدخال: لا يحتاج إلى أسطر إدخال.
استورد أساسي::ويب.
سجل حالة { عدد: ص64 }
دالة عالج(الطلب: ويب::طلب_وارد, سياق: ويب::سياق<منطقي,حالة>) -> ويب::استجابة_خادم {
دع محفوظ = ويب::التقط_الحالة(سياق).
دع منشور = ويب::استبدل_الحالة_إن_كانت_حالية(سياق, محفوظ, حالة { عدد: محفوظ::قيمة::عدد + 1 }).
إذا ليس منشور::نجاح أو ليس منشور::قيمة { أرجع ويب::أنشئ_استجابة(409, [])::قيمة. }
أرجع ويب::أنشئ_استجابة(200, [])::قيمة.
}
دالة ابدأ_الرئيسية() -> ص64 {
دع وجهات = ويب::أنشئ_موجه([ويب::أنشئ_وجهة("GET", "/", عالج)::قيمة])::قيمة.
متغير خادم = ويب::إعدادات_خدمة().
خادم::مستمعون = [ويب::أنشئ_مستمع("127.0.0.1", 8081)::قيمة].
دع مبدوء = ويب::ابدأ(خادم, وجهات, خطأ, حالة { عدد: 10 }).
إذا ليس مبدوء::نجاح { اطبع(مبدوء::الخطأ::الرمز). أرجع 1. }
دع مالك = مبدوء::قيمة.
دع مرادف = مالك.
دع محفوظ = ويب::التقط_حالة_الجلسة(مالك)::قيمة.
متغير منسوخ = ويب::حالة_الجلسة(مالك)::قيمة.
منسوخ::عدد = 99.
إذا ويب::حالة_الجلسة(مالك)::قيمة::عدد لا يطابق 10 { أرجع 2. }
دع منشور = ويب::استبدل_حالة_الجلسة_إن_كانت_حالية(مالك, محفوظ, حالة { عدد: 11 }).
إذا ليس منشور::نجاح أو ليس منشور::قيمة { أرجع 3. }
دع متقادم = ويب::استبدل_حالة_الجلسة_إن_كانت_حالية(مرادف, محفوظ, حالة { عدد: 12 }).
إذا ليس متقادم::نجاح أو متقادم::قيمة { أرجع 4. }
إذا ويب::حالة_الجلسة(مالك)::قيمة::عدد لا يطابق 11 { أرجع 5. }
إذا ليس ويب::أوقف_الجلسة(مالك)::نجاح { أرجع 6. }
متغير ميزانية = ويب::ميزانية_التقدم().
ميزانية::زمن_الانتظار_مللي = 1.
متغير مغلق = خطأ.
طالما ليس مغلق {
دع متقدم = ويب::تقدم(مالك, ميزانية).
إذا ليس متقدم::نجاح { اطبع(متقدم::الخطأ::الرمز). أرجع 7. }
مغلق = متقدم::قيمة يطابق ويب::جلسة_مغلقة.
}
إذا ليس ويب::أغلق_الجلسة(مرادف)::نجاح أو ليس ويب::أغلق_الجلسة(مالك)::نجاح { أرجع 8. }
إذا ويب::حالة_الجلسة(مرادف)::الخطأ::الرمز لا يطابق "http.closed_session" { أرجع 9. }
إذا محفوظ::قيمة::عدد لا يطابق 10 { أرجع 10. }
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل جلسة.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": ""
}
}aspl check جلسة.لبات
aspl run جلسة.لباتتشترك نسخ الجلسة في مالك مدار واحد. يبطل إغلاق نسخة كل النسخ ويحرر فقدان آخر نسخة قابلة للوصول المورد. تحوي لقطة_حالة<S> قيمة منسوخة للقراءة فقط وهوية جلسة وإصدار خفيين. يفشل نشر لقطة جلسة أخرى بـhttp.invalid_argument. تحتفظ المقابض المدارة في اللقطات بالمالك الأصلي نفسه ولا تنسخ حالته الأصلية المتغيرة. راجع أعمار الخدمة والنشر.
الإغلاق وبناء ELF
أرسل POST /stop للخدمة العادية من نافذة أخرى:
curl --http1.1 --request POST http://127.0.0.1:8080/stopللخدمة المشفرة استخدم CA الموثوق ومنفذها:
curl --http1.1 --cacert server.pem --request POST https://localhost:8443/stopتطلب أوقف(ctx) من المعالج التصريف ويقبل تكرارها. يمكن للاستجابة الحالية الاكتمال. لا تعود اخدم عاديا قبل تحرير العمل المملوك. تحتاج أوقف_الجلسة إلى تقدم لاحق حتى الإغلاق. تنهي أغلق_الجلسة العمل وتحرر المالك. تصرّف أول Ctrl+C أو SIGTERM ثم تنهي التنفيذ بحالة 7، وتتجاوز الإشارة الثانية بقية التصريف. يبقى الفخ نهائيا بحالة 5 ولا يتحول تلقائيا إلى 500. قد يلغي انتهاء الأب أو قطع الاتصال أو انتهاء التصريف اكتمال المعالج ونشر الحالة.
aspl build -o service-program خدمة.لبات
aspl build -o client-program عميل.لبات
./service-program --aspl-diagnostic-language=ar --aspl-color=neverشغّل ./client-program في نافذة أخرى ثم أرسل POST /stop. استخدم اسم الجذر الإنجليزي عند بناء تلك النسخة. يتضمن ELF الوحدات المفحوصة والآلة الافتراضية ويعمل دون لبات أو ملفات المصدر أو مترجم C. تبقى ملفات TLS ومكتبات C المشتركة المصرح بها مدخلات خارجية. يقبل البرنامج المولد خيارات التشخيص واللون المحجوزة؛ لا أوامر لبات أو معاملات تطبيق عامة. راجع البناء وحالة العملية.