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

پراکسی اچ‌تی‌تی‌پی net.httpproxy

پراکسی HTTP و HTTPS: کارخواه با ورود Basic و تونل CONNECT، کارساز که درخواست‌های ساده را جلو می‌برد و تونل باز می‌کند، با قاعده‌های دسترسی، TLS و اتصال‌دهنده‌ی زنجیره‌ی پراکسی.

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

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

پراکسی HTTP دو نوع ترافیک را اداره می‌کند. یک درخواست ساده (GET http://example.com/ HTTP/1.1) را پراکسی جلو می‌برد و خودش اتصال به وب‌سایت را باز می‌کند. درخواست CONNECT host:port از پراکسی می‌خواهد یک تونل خام باز کند و سپس بایت‌ها دست‌نخورده در دو جهت می‌گذرند، همان‌طور که HTTPS و هر پروتکل TCP دیگر از پراکسی رد می‌شود. این بسته هر دو سمت را دارد: دریافت، ارسال، درخواست و اتصال کارخواه‌اند و شروع یک کارساز راه می‌اندازد. به تونل هم وصل می‌شود: به شکل ورودی اچ‌تی‌تی‌پی که می‌تواند یک درگاه را با SOCKS شریک شود، و به شکل رابط اچ‌تی‌تی‌پی که یک گام از زنجیره‌ی پراکسی است. برای دیدن اینکه تکه‌ها در یک برنامه چگونه کنار هم می‌نشینند، ساختن برنامه‌ای به سبک v2ray یا VPN را بخوانید.

ایده‌های اصلی:

  • دریافت، ارسال و درخواست یک نشانی ساده‌ی http:// را از راه پراکسی می‌گیرند و یک پاسخ برمی‌گردانند. برای https:// از اتصال استفاده کنید که یک جریان برمی‌گرداند و TLS را خودتان رویش اجرا کنید.
  • شکست مقدار است. موفق و موفق نادرست‌اند و خطا یا وضعیت دلیل را می‌گویند. ۴۰۴ یا ۴۰۷ رفت و برگشت موفقی با همان وضعیت است.
  • کارساز یک پیکربندی سرور است که به شروع داده می‌شود. تعیین اتصال به مقصد یا تعیین شماره‌گیر شیوه‌ی رسیدن به مقصدها را تعیین می‌کنند، پس می‌توان آن را به قاعده‌های مسیریابی و زنجیره‌ی پراکسی وصل کرد؛ اجازه روش، میزبان یا درگاه را رد می‌کند.
  • تجزیه‌گر عمدا سخت‌گیر است: درخواستی با هم Content-Length و Transfer-Encoding، دو طول متفاوت، سرآیند تاخورده یا خراب، روش بد یا سرآیندی بزرگ‌تر از بیشترین اندازه سرآیند رد می‌شود، نه اینکه حدس زده شود. همین‌طور جلوی request smuggling گرفته می‌شود.

چیزهایی که آدم را گیر می‌اندازد:

  • کارساز روی bind_host گوش می‌دهد که پیش‌فرضش 127.0.0.1 است. 0.0.0.0 را فقط عمداً بدهید. اگر ورود نباشد، یک پراکسی HTTP باز که از بیرون در دسترس است را غریبه‌ها به کار می‌برند. افزودن کاربر، دیوار آتش یا هر دو.
  • پراکسی CONNECT می‌تواند به نشانی‌های داخلی برسد. کارخواهی که بتواند به هر میزبان و درگاهی تونل باز کند به سرویس‌های شبکه‌ی خودتان می‌رسد (پایگاه‌داده‌ای روی 10.0.0.5، یک نشانی metadata) یا روی درگاه ۲۵ نامه می‌فرستد. با اجازه محدودش کنید، مثلا به درگاه ۴۴۳ و میزبان‌های عمومی.
  • ورود Basic رمزشده نیست. نام کاربری و گذرواژه Base64 هستند که فقط یک کدگذاری است. با تعیین تی ال اس خود پراکسی را TLS‌دار کنید، یا آن را روی شبکه‌ی مورد اعتماد نگه دارید.
  • بدنه‌ها متن‌اند. بدنه در نخستین بایت NUL تمام می‌شود و از راه ورودی اچ‌تی‌تی‌پی بدنه‌ی درخواست ساده به ۱ مگابایت متن محدود است. تونل‌ها چنین حدی ندارند.
  • فقط نشانی مطلق http://. درخواست نشانی‌های https:// و نسبی را رد می‌کند. تجزیه نشانی وب هر دو طرح را می‌خواند ولی فقط http می‌تواند راه ساده را برود.
  • فقط HTTP/1.1. HTTP/2 نیست و کدگذاری انتقال فشرده هم نیست (gzip در انتقال با ۵۰۱ پاسخ می‌گیرد).
  • جریان‌های جریان را ببندید.

استفاده از پراکسی HTTP در برنامه

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

net-httpproxy-guide-proxy.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع ریشه:
    start_backends()
    ناپایا server_cfg := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(server_cfg، درست)
    server := پراکسی اچ‌تی‌تی‌پی.شروع(server_cfg)
    client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، server.درگاه)

    plain := پراکسی اچ‌تی‌تی‌پی.دریافت(client، "http://127.0.0.1:" + origin_port + "/news")
    سرچاپ "HTTP ساده:"، plain.وضعیت، plain.بدنه

    tunnel := پراکسی اچ‌تی‌تی‌پی.اتصال(client، "127.0.0.1"، echo_port)
    tunnel.جریان.نوشتن("anything, even TLS")
    سرچاپ "تونل:"، tunnel.وضعیت، tunnel.جریان.خواندن(100)
    tunnel.جریان.بستن()
    پراکسی اچ‌تی‌تی‌پی.توقف(server)
پایان
خروجیHTTP ساده: 200 origin saw: GET /news HTTP/1.1 تونل: 200 echo:anything, even TLS

اگر پراکسی ورود می‌خواهد کلاینت جدید با احراز هویت را به کار ببرید؛ وضعیت ۴۰۷ یعنی ورود نبود یا نادرست بود. برای استفاده از پراکسی به عنوان یک گام از چند گام، رابط اچ‌تی‌تی‌پی و تونل.زنجیره را ببینید.

راه انداختن پراکسی HTTP

پیکربندی سرور جدید پیکربندی یک درگاه را می‌دهد، افزودن کاربر ورود را روشن می‌کند و شروع در پس‌زمینه سرویس می‌دهد. کارساز اتصال‌ها را زنده نگه می‌دارد، درخواست‌های pipeline، بدنه‌ی تکه‌تکه، Expect: 100-continue و Upgrade را اداره می‌کند و پیش از جلو بردن درخواست سرآیندهای مخصوص یک گام (از نوع گام‌به‌گام) را برمی‌دارد. کارخواه‌های کند یا ساکت با مهلت دست‌دهی میلی‌ثانیه و مهلت بی‌کاری میلی‌ثانیه قطع می‌شوند.

پیش از اینکه پراکسی را به روی کسی باز کنید تصمیم بگیرید چه کاری اجازه دارد: اجازه کانکت و اجازه درخواست ساده دو نوع ترافیک را کلید می‌زنند و اجازه هر روش، میزبان و درگاه را می‌بیند. پراکسی یک سایت معمولا باید CONNECT را فقط به درگاه ۴۴۳ اجازه بدهد و نشانی‌های خصوصی را رد کند.

ناپایا config := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(3128)
پراکسی اچ‌تی‌تی‌پی.افزودن کاربر(config، "alice"، "یک گذرواژه‌ی بلند و تصادفی")
config.اجازه = (method: رشته، _host: رشته، port: صحیح): برگشت port برابر 443 یا method نابرابر "CONNECT" پایان
پراکسی اچ‌تی‌تی‌پی.تعیین تی ال اس(config، "proxy.crt"، "proxy.key")
server := پراکسی اچ‌تی‌تی‌پی.شروع(config)

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

چه باید دانست

  • کارساز روی bind_host (به‌طور پیش‌فرض loopback) گوش می‌دهد. ورود یا دیوار آتش به کار ببرید و مقصدهای CONNECT را محدود کنید.
  • ورود Basic فقط Base64 است. تعیین تی ال اس یا یک شبکه‌ی مورد اعتماد به کار ببرید.
  • از راه ورودی اچ‌تی‌تی‌پی (سازگارکننده‌ی تونل) هر درخواست ساده اتصال خودش را می‌گیرد، با بدنه‌ای تا ۱ مگابایت متن؛ کارساز مستقل شروع اتصال‌ها را زنده نگه می‌دارد.
  • حدهای سرآیند بیشترین اندازه سرآیند بایت و بیشترین تعداد سرآیند سطر است. سرآیند بزرگ‌تر ۴۳۱ می‌گیرد.
  • فقط HTTP/1.1، بدون HTTP/2 و بدون کدگذاری انتقال فشرده.
  • هیچ گزارشی خودکار نوشته نمی‌شود.

گونه‌ها

ساختار سرآیند
یک سرآیند تجزیه‌شده‌ی درخواست یا پاسخ: سطر نخست و سرآیندها. تجزیه سرآیند درخواست و تجزیه سرآیند پاسخ آن را می‌سازند.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستدرست وقتی سرآیند معتبر بود.
خطاerrرشته = ""چرا معتبر نبود.
روشmethodرشته = ""روش درخواست، مثل GET یا CONNECT.
هدفtargetرشته = ""هدف درخواست: نشانی مطلق برای درخواست پراکسی‌شده، host:port برای CONNECT.
نسخهversionرشته = ""متن نسخه‌ی HTTP، مثل HTTP/1.1.
وضعیتstatusصحیح = 0کد وضعیت یک سرآیند پاسخ.
دلیلreasonرشته = ""عبارت دلیل یک سرآیند پاسخ. خالی مجاز است.
نام‌هاnamesوکتور<رشته>نام سرآیندها به ترتیب، همان‌طور که نوشته شده‌اند.
مقدارهاvaluesوکتور<رشته>مقدار سرآیندها، یکی برای هر نام.
net-httpproxy-Parse.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی رشته

تابع ریشه:
    request := "GET http://example.com:8080/a/b?x=1 HTTP/1.1\r\nHost: example.com:8080\r\nProxy-Authorization: Basic dXNlcjpwYXNz\r\nConnection: keep-alive, X-Drop\r\nX-Drop: 1\r\n\r\n"
    head := پراکسی اچ‌تی‌تی‌پی.تجزیه سرآیند درخواست(request)
    سرچاپ head.معتبر، head.روش، head.هدف، head.نسخه، head.نام‌ها.طول()
    سرچاپ پراکسی اچ‌تی‌تی‌پی.گرفتن سرآیند(head، "HOST")، پراکسی اچ‌تی‌تی‌پی.سرآیند دارد(head، "x-drop")، پراکسی اچ‌تی‌تی‌پی.تعداد سرآیند(head، "host")
    سرچاپ پراکسی اچ‌تی‌تی‌پی.سرآیند توکن دارد(head، "connection"، "KEEP-ALIVE")، پراکسی اچ‌تی‌تی‌پی.سرآیند توکن دارد(head، "connection"، "close")
    سرچاپ head.نام‌ها.بگیر(0)، head.مقدارها.بگیر(0)

    هر text در ["G@T / HTTP/1.1\r\n\r\n"، "GET /\r\n\r\n"، "GET / HTTP/1.1\r\nBroken header\r\n\r\n"، "GET / HTTP/1.1\r\nA: b\r\n c\r\n\r\n"]:
        bad := پراکسی اچ‌تی‌تی‌پی.تجزیه سرآیند درخواست(text)
        سرچاپ bad.معتبر، bad.خطا
    پایان
    سرچاپ پراکسی اچ‌تی‌تی‌پی.بیشترین اندازه سرآیند، پراکسی اچ‌تی‌تی‌پی.بیشترین تعداد سرآیند

    response := پراکسی اچ‌تی‌تی‌پی.تجزیه سرآیند پاسخ("HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm=\"x\"\r\n\r\n")
    سرچاپ response.معتبر، response.وضعیت، response.دلیل، پراکسی اچ‌تی‌تی‌پی.گرفتن سرآیند(response، "proxy-authenticate")

    هر u در ["http://example.com"، "HTTP://Example.COM:81/p?q=1#frag"، "http://[::1]:8080/x"، "https://secure.example/a"، "ftp://example.com/"، "/relative"]:
        x := پراکسی اچ‌تی‌تی‌پی.تجزیه نشانی وب(u)
        اگر x.معتبر:
            سرچاپ u، "->"، x.طرح، x.میزبان، x.درگاه، x.مسیر
        وگرنه:
            سرچاپ u، "-> invalid"
        پایان
    پایان
    هر t در ["example.com:443"، "example.com"، "[::1]:8443"، "::1"، "host:0"]:
        hp := پراکسی اچ‌تی‌تی‌پی.جداسازی میزبان درگاه(t، 80)
        سرچاپ t، "->"، hp.معتبر، hp.میزبان، hp.درگاه، hp.درگاه دارد
    پایان

    header := پراکسی اچ‌تی‌تی‌پی.سرآیند بیسیک("user"، "pass")
    سرچاپ header
    ناپایا user := ""
    ناپایا password := ""
    سرچاپ پراکسی اچ‌تی‌تی‌پی.اعتبارنامه بیسیک(header، user، password)، user، password
    سرچاپ پراکسی اچ‌تی‌تی‌پی.اعتبارنامه بیسیک("Bearer abc"، user، password)

    هر name در ["Connection"، "Transfer-Encoding"، "Upgrade"، "Host"، "Content-Length"]:
        سرچاپ name، پراکسی اچ‌تی‌تی‌پی.از نوع گام‌به‌گام(name)
    پایان
    سرچاپ رشته.جایگزینی(پراکسی اچ‌تی‌تی‌پی.متن پاسخ(407، "Proxy-Authenticate: Basic realm=\"r\"\r\n"، ""، نادرست)، "\r\n"، "|")
    سرچاپ پراکسی اچ‌تی‌تی‌پی.دلیل وضعیت(403)، "|"، پراکسی اچ‌تی‌تی‌پی.دلیل وضعیت(502)، "|"، پراکسی اچ‌تی‌تی‌پی.دلیل وضعیت(999)
پایان
خروجیtrue GET http://example.com:8080/a/b?x=1 HTTP/1.1 4 example.com:8080 true 1 true false Host example.com:8080 false invalid method false malformed request line false malformed header line false folded header lines are not allowed 65536 200 true 407 Proxy Authentication Required Basic realm="x" http://example.com -> http example.com 80 / HTTP://Example.COM:81/p?q=1#frag -> http Example.COM 81 /p?q=1 http://[::1]:8080/x -> http ::1 8080 /x https://secure.example/a -> https secure.example 443 /a ftp://example.com/ -> invalid /relative -> invalid example.com:443 -> true example.com 443 true example.com -> true example.com 80 false [::1]:8443 -> true ::1 8443 true ::1 -> false 0 false host:0 -> false 0 false Basic dXNlcjpwYXNz true user pass false Connection true Transfer-Encoding true Upgrade true Host false Content-Length false HTTP/1.1 407 Proxy Authentication Required|Proxy-Authenticate: Basic realm="r"|Content-Length: 0|| Forbidden | Bad Gateway | Status

میزبان درگاه HostPort

ساختار میزبان درگاه
یک میزبان و درگاه که از متنی مثل example.com:443 گرفته شده.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستدرست وقتی متن میزبان و درگاه معتبر بود.
میزبانhostرشته = ""میزبان، برای IPv6 بدون کروشه.
درگاهportصحیح = 0درگاه، یا پیش‌فرض اگر متن نداشت.
درگاه داردhas_portمنطقی = نادرستدرست وقتی متن خودش درگاه را نام برده بود.

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

نشانی وب URL

ساختار نشانی وب
یک نشانی http:// یا https:// تجزیه‌شده. تجزیه نشانی وب آن را می‌سازد.
نامانگلیسیگونهتوضیح
معتبرokمنطقی = نادرستدرست وقتی نشانی معتبر بود.
طرحschemeرشته = ""http یا https، با حروف کوچک.
میزبانhostرشته = ""میزبان، همان‌طور که نوشته شده.
درگاهportصحیح = 0درگاه، یا ۸۰ یا ۴۴۳ اگر نشانی نداشت.
مسیرpathرشته = ""مسیر با پرسمان، دست‌کم /. بخش پس از # حذف می‌شود.

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

کلاینت Client

ساختار کلاینت
یک کارخواه پراکسی HTTP: از کدام پراکسی استفاده شود، ورود و گزینه‌های TLS. با کلاینت جدید یا کلاینت جدید با احراز هویت ساخته می‌شود.
نامانگلیسیگونهتوضیح
میزبانhostرشته = ""نام میزبان یا IP پراکسی.
درگاهportصحیح = 0درگاه پراکسی.
نام کاربریusernameرشته = ""نام کاربری برای Proxy-Authorization: Basic. خالی یعنی بدون ورود.
گذرواژهpasswordرشته = ""گذرواژه‌ای که با نام کاربری می‌آید.
امنtlsمنطقی = نادرستدرست یعنی خود پراکسی از راه TLS برسید (پراکسی HTTPS). پیش‌فرض نادرست.
نام سرورserver_nameرشته = ""نامی که وقتی امن روشن است در گواهی پراکسی فرستاده و بررسی می‌شود. خالی یعنی همان میزبان.
بدون اعتبارسنجیinsecureمنطقی = نادرستدرست یعنی بررسی گواهی نادیده گرفته شود. فقط برای آزمون.
مهلت میلی‌ثانیهtimeout_msصحیح = 15000اتصال و هر پاسخ چند میلی‌ثانیه می‌تواند طول بکشد. پیش‌فرض ۱۵۰۰۰.
بیشترین اندازه بدنهmax_bodyصحیح = 16777216بزرگ‌ترین بدنه‌ی پاسخی که درخواست می‌خواند، به بایت. پیش‌فرض ۱۶۷۷۷۲۱۶ (۱۶ مگابایت)؛ بدنه‌ی بزرگ‌تر پاسخ را ناموفق می‌کند.
net-httpproxy-Get.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع ریشه:
    start_backends()
    ناپایا server_cfg := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(server_cfg، درست)
    server := پراکسی اچ‌تی‌تی‌پی.شروع(server_cfg)
    سرچاپ "proxy up:"، server.موفق
    client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، server.درگاه)
    سرچاپ client.مهلت میلی‌ثانیه، client.بیشترین اندازه بدنه، client.امن

    url := "http://127.0.0.1:" + origin_port
    r := پراکسی اچ‌تی‌تی‌پی.دریافت(client، url + "/hello?x=1")
    سرچاپ r.موفق، r.وضعیت، r.طول بدنه، r.بدنه
    سرچاپ پراکسی اچ‌تی‌تی‌پی.گرفتن سرآیند(r.سرآیند، "content-length")، r.سرآیند.دلیل

    p := پراکسی اچ‌تی‌تی‌پی.ارسال(client، url + "/submit"، "text/plain"، "payload")
    سرچاپ p.موفق، p.وضعیت، p.بدنه
    custom := پراکسی اچ‌تی‌تی‌پی.درخواست(client، "PUT"، url + "/thing"، "X-Trace: 1\r\n"، "data")
    سرچاپ custom.وضعیت، custom.بدنه

    https := پراکسی اچ‌تی‌تی‌پی.دریافت(client، "https://127.0.0.1/")
    سرچاپ https.موفق، https.خطا
    پراکسی اچ‌تی‌تی‌پی.توقف(server)
پایان
خروجیproxy up: true 15000 16777216 false true 200 35 origin saw: GET /hello?x=1 HTTP/1.1 35 OK true 200 origin saw: POST /submit HTTP/1.1 200 origin saw: PUT /thing HTTP/1.1 false only absolute http URLs can go through the proxy this way

نتیجه دست‌دهی HandshakeResult

ساختار نتیجه دست‌دهی
نتیجه‌ی یک CONNECT روی یک جریان باز.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی پراکسی با وضعیت ۲xx پاسخ داد.
وضعیتstatusصحیح = 0وضعیت HTTP که پراکسی با آن پاسخ داد، ۰ اگر پاسخی نبود.
خطاerrرشته = ""دلیل خوانا در صورت شکست.
net-httpproxy-Connect.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع ریشه:
    start_backends()
    ناپایا server_cfg := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(server_cfg، درست)
    server := پراکسی اچ‌تی‌تی‌پی.شروع(server_cfg)
    client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، server.درگاه)

    tunnel := پراکسی اچ‌تی‌تی‌پی.اتصال(client، "127.0.0.1"، echo_port)
    سرچاپ "connect:"، tunnel.موفق، tunnel.وضعیت
    tunnel.جریان.نوشتن("bytes pass through untouched")
    سرچاپ tunnel.جریان.خواندن(100)
    tunnel.جریان.بستن()

    conn := پراکسی اچ‌تی‌تی‌پی.شماره‌گیری اتصال(client، "127.0.0.1"، echo_port)
    تی سی پی.نوشتن(conn، "plain conn")
    سرچاپ تی سی پی.خواندن(conn، 100)
    تی سی پی.بستن(conn)

    refused := پراکسی اچ‌تی‌تی‌پی.اتصال(client، "127.0.0.1"، تی سی پی.درگاه آزاد())
    سرچاپ "refused:"، refused.موفق، refused.وضعیت، refused.خطا
    پراکسی اچ‌تی‌تی‌پی.توقف(server)

    ناپایا first_cfg := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(first_cfg، درست)
    first := پراکسی اچ‌تی‌تی‌پی.شروع(first_cfg)
    ناپایا second_cfg := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(second_cfg، درست)
    second := پراکسی اچ‌تی‌تی‌پی.شروع(second_cfg)
    hop := پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، first.درگاه)، "127.0.0.1"، second.درگاه)
    onward := پراکسی اچ‌تی‌تی‌پی.دست‌دهی کلاینت(hop.جریان، پراکسی اچ‌تی‌تی‌پی.کلاینت جدید(""، 0)، "127.0.0.1"، echo_port)
    سرچاپ "second hop:"، onward.موفق، onward.وضعیت
    hop.جریان.نوشتن("two hops")
    سرچاپ hop.جریان.خواندن(100)
    hop.جریان.بستن()
    پراکسی اچ‌تی‌تی‌پی.توقف(first)
    پراکسی اچ‌تی‌تی‌پی.توقف(second)
پایان
خروجیconnect: true 200 echo:bytes pass through untouched echo:plain conn refused: false 502 proxy answered 502 Bad Gateway second hop: true 200 echo:two hops

نتیجه اتصال ConnectResult

ساختار نتیجه اتصال
نتیجه‌ی اتصال: جریان تونل در صورت موفقیت و وضعیت و دلیل در غیر این صورت.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی تونل باز است.
وضعیتstatusصحیح = 0وضعیت HTTP پراکسی، مثل ۲۰۰، ۴۰۷ (ورود لازم است)، ۴۰۳ یا ۵۰۲.
خطاerrرشته = ""دلیل خوانا در صورت شکست.
جریانstreamdyn تونل.جریانجریان باز به مقصد، وقتی موفق درست است معتبر است. بایت‌ها در هر دو جهت دست‌نخورده می‌گذرند، پس TLS می‌تواند درونش اجرا شود.

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

پاسخ Response

ساختار پاسخ
یک پاسخ کامل HTTP که با دریافت، ارسال یا درخواست از راه پراکسی گرفته شده.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی پاسخ کامل رسید. ۴۰۴ هم ok است؛ بدنه‌ی بریده‌شده نه.
خطاerrرشته = ""دلیل خوانا وقتی موفق نادرست است.
وضعیتstatusصحیح = 0کد وضعیت HTTP.
سرآیندheadسرآیندسطر وضعیت و سرآیندهای تجزیه‌شده. با گرفتن سرآیند بخوانیدشان.
بدنهbodyرشته = ""بدنه به شکل متن. در نخستین بایت NUL تمام می‌شود.
طول بدنهlengthصحیح = 0طول بدنه به بایت.

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

پیکربندی سرور ServerConfig

ساختار پیکربندی سرور
تنظیمات یک کارساز پراکسی HTTP: درگاه، ورود، آنچه مجاز است، TLS، حدهای زمانی و شیوه‌ی رسیدن به مقصدها. از پیکربندی سرور جدید شروع کنید.
نامانگلیسیگونهتوضیح
درگاهportصحیح = 0درگاهی که روی آن گوش داده می‌شود؛ ۰ یک درگاه آزاد برمی‌گزیند.
میزبان پیوندbind_hostرشته = "127.0.0.1"نشانی‌ای که روی آن گوش داده می‌شود. پیش‌فرض 127.0.0.1 است؛ 0.0.0.0 یا یک نشانی عمومی را عمداً بدهید.
نیاز به احراز هویتrequire_authمنطقی = نادرستدرست وقتی کارخواه‌ها باید Proxy-Authorization بفرستند. افزودن کاربر و تعیین احراز هویت آن را روشن می‌کنند.
قلمروrealmرشته = "Salam proxy"قلمرو نام‌برده در چالش ۴۰۷. پیش‌فرض Salam proxy.
کاربرانusersنگاشت<رشته، رشته>نام‌های کاربری و گذرواژه‌های پذیرفته‌شده.
احراز هویتauthتابع(رشته، رشته): منطقیبررسی سفارشی (user, password) -> bool که به جای کاربران به کار می‌رود. با تعیین احراز هویت تعیین می‌شود.
دارای احراز هویت سفارشیhas_authمنطقی = نادرستدرست وقتی احراز هویت به کار می‌رود.
اجازه کانکتallow_connectمنطقی = درستدرست یعنی تونل‌های CONNECT مجاز باشند. پیش‌فرض درست. نادرست با ۴۰۳ پاسخ می‌دهد.
اجازه درخواست سادهallow_plainمنطقی = درستدرست یعنی درخواست‌های ساده‌ی http:// جلو بروند. پیش‌فرض درست. نادرست با ۴۰۳ پاسخ می‌دهد.
مهلت دست‌دهی میلی‌ثانیهhandshake_timeout_msصحیح = 15000کارخواه چند میلی‌ثانیه وقت دارد سرآیند درخواستش را بفرستد. پیش‌فرض ۱۵۰۰۰.
مهلت بی‌کاری میلی‌ثانیهidle_timeout_msصحیح = 60000یک اتصال keep-alive چند میلی‌ثانیه می‌تواند منتظر درخواست بعدی بماند. پیش‌فرض ۶۰۰۰۰.
مهلت بی‌کاری رلهrelay_idle_msصحیح = 0تونل CONNECT را پس از این همه میلی‌ثانیه سکوت قطع کن. ۰، پیش‌فرض، یعنی هرگز.
استفاده از تی ال اسuse_tlsمنطقی = نادرستدرست وقتی خود پراکسی TLS حرف می‌زند، که تعیین تی ال اس روشنش می‌کند.
پیکربندی تی ال اسtls_configتی ال اس.پیکربندی کارسازتنظیمات TLS که وقتی استفاده از تی ال اس درست است به کار می‌رود.
اتصال به مقصدconnectتابع(رشته، صحیح): ساکس.خروجیتابع بازخوانی که به مقصد می‌رسد: (host, port) -> ساکس.خروجی. پیش‌فرض مستقیم شماره‌گیری می‌کند. با تعیین اتصال به مقصد یا تعیین شماره‌گیر تعیین می‌شود.
اجازهallowتابع(رشته، رشته، صحیح): منطقییک قاعده‌ی دسترسی (method, host, port) -> bool که پیش از هر درخواست پرسیده می‌شود؛ نادرست با ۴۰۳ پاسخ می‌دهد. پیش‌فرض همه چیز را مجاز می‌داند.
سیاست مقصدpolicyتونل.سیاست مقصدکدام مقصدها قابل دسترسی‌اند. به‌طور پیش‌فرض نشانی‌های حلقه محلی، خصوصی، پیوند محلی، فراداده و دیگر نشانی‌های ویژه رد می‌شوند. به DestPolicy نگاه کنید.
اتصال سفارشی داردhas_connectمنطقی = نادرستدرست وقتی یک اتصال‌دهنده‌ی سفارشی تعیین شده است. آن‌گاه سیاست فقط نام‌ها و نشانی‌های صریح را می‌سنجد و اتصال‌دهنده باید خودش امن تفکیک کند.
بیشینه اتصال همزمانmax_connectionsصحیح = 1024بیشترین شمار اتصال همزمان؛ بیشتر از آن بسته می‌شود (ساکس) یا با ۵۰۳ پاسخ داده می‌شود (اچ‌تی‌تی‌پی). پیش‌فرض ۱۰۲۴ است و ۰ سقف را برمی‌دارد.
بیشینه دست دادن مبداmax_per_sourceصحیح = 32بیشترین دست‌دهی‌های هم‌زمان در جریان از یک نشانی مبدا. پیش‌فرض ۳۲ است و ۰ حد را برمی‌دارد.
مهلت کل دست‌دهیhandshake_deadline_msصحیح = 10000کل زمانی که یک اتصال برای پایان دست‌دهی دارد، به میلی‌ثانیه، هر قدر هم آهسته بفرستد. پیش‌فرض ۱۰۰۰۰ است و ۰ آن را خاموش می‌کند.
net-httpproxy-Policy.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع ریشه:
    start_backends()
    url := "http://127.0.0.1:" + origin_port + "/"

    ناپایا acl := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(acl، درست)
    acl.اجازه = (method: رشته، _host: رشته، port: صحیح): برگشت method برابر "GET" و port نابرابر 25 پایان
    acl_server := پراکسی اچ‌تی‌تی‌پی.شروع(acl)
    acl_client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، acl_server.درگاه)
    سرچاپ "GET:"، پراکسی اچ‌تی‌تی‌پی.دریافت(acl_client، url).وضعیت
    سرچاپ "POST:"، پراکسی اچ‌تی‌تی‌پی.ارسال(acl_client، url، "text/plain"، "x").وضعیت
    سرچاپ "port 25:"، پراکسی اچ‌تی‌تی‌پی.دریافت(acl_client، "http://127.0.0.1:25/").وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(acl_server)

    ناپایا no_connect := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(no_connect، درست)
    no_connect.اجازه کانکت = نادرست
    nc := پراکسی اچ‌تی‌تی‌پی.شروع(no_connect)
    سرچاپ "connect off:"، پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، nc.درگاه)، "127.0.0.1"، echo_port).وضعیت، پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، nc.درگاه)، url).وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(nc)

    ناپایا no_plain := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(no_plain، درست)
    no_plain.اجازه درخواست ساده = نادرست
    np := پراکسی اچ‌تی‌تی‌پی.شروع(no_plain)
    opened := پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، np.درگاه)، "127.0.0.1"، echo_port)
    سرچاپ "plain off:"، پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، np.درگاه)، url).وضعیت، opened.وضعیت
    opened.جریان.بستن()
    پراکسی اچ‌تی‌تی‌پی.توقف(np)

    ناپایا routed := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(routed، درست)
    پراکسی اچ‌تی‌تی‌پی.تعیین اتصال به مقصد(routed، (host: رشته، _port: صحیح): اگر host برابر "echo.internal": برگشت ساکس.اتصال مستقیم("127.0.0.1"، echo_port، 2000) پایان برگشت ساکس.خروجی { موفق = نادرست، کد = ساکس.کد شبکه در دسترس نیست، خطا = "no route" } پایان)
    rs := پراکسی اچ‌تی‌تی‌پی.شروع(routed)
    named := پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، rs.درگاه)، "echo.internal"، 1)
    named.جریان.نوشتن("by name")
    سرچاپ "routed:"، named.وضعیت، named.جریان.خواندن(100)
    سرچاپ "unknown:"، پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، rs.درگاه)، "other.internal"، 1).وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(rs)

    ناپایا blocked := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(blocked، درست)
    پراکسی اچ‌تی‌تی‌پی.تعیین شماره‌گیر(blocked، تونل.مسدود())
    bs := پراکسی اچ‌تی‌تی‌پی.شروع(blocked)
    سرچاپ "block dialer:"، پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، bs.درگاه)، "127.0.0.1"، echo_port).وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(bs)

    ناپایا config := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(config، درست)
    سرچاپ config.مهلت دست‌دهی میلی‌ثانیه، config.مهلت بی‌کاری میلی‌ثانیه، config.مهلت بی‌کاری رله، config.اجازه کانکت، config.اجازه درخواست ساده
پایان
خروجیGET: 200 POST: 403 port 25: 403 connect off: 403 200 plain off: 403 200 routed: 200 echo:by name unknown: 502 block dialer: 502 15000 60000 0 true true

سرور Server

ساختار سرور
یک پراکسی HTTP در حال اجرا. شروع آن را برمی‌گرداند و توقف پایانش می‌دهد.
نامانگلیسیگونهتوضیح
موفقokمنطقی = نادرستدرست وقتی درگاه بسته شد و کارساز در حال اجراست.
درگاهportصحیح = 0درگاهی که روی آن گوش می‌دهد؛ وقتی ۰ خواسته‌اید به کار می‌آید.
میزبانhostرشته = ""نشانی‌ای که کارساز روی آن گوش می‌دهد.
شنوندهlistenerتی سی پی.سرورشنونده‌ی TCP زیرین.
پرچم توقفstop_cellصحیح۶۴*پرچمی که توقف پاکش می‌کند تا حلقه‌ی پذیرش تمام شود.

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

ورودی اچ‌تی‌تی‌پی HttpInbound

ساختار ورودی اچ‌تی‌تی‌پی
یک کارساز پراکسی HTTP برای تونل.پذیرنده: یک درخواست CONNECT یا نشانی مطلق را از یک جریان می‌خواند و به یک تونل.نشست تبدیل می‌کند، پس می‌تواند در یک تونل.پروتکل ترکیبی درگاه را شریک شود. با ورودی جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
پیکربندیconfigپیکربندی سرورتنظیمات کارساز: ورود، روش‌های مجاز و حدها.
net-httpproxy-Inbound.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع ریشه:
    start_backends()
    ناپایا config := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.افزودن کاربر(config، "u"، "p")
    inbound_protocol := پراکسی اچ‌تی‌تی‌پی.ورودی جدید(config)
    سرچاپ inbound_protocol.نام()

    forward := تونل.انتقال‌دهنده جدید(تونل.مستقیم()، inbound_protocol)
    listener := تونل.شنود تی سی پی(0)
    تونل.سرویس‌دهی پس‌زمینه(listener، inbound_protocol، forward)

    client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید با احراز هویت("127.0.0.1"، listener.درگاه، "u"، "p")
    سرچاپ پراکسی اچ‌تی‌تی‌پی.دریافت(client، "http://127.0.0.1:" + origin_port + "/page").بدنه
    tunnel_result := پراکسی اچ‌تی‌تی‌پی.اتصال(client، "127.0.0.1"، echo_port)
    tunnel_result.جریان.نوشتن("connect through the inbound")
    سرچاپ tunnel_result.وضعیت، tunnel_result.جریان.خواندن(100)
    tunnel_result.جریان.بستن()
    سرچاپ "without login:"، پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، listener.درگاه)، "http://127.0.0.1:" + origin_port + "/").وضعیت
    listener.توقف()

    hop := پراکسی اچ‌تی‌تی‌پی.رابط جدید(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، 3128))
    سرچاپ hop.نام()، hop.کارساز().متن()
    via := تونل.از طریق(تونل.مستقیم()، hop)
    سرچاپ via.نام()
پایان
خروجیhttp origin saw: GET /page HTTP/1.1 200 echo:connect through the inbound without login: 407 http 127.0.0.1:3128 http

نام Name

تابع نام(): رشته
http را برمی‌گرداند.

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

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان): تونل.نشست
سرآیند درخواست را می‌خواند و وارسی می‌کند، ورود پراکسی و قاعده‌ی دسترسی را بررسی می‌کند و مقصد را برمی‌گرداند. درخواست ساده به شکل مسیر و با Connection: close بازنویسی و به شکل تونل.داده آغازین جلو برده می‌شود، پس از این درون‌سو هر اتصال یک درخواست می‌برد، با بدنه‌ای تا ۱ مگابایت متن؛ بدنه‌ی تکه‌تکه ۵۰۱ می‌گیرد. درخواست ردشده همین‌جا پاسخ می‌گیرد (۴۰۷، ۴۰۳، ۴۰۰، ۴۳۱، ۵۰۱).

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

پاسخ Reply

تابع پاسخ(s: dyn تونل.جریان، sess: تونل.نشست، ok: منطقی)
برای درخواست CONNECT پاسخ 200 Connection established یا 502 Bad Gateway را می‌فرستد. برای درخواست ساده فقط شکست پاسخ می‌گیرد (۵۰۲): در موفقیت پاسخ خود مقصد به کارخواه می‌رسد.

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

رابط اچ‌تی‌تی‌پی HttpConnector

ساختار رابط اچ‌تی‌تی‌پی
یک گام پراکسی HTTP از یک تونل.زنجیره: به یک پراکسی وصل می‌شود و از آن یک تونل CONNECT به جای بعدی می‌خواهد. با رابط جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
کلاینتclientکلاینتتنظیمات کارخواه: نشانی پراکسی، ورود و TLS.

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

کارساز Server

تابع کارساز(): تونل.نشانی
نشانی پراکسی HTTP.

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

دست‌دهی Handshake

تابع دست‌دهی(s: dyn تونل.جریان، target: تونل.نشانی): منطقی
روی جریان باز برای یک مقصد CONNECT می‌فرستد و پاسخ ۲xx را بررسی می‌کند. درست وقتی پراکسی موافقت کرد.

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

نام Name

تابع نام(): رشته
http را برمی‌گرداند.

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

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

بیشترین اندازه سرآیند MaxHeadBytes

پایا بیشترین اندازه سرآیند: صحیح۳۲ = 65536
بزرگ‌ترین سرآیند درخواست یا پاسخ، به بایت: ۶۵۵۳۶. بزرگ‌تر رد می‌شود (در کارساز ۴۳۱).

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

بیشترین تعداد سرآیند MaxHeaders

پایا بیشترین تعداد سرآیند: صحیح۳۲ = 200
بیشترین شمار سطر سرآیند: ۲۰۰.

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

تابع‌ها

تجزیه سرآیند درخواست ParseRequestHead

تابع تجزیه سرآیند درخواست(text: رشته): سرآیند
یک سرآیند درخواست را تجزیه می‌کند: سطر درخواست و سطرهای سرآیند. سخت‌گیر است: روش بد، نسخه‌ی نبوده، سرآیند تاخورده یا خراب، بیش از بیشترین تعداد سرآیند سرآیند یا سرآیند بزرگ‌تر از بیشترین اندازه سرآیند همه با دلیلی در خطا شکست می‌خورند.

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

تجزیه سرآیند پاسخ ParseResponseHead

تابع تجزیه سرآیند پاسخ(text: رشته): سرآیند
یک سرآیند پاسخ را تجزیه می‌کند: سطر وضعیت و سرآیندها. عبارت دلیل می‌تواند خالی باشد.

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

گرفتن سرآیند HeaderGet

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

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

سرآیند دارد HeaderHas

تابع سرآیند دارد(h: سرآیند، name: رشته): منطقی
درست وقتی سرآیند وجود دارد.

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

تعداد سرآیند HeaderCount

تابع تعداد سرآیند(h: سرآیند، name: رشته): صحیح
چند سطر این نام سرآیند را دارند.

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

سرآیند توکن دارد HeaderHasToken

تابع سرآیند توکن دارد(h: سرآیند، name: رشته، token: رشته): منطقی
درست وقتی مقدار سرآیند جداشده با ویرگول یک نشانه را دارد، مثل keep-alive در Connection. بزرگی و کوچکی حروف نادیده گرفته می‌شود.

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

از نوع گام‌به‌گام IsHopByHop

تابع از نوع گام‌به‌گام(name: رشته): منطقی
درست برای سرآیندهایی که به یک اتصال تعلق دارند و نباید جلو بروند: Connection، Keep-Alive، Proxy-Authenticate، Proxy-Authorization، Proxy-Connection، TE، Trailer، Transfer-Encoding، Upgrade.

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

جداسازی میزبان درگاه SplitHostPort

تابع جداسازی میزبان درگاه(s: رشته، default_port: صحیح): میزبان درگاه
host:port یا [v6]:port را جدا می‌کند و اگر درگاهی نوشته نشده یک درگاه پیش‌فرض می‌دهد. متن نامعتبر (درگاه بد، دونقطه‌ی اضافه، فاصله، / یا @) معتبر را نادرست می‌کند.

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

تجزیه نشانی وب ParseURL

تابع تجزیه نشانی وب(s: رشته): نشانی وب
یک نشانی http:// یا https:// را به طرح، میزبان، درگاه و مسیر تجزیه می‌کند. طرح‌های دیگر و نشانی‌های نسبی نامعتبرند.

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

سرآیند بیسیک BasicHeader

تابع سرآیند بیسیک(user: رشته، pass: رشته): رشته
مقدار Basic ... برای سرآیند Proxy-Authorization را برمی‌گرداند: نام کاربری و گذرواژه با دونقطه به هم چسبیده، در Base64.

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

اعتبارنامه بیسیک BasicCredentials

تابع اعتبارنامه بیسیک(value: رشته، user &: رشته، pass &: رشته): منطقی
مقدار یک سرآیند Basic را دوباره به نام کاربری و گذرواژه می‌خواند (گذرواژه می‌تواند دونقطه داشته باشد). اگر مقدار Basic معتبری نبود نادرست.

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

دلیل وضعیت StatusReason

تابع دلیل وضعیت(code: صحیح): رشته
عبارت دلیل استاندارد یک کد وضعیت را برمی‌گرداند، یا Status برای کدی که نمی‌شناسد.

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

متن پاسخ ResponseText

تابع متن پاسخ(code: صحیح، extra_headers: رشته، body: رشته، close: منطقی): رشته
یک پاسخ کوچک کامل می‌سازد: سطر وضعیت، سطرهای سرآیند اضافه، Content-Length، Connection: close اختیاری و بدنه.

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

کلاینت جدید NewClient

تابع کلاینت جدید(host: رشته، port: صحیح): کلاینت
یک کارخواه برای پراکسی، بدون ورود می‌سازد.

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

کلاینت جدید با احراز هویت NewClientAuth

تابع کلاینت جدید با احراز هویت(host: رشته، port: صحیح، username: رشته، password: رشته): کلاینت
کارخواهی می‌سازد که با احراز هویت Basic به پراکسی وارد می‌شود.
net-httpproxy-Auth.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع ریشه:
    start_backends()
    ناپایا config := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(config، درست)
    config.قلمرو = "demo"
    پراکسی اچ‌تی‌تی‌پی.افزودن کاربر(config، "alice"، "s3cret")
    سرچاپ config.نیاز به احراز هویت، config.قلمرو
    server := پراکسی اچ‌تی‌تی‌پی.شروع(config)
    url := "http://127.0.0.1:" + origin_port + "/"

    anonymous := پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، server.درگاه)، url)
    سرچاپ "no login:"، anonymous.وضعیت، پراکسی اچ‌تی‌تی‌پی.گرفتن سرآیند(anonymous.سرآیند، "proxy-authenticate")
    wrong := پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید با احراز هویت("127.0.0.1"، server.درگاه، "alice"، "nope")، url)
    سرچاپ "wrong password:"، wrong.وضعیت
    right := پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید با احراز هویت("127.0.0.1"، server.درگاه، "alice"، "s3cret")، url)
    سرچاپ "right password:"، right.وضعیت، right.بدنه
    سرچاپ "connect without login:"، پراکسی اچ‌تی‌تی‌پی.اتصال(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، server.درگاه)، "127.0.0.1"، echo_port).وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(server)

    ناپایا custom := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)
    پراکسی اچ‌تی‌تی‌پی.اجازه آدرس‌های خصوصی(custom، درست)
    پراکسی اچ‌تی‌تی‌پی.تعیین احراز هویت(custom، (user: رشته، password: رشته): برگشت user برابر "bob" و password برابر "pw" پایان)
    سرچاپ custom.دارای احراز هویت سفارشی
    second := پراکسی اچ‌تی‌تی‌پی.شروع(custom)
    سرچاپ "callback good:"، پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید با احراز هویت("127.0.0.1"، second.درگاه، "bob"، "pw")، url).وضعیت
    سرچاپ "callback bad:"، پراکسی اچ‌تی‌تی‌پی.دریافت(پراکسی اچ‌تی‌تی‌پی.کلاینت جدید با احراز هویت("127.0.0.1"، second.درگاه، "bob"، "x")، url).وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(second)
پایان
خروجیtrue demo no login: 407 Basic realm="demo" wrong password: 407 right password: 200 origin saw: GET / HTTP/1.1 connect without login: 407 true callback good: 200 callback bad: 407

دست‌دهی کلاینت ClientHandshake

تابع دست‌دهی کلاینت(s: dyn تونل.جریان، c: کلاینت، host: رشته، port: صحیح): نتیجه دست‌دهی
روی جریانی که از پیش به یک پراکسی باز است CONNECT host:port می‌فرستد و پاسخ را می‌خواند. همین‌طور گام دوم روی گام اول اضافه می‌شود.

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

اتصال Connect

تابع اتصال(c: کلاینت، host: رشته، port: صحیح): نتیجه اتصال
به پراکسی وصل می‌شود و یک تونل CONNECT به یک میزبان و درگاه باز می‌کند. برای HTTPS و هر پروتکل TCP دیگر به کار ببرید.

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

شماره‌گیری اتصال DialConn

تابع شماره‌گیری اتصال(c: کلاینت، host: رشته، port: صحیح): تی سی پی.اتصال شبکه
مثل اتصال ولی یک اتصال TCP ساده برای تابع‌های net.tcp برمی‌گرداند. در شکست اتصال خالی.

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

درخواست Request

تابع درخواست(c: کلاینت، method: رشته، url: رشته، headers: رشته، body: رشته): پاسخ
یک درخواست HTTP ساده را از راه پراکسی می‌فرستد: یک روش، یک نشانی مطلق http://، سطرهای سرآیند اضافه (هر یک با شکست سطر) و یک بدنه. برای https:// از اتصال استفاده کنید و TLS را روی تونل اجرا کنید.

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

دریافت Get

تابع دریافت(c: کلاینت، url: رشته): پاسخ
یک نشانی http:// را با GET از راه پراکسی می‌گیرد.

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

ارسال Post

تابع ارسال(c: کلاینت، url: رشته، content_type: رشته، body: رشته): پاسخ
یک POST با نوع محتوا و بدنه از راه پراکسی می‌فرستد.

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

پیکربندی سرور جدید NewServerConfig

تابع پیکربندی سرور جدید(port: صحیح): پیکربندی سرور
پیکربندی‌ای برای یک درگاه با پیش‌فرض‌های بالا برمی‌گرداند.

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

افزودن کاربر AddUser

تابع افزودن کاربر(cfg &: پیکربندی سرور، user: رشته، pass: رشته)
یک کاربر و گذرواژه اضافه می‌کند و ورود را روشن می‌کند.

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

تعیین احراز هویت SetAuth

تابع تعیین احراز هویت(cfg &: پیکربندی سرور، check: تابع(رشته، رشته): منطقی)
یک بررسی ورود سفارشی تعیین می‌کند و ورود را روشن می‌کند.

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

تعیین اتصال به مقصد SetConnector

تابع تعیین اتصال به مقصد(cfg &: پیکربندی سرور، connect: تابع(رشته، صحیح): ساکس.خروجی)
تابع بازخوانی را که به مقصدها می‌رسد تعیین می‌کند. برای مسیریابی با نام یا رد کردن میزبان‌ها به کار ببرید.

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

تعیین سیاست مقصد SetPolicy

تابع تعیین سیاست مقصد(cfg &: پیکربندی سرور، p: تونل.سیاست مقصد)
سیاست مقصد کارساز را تعیین می‌کند.

اجازه آدرس‌های خصوصی AllowPrivate

تابع اجازه آدرس‌های خصوصی(cfg &: پیکربندی سرور، enabled: منطقی)
دسترسی به نشانی‌های حلقه محلی و خصوصی را می‌دهد. فقط وقتی اثر دارد که کارساز روی حلقه محلی بسته شده باشد؛ روی هر نشانی دیگر نادیده گرفته می‌شود.

تعیین تی ال اس SetTLS

تابع تعیین تی ال اس(cfg &: پیکربندی سرور، cert_file: رشته، key_file: رشته): منطقی
یک گواهی و کلید بار می‌کند و خود پراکسی را TLS‌دار می‌کند (پراکسی HTTPS). اگر پرونده‌ها قابل استفاده نباشند نادرست.
net-httpproxy-Tls.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی

تابع ریشه:
    ناپایا config := پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(8443)
    پراکسی اچ‌تی‌تی‌پی.افزودن کاربر(config، "alice"، "a long random password")
    اگر وارونه پراکسی اچ‌تی‌تی‌پی.تعیین تی ال اس(config، "proxy.crt"، "proxy.key"):
        سرچاپ "certificate or key could not be loaded"
        برگشت
    پایان
    سرچاپ config.استفاده از تی ال اس
    server := پراکسی اچ‌تی‌تی‌پی.شروع(config)
    سرچاپ "https proxy up:"، server.موفق

    ناپایا client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید با احراز هویت("proxy.example.com"، 8443، "alice"، "a long random password")
    client.امن = درست
    client.نام سرور = "proxy.example.com"
    client.بدون اعتبارسنجی = نادرست
    tunnel := پراکسی اچ‌تی‌تی‌پی.اتصال(client، "example.com"، 443)
    سرچاپ tunnel.موفق، tunnel.وضعیت
    پراکسی اچ‌تی‌تی‌پی.توقف(server)
پایان

رسیدگی Handle

تابع رسیدگی(cfg: پیکربندی سرور، s: dyn تونل.جریان)
یک کارخواه را روی یک جریان باز سرویس می‌دهد: درخواست‌ها را می‌خواند، جلو می‌برد یا تونل باز می‌کند، تا پایان اتصال.
net-httpproxy-Handle.salam
// زبان: فارسی
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا proxy_port := 0

ناپایا origin_port := 0
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()

تابع origin():
    srv := تی سی پی.پیوند(0)
    origin_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        request := تی سی پی.خواندن(c، 4096)
        first := request.زیررشته(0، request.بیاب("\r\n"))
        body := "origin saw: " + first
        تی سی پی.نوشتن(c، "HTTP/1.1 200 OK\r\nContent-Length: " + body.طول() + "\r\nConnection: close\r\n\r\n" + body)
        تی سی پی.بستن(c)
    پایان
پایان

تابع echo():
    srv := تی سی پی.پیوند(0)
    echo_port = تی سی پی.درگاه(srv)
    همگام سازی.اتمام(ready)
    تا درست:
        c := تی سی پی.پذیرش(srv)
        تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
        تی سی پی.بستن(c)
    پایان
پایان

تابع start_backends():
    همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
    _a := نخ‌ساز(origin)
    _b := نخ‌ساز(echo)
    همگام سازی.انتظار(ready)
پایان

تابع serve_one():
    listener := تی سی پی.پیوند(0)
    proxy_port = تی سی پی.درگاه(listener)
    همگام سازی.اتمام(ready)
    c := تی سی پی.پذیرش(listener)
    پراکسی اچ‌تی‌تی‌پی.رسیدگی(پراکسی اچ‌تی‌تی‌پی.پیکربندی سرور جدید(0)، تونل.پوشاندن تی سی پی(c))
پایان

تابع ریشه:
    start_backends()
    همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
    _t := نخ‌ساز(serve_one)
    همگام سازی.انتظار(ready)
    client := پراکسی اچ‌تی‌تی‌پی.کلاینت جدید("127.0.0.1"، proxy_port)
    سرچاپ پراکسی اچ‌تی‌تی‌پی.دریافت(client، "http://127.0.0.1:" + origin_port + "/by-hand").بدنه
پایان
خروجیorigin saw: GET /by-hand HTTP/1.1

شروع Start

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

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

توقف Stop

تابع توقف(sv: سرور)
پذیرش کارخواه‌های تازه را می‌ایستاند. اتصال‌هایی که در جریان‌اند خودشان تمام می‌شوند.

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

خدمت‌رسانی Serve

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

ورودی جدید NewInbound

تابع ورودی جدید(cfg: پیکربندی سرور): ورودی اچ‌تی‌تی‌پی
از یک پیکربندی کارساز یک درون‌سوی پراکسی HTTP می‌سازد.

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

رابط جدید NewConnector

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

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

تعیین شماره‌گیر SetDialer

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

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