کتابخانه‌ی استاندارد · شبکه

مسیریاب net/router

مسیریابی درخواست‌های HTTP با پارامتر، گروه و پرونده‌های ایستا.

واردسازی شبکه.مسیریاب

مسیریاب هر روش و مسیر را به یک تابع گرداننده وصل می‌کند. این بسته لایه‌ی مسیریابی سرور اچ تی تی پی است: مسیرها را روی یک مسیریاب ثبت می‌کنید، آن را با اچ تی تی پی.استفاده به سرور می‌دهید و سرور برای هر درخواست اعزام را صدا می‌زند، پارامترهای مسیر را در زمینه‌ی درخواست می‌گذارد و گرداننده را با شناسه‌ی همان زمینه صدا می‌زند. گرداننده پارامترها را با اچ تی تی پی.پارامتر زمینه می‌خواند. کارهای مشترک مثل ثبت دسترسی، CORS و سرآیندهای امنیتی را میان افزار فراهم می‌کند که گرداننده اول صدایش می‌زند.

الگو بخش به بخش با مسیر سنجیده می‌شود:

  • بخش ثابتی مثل /notes باید بایت به بایت یکی باشد (پس نام روش و مسیر به بزرگی و کوچکی حروف حساس‌اند)؛
  • بخشی که با : شروع شود پارامتر است: /books/:id مسیر /books/42 را با id برابر 42 می‌پذیرد؛
  • * هر چه بعد از آن بیاید، حتی با اسلش، می‌پذیرد و پارامتری نمی‌سازد.

بیشتر نمونه‌های زیر به جای راه‌اندازی سرور، اعزام را مستقیم صدا می‌زنند. این همان جستجویی است که سرور انجام می‌دهد و دیدن و آزمودن قاعده‌ها را آسان می‌کند. اعزام یک تطابق با matched، تابع گرداننده‌ی fn و پارامترها برمی‌گرداند؛ آن را با آزادسازی تطابق آزاد کنید.

چیزهایی که بیشتر غافلگیر می‌کنند:

  • همه‌ی مسیرها را پیش از اچ تی تی پی.استفاده ثبت کنید. سرور رونوشت خودش را از مسیریاب نگه می‌دارد و مسیری که بعداً اضافه شود هرگز دیده نمی‌شود و ۴۰۴ می‌گیرد.
  • اسلش پایانی فقط در مسیرهای پارامتردار و ستاره‌دار پذیرفته می‌شود. /users/:name مسیر /users/sara/ را هم می‌پذیرد، ولی مسیر ثابت /notes با /notes/ جور نمی‌شود.
  • پارامترها رمزگشایی نمی‌شوند. /tags/open%20source مقدار open%20source می‌دهد؛ آن را از اچ تی تی پی.رمزگشایی نشانی بگذرانید. رشته‌ی پرسمان پیش‌تر جدا شده و با اچ تی تی پی.پرسمان زمینه خوانده می‌شود.
  • پاسخ ۴۰۵ خودکار نیست و هر مسیریاب فقط یک پوشه‌ی ایستا دارد؛ هر دو در ادامه آمده‌اند.

مسیرهای یک منبع REST

منبعی مثل یادداشت‌ها معمولاً پنج مسیر دارد: فهرست و ساخت روی مجموعه، و خواندن، جایگزینی و حذف روی یک عضو. هر روش را با تابع خودش ثبت کنید (دریافت، ارسال، قراردادن، حذف و برای ویرایش بخشی وصله) و شناسه‌ی عضو را با دریافت پارامتر بخوانید. مسیری که با هیچ الگویی جور نشود، یا روشی که مسیری ندارد، matched را نادرست می‌کند و سرور با ۴۰۴ پاسخ می‌دهد.

net-router-guide-rest.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع فهرست یادداشت‌ها(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "همه یادداشت‌ها") پایان
تابع ساخت یادداشت(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "ساخته شد") پایان
تابع نمایش یادداشت(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "یک یادداشت") پایان
تابع ویرایش یادداشت(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "ویرایش شد") پایان
تابع حذف یادداشت(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "حذف شد") پایان

تابع نام رسیدگی‌کننده(تابع‌ک: صحیح۶۴): رشته:
    اگر تابع‌ک == فهرست یادداشت‌ها: برگشت "فهرست یادداشت‌ها" پایان
    اگر تابع‌ک == ساخت یادداشت: برگشت "ساخت یادداشت" پایان
    اگر تابع‌ک == نمایش یادداشت: برگشت "نمایش یادداشت" پایان
    اگر تابع‌ک == ویرایش یادداشت: برگشت "ویرایش یادداشت" پایان
    اگر تابع‌ک == حذف یادداشت: برگشت "حذف یادداشت" پایان
    برگشت "?"
پایان

تابع امتحان درخواست(م: مسیریاب.مسیریاب، روش: رشته، مسیر: رشته):
    ناپایا ت := مسیریاب.اعزام(م، روش، مسیر)
    اگر ت.پیدا شد:
        شناسه := مسیریاب.دریافت پارامتر(ت، "id")
        اگر شناسه.طول() > ۰:
            سرچاپ روش، مسیر، "->"، نام رسیدگی‌کننده(ت.گرداننده)، "با شناسه"، شناسه
        وگرنه:
            سرچاپ روش، مسیر، "->"، نام رسیدگی‌کننده(ت.گرداننده)
        پایان
    وگرنه:
        سرچاپ روش، مسیر، "-> ۴۰۴"
    پایان
    مسیریاب.آزادسازی تطابق(ت)
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/notes"، فهرست یادداشت‌ها)
    مسیریاب.ارسال(م، "/notes"، ساخت یادداشت)
    مسیریاب.دریافت(م، "/notes/:id"، نمایش یادداشت)
    مسیریاب.قراردادن(م، "/notes/:id"، ویرایش یادداشت)
    مسیریاب.حذف(م، "/notes/:id"، حذف یادداشت)

    امتحان درخواست(م، "GET"، "/notes")
    امتحان درخواست(م، "POST"، "/notes")
    امتحان درخواست(م، "GET"، "/notes/17")
    امتحان درخواست(م، "PUT"، "/notes/17")
    امتحان درخواست(م، "DELETE"، "/notes/17")
    امتحان درخواست(م، "DELETE"، "/notes")
    امتحان درخواست(م، "GET"، "/notes/17/comments")
پایان
خروجیGET /notes -> فهرست یادداشت‌ها POST /notes -> ساخت یادداشت GET /notes/17 -> نمایش یادداشت با شناسه 17 PUT /notes/17 -> ویرایش یادداشت با شناسه 17 DELETE /notes/17 -> حذف یادداشت با شناسه 17 DELETE /notes -> ۴۰۴ GET /notes/17/comments -> ۴۰۴

هر پارامتر دقیقاً با یک بخش مسیر جور می‌شود: /notes/17/comments به /notes/:id نمی‌رسد. برای منبع‌های تودرتو الگوی جدا بگذارید، مثل /notes/:id/comments.

کدام مسیر برنده است

وقتی چند الگو با یک مسیر جور شوند، بخش ثابت بر پارامتر و پارامتر بر * پیش است؛ پس /users/me به گرداننده‌ی خودش می‌رسد، با این‌که /users/:name زودتر ثبت شده است. میان دو مسیر ستاره‌دار، آن که زودتر ثبت شده برنده است؛ پس مسیر همه‌گیر /* را آخر و پس از مسیرهای دقیق‌تری مثل /assets/* ثبت کنید. خروجی سه قاعده‌ی دیگر را هم نشان می‌دهد: /users/sara/ با اسلش پایانی باز هم به مسیر پارامتردار می‌رسد، /users/me/ از مسیر ثابت جا می‌ماند و با name برابر me به /users/:name می‌رسد، و درخواست HEAD به مسیر GET برمی‌گردد.

net-router-guide-order.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع خودم(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "خودم") پایان
تابع کاربر(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "کاربر") پایان
تابع دارایی‌ها(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "دارایی‌ها") پایان
تابع صفحه عمومی(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "صفحه") پایان

تابع نام رسیدگی‌کننده(تابع‌ک: صحیح۶۴): رشته:
    اگر تابع‌ک == خودم: برگشت "خودم" پایان
    اگر تابع‌ک == کاربر: برگشت "کاربر" پایان
    اگر تابع‌ک == دارایی‌ها: برگشت "دارایی‌ها" پایان
    اگر تابع‌ک == صفحه عمومی: برگشت "صفحه" پایان
    برگشت "?"
پایان

تابع نشان بده(م: مسیریاب.مسیریاب، روش: رشته، مسیر: رشته):
    ناپایا ت := مسیریاب.اعزام(م، روش، مسیر)
    اگر ت.پیدا شد:
        سرچاپ روش، مسیر، "->"، نام رسیدگی‌کننده(ت.گرداننده)، ت.پارامترها.اقلام.طول()، "پارامتر"
    وگرنه:
        سرچاپ روش، مسیر، "-> مسیری نیست"
    پایان
    مسیریاب.آزادسازی تطابق(ت)
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/assets/*"، دارایی‌ها)
    مسیریاب.دریافت(م، "/users/:name"، کاربر)
    مسیریاب.دریافت(م، "/users/me"، خودم)
    مسیریاب.دریافت(م، "/*"، صفحه عمومی)

    نشان بده(م، "GET"، "/users/me")
    نشان بده(م، "GET"، "/users/sara")
    نشان بده(م، "GET"، "/users/sara/")
    نشان بده(م، "GET"، "/users/me/")
    نشان بده(م، "GET"، "/assets/css/site.css")
    نشان بده(م، "GET"، "/about")
    نشان بده(م، "HEAD"، "/users/sara")
    نشان بده(م، "POST"، "/users/sara")
پایان
خروجیGET /users/me -> خودم 0 پارامتر GET /users/sara -> کاربر 1 پارامتر GET /users/sara/ -> کاربر 1 پارامتر GET /users/me/ -> کاربر 1 پارامتر GET /assets/css/site.css -> دارایی‌ها 0 پارامتر GET /about -> صفحه 0 پارامتر HEAD /users/sara -> کاربر 1 پارامتر POST /users/sara -> مسیری نیست

۴۰۴ یا ۴۰۵: گفتن این‌که چه مجاز است

درخواستی که مسیرش وجود دارد ولی روشش نادرست است باید 405 Method Not Allowed و سرآیند Allow بگیرد، نه ۴۰۴. مسیریاب این کار را خودش نمی‌کند، اما ساختنش روی اعزام آسان است: وقتی درخواست جور نشد، همان مسیر را با روش‌های دیگر امتحان کنید و آن‌هایی را که جور می‌شوند فهرست کنید.

net-router-guide-allow.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع فهرست سفارش‌ها(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "سفارش‌ها") پایان
تابع ثبت سفارش(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "ثبت شد") پایان

تابع روش‌های مجاز(م: مسیریاب.مسیریاب، مسیر: رشته): رشته:
    روش‌ها := ["GET"، "POST"، "PUT"، "PATCH"، "DELETE"]
    ناپایا خروجی := ""
    هر ر در روش‌ها:
        ناپایا یافته := مسیریاب.اعزام(م، ر، مسیر)
        اگر یافته.پیدا شد:
            اگر خروجی.طول() > ۰: خروجی += ", " پایان
            خروجی += ر
        پایان
        مسیریاب.آزادسازی تطابق(یافته)
    پایان
    برگشت خروجی
پایان

تابع پاسخ بده(م: مسیریاب.مسیریاب، روش: رشته، مسیر: رشته):
    ناپایا ت := مسیریاب.اعزام(م، روش، مسیر)
    اگر ت.پیدا شد:
        سرچاپ روش، مسیر، "-> ۲۰۰"
    وگرنه:
        مجاز := روش‌های مجاز(م، مسیر)
        اگر مجاز.طول() > ۰:
            سرچاپ روش، مسیر، "-> ۴۰۵، Allow:"، مجاز
        وگرنه:
            سرچاپ روش، مسیر، "-> ۴۰۴"
        پایان
    پایان
    مسیریاب.آزادسازی تطابق(ت)
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/orders"، فهرست سفارش‌ها)
    مسیریاب.ارسال(م، "/orders"، ثبت سفارش)
    پاسخ بده(م، "GET"، "/orders")
    پاسخ بده(م، "DELETE"، "/orders")
    پاسخ بده(م، "GET"، "/invoices")
پایان
خروجیGET /orders -> ۲۰۰ DELETE /orders -> ۴۰۵، Allow: GET, POST GET /invoices -> ۴۰۴

گروه کردن مسیرها زیر یک پیشوند

گروه مسیری را زیر یک پیشوند مشترک ثبت می‌کند و نسخه‌های API را از هم جدا نگه می‌دارد: /api/v1/users و /api/v2/users می‌توانند کنار هم باشند و به گرداننده‌های متفاوت برسند. پیشوند را در یک متغیر نگه دارید تا تغییر نام نسخه در یک جا انجام شود. مسیرهای ثبت‌شده در routes مسیریاب هستند؛ برای چاپ جدول مسیرها هنگام راه‌اندازی به کار می‌آید.

net-router-guide-versions.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع کاربران نسخه۱(زمینه: صحیح۶۴): اچ تی تی پی.جیسون(زمینه، "[\"ali\"]") پایان
تابع کاربران نسخه۲(زمینه: صحیح۶۴): اچ تی تی پی.جیسون(زمینه، "{\"users\":[\"ali\"]}") پایان
تابع کاربر نسخه۲(زمینه: صحیح۶۴): اچ تی تی پی.جیسون(زمینه، "{}") پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    ن۱ := "/api/v1"
    ن۲ := "/api/v2"
    مسیریاب.گروه(م، ن۱، "GET"، "/users"، کاربران نسخه۱)
    مسیریاب.گروه(م، ن۲، "GET"، "/users"، کاربران نسخه۲)
    مسیریاب.گروه(م، ن۲، "GET"، "/users/:id"، کاربر نسخه۲)

    هر مس در م.مسیرها:
        سرچاپ مس.روش، مس.الگو
    پایان
    ناپایا ت := مسیریاب.اعزام(م، "GET"، "/api/v2/users/5")
    سرچاپ ت.گرداننده == کاربر نسخه۲، مسیریاب.دریافت پارامتر(ت، "id")
    مسیریاب.آزادسازی تطابق(ت)
    ناپایا قدیمی := مسیریاب.اعزام(م، "GET"، "/api/v1/users")
    سرچاپ قدیمی.گرداننده == کاربران نسخه۱
    مسیریاب.آزادسازی تطابق(قدیمی)
پایان
خروجیGET /api/v1/users GET /api/v2/users GET /api/v2/users/:id true 5 true

پارامترهای مسیر در سرور در حال اجرا

درون گرداننده پارامترها از زمینه‌ی درخواست می‌آیند: اچ تی تی پی.پارامتر زمینه(زمینه، "slug") یکی را می‌خواند و اچ تی تی پی.پرسمان زمینه(زمینه، "page") رشته‌ی پرسمان را، که سرور پیش از مسیریابی از مسیر جدا می‌کند. برنامه‌ی زیر یک وبلاگ و صفحه‌ی برچسب را سرو می‌کند و دو قاعده‌ی سرور را از بالای صفحه نشان می‌دهد: برچسب تا وقتی از اچ تی تی پی.رمزگشایی نشانی نگذرد به شکل درصدی می‌ماند، و /late که پس از اچ تی تی پی.استفاده ثبت شده ۴۰۴ می‌گیرد.

net-router-guide-server.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع نمایش برچسب(زمینه: صحیح۶۴):
    خام := اچ تی تی پی.پارامتر(زمینه، "tag")
    اچ تی تی پی.متن(زمینه، "raw=" + خام + " decoded=" + اچ تی تی پی.رمزگشایی نشانی(خام))
پایان

تابع نمایش نوشته(زمینه: صحیح۶۴):
    اچ تی تی پی.جیسون(زمینه، "{\"post\":\"" + اچ تی تی پی.پارامتر(زمینه، "slug") + "\",\"page\":\"" + اچ تی تی پی.پرسمان(زمینه، "page") + "\"}")
پایان

تابع دیرهنگام(زمینه: صحیح۶۴): اچ تی تی پی.متن(زمینه، "late") پایان

تابع بگیر(مسیر: رشته):
    پاسخ := اچ تی تی پی.دریافت("http://127.0.0.1:18589" + مسیر)
    سرچاپ مسیر، پاسخ.وضعیت، پاسخ.بدنه
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/tags/:tag"، نمایش برچسب)
    مسیریاب.دریافت(م، "/blog/:slug"، نمایش نوشته)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۸۵۸۹)
    اچ تی تی پی.تنظیم میزبان(س، "127.0.0.1")
    اچ تی تی پی.استفاده(س، م)
    مسیریاب.دریافت(م، "/late"، دیرهنگام)
    اگر وارونه اچ تی تی پی.اجرا در پس زمینه(س):
        سرچاپ "درگاه ۱۸۵۸۹ گرفته است"
        برگشت ۱
    پایان
    بگیر("/tags/open%20source")
    بگیر("/blog/hello-salam?page=2")
    بگیر("/late")
    برگشت ۰
پایان
خروجی/tags/open%20source 200 raw=open%20source decoded=open source /blog/hello-salam?page=2 200 {"post":"hello-salam","page":"2"} /late 404 404 Not Found

فرستادن یک پوشه کنار API

ایستا(مسیریاب، پیشوند، پوشه) پرونده‌های یک پوشه را برای مسیرهایی که با پیشوند شروع می‌شوند می‌فرستد، با Content-Type از مایم و index.html برای پوشه. پوشه‌ای که بدون اسلش پایانی خواسته شود با ۳۰۱ به نشانی اسلش‌دار فرستاده می‌شود و .. نمی‌تواند از پوشه بیرون برود. پرونده‌های ایستا پیش از مسیرها و برای هر روشی بررسی می‌شوند و مسیری که پرونده ندارد به مسیرها و سپس به ۴۰۴ می‌رسد؛ پس /api/status باز هم به گرداننده‌ی خودش می‌رسد. برنامه یک پوشه‌ی کوچک public می‌نویسد، آن را روی 127.0.0.1 می‌فرستد و چهار مسیر را می‌گیرد.

net-router-guide-static.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی سیستم عامل

تابع وضعیت(زمینه: صحیح۶۴): اچ تی تی پی.جیسون(زمینه، "{\"ok\":true}") پایان

تابع بگیر(مسیر: رشته):
    پاسخ := اچ تی تی پی.دریافت("http://127.0.0.1:18588" + مسیر)
    سرچاپ مسیر، پاسخ.وضعیت، اچ تی تی پی.دریافت سرصفحه(پاسخ، "Content-Type")
پایان

تابع ریشه:
    سیستم عامل.ساخت پوشه ها("public/css")
    سیستم عامل.نوشتن پرونده("public/index.html"، "<h1>سلام</h1>")
    سیستم عامل.نوشتن پرونده("public/css/site.css"، "h1 { color: teal }")

    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/api/status"، وضعیت)
    مسیریاب.ایستا(م، "/"، "public")
    ناپایا س := اچ تی تی پی.سرور جدید(۱۸۵۸۸)
    اچ تی تی پی.تنظیم میزبان(س، "127.0.0.1")
    اچ تی تی پی.استفاده(س، م)
    اگر وارونه اچ تی تی پی.اجرا در پس زمینه(س):
        سرچاپ "درگاه ۱۸۵۸۸ گرفته است"
        برگشت ۱
    پایان
    بگیر("/")
    بگیر("/css/site.css")
    بگیر("/api/status")
    بگیر("/missing.png")
    سیستم عامل.حذف همه("public")
    برگشت ۰
پایان
خروجی/ 200 text/html; charset=utf-8 /css/site.css 200 text/css /api/status 200 application/json /missing.png 404 text/plain; charset=utf-8

پیشوند یک پیشوند رشته‌ای ساده است. با / هر مسیر اول روی دیسک جستجو می‌شود که برای سایت کوچک اشکالی ندارد؛ برای یک API بزرگ پرونده‌ها را زیر پیشوند خودشان مثل /static بگذارید. هر مسیریاب یک پوشه‌ی ایستا دارد و فراخوانی دوباره‌ی ایستا جای قبلی را می‌گیرد. فعال سازی فهرست پوشه باعث می‌شود پوشه‌ای که index.html ندارد به جای ۴۰۴ فهرست HTML پرونده‌هایش را برگرداند.

گونه‌ها

پارامتر Param

ساختار پارامتر
یک پارامتر مسیر.
نامانگلیسیگونهتوضیح
کلیدkeyرشته = ""نام، بدون :.
مقدارvalueرشته = ""مقدار از مسیر درخواست.
net-router-Dispatch.salam
واردسازی شبکه.مسیریاب

ناپایا شمار := ۰

تابع فهرست(_زمینه: صحیح۶۴):
    شمار += ۱
پایان

تابع نمایش(_زمینه: صحیح۶۴):
    شمار += ۱
پایان

تابع ساختن(_زمینه: صحیح۶۴):
    شمار += ۱
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/books"، فهرست)
    مسیریاب.دریافت(م، "/books/:id"، نمایش)
    مسیریاب.ارسال(م، "/books"، ساختن)
    مسیریاب.قراردادن(م، "/books/:id"، ساختن)
    مسیریاب.حذف(م، "/books/:id"، ساختن)
    مسیریاب.وصله(م، "/books/:id"، ساختن)
    مسیریاب.سر(م، "/books"، فهرست)
    مسیریاب.گزینه ها(م، "/books"، فهرست)
    مسیریاب.روش(م، "PURGE"، "/cache"، ساختن)
    مسیریاب.روش(م، "GET"، "/files/*"، نمایش)
    مسیریاب.گروه(م، "/api/v1"، "GET"، "/users/:uid/books/:id"، نمایش)
    مسیریاب.ایستا(م، "/static"، "public")
    مسیریاب.فعال سازی فهرست پوشه(م)
    سرچاپ م.مسیرها.طول()، م.ایستا فعال، م.پیشوند ایستا، م.فهرست ایستا
    ناپایا ت := مسیریاب.اعزام(م، "GET"، "/books/42")
    سرچاپ ت.پیدا شد، ت.گرداننده == نمایش، مسیریاب.دریافت پارامتر(ت، "id")
    مسیریاب.آزادسازی تطابق(ت)
    ناپایا ت۲ := مسیریاب.اعزام(م، "GET"، "/api/v1/users/7/books/3")
    سرچاپ ت۲.پیدا شد، ت۲.پارامترها.اقلام.طول()، ت۲.پارامترها.اقلام[۰].کلید، ت۲.پارامترها.اقلام[۰].مقدار
    مسیریاب.آزادسازی تطابق(ت۲)
    ناپایا ت۳ := مسیریاب.اعزام(م، "GET"، "/files/a/b.txt")
    سرچاپ ت۳.پیدا شد، ت۳.پارامترها.اقلام.طول()
    مسیریاب.آزادسازی تطابق(ت۳)
    ناپایا ت۴ := مسیریاب.اعزام(م، "DELETE"، "/books")
    سرچاپ ت۴.پیدا شد، م.مسیرها[۰].روش، م.مسیرها[۰].الگو
    مسیریاب.آزادسازی تطابق(ت۴)
پایان
خروجی11 true /static true true true 42 true 2 uid 7 true 0 false GET /books

پارامترها ParamList

ساختار پارامترها
فهرست پارامترها.
نامانگلیسیگونهتوضیح
اقلامitemsوکتور<پارامتر>پارامترها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

مسیر مسیریابی Route

ساختار مسیر مسیریابی
یک مسیر ثبت‌شده.
نامانگلیسیگونهتوضیح
روشmethodرشته = ""روش HTTP.
الگوpatternرشته = ""الگوی مسیر.
گردانندهfnصحیح۶۴ = 0تابع گرداننده.
شناسه روشmidصحیح = 0شناسه‌ی روش.
نوع الگوspecصحیح = 0نوع الگو: صفر ثابت، ۱ با پارامتر، ۲ با *.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

مسیریاب Router

ساختار مسیریاب
مسیریاب: درخواست‌ها را بر اساس روش و مسیر به تابع مناسب می‌فرستد.
نامانگلیسیگونهتوضیح
مسیرهاroutesوکتور<مسیر مسیریابی>مسیرهای ثبت‌شده.
پیشوند ایستاstatic_prefixرشته = ""پیشوند مسیر پرونده‌های ایستا.
پوشه ایستاstatic_dirرشته = ""پوشه‌ی پرونده‌های ایستا.
ایستا فعالhas_staticمنطقی = نادرستپرونده‌های ایستا فعال است.
فهرست ایستاstatic_listingمنطقی = نادرستفهرست محتوای پوشه‌ها نشان داده شود.
مدیر پیش‌فرضfallbackصحیح۶۴ = 0مدیری که وقتی هیچ مسیری مطابقت نکند اجرا می‌شود؛ صفر یعنی مدیری نیست و سرور ۴۰۴ می‌دهد.
جدول نمایهidxوکتور<صحیح>جدول درهم مسیرهای ثابت.
پوشش نمایهidx_maskصحیح = 0اندازه‌ی جدول منهای یک.
شمار ثابت‌هاn_literalصحیح = 0تعداد مسیرهای ثابت.
شمار پویاهاn_dynamicصحیح = 0تعداد مسیرهای دارای پارامتر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

تطابق Match

ساختار تطابق
نتیجه‌ی یافتن مسیر.
نامانگلیسیگونهتوضیح
پیدا شدmatchedمنطقی = نادرستمسیری پیدا شد.
گردانندهfnصحیح۶۴ = 0تابع گرداننده‌ی مسیر.
پارامترهاparamsپارامترهاپارامترهای مسیر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

تابع‌ها

مسیریاب جدید NewRouter

تابع مسیریاب جدید(): مسیریاب
مسیریاب خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

دریافت Get

تابع دریافت(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
گرداننده‌ی درخواست‌های GET یک مسیر را ثبت می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

ارسال Post

تابع ارسال(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
برای POST.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

قراردادن Put

تابع قراردادن(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
برای PUT.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

حذف Delete

تابع حذف(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
برای DELETE.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

وصله Patch

تابع وصله(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
برای PATCH.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

تابع سر(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
برای HEAD.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

گزینه ها Options

تابع گزینه ها(r &: مسیریاب، path: رشته، fn: صحیح۶۴)
برای OPTIONS.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

روش Method

تابع روش(r &: مسیریاب، method: رشته، path: رشته، fn: صحیح۶۴)
گرداننده را برای هر روشی که نام ببرید ثبت می‌کند، مثلاً PROPFIND. نام روش به بزرگی و کوچکی حروف حساس است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

گروه Group

تابع گروه(r &: مسیریاب، prefix: رشته، method: رشته، path: رشته، fn: صحیح۶۴)
یک مسیر را زیر پیشوندی مثل /api/v1 ثبت می‌کند؛ همان ثبت پیشوند + مسیر با آن روش است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

ایستا Static

تابع ایستا(r &: مسیریاب، prefix: رشته، dir: رشته)
پرونده‌های پوشه‌ی داده‌شده را زیر پیشوند مسیر سرو می‌کند. هر مسیریاب یک پوشه‌ی ایستا دارد و فراخوانی دوباره جای قبلی را می‌گیرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

فعال سازی فهرست پوشه EnableListing

تابع فعال سازی فهرست پوشه(r &: مسیریاب)
برای پوشه‌های بدون index.html، فهرست پرونده‌ها را نشان می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

تنظیم مدیر پیش‌فرض SetFallback

تابع تنظیم مدیر پیش‌فرض(r &: مسیریاب، fn: صحیح۶۴)
مدیری را برای هر درخواستی می‌گذارد که با هیچ مسیری نخورد، با هر روش و مسیری؛ مدیر کل پاسخ را می‌سازد. سروری که پاسخ را از سرآیند Host انتخاب می‌کند، مانند net/httpd، با همین پشت یک مسیریاب می‌نشیند.
net-router-Fallback.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع خانه(ز: صحیح۶۴):
    اچ تی تی پی.متن(ز، "خانه")
پایان

تابع بقیه(ز: صحیح۶۴):
    اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۲)
    اچ تی تی پی.متن(ز، "رسید " + اچ تی تی پی.روش(ز) + " " + اچ تی تی پی.مسیر(ز))
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    سرچاپ م.مدیر پیش‌فرض
    مسیریاب.دریافت(م، "/"، خانه)
    مسیریاب.تنظیم مدیر پیش‌فرض(م، بقیه)
    سرچاپ م.مدیر پیش‌فرض == بقیه
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۲۵)
    اچ تی تی پی.استفاده(س، م)
    سرچاپ اچ تی تی پی.اجرا در پس زمینه(س)
    الف := اچ تی تی پی.دریافت("http://127.0.0.1:19625/")
    سرچاپ اچ تی تی پی.وضعیت(الف)، اچ تی تی پی.بدنه(الف)
    ب := اچ تی تی پی.دریافت("http://127.0.0.1:19625/unknown/page")
    سرچاپ اچ تی تی پی.وضعیت(ب)، اچ تی تی پی.بدنه(ب)
پایان
خروجی0 true true 200 خانه 202 رسید GET /unknown/page

دریافت پارامتر ParamGet

تابع دریافت پارامتر(m: تطابق، key: رشته): رشته
مقدار یک پارامتر مسیر، هنوز رمزگشایی‌نشده؛ اگر نباشد، رشته‌ی خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

اعزام Dispatch

تابع اعزام(r: مسیریاب، method: رشته، path: رشته): تطابق
مسیر مناسب برای روش و مسیر درخواست را پیدا می‌کند. مسیرهای ثابت بر مسیرهای دارای پارامتر مقدم‌اند و درخواست HEAD، اگر مسیر خودش را نداشته باشد، به مسیر GET می‌رود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam

آزادسازی تطابق FreeMatch

تابع آزادسازی تطابق(m &: تطابق)
حافظه‌ی نتیجه را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-router-Dispatch.salam