import core::http; record State { count: i64 } fn handle(req: http::IncomingRequest, ctx: http::Context) -> 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; }