تقدم جلسة HTTP ونشرها وإغلاقها
لبات 0.7.0 · الإصدار الحالي
المضيف الأصلي فقط. تقدم جلسة HTTP ونشرها وإغلاقها مع المصادر الموردة الدقيقة والمتطلبات والأوامر والنتائج.
محتويات الصفحة
تجهيز المضيف الأصلي
وفّر 127.0.0.1:8081. لا طلبات خارجية أو وحدات مصدر أو أصول TLS. ينسخ البرنامج الحالة وينشر 11 شرطيا ويرفض النشر القديم بنجاح ذي قيمة خطأ ثم يصرّف الجلسة ويغلق نسخها المشتركة.
اتبع دليل النشر للشهادات واختيار CA ومجلدات العمل ومسار الطرف العلوي الكامل.
اتبع دليل HTTP ومرجع الواجهة. احتفظ بأسماء الملفات ووحدات نسخة المصدر المختارة. احفظ النسختين العربية والإنجليزية في مجلدين منفصلين. يوفّر القارئ مدخلات TLS؛ لا شهادات أو مفاتيح مضمّنة. لا أصول بيانات أخرى.
المصدر العربي
التنفيذ: المضيف الأصلي فقط · لبات 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": ""
}
}المصدر الإنجليزي
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 المنشور على Linux x86-64 مع glibc 2.34 أو أحدث. لا أسطر إدخال. وفّر 127.0.0.1:8081. لا طلبات خارجية أو وحدات مصدر أو أصول TLS. ينسخ البرنامج الحالة وينشر 11 شرطيا ويرفض النشر القديم بنجاح ذي قيمة خطأ ثم يصرّف الجلسة ويغلق نسخها المشتركة.
الإدخال: لا يحتاج إلى أسطر إدخال.
import core::http;
record State { count: i64 }
fn handle(req: http::IncomingRequest, ctx: http::Context<bool,State>) -> http::ServerResponse {
let saved = http::snapshot_state(ctx);
let published = http::replace_state_if_current(ctx, saved, State { count: saved::value::count + 1 });
if not published::ok or not published::value { return http::response(409, [])::value; }
return http::response(200, [])::value;
}
fn start_main() -> i64 {
let routes = http::router([http::route("GET", "/", handle)::value])::value;
var server = http::server_config();
server::listeners = [http::listener("127.0.0.1", 8081)::value];
let started = http::start(server, routes, false, State { count: 10 });
if not started::ok { print(started::error::code); return 1; }
let owner = started::value;
let alias = owner;
let saved = http::snapshot_session_state(owner)::value;
var copied = http::session_state(owner)::value;
copied::count = 99;
if http::session_state(owner)::value::count not matches 10 { return 2; }
let published = http::replace_session_state_if_current(owner, saved, State { count: 11 });
if not published::ok or not published::value { return 3; }
let stale = http::replace_session_state_if_current(alias, saved, State { count: 12 });
if not stale::ok or stale::value { return 4; }
if http::session_state(owner)::value::count not matches 11 { return 5; }
if not http::stop_session(owner)::ok { return 6; }
var budget = http::progress_budget();
budget::wait_ms = 1;
var closed = false;
while not closed {
let advanced = http::progress(owner, budget);
if not advanced::ok { print(advanced::error::code); return 7; }
closed = advanced::value matches http::SESSION_CLOSED;
}
if not http::close_session(alias)::ok or not http::close_session(owner)::ok { return 8; }
if http::session_state(alias)::error::code not matches "http.closed_session" { return 9; }
if saved::value::count not matches 10 { return 10; }
return 0;
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل session.asplالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": ""
}
}الأوامر والنتائج
ar:
aspl check ar/session.aspl
aspl run ar/session.aspl
aspl build -o http-session-ar-program ar/session.aspl
./http-session-ar-programen:
aspl check en/session.aspl
aspl run en/session.aspl
aspl build -o http-session-en-program en/session.aspl
./http-session-en-programشغّل الأوامر من المجلد الأب لمجلدي ar/en المنفصلين. يفتح البرنامج مستمعه ويفحص الحالة المنسوخة والحالية والقديمة ثم يصرّفها عبر التقدم ويغلق تلقائيا. لا يحتاج طلبا خارجيا أو POST /stop. لا خرج للنجاح وحالته 0. تأتي تفاصيل النتائج المعروضة من الكتالوج. راجع مجموعة HTTP.