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

اچ تی تی پی net/http

سرور و کارخواه HTTP: گرداننده‌ها، پاسخ متنی و جیسون، کوکی و فرستادن درخواست.

واردسازی شبکه.اچ تی تی پی

این بسته هر دو نیمه‌ی HTTP/1.1 را دارد: سروری برای صفحه‌های وب و APIهای جیسون، و کارخواهی برای صدا زدن سرویس‌های دیگر. سرور هر درخواست را به یک مسیریاب می‌دهد که گرداننده را بر اساس روش و مسیر انتخاب می‌کند. هر گرداننده یک عدد صحیح۶۴ می‌گیرد که شناسه‌ی زمینه‌ی درخواست است؛ با تابع‌های زمینه‌ی پایین درخواست را می‌خوانید و پاسخ را می‌نویسید، یا شناسه را با زمینه جدید به ساختار زمینه تبدیل می‌کنید و همان نام‌ها را روی آن صدا می‌زنید.

بسته‌های پیرامون آن:

اشتباه‌های رایج:

  • همه‌ی مسیرها را پیش از استفاده ثبت کنید. سرور رونوشتی از مسیریاب نگه می‌دارد.
  • ارسال، قراردادن و وصله بدنه را فرم برچسب می‌زنند (application/x-www-form-urlencoded)، مگر این‌که Content-Type بدهید؛ جیسون را با ارسال با و همین سرآیند بفرستید.
  • کارخواه تا نخواهید تغییر مسیر را دنبال نمی‌کند. پاسخ ۳۰۲ همان ۳۰۲ با سرآیند Location برمی‌گردد؛ برای دنبال کردن، max_redirects را در گزینه های درخواست (یا با تنظیم سقف تغییر مسیر روی یک کارخواه) بالای صفر بگذارید. هیچ‌وقت معطل نمی‌ماند و بی‌حد نمی‌خواند: خواندن یا نوشتنی که ۳۰ ثانیه بی‌حرکت بماند شکست می‌خورد، پاسخ بالای ۲۵۶ مگابایت شکست می‌خورد و timeout_ms کل درخواست را محدود می‌کند.
  • موفق یعنی وضعیت 2xx. وقتی اصلاً به سرور نرسیده‌اید وضعیت صفر است و خطا دلیلش را می‌گوید.
  • مقداری که از درخواست خوانده می‌شود با برگشتن گرداننده آزاد می‌شود؛ پایان صفحه را ببینید.

نمونه‌ها سرور را با اجرا در پس زمینه روی 127.0.0.1 اجرا می‌کنند و با همان برنامه به آن درخواست می‌فرستند.

یک API جیسون در یک پرونده

رایج‌ترین کار، یک API کوچک جیسون است: فهرست رکوردها، نمایش یکی با شناسه‌اش و ساختن رکورد تازه. هر مسیر را با گرداننده‌اش روی مسیریاب ثبت کنید، مسیریاب را با استفاده به سرور بدهید و سرور را راه بیندازید. در این نمونه رکوردها ساختارهای سلام‌اند: جیسون.سریال سازی آن‌ها را به بدنه‌ی پاسخ تبدیل می‌کند و جیسون.واسریال سازی آسان گیر بدنه‌ی فرستاده‌شده را به ساختار برمی‌گرداند؛ فیلدهای ناشناخته را نادیده می‌گیرد و فیلدهای نیامده را با مقدار پیش‌فرض رها می‌کند.

net-http-guide-api.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.خطای کدگذاری
واردسازی تبدیل

ناپایا کتاب‌ها := وکتور {} برگردان وکتور<کتاب>

ساختار کتاب:
    @جیسون "id"
    همگانی شناسه: صحیح = ۰
    @جیسون "title"
    همگانی عنوان: رشته = ""
پایان

تابع فهرست(ز: صحیح۶۴):
    اچ تی تی پی.جیسون(ز، جیسون.سریال سازی(کتاب‌ها))
پایان

تابع نمایش(ز: صحیح۶۴):
    شماره := تبدیل.رشته به عدد(اچ تی تی پی.پارامتر(ز، "id"))
    هر ک در کتاب‌ها:
        اگر ک.شناسه برابر شماره:
            اچ تی تی پی.جیسون(ز، جیسون.سریال سازی(ک))
            برگشت
        پایان
    پایان
    اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۴)
    اچ تی تی پی.جیسون(ز، `{"error":"چنین کتابی نیست"}`)
پایان

تابع ساختن(ز: صحیح۶۴):
    ناپایا ک := کتاب {}
    ناپایا خ := خطای کدگذاری.بدون خطا()
    اگر وارونه جیسون.واسریال سازی آسان گیر(اچ تی تی پی.بدنه(ز)، ک، خ):
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۰)
        اچ تی تی پی.جیسون(ز، "{" + جیسون.عضو("error"، خ.پیام) + "}")
        برگشت
    پایان
    ک.شناسه = کتاب‌ها.طول() + ۱
    کتاب‌ها.بیفزا(ک)
    اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
    اچ تی تی پی.تنظیم سرصفحه(ز، "Location"، "/books/" + ک.شناسه)
    اچ تی تی پی.جیسون(ز، جیسون.سریال سازی(ک))
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/books"، فهرست)
    مسیریاب.دریافت(م، "/books/:id"، نمایش)
    مسیریاب.ارسال(م، "/books"، ساختن)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۱)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19781"
    پ := اچ تی تی پی.ارسال(پایه + "/books"، `{"title": "شازده کوچولو"}`)
    سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "location")، اچ تی تی پی.بدنه(پ)
    _ := اچ تی تی پی.ارسال(پایه + "/books"، `{"title": "مثنوی"}`)
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/books"))
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/books/2"))
    نبود := اچ تی تی پی.دریافت(پایه + "/books/9")
    سرچاپ اچ تی تی پی.وضعیت(نبود)، اچ تی تی پی.بدنه(نبود)
    بد := اچ تی تی پی.ارسال(پایه + "/books"، `{"title": 7}`)
    سرچاپ اچ تی تی پی.وضعیت(بد)، اچ تی تی پی.بدنه(بد)
پایان
خروجی201 /books/1 {"id":1,"title":"شازده کوچولو"} [{"id":1,"title":"شازده کوچولو"},{"id":2,"title":"مثنوی"}] {"id":2,"title":"مثنوی"} 404 {"error":"چنین کتابی نیست"} 400 {"error": "value does not match the expected type"}

تا گرداننده تمام نشود چیزی فرستاده نمی‌شود: وضعیت، سرآیندها و بدنه جمع می‌شوند و با هم می‌روند، و اگر دو بار بدنه بنویسید دومی جای اولی را می‌گیرد. برای همین گرداننده درست پس از نوشتن خطا برمی‌گردد. پاسخ معمول به ساختن، ۲۰۱ همراه با سرآیند Location است، و یک ۴۰۴ با خطای کوتاه جیسون برای کارخواه از صفحه‌ی خالی راحت‌تر است. پارامترهای مسیر مثل :id همیشه متن‌اند؛ پیش از مقایسه آن‌ها را با تبدیل.رشته به عدد به عدد تبدیل کنید.

فرم HTML، رشته‌ی پرسمان و تغییر مسیر

فرم مرورگر با نوع application/x-www-form-urlencoded می‌رسد. فرم زمینه یک فیلد را می‌خواند و رمزگشایی می‌کند؛ %40 می‌شود @ و + می‌شود فاصله. پرسمان زمینه همین کار را برای رشته‌ی پرسمان می‌کند. پس از یک POST موفق با تغییرمسیر زمینه پاسخ دهید تا اگر کاربر صفحه را تازه کرد، فرم دوباره فرستاده نشود.

net-http-guide-forms.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی قالب

ناپایا پیام‌ها := وکتور {} برگردان وکتور<رشته>

تابع تابلو(ز: صحیح۶۴):
    ناپایا صفحه := "<ul>"
    هر پیام در پیام‌ها:
        صفحه = صفحه + "<li>" + قالب.گریز اچ تی ام ال(پیام) + "</li>"
    پایان
    اچ تی تی پی.اچ تی ام ال(ز، صفحه + "</ul>")
پایان

تابع نوشتن(ز: صحیح۶۴):
    نام := اچ تی تی پی.فرم(ز، "name")
    متن := اچ تی تی پی.فرم(ز، "text")
    اگر نام برابر "" یا متن برابر "":
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۰)
        اچ تی تی پی.متن(ز، "نام و متن هر دو لازم‌اند")
        برگشت
    پایان
    پیام‌ها.بیفزا(نام + ": " + متن)
    اچ تی تی پی.تغییرمسیر(ز، "/board")
پایان

تابع جستجو(ز: صحیح۶۴):
    واژه := اچ تی تی پی.پرسمان(ز، "q")
    ناپایا تعداد := ۰
    هر پیام در پیام‌ها:
        اگر پیام.بیاب(واژه) بزرگتربرابر ۰:
            تعداد += ۱
        پایان
    پایان
    اچ تی تی پی.متن(ز، "«" + واژه + "» در " + تعداد + " پیام پیدا شد")
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/board"، تابلو)
    مسیریاب.ارسال(م، "/board"، نوشتن)
    مسیریاب.دریافت(م، "/search"، جستجو)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۲)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19782"
    ناپایا فرم := اچ تی تی پی.سرصفحه جدید()
    فرم.درج("name"، "سارا")
    فرم.درج("text"، "ساعت ۵ می‌بینمت و چای & شیرینی بیاور")
    ناپایا سر := اچ تی تی پی.سرصفحه جدید()
    سر.درج("Content-Type"، "application/x-www-form-urlencoded")
    پ := اچ تی تی پی.ارسال با(پایه + "/board"، اچ تی تی پی.کدگذاری فرم(فرم)، سر)
    سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "location")
    ناقص := اچ تی تی پی.ارسال با(پایه + "/board"، "name=Reza"، سر)
    سرچاپ اچ تی تی پی.وضعیت(ناقص)، اچ تی تی پی.بدنه(ناقص)
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/board"))
    ناپایا پرسش := اچ تی تی پی.سرصفحه جدید()
    پرسش.درج("q"، "چای")
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(اچ تی تی پی.با پرسمان(پایه + "/search"، پرسش)))
پایان
خروجی302 /board 400 نام و متن هر دو لازم‌اند <ul><li>سارا: ساعت ۵ می‌بینمت و چای &amp; شیرینی بیاور</li></ul> «چای» در 1 پیام پیدا شد

هر چیزی که کاربر نوشته، پیش از رفتن در HTML باید گریز داده شود؛ وگرنه پیامی که <script> دارد در مرورگر همه‌ی بازدیدکنندگان اجرا می‌شود. قالب.گریز اچ تی ام ال این کار را می‌کند، همان‌طور که &amp; در خروجی نشان می‌دهد. در سمت کارخواه، کدگذاری فرم بدنه‌ی فرم را از یک نگاشت می‌سازد و با پرسمان رشته‌ی پرسمان را به نشانی اضافه می‌کند، هر دو با گریز درست.

گروه مسیرها و بررسی ورود

مسیریاب.گروه مسیر را زیر یک پیشوند مشترک می‌گذارد؛ نسخه‌بندی API زیر /api/v1 همین‌طور انجام می‌شود. زنجیره‌ی جداگانه‌ای برای میان‌افزار وجود ندارد: بررسی‌ای که چند گرداننده با هم دارند یک تابع ساده است که اگر درخواست اجازه‌ی ادامه دارد درست برمی‌گرداند، وگرنه خودش پاسخ خطا را می‌نویسد و نادرست برمی‌گرداند. هر گرداننده آن را در خط اول صدا می‌زند و اگر نادرست بود برمی‌گردد.

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

تابع وارد شده(ز: صحیح۶۴): منطقی:
    اگر اچ تی تی پی.سرصفحه(ز، "Authorization") برابر "Bearer s3cret":
        برگشت درست
    پایان
    اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۱)
    اچ تی تی پی.تنظیم سرصفحه(ز، "WWW-Authenticate"، "Bearer")
    اچ تی تی پی.جیسون(ز، `{"error":"اول وارد شوید"}`)
    برگشت نادرست
پایان

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

تابع نمایه(ز: صحیح۶۴):
    اگر وارونه وارد شده(ز): برگشت پایان
    اچ تی تی پی.جیسون(ز، `{"user":"maryam"}`)
پایان

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

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/health"، سلامت)
    مسیریاب.گروه(م، "/api/v1"، "GET"، "/profile"، نمایه)
    مسیریاب.گروه(م، "/api/v1"، "DELETE"، "/posts/:id"، پاک کردن)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۳)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19783"
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/health"))
    پ := اچ تی تی پی.دریافت(پایه + "/api/v1/profile")
    سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "www-authenticate")، اچ تی تی پی.بدنه(پ)
    ناپایا مجوز := اچ تی تی پی.سرصفحه جدید()
    مجوز.درج("Authorization"، "Bearer s3cret")
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت با(پایه + "/api/v1/profile"، مجوز))
    سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.حذف با(پایه + "/api/v1/posts/3"، مجوز))
    سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/profile"))
پایان
خروجیok 401 Bearer {"error":"اول وارد شوید"} {"user":"maryam"} 204 404

مسیری که ثبت نشده خودبه‌خود ۴۰۴ می‌دهد، پس /profile بدون پیشوند پیدا نمی‌شود. برای ورود با کوکی به جای توکن، بسته‌ی نشست را ببینید.

پرونده‌های ایستا و تنظیمات سرور

مسیریاب.ایستا یک پوشه‌ی کامل را زیر یک پیشوند سرو می‌کند و نوع محتوا را از پسوند پرونده می‌گیرد. مسیری که بخواهد با .. از پوشه بیرون برود پذیرفته نمی‌شود و پرونده‌ی ناموجود ۴۰۴ می‌دهد. پنهان سازی توکن شماره‌ی نسخه را از سرآیند Server برمی‌دارد تا پاسخ فقط Salam بگوید.

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

تابع ریشه:
    _ := سیستم عامل.ساخت پوشه ها("public/css")
    _ := سیستم عامل.نوشتن پرونده("public/index.html"، "<h1>خوش آمدید</h1>")
    _ := سیستم عامل.نوشتن پرونده("public/css/site.css"، "body { margin: 0 }")
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.ایستا(م، "/site"، "public")
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۴)
    اچ تی تی پی.پنهان سازی توکن(س)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19784"
    صفحه := اچ تی تی پی.دریافت(پایه + "/site/index.html")
    سرچاپ اچ تی تی پی.وضعیت(صفحه)، اچ تی تی پی.دریافت سرصفحه(صفحه، "content-type")، اچ تی تی پی.بدنه(صفحه)
    سبک := اچ تی تی پی.دریافت(پایه + "/site/css/site.css")
    سرچاپ اچ تی تی پی.دریافت سرصفحه(سبک، "content-type")، اچ تی تی پی.بدنه(سبک)
    سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/site/missing.png"))
    سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/site/../secret.txt"))
    سرچاپ اچ تی تی پی.دریافت سرصفحه(صفحه، "server")
پایان
خروجی200 text/html; charset=utf-8 <h1>خوش آمدید</h1> text/css body { margin: 0 } 404 404 Salam

اجرای سرور واقعی

نمونه‌های بالا از اجرا در پس زمینه استفاده می‌کنند تا یک برنامه هم سرور باشد و هم کارخواه خودش. سرویس واقعی اجرا را صدا می‌زند که هرگز برنمی‌گردد. درگاه را از متغیر محیطی بخوانید، وقتی سرور در کانتینر یا پشت پراکسی است روی 0.0.0.0 گوش دهید، و تا وقتی سرور را راه می‌اندازید گزارش دسترسی را روشن نگه دارید.

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

تابع خانه(ز: صحیح۶۴):
    اچ تی تی پی.اچ تی ام ال(ز، "<h1>سلام</h1>")
پایان

تابع سلامت(ز: صحیح۶۴):
    اچ تی تی پی.جیسون(ز، `{"status":"ok"}`)
پایان

تابع ریشه:
    ناپایا درگاه := ۸۰۸۰
    اگر سیستم عامل.متغیر محیطی("PORT") نابرابر "":
        درگاه = تبدیل.رشته به عدد(سیستم عامل.متغیر محیطی("PORT"))
    پایان
    اچ تی تی پی.بیشینه بایت بدنه(۱۰۴۸۵۷۶)
    اچ تی تی پی.تنظیم بیکاری زنده نگه داشتن(۵۰۰۰)
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/"، خانه)
    مسیریاب.دریافت(م، "/health"، سلامت)
    مسیریاب.ایستا(م، "/assets"، "public")
    ناپایا س := اچ تی تی پی.سرور جدید(درگاه)
    اچ تی تی پی.تنظیم میزبان(س، "0.0.0.0")
    اچ تی تی پی.پنهان سازی توکن(س)
    اچ تی تی پی.فعال سازی گزارش دسترسی(س)
    اچ تی تی پی.استفاده(س، م)
    سرچاپ "گوش دادن روی درگاه " + درگاه
    اچ تی تی پی.اجرا(س)
پایان

آن را اجرا کنید و از ترمینال دیگری امتحانش کنید:

PORT=8080 salam run server.salam
curl http://127.0.0.1:8080/health

این محدودیت‌ها برای کل فرایندند: بیشینه بایت بدنه و بیشینه بایت سرایند درخواست‌های بیش از اندازه را رد می‌کنند، تنظیم بیکاری زنده نگه داشتن اتصال‌های بیکار را می‌بندد و بیشینه درخواست زنده نگه داشتن شمار درخواست‌های یک اتصال را محدود می‌کند. برای HTTPS به جای اجرا از اجرای امن با پرونده‌ی گواهی و کلید استفاده کنید، یا سرور را پشت پراکسی‌ای بگذارید که TLS را انجام می‌دهد.

صدا زدن یک API از سمت کارخواه

دریافت، ارسال و دیگر فراخوانی‌های یک‌خطی درخواستی می‌فرستند و یک پاسخ برمی‌گردانند؛ شکل‌های ... با یک نگاشت از سرآیندهای اضافه می‌گیرند. برنامه‌ی زیر چهار پاسخی را نشان می‌دهد که کارخواه باید از عهده‌شان برآید. ارسال بدون نوع محتوا به شکل فرم به سرور می‌رسد، پس API جیسون آن را با ۴۱۵ رد می‌کند؛ همان بدنه با ارسال با و Content-Type: application/json تیکت را می‌سازد. تغییر مسیر دنبال نمی‌شود، پس دریافت همان ۳۰۲ را برمی‌گرداند و Location را خودتان می‌خوانید. سروری که اجرا نیست وضعیت صفر می‌دهد و دلیلش در خطا است.

net-http-guide-client.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی کدگذاری.جیسون

تابع ساخت تیکت(ز: صحیح۶۴):
    نوع محتوا := اچ تی تی پی.سرصفحه(ز، "Content-Type")
    اگر نوع محتوا != "application/json":
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۱۵)
        اچ تی تی پی.جیسون(ز، "{\"error\":\"expected JSON, got " + نوع محتوا + "\"}")
        برگشت
    پایان
    عنوان := جیسون.دریافت(اچ تی تی پی.بدنه(ز)، "title")
    اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
    اچ تی تی پی.جیسون(ز، "{\"id\":31,\"title\":" + جیسون.رشته جیسون(عنوان) + "}")
پایان

تابع تیکت‌های قدیمی(ز: صحیح۶۴): اچ تی تی پی.تغییرمسیر(ز، "/v2/tickets") پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.ارسال(م، "/tickets"، ساخت تیکت)
    مسیریاب.دریافت(م، "/tickets"، تیکت‌های قدیمی)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۸۶۳۲)
    اچ تی تی پی.تنظیم میزبان(س، "127.0.0.1")
    اچ تی تی پی.استفاده(س، م)
    اگر وارونه اچ تی تی پی.اجرا در پس زمینه(س):
        سرچاپ "درگاه ۱۸۶۳۲ گرفته است"
        برگشت ۱
    پایان
    پایه := "http://127.0.0.1:18632"
    بدنه := `{"title": "کاغذ چاپگر تمام شده"}`

    ساده := اچ تی تی پی.ارسال(پایه + "/tickets"، بدنه)
    سرچاپ "ارسال:"، اچ تی تی پی.وضعیت(ساده)، اچ تی تی پی.بدنه(ساده)

    ناپایا سرها := اچ تی تی پی.سرصفحه جدید()
    سرها.درج("Content-Type"، "application/json")
    ساخته := اچ تی تی پی.ارسال با(پایه + "/tickets"، بدنه، سرها)
    سرچاپ "ارسال با:"، اچ تی تی پی.وضعیت(ساخته)، اچ تی تی پی.موفق(ساخته)، "شناسه"، جیسون.دریافت عدد(اچ تی تی پی.بدنه(ساخته)، "id")

    جابه‌جا := اچ تی تی پی.دریافت(پایه + "/tickets")
    سرچاپ "دریافت:"، اچ تی تی پی.وضعیت(جابه‌جا)، "Location:"، اچ تی تی پی.دریافت سرصفحه(جابه‌جا، "location")

    خاموش := اچ تی تی پی.دریافت("http://127.0.0.1:1/tickets")
    سرچاپ "سرور خاموش:"، اچ تی تی پی.وضعیت(خاموش)، اچ تی تی پی.موفق(خاموش)، اچ تی تی پی.خطا(خاموش)
    برگشت ۰
پایان
خروجیارسال: 415 {"error":"expected JSON, got application/x-www-form-urlencoded"} ارسال با: 201 true شناسه 31 دریافت: 302 Location: /v2/tickets سرور خاموش: 0 false could not connect to 127.0.0.1:1

پاسخ‌های gzip و chunked برایتان باز می‌شوند و هر درخواست با Connection: close فرستاده می‌شود. برای چند فراخوانی که یک ورود مشترک دارند، کارخواه جدید کوکی‌های هر پاسخ را نگه می‌دارد و با درخواست بعدی می‌فرستد، به‌علاوه‌ی سرآیندهایی که با تنظیم سرصفحه گذاشته‌اید. هر کوکی فقط به میزبانی برمی‌گردد که آن را گذاشته؛ کوکی‌ای که با تنظیم کوکی اضافه کنید به میزبان نخستین درخواست می‌رود و هرگز به میزبانی که یک تغییر مسیر به آن برساند.

هر تعداد نخ می‌توانند فراخوانی‌های یک‌خطی را هم‌زمان به کار ببرند، چون هر فراخوانی بیرون از خودش وضعیتی نگه نمی‌دارد. یک کارخواه که از کارخواه جدید آمده باشد را هم می‌شود بین نخ‌ها به اشتراک گذاشت: قفل خودش را دارد، پس تنظیم سرصفحه، ظرف کوکی و تنظیم‌ها سازگار می‌مانند. وقتی کارتان با یک کارخواه مشترک تمام شد آزادسازی را صدا بزنید. کارخواه {} که به شکل لفظی نوشته شود قفل ندارد و مال یک نخ است.

درخواست خام: سرآیند خودتان، بایت و مهلت

فراخوانی‌های یک‌خطی بالا درخواست را برایتان می‌سازند. وقتی کنترل کامل سطر درخواست و سرآیندها را بخواهید، مثلاً برای امضای درخواست، فرستادن بدنه‌ی دودویی یا کار با APIای که سرآیندهای غیرمعمول دارد، سر درخواست را خودتان بنویسید و با ارسال خام بفرستید. بسته‌های ای دبلیو اس، اعلان وب، میلی‌سرچ، الستیک سرچ و تایپ‌سنس روی همین فراخوانی‌ها ساخته شده‌اند. نمونه‌ها در برابر سرور کوچکی اجرا می‌شوند که در یک نخ از همان برنامه است، پس به شبکه نیاز ندارند.

هر فراخوانی خام یک نقطه پایانی از تجزیه نقطه پایانی می‌گیرد (میزبان، درگاه و روشن یا خاموش بودن TLS؛ مسیر داخل نشانی کنار گذاشته می‌شود، چون مسیر در سطر درخواست شما می‌آید) و یک سر درخواست: سطر درخواست، سرآیندها و یک سطر خالی، که هر سطرش با \r\n تمام می‌شود. بدنه یک اشاره‌گر و یک طول است، پس هر بایتی را می‌تواند در بر بگیرد. پاسخ یک پاسخ خام است با بدنه به شکل بایت که بدنه‌ی chunked در آن باز شده و با آزادسازی پاسخ خام آزاد می‌شود. ارسال خام تا هر وقت سرور بخواهد صبر می‌کند؛ ارسال خام با مهلت مهلتی به میلی‌ثانیه اضافه می‌کند؛ ارسال خام با پیکربندی امن یک tls.Config خودتان را. پاسخی بزرگ‌تر از سقف پاسخ خام (پیش‌فرض ۲۵۶ مگابایت) به شکل خطا گزارش می‌شود.

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

  • اگر پاسخ قاب‌بندی ندارد، Connection: close بفرستید. فراخوانی‌های خام به محض کامل شدن پاسخی که Content-Length یا بدنهٔ chunked دارد تمام می‌شوند. پاسخی که هیچ‌کدام را ندارد تا بسته شدن اتصال از سوی سرور خوانده می‌شود؛ پس روی اتصال زنده، فراخوانی تا آن لحظه (یا تا پایان مهلت) منتظر می‌ماند.
  • ok یعنی وضعیت 2xx، نه «پاسخی رسید». برای جدا کردن ۴۰۴ از سرور خاموش به status نگاه کنید.
  • رشته در نخستین بایت صفر تمام می‌شود، پس بدنه‌ی دودویی در data می‌ماند؛ متن پاسخ خام در نخستین صفر می‌برد.

فرستادن JSON با سرآیندهای خودتان

تجزیه نقطه پایانی یک نشانی را به میزبان، درگاه و این‌که TLS لازم است یا نه تبدیل می‌کند. سر درخواست متن ساده‌ای است که خودتان می‌نویسید: سطر درخواست، سرآیند Host و این‌جا توکن Authorization، نوع محتوا و طول بدنه، که با یک سطر خالی تمام می‌شود. ارسال خام با مهلت سر و بدنه را می‌فرستد و پاسخ را برمی‌گرداند؛ متن پاسخ خام بدنه‌ی پاسخ را به رشته تبدیل می‌کند. مقدار سرصفحه یک سرآیند را در سر پاسخ پیدا می‌کند و به بزرگی و کوچکی حرف اهمیت نمی‌دهد.

net-http-raw-post-json.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی کدگذاری.جیسون

ناپایا سرور := تی سی پی.سرور {}

تابع خواندن درخواست(ا: تی سی پی.اتصال شبکه): رشته:
    ناپایا رسیده := تی سی پی.خواندن(ا، ۴۰۹۶)
    تا رسیده.بیاب("\r\n\r\n") کوچکتر ۰:
        رسیده += تی سی پی.خواندن(ا، ۴۰۹۶)
    پایان
    انتهای سر := رسیده.بیاب("\r\n\r\n") + ۴
    اندازه := اچ تی تی پی.مقدار سرصفحه(رسیده، "content-length").به صحیح()
    تا رسیده.طول() کوچکتر انتهای سر + اندازه:
        رسیده += تی سی پی.خواندن(ا، ۴۰۹۶)
    پایان
    برگشت رسیده
پایان

تابع رابط برنامه():
    ا := تی سی پی.پذیرش(سرور)
    درخواست := خواندن درخواست(ا)
    جا := درخواست.بیاب("\r\n\r\n") + ۴
    بدنه := درخواست.زیررشته(جا، درخواست.طول() - جا)
    نام := جیسون.دریافت(بدنه، "name")
    مجوز := اچ تی تی پی.مقدار سرصفحه(درخواست، "authorization")
    پاسخ := "{\"id\": 7, \"name\": \"" + نام + "\", \"auth\": \"" + مجوز + "\"}"
    سر := "HTTP/1.1 201 Created\r\nContent-Type: application/json\r\nLocation: /users/7\r\nContent-Length: " + پاسخ.طول() + "\r\nConnection: close\r\n\r\n"
    _ := تی سی پی.نوشتن(ا، سر + پاسخ)
    تی سی پی.بستن(ا)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    ک := نخ‌ساز(رابط برنامه)
    نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
    بدنه := `{"name": "سارا", "role": "editor"}`
    ناپایا سر := "POST /users HTTP/1.1\r\n"
    سر += "Host: 127.0.0.1\r\n"
    سر += "Authorization: Bearer abc123\r\n"
    سر += "Content-Type: application/json\r\n"
    سر += "Content-Length: " + بدنه.طول() + "\r\n"
    سر += "Connection: close\r\n\r\n"
    ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، بدنه برگردان تهی*، بدنه.طول()، ۵۰۰۰)
    پاسخ‌متن := اچ تی تی پی.متن پاسخ خام(پ)
    اچ تی تی پی.آزادسازی پاسخ خام(پ)
    نخ‌پیوند(ک)
    تی سی پی.بستن سرور(سرور)
    سرچاپ "وضعیت:"، پ.وضعیت، پ.موفق
    سرچاپ "نشانی تازه:"، اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "Location")
    سرچاپ "شناسه:"، جیسون.دریافت عدد(پاسخ‌متن، "id")
    سرچاپ "بدنه:"، پاسخ‌متن
پایان
خروجیوضعیت: 201 true نشانی تازه: /users/7 شناسه: 7 بدنه: {"id": 7, "name": "سارا", "auth": "Bearer abc123"}

Content-Length باید طول به بایت باشد و طول() رشته همین را برمی‌گرداند؛ پس برای متن فارسی هم درست می‌ماند، با این‌که «سارا» چهار حرف و هشت بایت است. طول نادرست باعث می‌شود سرور منتظر داده‌ی بیشتر بماند یا بدنه را ببرد.

کدهای وضعیت و شکست‌ها

یک پاسخ خام سه حالت را از هم جدا می‌کند. ok فقط برای وضعیت 2xx درست است. پاسخ 4xx یا 5xx هم status و بدنه‌ی خودش را دارد که معمولاً مشکل را توضیح می‌دهد. وقتی هیچ پاسخی نرسیده، چون اتصال رد شده، میزبان ناشناخته بوده یا نشانی تجزیه نشده، status برابر ۰ است و error دلیلش را می‌گوید.

net-http-raw-status-errors.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی

ناپایا سرور := تی سی پی.سرور {}

تابع رابط برنامه():
    تکرار ۲:
        ا := تی سی پی.پذیرش(سرور)
        درخواست := تی سی پی.خواندن(ا، ۴۰۹۶)
        اگر درخواست.بیاب("GET /missing ") برابر ۰:
            تی سی پی.نوشتن اچ تی تی پی(ا، "404 Not Found"، "application/json; charset=utf-8"، `{"error": "چنین صفحه‌ای نیست"}`)
        وگرنه:
            تی سی پی.نوشتن اچ تی تی پی(ا، "503 Service Unavailable"، "text/plain; charset=utf-8"، "بعدا دوباره امتحان کنید")
        پایان
        تی سی پی.بستن(ا)
    پایان
پایان

تابع بگیر از(نشانی: اچ تی تی پی.نقطه پایانی، مسیر: رشته):
    سر := "GET " + مسیر + " HTTP/1.1\r\nHost: " + نشانی.میزبان + "\r\nConnection: close\r\n\r\n"
    ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۵۰۰۰)
    بدنه := اچ تی تی پی.متن پاسخ خام(پ)
    اگر پ.موفق:
        سرچاپ مسیر، "کار کرد:"، بدنه
    وگرنه پ.وضعیت بزرگتر ۰:
        سرچاپ مسیر، "پاسخ"، پ.وضعیت، "داد با"، بدنه
    وگرنه:
        سرچاپ مسیر، "شکست خورد:"، پ.خطا
    پایان
    اچ تی تی پی.آزادسازی پاسخ خام(پ)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    نخ := نخ‌ساز(رابط برنامه)
    نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
    بگیر از(نشانی، "/missing")
    بگیر از(نشانی، "/busy")
    نخ‌پیوند(نخ)
    تی سی پی.بستن سرور(سرور)
    بگیر از(اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:1")، "/nobody-listens")
    نشانی بد := اچ تی تی پی.تجزیه نقطه پایانی("ftp://files.example.com")
    سرچاپ "نشانی ftp درست است:"، نشانی بد.موفق
    بگیر از(نشانی بد، "/")
پایان
خروجی/missing پاسخ 404 داد با {"error": "چنین صفحه‌ای نیست"} /busy پاسخ 503 داد با بعدا دوباره امتحان کنید /nobody-listens شکست خورد: could not connect to 127.0.0.1:1 نشانی ftp درست است: false / شکست خورد: the endpoint could not be parsed

وضعیت 503 یا 429 اغلب یعنی «بعداً دوباره امتحان کن»؛ پیش از تلاش دوباره Retry-After را با مقدار سرصفحه بخوانید و خطای 4xx مثل 404 را که تغییر نمی‌کند دوباره نفرستید.

یک کارخواه کوچک API

ساختاری که نقطه‌ی پایانی و توکن را نگه می‌دارد و برای هر گونه درخواست یک متد دارد، نوشتن سرآیندها را در یک جا نگه می‌دارد. JSON پاسخ‌ها با جیسون خوانده می‌شود: جیسون.دریافت برای یک فیلد و جیسون.اقلام برای پیمودن یک آرایه.

net-http-raw-api-client.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی کدگذاری.جیسون

ناپایا سرور := تی سی پی.سرور {}

ساختار رابط:
    همگانی نشانی: اچ تی تی پی.نقطه پایانی = اچ تی تی پی.نقطه پایانی {}
    همگانی توکن: رشته = ""

    همگانی تابع خواندن مسیر(مسیر: رشته): رشته:
        ناپایا سر := "GET " + مسیر + " HTTP/1.1\r\n"
        سر += "Host: " + این.نشانی.میزبان + "\r\n"
        سر += "Authorization: Bearer " + این.توکن + "\r\n"
        سر += "Accept: application/json\r\n"
        سر += "Connection: close\r\n\r\n"
        ناپایا خام := اچ تی تی پی.ارسال خام با مهلت(این.نشانی، سر، پوچ، ۰، ۵۰۰۰)
        دیرکن اچ تی تی پی.آزادسازی پاسخ خام(خام)
        برگشت اچ تی تی پی.متن پاسخ خام(خام)
    پایان
پایان

تابع پشتیبان():
    تکرار ۲:
        ا := تی سی پی.پذیرش(سرور)
        درخواست := تی سی پی.خواندن(ا، ۴۰۹۶)
        اگر درخواست.بیاب("GET /users/7 ") برابر ۰:
            تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "application/json; charset=utf-8"، `{"id": 7, "name": "سارا", "city": "شیراز"}`)
        وگرنه:
            تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "application/json; charset=utf-8"، `[{"item": "خودکار", "qty": 3}, {"item": "دفتر", "qty": 1}]`)
        پایان
        تی سی پی.بستن(ا)
    پایان
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    نخ := نخ‌ساز(پشتیبان)
    رابط برنامه := رابط { نشانی = اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))، توکن = "abc123" }
    کاربر := رابط برنامه.خواندن مسیر("/users/7")
    سرچاپ جیسون.دریافت(کاربر، "name")، "از"، جیسون.دریافت(کاربر، "city")
    سفارش‌ها := رابط برنامه.خواندن مسیر("/users/7/orders")
    هر سفارش در جیسون.اقلام(سفارش‌ها):
        سرچاپ " "، جیسون.دریافت عدد(سفارش، "qty")، "عدد"، جیسون.دریافت(سفارش، "item")
    پایان
    نخ‌پیوند(نخ)
    تی سی پی.بستن سرور(سرور)
پایان
خروجیسارا از شیراز 3 عدد خودکار 1 عدد دفتر

پاسخ تکه‌تکه و مهلت

سروری که طول پاسخش را از پیش نمی‌داند آن را در تکه‌هایی می‌فرستد که پیش از هر کدام اندازه‌اش در مبنای ۱۶ آمده است. ارسال خام با مهلت این قاب‌بندی را برمی‌دارد. آخرین پارامتر ارسال خام با مهلت مهلتی به میلی‌ثانیه برای هر خواندن و نوشتن است و در لینوکس برای اتصال هم، پس سروری که اتصال را می‌پذیرد و بعد چیزی نمی‌گوید نمی‌تواند برنامه را معطل کند. درخواست دوم زیر با مهلت ۳۰۰ میلی‌ثانیه به چنین سروری می‌خورد.

net-http-raw-chunked.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی

ناپایا سرور := تی سی پی.سرور {}

تابع خبرنامه():
    تکرار ۲ در ی:
        ا := تی سی پی.پذیرش(سرور)
        _ := تی سی پی.خواندن(ا، ۴۰۹۶)
        اگر ی کوچکتر ۱:
            _ := تی سی پی.نوشتن(ا، "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n6\r\nnews: \r\n9\r\nall quiet\r\n0\r\n\r\n")
        وگرنه:
            _ := تی سی پی.خواندن(ا، ۴۰۹۶)
        پایان
        تی سی پی.بستن(ا)
    پایان
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    نخ := نخ‌ساز(خبرنامه)
    نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
    سر := "GET /feed HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"

    ناپایا خام := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۲۰۰۰)
    سرچاپ "بدنه:"، اچ تی تی پی.متن پاسخ خام(خام)
    اچ تی تی پی.آزادسازی پاسخ خام(خام)

    ناپایا کند := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۳۰۰)
    سرچاپ "سرور خاموش:"، کند.موفق، کند.وضعیت، کند.خطا
    اچ تی تی پی.آزادسازی پاسخ خام(کند)
    نخ‌پیوند(نخ)
    تی سی پی.بستن سرور(سرور)
پایان
خروجیبدنه: news: all quiet سرور خاموش: false 0 the request timed out

پایان مهلت به شکل the request timed out گزارش می‌شود و پاسخی که با بسته شدن اتصال ناقص بماند به شکل the response body was cut short؛ هر دو برای تلاش دوباره‌ی بعدی ارزش دارند. ارسال خام اصلاً مهلت ندارد؛ برای هر سروری که در اختیار شما نیست ارسال خام با مهلت را با یک مهلت به کار ببرید. ارسال خام با پیکربندی امن همین مهلت را به‌علاوه‌ی یک tls.Config برای مرجع خصوصی می‌گیرد.

بارگیری دودویی

رشته در نخستین بایت صفر تمام می‌شود، پس تصویر یا پرونده‌ی زیپی که به رشته تبدیل شود بریده می‌رسد. به جای آن بدنه را از خود پاسخ خام بخوانید: data به بایت‌های بدنه اشاره می‌کند و len شمار آن‌هاست. برنامه دوازده بایت از سرآیند یک PNG را بارگیری می‌کند و نشان می‌دهد که متن پاسخ خام، که بدنه را به رشته تبدیل می‌کند، فقط هشت بایت پیش از نخستین صفر را نگه می‌دارد.

net-http-raw-binary.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی حافظه
واردسازی تبدیل

ناپایا سرور := تی سی پی.سرور {}

تابع پرونده‌ها():
    ا := تی سی پی.پذیرش(سرور)
    _ := تی سی پی.خواندن(ا، ۴۰۹۶)
    تصویر := [۱۳۷، ۸۰، ۷۸، ۷۱، ۱۳، ۱۰، ۲۶، ۱۰، ۰، ۰، ۰، ۱۳]
    بافر := حافظه.تخصیص(۱۲ برگردان طبیعی۶۴) برگردان طبیعی۸*
    تکرار ۱۲ در ی:
        بافر[ی] = تصویر[ی] برگردان طبیعی۸
    پایان
    _ := تی سی پی.نوشتن(ا، "HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: 12\r\nConnection: close\r\n\r\n")
    _ := تی سی پی.نوشتن بایت(ا، بافر برگردان تهی*، ۱۲)
    حافظه.آزادسازی(بافر برگردان تهی*)
    تی سی پی.بستن(ا)
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    نخ := نخ‌ساز(پرونده‌ها)
    نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
    سر := "GET /logo.png HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
    ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۵۰۰۰)
    نخ‌پیوند(نخ)
    تی سی پی.بستن سرور(سرور)
    سرچاپ پ.موفق، پ.وضعیت، اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "content-type")
    سرچاپ "بایت‌های رسیده:"، پ.اندازه
    بایت‌ها := پ.داده برگردان طبیعی۸*
    ناپایا شانزدهی := ""
    تکرار پ.اندازه در ی:
        اگر ی بزرگتر ۰: شانزدهی += " " پایان
        اگر بایت‌ها[ی] کوچکتر ۱۶: شانزدهی += "0" پایان
        شانزدهی += تبدیل.قالب شانزده(بایت‌ها[ی] برگردان طبیعی۶۴)
    پایان
    سرچاپ شانزدهی
    سرچاپ "PNG است:"، پ.اندازه بزرگتربرابر ۴ و بایت‌ها[۱] برگردان صحیح برابر ۸۰ و بایت‌ها[۲] برگردان صحیح برابر ۷۸ و بایت‌ها[۳] برگردان صحیح برابر ۷۱
    سرچاپ "متن پاسخ خام فقط"، اچ تی تی پی.متن پاسخ خام(پ).طول()، "بایت نگه می‌دارد"
    اچ تی تی پی.آزادسازی پاسخ خام(پ)
پایان
خروجیtrue 200 image/png بایت‌های رسیده: 12 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d PNG است: true متن پاسخ خام فقط 8 بایت نگه می‌دارد

بدنه‌ی پاسخ خام به سقف پاسخ خام بایت محدود است، یعنی ۲۵۶ مگابایت مگر این‌که با تنظیم سقف پاسخ خام عوضش کنید؛ پاسخ بزرگ‌تر به جای پر کردن حافظه به شکل خطا گزارش می‌شود. بافر data تا آزادسازی پاسخ خام مال شماست.

HTTPS

نشانی https:// نقطه‌ی پایانی‌ای با secure درست می‌دهد و همان فراخوانی‌ها از راه تی ال اس با TLS حرف می‌زنند و گواهی سرور را بررسی می‌کنند. چیز دیگری تغییر نمی‌کند. این نمونه از API گیت‌هاب درباره‌ی مخزن سلام می‌پرسد و به اینترنت نیاز دارد؛ گیت‌هاب سرآیند User-Agent را لازم می‌داند.

net-http-raw-https.salam
واردسازی شبکه.اچ تی تی پی
واردسازی کدگذاری.جیسون

تابع ریشه:
    نشانی := اچ تی تی پی.تجزیه نقطه پایانی("https://api.github.com")
    سرچاپ نشانی.میزبان، نشانی.درگاه، نشانی.امن
    ناپایا سر := "GET /repos/SalamLang/Salam HTTP/1.1\r\n"
    سر += "Host: api.github.com\r\n"
    سر += "User-Agent: salam-example\r\n"
    سر += "Accept: application/vnd.github+json\r\n"
    سر += "Connection: close\r\n\r\n"
    ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۱۰۰۰۰)
    دیرکن اچ تی تی پی.آزادسازی پاسخ خام(پ)
    بدنه := اچ تی تی پی.متن پاسخ خام(پ)
    اگر پ.وضعیت برابر ۰:
        سرچاپ "درخواست شکست خورد:"، پ.خطا
        برگشت ۱
    پایان
    سرچاپ "وضعیت:"، پ.وضعیت
    سرچاپ "سهمیه‌ی باقی‌مانده:"، اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "x-ratelimit-remaining")
    اگر پ.موفق:
        سرچاپ جیسون.دریافت(بدنه، "full_name")، "به زبان"، جیسون.دریافت(بدنه، "language")، "نوشته شده است"
    پایان
    برگشت ۰
پایان

هنگام نوشتن این صفحه چنین چاپ کرد:

api.github.com 443 true
وضعیت: 200
سهمیه‌ی باقی‌مانده: 58
SalamLang/Salam به زبان TeX نوشته شده است

عدد سهمیه با هر فراخوانی از نشانی شما کم می‌شود و زبان همان است که گیت‌هاب در آن لحظه برای مخزن تشخیص می‌دهد.

مهلت، سقف و تغییر مسیر

درخواست‌های کارخواه با سقف‌های زیر اجرا می‌شوند. گزینه های درخواست سقف‌ها را نگه می‌دارد و انجام درخواست درخواستی را با آن‌ها می‌فرستد؛ هر کارخواه رونوشت خودش را دارد که با تنظیم مهلت، تنظیم مهلت بیکاری، تنظیم سقف تغییر مسیر و تنظیم سقف بدنه عوض می‌شود. idle_ms (پیش‌فرض ۳۰ ثانیه) مدتی است که یک خواندن یا نوشتن می‌تواند بی‌حرکت بماند، timeout_ms (پیش‌فرض خاموش) زمان کل درخواست با تغییر مسیرهاست و max_body (پیش‌فرض ۲۵۶ مگابایت) بدنه را حتی پس از باز شدن gzip محدود می‌کند، پس پاسخ فشرده‌ی کوچک نمی‌تواند حافظه را پر کند. پیدا کردن نشانی یک نام میزبان را حل‌کننده‌ی سیستم انجام می‌دهد و در سیستم‌هایی جز لینوکس خودِ اتصال هم مهلت پیش‌فرض سیستم را دارد؛ این سقف‌ها هیچ‌کدام را شامل نمی‌شوند. درخواستی که زمانش تمام شود the request timed out گزارش می‌دهد و پاسخی که با بسته شدن اتصال ناقص بماند خطاست، نه بدنه‌ی کوچک‌تر.

تغییر مسیر فقط وقتی دنبال می‌شود که max_redirects بالای صفر باشد. ۳۰۱ یا ۳۰۲ پس از POST و هر ۳۰۳ به GET بدون بدنه تبدیل می‌شوند؛ ۳۰۷ و ۳۰۸ درخواست را همان‌طور که بود تکرار می‌کنند. وقتی تغییر مسیر به میزبان دیگری برود سرآیندهای Authorization و Cookie کنار گذاشته می‌شوند و تغییر مسیر از https به http رد می‌شود. نشانی نهایی در فیلد url پاسخ است.

درخواست پیش از فرستادن بررسی می‌شود: روش، نام سرآیند یا نشانی‌ای که فاصله یا نویسه‌ی کنترلی دارد، و مقدار سرآیندی که شکست سطر دارد، با پیامی در err رد می‌شود، پس مقداری که از بیرون می‌آید نمی‌تواند سرآیند به درخواست اضافه کند. سرآیندهای Content-Length، Transfer-Encoding، Connection و Accept-Encoding شما را همان‌هایی که کارخواه حساب می‌کند جایگزین می‌کند. نمونه به سروری که دیر جواب می‌دهد و سروری که هرگز جواب نمی‌دهد درخواست می‌فرستد، یک تغییر مسیر را دنبال می‌کند و پاسخ بیش از اندازه بزرگ را رد می‌کند.

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

ناپایا سرور := تی سی پی.سرور {}

تابع پشتیبان():
    تکرار ۶:
        اتصال := تی سی پی.پذیرش(سرور)
        درخواست := تی سی پی.خواندن(اتصال، ۴۰۹۶)
        اگر درخواست.بیاب("GET /old ") برابر ۰:
            _ := تی سی پی.نوشتن(اتصال، "HTTP/1.1 302 Found\r\nLocation: /new\r\nContent-Length: 0\r\nConnection: close\r\n\r\n")
        وگرنه درخواست.بیاب("GET /silent ") برابر ۰:
            همگام سازی.خواب میلی ثانیه(۷۰۰)
        وگرنه درخواست.بیاب("GET /big ") برابر ۰:
            تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "0123456789")
        وگرنه:
            تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "landed")
        پایان
        تی سی پی.بستن(اتصال)
    پایان
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    نخ := نخ‌ساز(پشتیبان)
    پایه := "http://127.0.0.1:" + تی سی پی.درگاه(سرور)
    ناپایا کارخواه := اچ تی تی پی.کارخواه جدید()
    کارخواه.تنظیم سقف تغییر مسیر(۳)
    کارخواه.تنظیم مهلت(۵۰۰۰)
    کارخواه.تنظیم مهلت بیکاری(۲۰۰۰)
    کارخواه.تنظیم سقف بدنه(۱۰۰۰)
    پاسخ := کارخواه.دریافت(پایه + "/old")
    سرچاپ پاسخ.وضعیت، اچ تی تی پی.بدنه(پاسخ)، پاسخ.نشانی.بیاب("/new") بزرگتر ۰
    ناپایا تنگ := اچ تی تی پی.گزینه های درخواست {}
    تنگ.حداکثر‌بدنه = ۵
    بزرگ := اچ تی تی پی.انجام درخواست("GET"، پایه + "/big"، اچ تی تی پی.سرصفحه جدید()، ""، تنگ)
    سرچاپ بزرگ.وضعیت، بزرگ.خطا
    ناپایا سریع := اچ تی تی پی.گزینه های درخواست {}
    سریع.میلی‌ثانیه‌زمان‌انتظار = ۲۰۰
    ساکت := اچ تی تی پی.انجام درخواست("GET"، پایه + "/silent"، اچ تی تی پی.سرصفحه جدید()، ""، سریع)
    سرچاپ ساکت.وضعیت، ساکت.خطا
    خام := کارخواه.درخواست بایتی("GET"، پایه + "/big"، ""، "")
    سرچاپ خام.وضعیت، خام.بدنه.طول
    سرچاپ کارخواه.درخواست خام("GET"، پایه + "/new"، "X-Id: 1\r\n"، "").وضعیت
    کارخواه.آزادسازی()
    نخ‌پیوند(نخ)
    تی سی پی.بستن سرور(سرور)
پایان
خروجی200 landed true 200 the response body is larger than the 5-byte limit 0 the request timed out 200 10 200

کدام تابع برای کدام کار

کارتابع
خواندن پارامتر مسیر، مقدار پرسمان یا فیلد فرمپارامتر زمینه، پرسمان زمینه، فرم زمینه
خواندن بدنه‌ی خام یا سرآیند درخواستبدنه زمینه، سرصفحه زمینه
پاسخ متنی، جیسون یا HTMLمتن زمینه، جیسون زمینه، اچ تی ام ال زمینه
تعیین وضعیت یا افزودن سرآیندوضعیت زمینه، تنظیم سرصفحه زمینه
فرستادن مرورگر به جای دیگرتغییرمسیر زمینه
نگه داشتن درخواست در یک ساختار به جای شناسه‌ی خالیزمینه جدید، سپس همان پارامتر و جیسون و بقیه
درخواست با مهلت، سقف اندازه یا تغییر مسیرانجام درخواست با گزینه های درخواست، یا تنظیم مهلت و تنظیم سقف تغییر مسیر روی یک کارخواه
یک درخواست از برنامهدریافت، ارسال، دریافت با، ارسال با، درخواست
چند درخواست با کوکی مشترککارخواه جدید
درخواست با سرآیندهایی که خودتان می‌نویسید، یا بدنه‌ی دودوییتجزیه نقطه پایانی، ارسال خام، ارسال خام با مهلت، ارسال خام با پیکربندی امن
خواندن بایت‌های پاسخ خامdata و len از پاسخ خام، متن پاسخ خام، و بعد آزادسازی پاسخ خام
بررسی پاسخموفق برای وضعیت 2xx، وضعیت برای کد (صفر وقتی پاسخی نیامد)، خطا برای دلیل

مقداری که از درخواست می‌خوانید، مثل پارامتر زمینه یا فرم زمینه، مال همان درخواست است و وقتی گرداننده برمی‌گردد آزاد می‌شود. برای نگه داشتن طولانی‌تر، در یک فهرست سراسری یا در نشست، رونوشتی با رشته.رونوشت یا رشته‌ی تازه‌ای که با + ساخته شده ذخیره کنید.

گونه‌ها

نقطه پایانی Endpoint

ساختار نقطه پایانی
نشانی یک سرور: میزبان، درگاه و امن بودن.
نامانگلیسیگونهتوضیح
میزبانhostرشته = ""میزبان.
درگاهportصحیح = 443درگاه: همان که در نشانی آمده، وگرنه ۸۰ برای http و ۴۴۳ برای https.
امنsecureمنطقی = درستبا TLS وصل شود.
موفقokمنطقی = نادرستنشانی درست خوانده شد؛ برای هر چیزی که با http:// یا https:// شروع نشود نادرست است.
net-http-SendRaw.salam
واردسازی تی ال اس
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی

ناپایا سرور := تی سی پی.سرور {}

تابع پاسخ‌گو():
    تکرار ۳:
        ا := تی سی پی.پذیرش(سرور)
        _ := تی سی پی.خواندن(ا، ۴۰۹۶)
        تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "text/plain"، "سلام از سرور")
        تی سی پی.بستن(ا)
    پایان
پایان

تابع ریشه:
    ن := اچ تی تی پی.تجزیه نقطه پایانی("https://api.example.com:8443")
    سرچاپ ن.موفق، ن.میزبان، ن.درگاه، ن.امن
    سرور = تی سی پی.پیوند(۰)
    ک := نخ‌ساز(پاسخ‌گو)
    محلی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
    سر := "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
    ناپایا پ := اچ تی تی پی.ارسال خام(محلی، سر، پوچ، ۰)
    سرچاپ پ.موفق، پ.وضعیت، اچ تی تی پی.متن پاسخ خام(پ)، "[" + پ.خطا + "]"
    سرچاپ اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "content-type")
    اچ تی تی پی.آزادسازی پاسخ خام(پ)
    ناپایا خ := اچ تی تی پی.ارسال خام با مهلت(محلی، سر، پوچ، ۰، ۲۰۰۰)
    سرچاپ خ.موفق، خ.وضعیت، خ.اندازه، اچ تی تی پی.متن پاسخ خام(خ)
    اچ تی تی پی.آزادسازی پاسخ خام(خ)
    ناپایا پیکربندی := تی ال اس.پیکربندی جدید("127.0.0.1")
    پیکربندی.پرونده گواهی ریشه = "/etc/ssl/certs/ca-certificates.crt"
    ناپایا امن := اچ تی تی پی.ارسال خام با پیکربندی امن(محلی، سر، پوچ، ۰، ۲۰۰۰، پیکربندی)
    سرچاپ امن.وضعیت، امن.اندازه
    اچ تی تی پی.آزادسازی پاسخ خام(امن)
    نخ‌پیوند(ک)
    تی سی پی.بستن سرور(سرور)
    سرچاپ اچ تی تی پی.سقف پاسخ خام() > ۰
    اچ تی تی پی.تنظیم سقف پاسخ خام(۱۰۲۴ * ۱۰۲۴)
    سرچاپ اچ تی تی پی.سقف پاسخ خام()
پایان
خروجیtrue api.example.com 8443 true true 200 سلام از سرور [] text/plain true 200 22 سلام از سرور 200 22 true 1048576

زمینه Context

ساختار زمینه
زمینه‌ی یک درخواست؛ همان شناسه‌ی عددی که گرداننده می‌گیرد، در یک ساختار.
نامانگلیسیگونهتوضیح
دستهhصحیح۶۴شناسه‌ی زمینه.
net-http-Context.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع سلام(ه: صحیح۶۴):
    ز := اچ تی تی پی.زمینه جدید(ه)
    نام := اچ تی تی پی.پرسمان(ز، "name")
    اگر اچ تی تی پی.کوکی دارد(ز، "seen"):
        اچ تی تی پی.متن(ز، "دوباره سلام " + نام + " (" + اچ تی تی پی.مقدار کوکی(ز، "seen") + ")")
    وگرنه:
        اچ تی تی پی.تنظیم کوکی(ز، اچ تی تی پی.کوکی با انقضا("seen"، "1"، ۳۶۰۰))
        اچ تی تی پی.متن(ز، "سلام " + نام + " (" + اچ تی تی پی.پرسمان خام(ز) + ")")
    پایان
پایان

تابع کتاب(ه: صحیح۶۴):
    ز := اچ تی تی پی.زمینه جدید(ه)
    اچ تی تی پی.تنظیم سرصفحه(ز، "X-Method"، اچ تی تی پی.روش(ز))
    اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۲)
    اچ تی تی پی.جیسون(ز، `{"id": "` + اچ تی تی پی.پارامتر(ز، "id") + `", "path": "` + اچ تی تی پی.مسیر(ز) + `"}`)
پایان

تابع فرم(ه: صحیح۶۴):
    ز := اچ تی تی پی.زمینه جدید(ه)
    اچ تی تی پی.متن(ز، اچ تی تی پی.فرم(ز، "a") + "|" + اچ تی تی پی.بدنه(ز) + "|" + اچ تی تی پی.سرصفحه(ز، "Content-Type"))
پایان

تابع خروج(ه: صحیح۶۴):
    ز := اچ تی تی پی.زمینه جدید(ه)
    اچ تی تی پی.پاک کردن کوکی(ز، "seen")
    اچ تی تی پی.تغییرمسیر(ز، "/hello")
پایان

تابع صفحه(ه: صحیح۶۴):
    ز := اچ تی تی پی.زمینه جدید(ه)
    ک := اچ تی تی پی.کوکی ها(ز)
    اچ تی تی پی.اچ تی ام ال(ز، "<p>" + ک.اندازه() + "</p>")
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/hello"، سلام)
    مسیریاب.دریافت(م، "/books/:id"، کتاب)
    مسیریاب.ارسال(م، "/form"، فرم)
    مسیریاب.دریافت(م، "/logout"، خروج)
    مسیریاب.دریافت(م، "/page"، صفحه)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۲)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19602"
    ناپایا ک := اچ تی تی پی.کارخواه جدید()
    سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/hello?name=%D9%85%D8%B1%DB%8C%D9%85"))
    سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/hello?name=%D9%85%D8%B1%DB%8C%D9%85"))
    سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/page"))
    پ := ک.دریافت(پایه + "/books/7")
    سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "x-method")
    ک.تنظیم سرصفحه("Content-Type"، "application/x-www-form-urlencoded")
    سرچاپ اچ تی تی پی.بدنه(ک.ارسال(پایه + "/form"، "a=1&b=2"))
    پ۲ := ک.دریافت(پایه + "/logout")
    سرچاپ اچ تی تی پی.وضعیت(پ۲)، اچ تی تی پی.خطوط کوکی(پ۲).طول() > ۰
پایان
خروجیسلام مریم (name=%D9%85%D8%B1%DB%8C%D9%85) دوباره سلام مریم (1) <p>1</p> 202 {"id": "7", "path": "/books/7"} GET 1|a=1&b=2|application/x-www-form-urlencoded 302 true

سرور Server

ساختار سرور
سرور HTTP.
نامانگلیسیگونهتوضیح
درگاهportصحیح = 0درگاه.
میزبانhostرشته = "0.0.0.0"نشانی گوش دادن؛ پیش‌فرض 0.0.0.0 یعنی همه‌ی نشانی‌ها.
مسیریابrouterrouter.Routerمسیریاب درخواست‌ها.
پنهان‌سازی‌توکنhide_tokensمنطقی = نادرستنسخه‌ی سرور در پاسخ‌ها پنهان شود.
گزارش‌دسترسیaccess_logمنطقی = نادرستهر درخواست در خروجی ثبت شود.
net-http-Server.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی شبکه.تی سی پی

تابع سلام(ه: صحیح۶۴):
    ز := اچ تی تی پی.زمینه جدید(ه)
    ا := اچ تی تی پی.اتصال مربوط به(ز)
    اچ تی تی پی.متن(ز، "سلام " + تی سی پی.اتصال معتبر(ا))
پایان

تابع ریشه:
    اچ تی تی پی.تنظیم بیکاری زنده نگه داشتن(۵۰۰۰)
    اچ تی تی پی.بیشینه درخواست زنده نگه داشتن(۱۰۰)
    اچ تی تی پی.بیشینه بایت سرایند(۱۶۳۸۴)
    اچ تی تی پی.بیشینه بایت بدنه(۱۰۴۸۵۷۶)
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/"، سلام)
    ناپایا س := اچ تی تی پی.سرور جدید(۸۰۸۰)
    اچ تی تی پی.تنظیم میزبان(س، "0.0.0.0")
    اچ تی تی پی.پنهان سازی توکن(س)
    اچ تی تی پی.فعال سازی گزارش دسترسی(س)
    اچ تی تی پی.استفاده(س، م)
    سرچاپ اچ تی تی پی.نسخه سرور، اچ تی تی پی.لبه است()
    اگر وارونه اچ تی تی پی.لبه است():
        اچ تی تی پی.اجرای امن(س، "cert.pem"، "key.pem")
    پایان
    اچ تی تی پی.اجرا(س)
پایان

پاسخ خام RawResponse

ساختار پاسخ خام
پاسخ با بدنه‌ی دودویی.
نامانگلیسیگونهتوضیح
وضعیتstatusصحیح = 0کد وضعیت.
سرصفحهheadرشته = ""سرآیندها.
دادهdataتهی*نشانی بدنه.
اندازهlenصحیح = 0طول بدنه به بایت، پس از باز کردن chunked.
موفقokمنطقی = نادرستوضعیت 2xx است.
خطاerrorرشته = ""پیام خطا، مثل the request timed out یا the response body was cut short.

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

ساختار کوکی
یک کوکی پاسخ.
نامانگلیسیگونهتوضیح
نامnameرشته = ""نام.
مقدارvalueرشته = ""مقدار.
مسیرpathرشته = "/"مسیری که کوکی برایش فرستاده می‌شود؛ پیش‌فرض /.
دامنهdomainرشته = ""دامنه؛ خالی یعنی همین میزبان.
حداکثر‌عمرmax_ageصحیح = 0عمر بر حسب ثانیه.
دارای‌حداکثر‌عمرhas_max_ageمنطقی = نادرستعمر تعیین شده؛ بدون آن کوکی با بستن مرورگر پاک می‌شود.
امنsecureمنطقی = نادرستفقط روی HTTPS فرستاده شود.
فقط‌اچ‌تی‌تی‌پیhttp_onlyمنطقی = درستجاوااسکریپت صفحه به آن دسترسی نداشته باشد؛ پیش‌فرض درست.
سایت‌یکسانsame_siteرشته = "Lax"سیاست SameSite؛ پیش‌فرض Lax.
net-http-Cookie.salam
واردسازی شبکه.اچ تی تی پی

تابع ریشه:
    ک := اچ تی تی پی.کوکی جدید("theme"، "dark")
    سرچاپ ک.نام، ک.مقدار، ک.مسیر، ک.فقط‌اچ‌تی‌تی‌پی، ک.سایت‌یکسان، ک.دارای‌حداکثر‌عمر
    ناپایا ا := اچ تی تی پی.کوکی با انقضا("sid"، "x1"، ۳۶۰۰)
    ا.امن = درست
    ا.دامنه = "salamlang.ir"
    سرچاپ ا.حداکثر‌عمر، ا.دارای‌حداکثر‌عمر، ا.امن، ا.دامنه
    م := اچ تی تی پی.کوکی منقضی شده("sid"، "/"، "salamlang.ir")
    سرچاپ م.حداکثر‌عمر، م.دارای‌حداکثر‌عمر
    سرچاپ اچ تی تی پی.رمزگشایی نشانی("a%20b+c")
پایان
خروجیtheme dark / true Lax false 3600 true true salamlang.ir -1 true a b c

پاسخ Response

ساختار پاسخ
پاسخ یک درخواست کارخواه.
نامانگلیسیگونهتوضیح
وضعیتstatusصحیح = 0کد وضعیت.
بدنهbodyرشته = ""بدنه.
سرصفحهheadرشته = ""سرآیندهای خام.
خطاerrرشته = ""پیام خطا، اگر درخواست نرسید یا به‌خاطر یک سقف رد شد؛ اگر چیزی برنگشته باشد وضعیت صفر است.
نشانیurlرشته = ""نشانی آخرین درخواست، پس از تغییر مسیرها.
net-http-Client.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع پژواک(ز: صحیح۶۴):
    اچ تی تی پی.تنظیم سرصفحه(ز، "X-Tag"، "a")
    اچ تی تی پی.تنظیم کوکی(ز، اچ تی تی پی.کوکی جدید("sid"، "abc"))
    اچ تی تی پی.متن(ز، اچ تی تی پی.روش(ز) + " " + اچ تی تی پی.سرصفحه(ز، "X-Token") + " " + اچ تی تی پی.بدنه(ز))
پایان

تابع کوکی‌ها(ز: صحیح۶۴):
    ه := اچ تی تی پی.کوکی ها(ز)
    اچ تی تی پی.متن(ز، "" + ه.اندازه() + " " + اچ تی تی پی.مقدار کوکی(ز، "lang") + " " + اچ تی تی پی.کوکی دارد(ز، "sid"))
    اچ تی تی پی.پاک کردن کوکی(ز، "old")
    اچ تی تی پی.پاک کردن کوکی در مسیر(ز، "scoped"، "/admin"، "")
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    هر روش در ["GET"، "POST"، "PUT"، "DELETE"، "PATCH"، "OPTIONS"، "HEAD"]:
        مسیریاب.روش(م، روش، "/echo"، پژواک)
    پایان
    مسیریاب.دریافت(م، "/cookies"، کوکی‌ها)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۳)
    اچ تی تی پی.استفاده(س، م)
    _ := اچ تی تی پی.اجرا در پس زمینه(س)
    ن := "http://127.0.0.1:19603/echo"
    ناپایا سر := اچ تی تی پی.سرصفحه جدید()
    سر.درج("X-Token"، "t1")
    پ := اچ تی تی پی.دریافت با(ن، سر)
    سرچاپ اچ تی تی پی.موفق(پ)، اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)، "[" + اچ تی تی پی.خطا(پ) + "]"
    سرچاپ اچ تی تی پی.سرصفحه ها(پ).دارد("X-Tag")، اچ تی تی پی.مقادیر سرصفحه(پ، "set-cookie")
    سرچاپ اچ تی تی پی.نگاشت کوکی(پ).دریافت("sid")، اچ تی تی پی.سرصفحه های خام(پ).طول() > ۰، اچ تی تی پی.خام(پ).طول() > ۰
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.ارسال(ن، "a"))، اچ تی تی پی.بدنه(اچ تی تی پی.قرار دادن با(ن، "b"، سر))
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.حذف(ن))، اچ تی تی پی.بدنه(اچ تی تی پی.حذف با(ن، سر))
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.وصله(ن، "c"))، اچ تی تی پی.بدنه(اچ تی تی پی.وصله با(ن، "d"، سر))
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.گزینه ها(ن))، اچ تی تی پی.بدنه(اچ تی تی پی.گزینه ها با(ن، سر))
    سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.درخواست هد(ن))، اچ تی تی پی.وضعیت(اچ تی تی پی.سرصفحه با(ن، سر))
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.قرار دادن(ن، "e"))، اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(ن))
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.درخواست خام("POST"، ن، "X-Token: raw\r\n"، "f"))
    ناپایا پارامترها := اچ تی تی پی.سرصفحه جدید()
    پارامترها.درج("q"، "سلام دنیا")
    سرچاپ اچ تی تی پی.کدگذاری فرم(پارامترها)، اچ تی تی پی.با پرسمان("http://x.ir/s"، پارامترها)
    ناپایا کوکی := اچ تی تی پی.سرصفحه جدید()
    کوکی.درج("lang"، "fa")
    کوکی.درج("sid"، "abc")
    سر.درج("Cookie"، اچ تی تی پی.سرصفحه کوکی(کوکی))
    پ۲ := اچ تی تی پی.دریافت با("http://127.0.0.1:19603/cookies"، سر)
    سرچاپ اچ تی تی پی.بدنه(پ۲)، اچ تی تی پی.خطوط کوکی(پ۲).طول()
    ناپایا ک := اچ تی تی پی.کارخواه جدید()
    ک.تنظیم کوکی("lang"، "en")
    سرچاپ اچ تی تی پی.بدنه(ک.دریافت("http://127.0.0.1:19603/cookies"))
    ک.پاک کردن کوکی ها()
    ناپایا اضافه := اچ تی تی پی.سرصفحه جدید()
    اضافه.درج("X-Token"، "c1")
    سرچاپ اچ تی تی پی.بدنه(ک.درخواست با("PUT"، ن، "g"، اضافه))، اچ تی تی پی.بدنه(ک.درخواست("PATCH"، ن، "h"))
    سرچاپ اچ تی تی پی.بدنه(ک.قرار دادن(ن، "i"))، اچ تی تی پی.بدنه(ک.حذف(ن))، اچ تی تی پی.بدنه(ک.وصله(ن، "j"))، اچ تی تی پی.بدنه(ک.گزینه ها(ن))، اچ تی تی پی.وضعیت(ک.درخواست هد(ن))
    خطا := اچ تی تی پی.دریافت("http://127.0.0.1:1/")
    سرچاپ اچ تی تی پی.موفق(خطا)، اچ تی تی پی.خطا(خطا) != ""
پایان
خروجیtrue 200 GET t1 [] true ["sid=abc; Path=/; SameSite=Lax; HttpOnly"] abc true true POST a PUT t1 b DELETE DELETE t1 PATCH c PATCH t1 d OPTIONS OPTIONS t1 200 200 PUT e GET POST raw f q=%D8%B3%D9%84%D8%A7%D9%85%20%D8%AF%D9%86%DB%8C%D8%A7 http://x.ir/s?q=%D8%B3%D9%84%D8%A7%D9%85%20%D8%AF%D9%86%DB%8C%D8%A7 2 fa true 2 1 en false PUT c1 g PATCH h PUT i DELETE PATCH j OPTIONS 200 false true

پاسخ بایتی BytesResponse

ساختار پاسخ بایتی
پاسخی که بدنه‌اش بایت‌های خام است، برای بارگیری بایگانی‌ها و تصویرهایی که رشته آن‌ها را در نخستین بایت صفر می‌بُرد.
نامانگلیسیگونهتوضیح
وضعیتstatusصحیح = 0کد وضعیت.
سرصفحهheadرشته = ""سرآیندهای خام.
بدنهbodycompress.ByteBufبدنه به شکل compress.ByteBuf؛ با compress.BufFree آزادش کنید.
خطاerrرشته = ""پیام خطا، اگر درخواست نرسید؛ آن‌گاه وضعیت صفر است.
نشانیurlرشته = ""نشانی آخرین درخواست، پس از تغییر مسیرها.

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

گزینه های درخواست RequestOptions

ساختار گزینه های درخواست
سقف‌های یک درخواست: idle_ms برای یک خواندن یا نوشتنِ بی‌حرکت (۳۰۰۰۰)، timeout_ms برای کل درخواست (۰، بی‌حد)، max_body به بایت (۲۵۶ مگابایت) و max_redirects (۰).
نامانگلیسیگونهتوضیح
میلی‌ثانیه‌بیکاریidle_msصحیح = 30000مدتی که یک خواندن یا نوشتن می‌تواند بی‌حرکت بماند، به میلی‌ثانیه.
میلی‌ثانیه‌زمان‌انتظارtimeout_msصحیح = 0زمان کل درخواست با تغییر مسیرها؛ ۰ یعنی بی‌حد.
حداکثر‌بدنهmax_bodyصحیح = 268435456بزرگ‌ترین بدنه به بایت، پس از باز شدن gzip.
حداکثر‌تغییرمسیرmax_redirectsصحیح = 0شمار تغییر مسیرهایی که دنبال می‌شوند؛ ۰ هیچ‌کدام.
net-http-Do.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی

ناپایا سرور := تی سی پی.سرور {}

تابع پشتیبان():
    تکرار ۶:
        اتصال := تی سی پی.پذیرش(سرور)
        درخواست := تی سی پی.خواندن(اتصال، ۴۰۹۶)
        اگر درخواست.بیاب("GET /old ") برابر ۰:
            _ := تی سی پی.نوشتن(اتصال، "HTTP/1.1 302 Found\r\nLocation: /new\r\nContent-Length: 0\r\nConnection: close\r\n\r\n")
        وگرنه درخواست.بیاب("GET /silent ") برابر ۰:
            همگام سازی.خواب میلی ثانیه(۷۰۰)
        وگرنه درخواست.بیاب("GET /big ") برابر ۰:
            تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "0123456789")
        وگرنه:
            تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "landed")
        پایان
        تی سی پی.بستن(اتصال)
    پایان
پایان

تابع ریشه:
    سرور = تی سی پی.پیوند(۰)
    نخ := نخ‌ساز(پشتیبان)
    پایه := "http://127.0.0.1:" + تی سی پی.درگاه(سرور)
    ناپایا کارخواه := اچ تی تی پی.کارخواه جدید()
    کارخواه.تنظیم سقف تغییر مسیر(۳)
    کارخواه.تنظیم مهلت(۵۰۰۰)
    کارخواه.تنظیم مهلت بیکاری(۲۰۰۰)
    کارخواه.تنظیم سقف بدنه(۱۰۰۰)
    پاسخ := کارخواه.دریافت(پایه + "/old")
    سرچاپ پاسخ.وضعیت، اچ تی تی پی.بدنه(پاسخ)، پاسخ.نشانی.بیاب("/new") بزرگتر ۰
    ناپایا تنگ := اچ تی تی پی.گزینه های درخواست {}
    تنگ.حداکثر‌بدنه = ۵
    بزرگ := اچ تی تی پی.انجام درخواست("GET"، پایه + "/big"، اچ تی تی پی.سرصفحه جدید()، ""، تنگ)
    سرچاپ بزرگ.وضعیت، بزرگ.خطا
    ناپایا سریع := اچ تی تی پی.گزینه های درخواست {}
    سریع.میلی‌ثانیه‌زمان‌انتظار = ۲۰۰
    ساکت := اچ تی تی پی.انجام درخواست("GET"، پایه + "/silent"، اچ تی تی پی.سرصفحه جدید()، ""، سریع)
    سرچاپ ساکت.وضعیت، ساکت.خطا
    خام := کارخواه.درخواست بایتی("GET"، پایه + "/big"، ""، "")
    سرچاپ خام.وضعیت، خام.بدنه.طول
    سرچاپ کارخواه.درخواست خام("GET"، پایه + "/new"، "X-Id: 1\r\n"، "").وضعیت
    کارخواه.آزادسازی()
    نخ‌پیوند(نخ)
    تی سی پی.بستن سرور(سرور)
پایان
خروجی200 landed true 200 the response body is larger than the 5-byte limit 0 the request timed out 200 10 200

کارخواه Client

ساختار کارخواه
کارخواه HTTP که سرآیندهای ثابت و کوکی‌ها را میان درخواست‌ها نگه می‌دارد؛ مثل یک مرورگر ساده.
نامانگلیسیگونهتوضیح
کوکی‌هاcookiesنگاشت<رشته، رشته>کوکی‌هایی که از پاسخ‌ها گرفته؛ هر کدام فقط به میزبانی برمی‌گردد که آن را گذاشته.
سرصفحه‌هاheadersنگاشت<رشته، رشته>سرآیندهایی که با هر درخواست فرستاده می‌شوند.
میزبان‌های‌کوکیcookie_hostsنگاشت<رشته، رشته>این‌که هر کوکی در cookies را کدام میزبان گذاشته.
امنیت‌کوکیcookie_secureنگاشت<رشته، منطقی>کوکی‌هایی که با ویژگی Secure آمده‌اند؛ این‌ها فقط روی HTTPS برگردانده می‌شوند و هرگز روی HTTP ساده فرستاده نمی‌شوند.
گزینه‌هاoptionsگزینه های درخواستسقف‌های این کارخواه: یک گزینه های درخواست.
قفلmusync.Mutexقفلی که نخ‌ها را قادر می‌کند کارخواهِ ساخته‌شده با کارخواه جدید را به اشتراک بگذارند.

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

تنظیم سرصفحه SetHeader

تابع تنظیم سرصفحه(name: رشته، value: رشته)
سرآیندی را برای همه‌ی درخواست‌های بعدی تنظیم می‌کند.

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

تنظیم کوکی SetCookie

تابع تنظیم کوکی(name: رشته، value: رشته)
کوکی‌ای را دستی اضافه می‌کند؛ فقط به میزبان نخستین درخواست فرستاده می‌شود.

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

پاک کردن کوکی ها ClearCookies

تابع پاک کردن کوکی ها()
همه‌ی کوکی‌ها را پاک می‌کند.

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

تنظیم مهلت SetTimeout

تابع تنظیم مهلت(total_ms: صحیح)
زمان کل یک درخواست را به میلی‌ثانیه می‌گذارد؛ ۰ یعنی بی‌حد.

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

تنظیم مهلت بیکاری SetIdleTimeout

تابع تنظیم مهلت بیکاری(idle_ms: صحیح)
مدتی را که یک خواندن یا نوشتن می‌تواند بی‌حرکت بماند به میلی‌ثانیه می‌گذارد.

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

تنظیم سقف تغییر مسیر SetMaxRedirects

تابع تنظیم سقف تغییر مسیر(n: صحیح)
شمار تغییر مسیرهایی را که درخواست دنبال می‌کند می‌گذارد؛ ۰ هیچ‌کدام.

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

تنظیم سقف بدنه SetMaxBody

تابع تنظیم سقف بدنه(bytes: صحیح)
بزرگ‌ترین بدنه‌ی مجاز پاسخ را به بایت می‌گذارد.

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

آزادسازی Free

تابع آزادسازی()
قفل و نگاشت‌های کارخواه را آزاد می‌کند.

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

درخواست Request

تابع درخواست(method: رشته، url: رشته، body: رشته): پاسخ
درخواست با روش و بدنه‌ی دلخواه؛ کوکی‌های پاسخ نگه داشته می‌شوند.

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

درخواست خام RequestRaw

تابع درخواست خام(method: رشته، url: رشته، header_block: رشته، body: رشته): پاسخ
درخواستی با متن سرآیندی که خودتان نوشته‌اید؛ کوکی‌ها و سرآیندهای کارخواه هم افزوده می‌شوند.

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

درخواست بایتی RequestBytes

تابع درخواست بایتی(method: رشته، url: رشته، header_block: رشته، body: رشته): پاسخ بایتی
مثل RequestRaw، ولی بدنه را به شکل بایت نگه می‌دارد (یک پاسخ بایتی).

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

درخواست با RequestWith

تابع درخواست با(method: رشته، url: رشته، body: رشته، extra: نگاشت<رشته، رشته>): پاسخ
مثل تابع بالا، با سرآیندهای اضافه برای همین درخواست.

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

دریافت Get

تابع دریافت(url: رشته): پاسخ
درخواست GET با کوکی‌ها و سرآیندهای کارخواه.

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

ارسال Post

تابع ارسال(url: رشته، body: رشته): پاسخ
درخواست POST با کوکی‌ها و سرآیندهای کارخواه.

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

قرار دادن Put

تابع قرار دادن(url: رشته، body: رشته): پاسخ
درخواست PUT با کوکی‌ها و سرآیندهای کارخواه.

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

حذف Delete

تابع حذف(url: رشته): پاسخ
درخواست DELETE با کوکی‌ها و سرآیندهای کارخواه.

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

وصله Patch

تابع وصله(url: رشته، body: رشته): پاسخ
درخواست PATCH با کوکی‌ها و سرآیندهای کارخواه.

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

گزینه ها Options

تابع گزینه ها(url: رشته): پاسخ
درخواست OPTIONS با کوکی‌ها و سرآیندهای کارخواه.

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

درخواست هد Head

تابع درخواست هد(url: رشته): پاسخ
درخواست HEAD با کوکی‌ها و سرآیندهای کارخواه.

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

پایاها و متغیرها

نسخه سرور SERVER_VERSION

پایا نسخه سرور: رشته = "0.6.0"
نسخه‌ی سرور که در سرآیند Server پاسخ‌ها فرستاده می‌شود.

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

تابع‌ها

رمزگشایی نشانی UrlDecode

تابع رمزگشایی نشانی(s: رشته): رشته
کدگذاری درصدی را برمی‌گرداند و + را فاصله می‌کند.

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

تجزیه نقطه پایانی ParseEndpoint

تابع تجزیه نقطه پایانی(endpoint: رشته): نقطه پایانی
نشانی‌ای مثل https://api.example.com:8443 را می‌خواند؛ درگاه پیش‌فرض برای http ۸۰ و برای https ۴۴۳ است. مسیر پس از میزبان نادیده گرفته می‌شود.

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

مقدار سرصفحه HeaderValue

تابع مقدار سرصفحه(head: رشته، name: رشته): رشته
مقدار یک سرآیند در متن سرآیندها؛ نام بدون توجه به کوچکی و بزرگی حروف.

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

میزبان Host

تابع میزبان(e: نقطه پایانی): رشته
میزبان یک Endpoint: برای https://api.example.com:8443/v1 همان api.example.com.
net-http-EndpointInfo.salam
واردسازی شبکه.اچ تی تی پی

تابع ریشه:
    ن := اچ تی تی پی.تجزیه نقطه پایانی("https://api.example.com:8443/v1/users")
    سرچاپ اچ تی تی پی.نقطه پایانی موفق(ن)، اچ تی تی پی.میزبان(ن)، اچ تی تی پی.درگاه(ن)، اچ تی تی پی.امن(ن)
    ساده := اچ تی تی پی.تجزیه نقطه پایانی("http://example.com")
    سرچاپ اچ تی تی پی.نقطه پایانی موفق(ساده)، اچ تی تی پی.میزبان(ساده)، اچ تی تی پی.درگاه(ساده)، اچ تی تی پی.امن(ساده)
    سرچاپ اچ تی تی پی.نقطه پایانی موفق(اچ تی تی پی.تجزیه نقطه پایانی("ftp://example.com"))
پایان
خروجیtrue api.example.com 8443 true true example.com 80 false false

درگاه Port

تابع درگاه(e: نقطه پایانی): صحیح
درگاه یک Endpoint: همان که در نشانی آمده، وگرنه ۸۰ برای http و ۴۴۳ برای https.

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

امن Secure

تابع امن(e: نقطه پایانی): منطقی
اینکه یک Endpoint با TLS وصل می‌شود: برای https:// درست و برای http:// نادرست.

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

نقطه پایانی موفق EndpointOk

تابع نقطه پایانی موفق(e: نقطه پایانی): منطقی
اینکه ParseEndpoint نشانی را خوانده است؛ برای هر چیزی که با http:// یا https:// شروع نشود نادرست است.

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

تنظیم بیکاری زنده نگه داشتن SetKeepAliveIdle

تابع تنظیم بیکاری زنده نگه داشتن(millis: صحیح)
اتصال بی‌کار keep-alive پس از چند میلی‌ثانیه بسته شود؛ برای همه‌ی سرورها.

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

بیشینه بایت سرایند SetMaxHeaderBytes

تابع بیشینه بایت سرایند(n: صحیح)
بیشترین اندازه‌ی سرآیندهای درخواست؛ بزرگ‌ترها با خطای ۴۳۱ رد می‌شوند.

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

بیشینه بایت بدنه SetMaxBodyBytes

تابع بیشینه بایت بدنه(n: صحیح)
بیشترین اندازه‌ی بدنه؛ بزرگ‌ترها با خطای ۴۱۳ رد می‌شوند.

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

بیشینه درخواست زنده نگه داشتن SetKeepAliveMaxRequests

تابع بیشینه درخواست زنده نگه داشتن(n: صحیح)
بیشترین تعداد درخواست روی یک اتصال.

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

ارسال پرونده File

تابع ارسال پرونده(h: صحیح۶۴، path: رشته، content_type: رشته): منطقی
یک پرونده‌ی روی دیسک را به‌عنوان بدنه می‌فرستد، تکه‌تکه، تا پرونده‌ی بزرگ هیچ‌وقت یکجا در حافظه نباشد؛ طول و نوع محتوا را خودش می‌گذارد. وضعیت و سرآیندهایی که گذاشته‌اید می‌مانند و به درخواست HEAD فقط سرآیندها می‌رسد. اگر پرونده باز نشود false برمی‌گرداند و چیزی تغییر نمی‌کند.
net-http-FileBody.salam
واردسازی ورودی خروجی
واردسازی سیستم عامل
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

تابع صفحه(ز: صحیح۶۴):
    پ := سیستم عامل.پوشه موقت() + "/salam_filebody_fa.txt"
    اگر اچ تی تی پی.ارسال پرونده(ز، پ، "text/plain"):
        اچ تی تی پی.تنظیم سرصفحه(ز، "X-Port"، اچ تی تی پی.مالکیت(ز، "" + اچ تی تی پی.درگاه محلی(ز)))
        اچ تی تی پی.تنظیم سرصفحه(ز، "X-Status"، اچ تی تی پی.مالکیت(ز، "" + اچ تی تی پی.وضعیت(ز)))
    وگرنه:
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۴)
        اچ تی تی پی.متن(ز، "پرونده نیست")
    پایان
پایان

تابع قطعه(ز: صحیح۶۴):
    پ := سیستم عامل.پوشه موقت() + "/salam_filebody_fa.txt"
    اگر اچ تی تی پی.ارسال بخشی از پرونده(ز، پ، "text/plain"، ۰، ۸):
        اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۶)
    وگرنه:
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۱۶)
        اچ تی تی پی.متن(ز، "بازه‌ی نادرست")
    پایان
پایان

تابع ریشه:
    پ := سیستم عامل.پوشه موقت() + "/salam_filebody_fa.txt"
    ورودی خروجی.نوشتن پرونده(پ، "سلام از پرونده")
    ناپایا اندازه := ۰ برگردان صحیح۶۴
    ناپایا زمان‌تغییر := ۰ برگردان صحیح۶۴
    سرچاپ اچ تی تی پی.وضعیت پرونده(پ، اندازه، زمان‌تغییر)، اندازه
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/file"، صفحه)
    مسیریاب.دریافت(م، "/part"، قطعه)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۲۴)
    اچ تی تی پی.استفاده(س، م)
    سرچاپ اچ تی تی پی.اجرا در پس زمینه(س)
    الف := اچ تی تی پی.دریافت("http://127.0.0.1:19624/file")
    سرچاپ اچ تی تی پی.وضعیت(الف)، اچ تی تی پی.بدنه(الف)
    سرچاپ اچ تی تی پی.دریافت سرصفحه(الف، "x-port")، اچ تی تی پی.دریافت سرصفحه(الف، "x-status")، اچ تی تی پی.دریافت سرصفحه(الف، "content-type")
    ب := اچ تی تی پی.دریافت("http://127.0.0.1:19624/part")
    سرچاپ اچ تی تی پی.وضعیت(ب)، اچ تی تی پی.بدنه(ب)
    سیستم عامل.حذف(پ)
پایان
خروجیtrue 26 true 200 سلام از پرونده 19624 200 text/plain 206 سلام

درگاه محلی LocalPort

تابع درگاه محلی(h: صحیح۶۴): صحیح
درگاه سوکت سروری که این درخواست از آن آمده؛ وقتی یک گرداننده چند درگاه را سرویس می‌دهد به کار می‌آید.

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

وضعیت Status

تابع وضعیت(h: صحیح۶۴): صحیح
کد وضعیت پاسخ. اگر دسته‌ی درخواست را در یک گرداننده بدهید، وضعیتی است که تا آن لحظه گذاشته شده (تا زمانی که عوض نکنید ۲۰۰).
net-http-Handle.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب

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

تابع کتاب(ز: صحیح۶۴):
    شناسه := اچ تی تی پی.پارامتر(ز، "id")
    قالب := اچ تی تی پی.پرسمان(ز، "format")
    اچ تی تی پی.تنظیم سرصفحه(ز، "X-Book"، شناسه)
    اچ تی تی پی.جیسون(ز، `{"id": "` + شناسه + `", "format": "` + قالب + `", "raw": "` + اچ تی تی پی.پرسمان خام(ز) + `"}`)
پایان

تابع ساختن(ز: صحیح۶۴):
    نام := اچ تی تی پی.فرم(ز، "name")
    اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
    اچ تی تی پی.متن(ز، اچ تی تی پی.روش(ز) + " " + اچ تی تی پی.مسیر(ز) + " " + نام + " " + اچ تی تی پی.سرصفحه(ز، "X-Client"))
پایان

تابع خام(ز: صحیح۶۴):
    پاسخ := اچ تی تی پی.مالکیت(ز، "بدنه: " + اچ تی تی پی.بدنه(ز))
    اچ تی تی پی.متن(ز، پاسخ)
پایان

تابع صفحه(ز: صحیح۶۴):
    اچ تی تی پی.اچ تی ام ال(ز، "<h1>سلام</h1>")
پایان

تابع قدیمی(ز: صحیح۶۴):
    اچ تی تی پی.تغییرمسیر(ز، "/")
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(م، "/"، خانه)
    مسیریاب.دریافت(م، "/books/:id"، کتاب)
    مسیریاب.ارسال(م، "/books"، ساختن)
    مسیریاب.قراردادن(م، "/raw"، خام)
    مسیریاب.دریافت(م، "/page"، صفحه)
    مسیریاب.دریافت(م، "/old"، قدیمی)
    ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۱)
    اچ تی تی پی.استفاده(س، م)
    سرچاپ اچ تی تی پی.اجرا در پس زمینه(س)
    پایه := "http://127.0.0.1:19601"
    پ := اچ تی تی پی.دریافت(پایه + "/")
    سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)
    پ۲ := اچ تی تی پی.دریافت(پایه + "/books/42?format=pdf")
    سرچاپ اچ تی تی پی.بدنه(پ۲)، اچ تی تی پی.دریافت سرصفحه(پ۲، "x-book")
    ناپایا سر := اچ تی تی پی.سرصفحه جدید()
    سر.درج("Content-Type"، "application/x-www-form-urlencoded")
    سر.درج("X-Client"، "salam")
    پ۳ := اچ تی تی پی.ارسال با(پایه + "/books"، "name=%D8%B3%D9%84%D8%A7%D9%85"، سر)
    سرچاپ اچ تی تی پی.وضعیت(پ۳)، اچ تی تی پی.بدنه(پ۳)
    سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.قرار دادن(پایه + "/raw"، "داده"))
    پ۴ := اچ تی تی پی.دریافت(پایه + "/page")
    سرچاپ اچ تی تی پی.دریافت سرصفحه(پ۴، "content-type")، اچ تی تی پی.بدنه(پ۴)
    پ۵ := اچ تی تی پی.درخواست("GET"، پایه + "/old"، اچ تی تی پی.سرصفحه جدید()، "")
    سرچاپ اچ تی تی پی.وضعیت(پ۵)، اچ تی تی پی.دریافت سرصفحه(پ۵، "location")
    سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/nope"))
پایان
خروجیtrue 200 سلام از سرور {"id": "42", "format": "pdf", "raw": "format=pdf"} 42 201 POST /books سلام salam بدنه: داده text/html; charset=utf-8 <h1>سلام</h1> 302 / 404

ارسال بخشی از پرونده FileRange

تابع ارسال بخشی از پرونده(h: صحیح۶۴، path: رشته، content_type: رشته، offset: صحیح، length: صحیح): منطقی
مثل File اما فقط length بایت را از offset به بعد می‌فرستد، برای پاسخ به درخواست Range؛ وضعیت ۲۰۶ و سرآیند Content-Range را فراخوان می‌گذارد. اگر آن بخش درون پرونده نباشد false برمی‌گرداند.

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

وضعیت پرونده FileStat

تابع وضعیت پرونده(path: رشته، size &: صحیح۶۴، mtime &: صحیح۶۴): منطقی
اندازه و زمان تغییر (ثانیه‌ی یونیکس) یک پرونده را با یک فراخوان سیستمی در دو متغیری که می‌دهید می‌خواند. اگر پرونده خوانده نشود false برمی‌گرداند. بیرون از لینوکس روی x64 و arm64 زمان ۰ است.

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

زمینه جدید Ctx

تابع زمینه جدید(h: صحیح۶۴): زمینه
شناسه‌ی عددی گرداننده را به زمینه تبدیل می‌کند. هر تابع این صفحه هر دو را می‌پذیرد، پس انتخاب سلیقه‌ای است: یک ساختار که آن را دست به دست می‌کنید و فیلدهایش را می‌خوانید، یا شناسه‌ی خالی.

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

روش Method

تابع روش(ctx: زمینه): رشته
روش درخواست، مثل GET.

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

مسیر Path

تابع مسیر(ctx: زمینه): رشته
مسیر درخواست بدون پرس‌وجو.

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

بدنه Body

تابع بدنه(ctx: زمینه): رشته
بدنه‌ی درخواست.

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

طول بدنه BodyLen

تابع طول بدنه(ctx: زمینه): صحیح
طول بدنه‌ی درخواست به بایت، با بایت‌های صفر؛ همراه بایت‌های بدنه به کار می‌رود.
net-http-Upload.salam
واردسازی حافظه
واردسازی رشته
واردسازی فشرده سازی
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مایم
واردسازی شبکه.مسیریاب

تابع پژواک(ز: صحیح۶۴):
    اندازه := اچ تی تی پی.طول بدنه(ز)
    داده := اچ تی تی پی.بایت‌های بدنه(ز) برگردان طبیعی۸*
    ناپایا صفرها := ۰
    تکرار اندازه در ی:
        اگر داده[ی] برابر ۰ برگردان طبیعی۸: صفرها += ۱ پایان
    پایان
    اچ تی تی پی.تنظیم سرصفحه(ز، "X-Zeros"، اچ تی تی پی.مالکیت(ز، رشته.از عدد(صفرها برگردان صحیح۶۴)))
    اچ تی تی پی.بایت‌ها(ز، "application/octet-stream"، اچ تی تی پی.بایت‌های بدنه(ز)، اندازه)
پایان

تابع بارگذاری(ز: صحیح۶۴):
    ناپایا قطعه‌ها := اچ تی تی پی.چندبخشی(ز)
    دیرکن مایم.آزادسازی چندبخشی(قطعه‌ها)
    اگر قطعه‌ها.اقلام.طول() برابر ۰:
        اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۰)
        اچ تی تی پی.متن(ز، "چندبخشی نیست")
        برگشت
    پایان
    ناپایا پاسخ := ""
    هر قطعه در قطعه‌ها.اقلام:
        پاسخ = پاسخ + قطعه.نام + ":" + قطعه.نام پرونده + ":" + رشته.از عدد(قطعه.بدنه.طول برگردان صحیح۶۴) + " "
    پایان
    پاسخ = پاسخ + "note=" + مایم.مقدار بخش(قطعه‌ها، "note")
    اچ تی تی پی.متن(ز، اچ تی تی پی.مالکیت(ز، پاسخ))
پایان

تابع ریشه:
    ناپایا م := مسیریاب.مسیریاب جدید()
    مسیریاب.ارسال(م، "/echo"، پژواک)
    مسیریاب.ارسال(م، "/upload"، بارگذاری)
    ناپایا سرور := اچ تی تی پی.سرور جدید(۱۹۶۱۵)
    اچ تی تی پی.استفاده(سرور، م)
    سرچاپ اچ تی تی پی.اجرا در پس زمینه(سرور)
    نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:19615")

    داده := حافظه.تخصیص(۴ برگردان طبیعی۶۴)
    بایت‌ها := داده برگردان طبیعی۸*
    بایت‌ها[۰] = ۸۳ برگردان طبیعی۸
    بایت‌ها[۱] = ۰ برگردان طبیعی۸
    بایت‌ها[۲] = ۲۵۵ برگردان طبیعی۸
    بایت‌ها[۳] = ۰ برگردان طبیعی۸
    سر := "POST /echo HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 4\r\nConnection: close\r\n\r\n"
    ناپایا الف := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، داده، ۴، ۲۰۰۰)
    برگشتی := الف.داده برگردان طبیعی۸*
    سرچاپ الف.وضعیت، الف.اندازه، اچ تی تی پی.مقدار سرصفحه(الف.سرصفحه، "x-zeros")، اچ تی تی پی.مقدار سرصفحه(الف.سرصفحه، "content-type")
    سرچاپ برگشتی[۰] برگردان صحیح، برگشتی[۱] برگردان صحیح، برگشتی[۲] برگردان صحیح، برگشتی[۳] برگردان صحیح
    اچ تی تی پی.آزادسازی پاسخ خام(الف)

    ناپایا نویسنده := مایم.نویسنده چندبخشی جدید()
    مایم.نوشتن فیلد(نویسنده، "note"، "سفر")
    مایم.نوشتن پرونده(نویسنده، "photo"، "pic.bin"، "image/png"، داده، ۴)
    ناپایا بدنه := مایم.بستن نویسنده(نویسنده)
    بالا := "POST /upload HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Type: " + مایم.سرآیند نوع محتوا(نویسنده) + "\r\nContent-Length: " + رشته.از عدد(بدنه.طول برگردان صحیح۶۴) + "\r\nConnection: close\r\n\r\n"
    ناپایا ب := اچ تی تی پی.ارسال خام با مهلت(نشانی، بالا، بدنه.داده، بدنه.طول، ۲۰۰۰)
    سرچاپ ب.وضعیت، اچ تی تی پی.متن پاسخ خام(ب)
    اچ تی تی پی.آزادسازی پاسخ خام(ب)
    فشرده سازی.آزادسازی بافر(بدنه)
    حافظه.آزادسازی(داده)

    ساده := اچ تی تی پی.ارسال("http://127.0.0.1:19615/upload"، "note=x")
    سرچاپ اچ تی تی پی.وضعیت(ساده)، اچ تی تی پی.بدنه(ساده)
پایان
خروجیtrue 200 4 2 application/octet-stream 83 0 255 0 200 note::6 photo:pic.bin:4 note=سفر 400 چندبخشی نیست

بایت‌های بدنه BodyBytes

تابع بایت‌های بدنه(ctx: زمینه): تهی*
اشاره‌گری به بایت‌های بدنه‌ی درخواست، برای بارگذاری پرونده و هر بدنه‌ی دودویی دیگری که بدنه آن را در نخستین بایت صفر می‌بُرد. این حافظه مال درخواست است و با پایان گرداننده آزاد می‌شود؛ آنچه را نگه می‌دارید کپی کنید و خودتان آزادش نکنید.

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

چندبخشی Multipart

تابع چندبخشی(ctx: زمینه): mime.MultipartParts
بدنه‌ی multipart/form-data را به بخش‌هایش جدا می‌کند و هر بخش نام، نام پرونده، نوع محتوا و بایت‌های خودش را دارد؛ اگر درخواست چندبخشی نباشد هیچ بخشی برنمی‌گرداند. نتیجه مال فراخواننده است و باید با مایم.آزادسازی چندبخشی آزاد شود.

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

بایت‌ها Bytes

تابع بایت‌ها(ctx: زمینه، content_type: رشته، p: تهی*، n: صحیح)
n بایت را از یک اشاره‌گر، با نوع محتوای داده‌شده، به عنوان بدنه می‌فرستد؛ برای پرونده، تصویر و بایگانی، بی آن‌که بایت صفر چیزی را ببُرد. بایت‌ها کپی می‌شوند و این تابع مالک اشاره‌گر نمی‌شود: اگر آن حافظه را خودتان گرفته‌اید، پس از فراخوانی آزادش کنید، ولی اشاره‌گری را که مال درخواست است، مانند خروجی بایت‌های بدنه، هرگز آزاد نکنید.

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

پرسمان خام RawQuery

تابع پرسمان خام(ctx: زمینه): رشته
کل رشته‌ی پرس‌وجو پس از ?، همان‌طور که آمده و بی کدگشایی؛ برای امضای درخواست یا فرستادن به سرویس دیگر.

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

پرسمان Query

تابع پرسمان(ctx: زمینه، key: رشته): رشته
یک پارامتر پرس‌وجو، کدگشایی‌شده.

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

تابع سرصفحه(ctx: زمینه، name: رشته): رشته
یک سرآیند درخواست؛ نام بدون توجه به کوچکی و بزرگی حروف.

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

پارامتر Param

تابع پارامتر(ctx: زمینه، name: رشته): رشته
یک پارامتر مسیر، مثل id در /books/:id.

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

فرم Form

تابع فرم(ctx: زمینه، field: رشته): رشته
یک فیلد فرم از بدنه‌ی application/x-www-form-urlencoded.

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

تنظیم وضعیت SetStatus

تابع تنظیم وضعیت(ctx: زمینه، code: صحیح)
کد وضعیت پاسخ؛ پیش‌فرض ۲۰۰.

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

تنظیم سرصفحه SetHeader

تابع تنظیم سرصفحه(ctx: زمینه، k: رشته، v: رشته)
یک سرآیند پاسخ را تنظیم می‌کند. فراخوانی دوباره با همان نام و همان املا مقدار را جایگزین می‌کند؛ املای دیگری مثل cache-control سرآیند دومی می‌افزاید.

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

افزودن سرصفحه AddHeader

تابع افزودن سرصفحه(ctx: زمینه، k: رشته، v: رشته)
یک سرآیند پاسخ را بدون جایگزینی مقداری که با همان نام ذخیره شده اضافه می‌کند، پس یک پاسخ می‌تواند چند سرآیند Set-Cookie داشته باشد.
net-http-AddHeader.salam
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی زمان

تابع show(ctx: صحیح۶۴):
    اچ تی تی پی.افزودن سرصفحه(ctx، "X-Test"، "one")
    اچ تی تی پی.افزودن سرصفحه(ctx، "X-Test"، "two")
    اچ تی تی پی.افزودن سرصفحه(ctx، "Set-Cookie"، "a=1; Path=/")
    اچ تی تی پی.افزودن سرصفحه(ctx، "Set-Cookie"، "b=2; Path=/")
    اچ تی تی پی.متن(ctx، "ok")
پایان

تابع ریشه:
    ناپایا r := مسیریاب.مسیریاب جدید()
    مسیریاب.دریافت(r، "/"، show)
    ناپایا s := اچ تی تی پی.سرور جدید(۱۹۵۲۱)
    اچ تی تی پی.تنظیم میزبان(s، "127.0.0.1")
    اچ تی تی پی.استفاده(s، r)
    اگر وارونه اچ تی تی پی.اجرا در پس زمینه(s):
        سرچاپ "cannot listen"
        برگشت ۱
    پایان
    زمان.خواب(۳۰۰)
    resp := اچ تی تی پی.دریافت("http://127.0.0.1:19521/")
    سرچاپ resp.وضعیت
    هر v در اچ تی تی پی.مقادیر سرصفحه(resp، "X-Test"):
        سرچاپ v
    پایان
    هر c در اچ تی تی پی.مقادیر سرصفحه(resp، "Set-Cookie"):
        سرچاپ c
    پایان
    برگشت ۰
پایان
خروجی200 one two a=1; Path=/ b=2; Path=/

اچ تی ام ال Html

تابع اچ تی ام ال(ctx: زمینه، html: رشته)
پاسخ HTML می‌فرستد.

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

جیسون Json

تابع جیسون(ctx: زمینه، json: رشته)
پاسخ جیسون می‌فرستد؛ متن جیسون را خودتان می‌سازید.

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

متن Text

تابع متن(ctx: زمینه، text: رشته)
پاسخ متنی می‌فرستد.

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

تغییرمسیر Redirect

تابع تغییرمسیر(ctx: زمینه، url: رشته)
با کد ۳۰۲ و بدنه‌ی خالی به نشانی دیگر هدایت می‌کند.

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

کوکی ها Cookies

تابع کوکی ها(ctx: زمینه): نگاشت<رشته، رشته>
همه‌ی کوکی‌های درخواست.

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

مقدار کوکی CookieValue

تابع مقدار کوکی(ctx: زمینه، name: رشته): رشته
مقدار یک کوکی؛ اگر نباشد، رشته‌ی خالی.

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

کوکی دارد HasCookie

تابع کوکی دارد(ctx: زمینه، name: رشته): منطقی
اگر درخواست این کوکی را داشته باشد، درست برمی‌گرداند.

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

تنظیم کوکی SetCookie

تابع تنظیم کوکی(ctx: زمینه، c: کوکی)
کوکی را در پاسخ تنظیم می‌کند.

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

پاک کردن کوکی ClearCookie

تابع پاک کردن کوکی(ctx: زمینه، name: رشته)
به مرورگر می‌گوید کوکی را پاک کند.

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

اتصال مربوط به ConnOf

تابع اتصال مربوط به(ctx: زمینه): tcp.Conn
اتصال TCP زیر درخواست؛ برای ارتقا به پروتکل‌های دیگر.

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

ارسال خام SendRaw

تابع ارسال خام(ep: نقطه پایانی، head: رشته، body: تهی*، n: صحیح): پاسخ خام
سر درخواستی را که نوشته‌اید و n بایت بدنه را از یک اشاره‌گر می‌فرستد، تا بسته شدن اتصال از سوی سرور می‌خواند، بدنه را دودویی نگه می‌دارد و بدنه‌ی chunked را باز می‌کند. مهلتی ندارد.

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

ارسال خام با مهلت SendRawTimeout

تابع ارسال خام با مهلت(ep: نقطه پایانی، head: رشته، body: تهی*، n: صحیح، timeout_ms: صحیح): پاسخ خام
مثل تابع بالا، با مهلتی به میلی‌ثانیه برای هر خواندن و نوشتن؛ ۰ یعنی بی‌مهلت.

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

ارسال خام با پیکربندی امن SendRawTLS

تابع ارسال خام با پیکربندی امن(ep: نقطه پایانی، head: رشته، body: تهی*، n: صحیح، timeout_ms: صحیح، cfg: tls.Config): پاسخ خام
مثل ارسال خام با مهلت، با tls.Config خودتان: مرجع خصوصی در ca_file، یا insecure_skip_verify برای آزمایش محلی. نقطه‌ی پایانی http ساده آن را نادیده می‌گیرد.

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

آزادسازی پاسخ خام FreeRaw

تابع آزادسازی پاسخ خام(r &: پاسخ خام)
حافظه‌ی پاسخ خام را آزاد می‌کند.

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

متن پاسخ خام RawText

تابع متن پاسخ خام(r: پاسخ خام): رشته
بدنه‌ی پاسخ خام به شکل رشته، بریده در نخستین بایت صفر.

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

سقف پاسخ خام RawLimit

تابع سقف پاسخ خام(): صحیح
بیشترین اندازه‌ی پاسخی که فراخوانی‌های خام می‌خوانند، به بایت؛ پیش‌فرض ۲۵۶ مگابایت.

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

تنظیم سقف پاسخ خام SetRawLimit

تابع تنظیم سقف پاسخ خام(bytes: صحیح)
این سقف را برای کل برنامه تغییر می‌دهد؛ صفر یا کمتر نادیده گرفته می‌شود.

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

سرور جدید NewServer

تابع سرور جدید(port: صحیح): سرور
سرور تازه روی درگاه داده‌شده.

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

استفاده Use

تابع استفاده(s &: سرور، r: router.Router)
مسیریاب را به سرور می‌دهد.

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

پنهان سازی توکن HideTokens

تابع پنهان سازی توکن(s &: سرور)
نسخه‌ی سرور را از سرآیندهای پاسخ برمی‌دارد.

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

تنظیم میزبان SetHost

تابع تنظیم میزبان(s &: سرور، host: رشته)
نشانی گوش دادن را تعیین می‌کند؛ مثلاً 127.0.0.1 برای دسترسی فقط از همین رایانه.

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

فعال سازی گزارش دسترسی EnableAccessLog

تابع فعال سازی گزارش دسترسی(s &: سرور)
هر درخواست را با روش، مسیر و وضعیت در خروجی ثبت می‌کند.

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

اجرا Run

تابع اجرا(s: سرور)
سرور را اجرا می‌کند و تا پایان برنامه برنمی‌گردد.

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

اجرا در پس زمینه RunBackground

تابع اجرا در پس زمینه(s: سرور): منطقی
سرور را در نخ دیگری اجرا می‌کند و بی‌درنگ برمی‌گردد. اگر گوش دادن روی درگاه شروع شود درست برمی‌گرداند، و اگر درگاه در دسترس نباشد (مثلاً برنامه‌ی دیگری آن را گرفته باشد) نادرست.

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

اجرای امن RunTLS

تابع اجرای امن(s: سرور، cert_file: رشته، key_file: رشته)
سرور HTTPS را با گواهی و کلید داده‌شده اجرا می‌کند.

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

روش Method

تابع روش(h: صحیح۶۴): رشته
روش درخواست، مثل GET.

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

مسیر Path

تابع مسیر(h: صحیح۶۴): رشته
مسیر درخواست بدون پرس‌وجو.

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

بدنه Body

تابع بدنه(h: صحیح۶۴): رشته
بدنه‌ی درخواست.

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

طول بدنه BodyLen

تابع طول بدنه(h: صحیح۶۴): صحیح
طول بدنه‌ی درخواست به بایت، با بایت‌های صفر؛ همراه بایت‌های بدنه به کار می‌رود.

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

بایت‌های بدنه BodyBytes

تابع بایت‌های بدنه(h: صحیح۶۴): تهی*
اشاره‌گری به بایت‌های بدنه‌ی درخواست، برای بارگذاری پرونده و هر بدنه‌ی دودویی دیگری که بدنه آن را در نخستین بایت صفر می‌بُرد. این حافظه مال درخواست است و با پایان گرداننده آزاد می‌شود؛ آنچه را نگه می‌دارید کپی کنید و خودتان آزادش نکنید.

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

چندبخشی Multipart

تابع چندبخشی(h: صحیح۶۴): mime.MultipartParts
بدنه‌ی multipart/form-data را به بخش‌هایش جدا می‌کند و هر بخش نام، نام پرونده، نوع محتوا و بایت‌های خودش را دارد؛ اگر درخواست چندبخشی نباشد هیچ بخشی برنمی‌گرداند. نتیجه مال فراخواننده است و باید با مایم.آزادسازی چندبخشی آزاد شود.

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

پرسمان Query

تابع پرسمان(h: صحیح۶۴، key: رشته): رشته
یک پارامتر پرس‌وجو، کدگشایی‌شده.

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

پرسمان خام RawQuery

تابع پرسمان خام(h: صحیح۶۴): رشته
کل رشته‌ی پرس‌وجو پس از ?، همان‌طور که آمده و بی کدگشایی؛ برای امضای درخواست یا فرستادن به سرویس دیگر.

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

تابع سرصفحه(h: صحیح۶۴، name: رشته): رشته
یک سرآیند درخواست؛ نام بدون توجه به کوچکی و بزرگی حروف.

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

پارامتر Param

تابع پارامتر(h: صحیح۶۴، name: رشته): رشته
یک پارامتر مسیر، مثل id در /books/:id.

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

فرم Form

تابع فرم(h: صحیح۶۴، field: رشته): رشته
یک فیلد فرم از بدنه‌ی application/x-www-form-urlencoded.

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

تنظیم وضعیت SetStatus

تابع تنظیم وضعیت(h: صحیح۶۴، code: صحیح)
کد وضعیت پاسخ؛ پیش‌فرض ۲۰۰.

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

تنظیم سرصفحه SetHeader

تابع تنظیم سرصفحه(h: صحیح۶۴، k: رشته، v: رشته)
یک سرآیند پاسخ را تنظیم می‌کند. فراخوانی دوباره با همان نام و همان املا مقدار را جایگزین می‌کند؛ املای دیگری مثل cache-control سرآیند دومی می‌افزاید.

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

افزودن سرصفحه AddHeader

تابع افزودن سرصفحه(h: صحیح۶۴، k: رشته، v: رشته)
یک سرآیند پاسخ را بدون جایگزینی مقداری که با همان نام ذخیره شده اضافه می‌کند، پس یک پاسخ می‌تواند چند سرآیند Set-Cookie داشته باشد.

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

اچ تی ام ال Html

تابع اچ تی ام ال(h: صحیح۶۴، html: رشته)
پاسخ HTML می‌فرستد.

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

جیسون Json

تابع جیسون(h: صحیح۶۴، json: رشته)
پاسخ جیسون می‌فرستد؛ متن جیسون را خودتان می‌سازید.

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

متن Text

تابع متن(h: صحیح۶۴، text: رشته)
پاسخ متنی می‌فرستد.

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

بایت‌ها Bytes

تابع بایت‌ها(h: صحیح۶۴، content_type: رشته، p: تهی*، n: صحیح)
n بایت را از یک اشاره‌گر، با نوع محتوای داده‌شده، به عنوان بدنه می‌فرستد؛ برای پرونده، تصویر و بایگانی، بی آن‌که بایت صفر چیزی را ببُرد. بایت‌ها کپی می‌شوند و این تابع مالک اشاره‌گر نمی‌شود: اگر آن حافظه را خودتان گرفته‌اید، پس از فراخوانی آزادش کنید، ولی اشاره‌گری را که مال درخواست است، مانند خروجی بایت‌های بدنه، هرگز آزاد نکنید.

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

مالکیت Own

تابع مالکیت(h: صحیح۶۴، s: رشته): رشته
رشته‌ای را که گرداننده ساخته به زمینه می‌سپارد تا با پایان درخواست آزاد شود؛ رشته‌ای را که از خود زمینه گرفته‌اید، مثل بدنه، به آن ندهید.

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

تغییرمسیر Redirect

تابع تغییرمسیر(h: صحیح۶۴، loc: رشته)
با کد ۳۰۲ و بدنه‌ی خالی به نشانی دیگر هدایت می‌کند.

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

لبه است IsEdge

تابع لبه است(): منطقی
اگر برنامه روی لبه (کلادفلر ورکرز، از راه WebAssembly) اجرا شود، درست است.

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

کوکی جدید NewCookie

تابع کوکی جدید(name: رشته، value: رشته): کوکی
کوکی جلسه‌ای که با بستن مرورگر پاک می‌شود.

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

کوکی با انقضا ExpiringCookie

تابع کوکی با انقضا(name: رشته، value: رشته، max_age_seconds: صحیح): کوکی
کوکی با عمر مشخص بر حسب ثانیه.

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

کوکی منقضی شده ExpiredCookie

تابع کوکی منقضی شده(name: رشته، path: رشته، domain: رشته): کوکی
کوکی منقضی‌شده برای پاک کردن کوکی موجود در مرورگر.

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

کوکی ها Cookies

تابع کوکی ها(h: صحیح۶۴): نگاشت<رشته، رشته>
همه‌ی کوکی‌های درخواست.

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

مقدار کوکی CookieValue

تابع مقدار کوکی(h: صحیح۶۴، name: رشته): رشته
مقدار یک کوکی؛ اگر نباشد، رشته‌ی خالی.

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

کوکی دارد HasCookie

تابع کوکی دارد(h: صحیح۶۴، name: رشته): منطقی
اگر درخواست این کوکی را داشته باشد، درست برمی‌گرداند.

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

تنظیم کوکی SetCookie

تابع تنظیم کوکی(h: صحیح۶۴، c: کوکی)
کوکی را در پاسخ تنظیم می‌کند.

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

پاک کردن کوکی ClearCookie

تابع پاک کردن کوکی(h: صحیح۶۴، name: رشته)
به مرورگر می‌گوید کوکی را پاک کند.

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

پاک کردن کوکی در مسیر ClearCookieAt

تابع پاک کردن کوکی در مسیر(h: صحیح۶۴، name: رشته، path: رشته، domain: رشته)
کوکی‌ای را که با مسیر یا دامنه‌ی خاصی تنظیم شده پاک می‌کند.

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

سرصفحه جدید NewHeaders

تابع سرصفحه جدید(): نگاشت<رشته، رشته>
نگاشت خالی برای سرآیندها یا پارامترها.

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

دریافت Get

تابع دریافت(url: رشته): پاسخ
درخواست GET می‌فرستد. تغییر مسیر دنبال نمی‌شود؛ خواندنی که ۳۰ ثانیه بی‌حرکت بماند شکست می‌خورد.

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

ارسال Post

تابع ارسال(url: رشته، body: رشته): پاسخ
درخواست POST با بدنه، فرستاده‌شده به شکل application/x-www-form-urlencoded؛ برای نوع محتوای دیگر ارسال با را به کار ببرید.

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

دریافت با GetWith

تابع دریافت با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل دریافت، با سرآیندهای اضافه.

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

ارسال با PostWith

تابع ارسال با(url: رشته، body: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل ارسال، با سرآیندهای اضافه.

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

درخواست Request

تابع درخواست(method: رشته، url: رشته، headers: نگاشت<رشته، رشته>، body: رشته): پاسخ
درخواست با روش دلخواه، سرآیندها و بدنه.

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

درخواست خام RequestRaw

تابع درخواست خام(method: رشته، url: رشته، header_block: رشته، body: رشته): پاسخ
درخواست با متن سرآیندهایی که خودتان نوشته‌اید؛ هر خط با \r\n تمام شود.

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

دریافت بایت ها با GetBytesWith

تابع دریافت بایت ها با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخ بایتی
مثل دریافت با، ولی بدنه را به شکل بایت نگه می‌دارد (یک پاسخ بایتی).

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

انجام درخواست Do

تابع انجام درخواست(method: رشته، url: رشته، headers: نگاشت<رشته، رشته>، body: رشته، opts: گزینه های درخواست): پاسخ
درخواستی را با سقف‌های یک گزینه های درخواست می‌فرستد.

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

موفق Ok

تابع موفق(r: پاسخ): منطقی
وقتی وضعیت 2xx باشد درست است. درخواستی که پاسخی نگرفت وضعیت صفر دارد و برای آن هم نادرست است؛ این دو را با وضعیت از هم جدا کنید.

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

وضعیت Status

تابع وضعیت(r: پاسخ): صحیح
کد وضعیت پاسخ. اگر دسته‌ی درخواست را در یک گرداننده بدهید، وضعیتی است که تا آن لحظه گذاشته شده (تا زمانی که عوض نکنید ۲۰۰).

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

بدنه Body

تابع بدنه(r: پاسخ): رشته
بدنه‌ی درخواست.

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

خطا Error

تابع خطا(r: پاسخ): رشته
پیام خطا؛ اگر درخواست موفق بود، خالی.

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

سرصفحه ها Headers

تابع سرصفحه ها(r: پاسخ): نگاشت<رشته، رشته>
سرآیندهای پاسخ به شکل نگاشت؛ نام‌ها همان‌طور که سرور فرستاده، با همان کوچکی و بزرگی حروف.

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

دریافت سرصفحه GetHeader

تابع دریافت سرصفحه(r: پاسخ، name: رشته): رشته
مقدار یک سرآیند؛ نام بدون توجه به کوچکی و بزرگی حروف.

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

خام Raw

تابع خام(r: پاسخ): رشته
متن کامل پاسخ.

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

سرصفحه های خام RawHeaders

تابع سرصفحه های خام(r: پاسخ): رشته
متن سرآیندهای پاسخ.

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

مقادیر سرصفحه HeaderValues

تابع مقادیر سرصفحه(r: پاسخ، name: رشته): وکتور<رشته>
همه‌ی مقدارهای سرآیندی که چند بار آمده، مثل Set-Cookie.

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

قرار دادن Put

تابع قرار دادن(url: رشته، body: رشته): پاسخ
درخواست PUT.

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

قرار دادن با PutWith

تابع قرار دادن با(url: رشته، body: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل قرار دادن، با سرآیندهای اضافه.

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

حذف Delete

تابع حذف(url: رشته): پاسخ
درخواست DELETE.

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

حذف با DeleteWith

تابع حذف با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل حذف، با سرآیندهای اضافه.

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

وصله Patch

تابع وصله(url: رشته، body: رشته): پاسخ
درخواست PATCH.

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

وصله با PatchWith

تابع وصله با(url: رشته، body: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل وصله، با سرآیندهای اضافه.

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

گزینه ها Options

تابع گزینه ها(url: رشته): پاسخ
درخواست OPTIONS.

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

گزینه ها با OptionsWith

تابع گزینه ها با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل گزینه ها، با سرآیندهای اضافه.

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

تابع درخواست هد(url: رشته): پاسخ
درخواست HEAD؛ فقط سرآیندها برمی‌گردند.

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

سرصفحه با HeadWith

تابع سرصفحه با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخ
مثل درخواست هد، با سرآیندهای اضافه.

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

کدگذاری فرم EncodeForm

تابع کدگذاری فرم(params: نگاشت<رشته، رشته>): رشته
نگاشت را به بدنه‌ی فرم a=1&b=2 با کدگذاری درصدی تبدیل می‌کند.

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

با پرسمان WithQuery

تابع با پرسمان(base: رشته، params: نگاشت<رشته، رشته>): رشته
پارامترها را به شکل پرس‌وجو به نشانی می‌افزاید.

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

خطوط کوکی SetCookieLines

تابع خطوط کوکی(r: پاسخ): وکتور<رشته>
همه‌ی سرآیندهای Set-Cookie پاسخ.

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

نگاشت کوکی CookieMap

تابع نگاشت کوکی(r: پاسخ): نگاشت<رشته، رشته>
نام و مقدار کوکی‌هایی که پاسخ تنظیم کرده.

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

سرصفحه کوکی CookieHeader

تابع سرصفحه کوکی(cookies: نگاشت<رشته، رشته>): رشته
نگاشت کوکی‌ها را به مقدار سرآیند Cookie تبدیل می‌کند.

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

کارخواه جدید NewClient

تابع کارخواه جدید(): کارخواه
کارخواهی تازه با قفل خودش، تا نخ‌ها بتوانند آن را به اشتراک بگذارند.

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