پراکسی اچتیتیپی 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 یا هر پروتکل دیگری را رویش اجرا کنید. نمونه یک پراکسی محلی و دو سرور محلی به کار میبرد تا هرجا اجرا شود.
// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی
ناپایا 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
پیکربندی سرور جدید پیکربندی یک درگاه را میدهد، افزودن کاربر ورود را روشن میکند و شروع در پسزمینه سرویس میدهد. کارساز اتصالها را زنده نگه میدارد، درخواستهای 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 و بدون کدگذاری انتقال فشرده.
- هیچ گزارشی خودکار نوشته نمیشود.
گونهها
سرآیند Head
ساختار سرآیندتجزیه سرآیند درخواست و تجزیه سرآیند پاسخ آن را میسازند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| معتبر | ok | منطقی = نادرست | درست وقتی سرآیند معتبر بود. |
| خطا | err | رشته = "" | چرا معتبر نبود. |
| روش | method | رشته = "" | روش درخواست، مثل GET یا CONNECT. |
| هدف | target | رشته = "" | هدف درخواست: نشانی مطلق برای درخواست پراکسیشده، host:port برای CONNECT. |
| نسخه | version | رشته = "" | متن نسخهی HTTP، مثل HTTP/1.1. |
| وضعیت | status | صحیح = 0 | کد وضعیت یک سرآیند پاسخ. |
| دلیل | reason | رشته = "" | عبارت دلیل یک سرآیند پاسخ. خالی مجاز است. |
| نامها | names | وکتور<رشته> | نام سرآیندها به ترتیب، همانطور که نوشته شدهاند. |
| مقدارها | values | وکتور<رشته> | مقدار سرآیندها، یکی برای هر نام. |
// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی رشته
تابع ریشه:
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)
پایانمیزبان درگاه 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
ساختار کلاینتکلاینت جدید یا کلاینت جدید با احراز هویت ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| میزبان | host | رشته = "" | نام میزبان یا IP پراکسی. |
| درگاه | port | صحیح = 0 | درگاه پراکسی. |
| نام کاربری | username | رشته = "" | نام کاربری برای Proxy-Authorization: Basic. خالی یعنی بدون ورود. |
| گذرواژه | password | رشته = "" | گذرواژهای که با نام کاربری میآید. |
| امن | tls | منطقی = نادرست | درست یعنی خود پراکسی از راه TLS برسید (پراکسی HTTPS). پیشفرض نادرست. |
| نام سرور | server_name | رشته = "" | نامی که وقتی امن روشن است در گواهی پراکسی فرستاده و بررسی میشود. خالی یعنی همان میزبان. |
| بدون اعتبارسنجی | insecure | منطقی = نادرست | درست یعنی بررسی گواهی نادیده گرفته شود. فقط برای آزمون. |
| مهلت میلیثانیه | timeout_ms | صحیح = 15000 | اتصال و هر پاسخ چند میلیثانیه میتواند طول بکشد. پیشفرض ۱۵۰۰۰. |
| بیشترین اندازه بدنه | max_body | صحیح = 16777216 | بزرگترین بدنهی پاسخی که درخواست میخواند، به بایت. پیشفرض ۱۶۷۷۷۲۱۶ (۱۶ مگابایت)؛ بدنهی بزرگتر پاسخ را ناموفق میکند. |
// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی
ناپایا 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)
پایاننتیجه دستدهی HandshakeResult
ساختار نتیجه دستدهیCONNECT روی یک جریان باز.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی پراکسی با وضعیت ۲xx پاسخ داد. |
| وضعیت | status | صحیح = 0 | وضعیت HTTP که پراکسی با آن پاسخ داد، ۰ اگر پاسخی نبود. |
| خطا | err | رشته = "" | دلیل خوانا در صورت شکست. |
// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی
ناپایا 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)
پایاننتیجه اتصال ConnectResult
ساختار نتیجه اتصالاتصال: جریان تونل در صورت موفقیت و وضعیت و دلیل در غیر این صورت.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی تونل باز است. |
| وضعیت | status | صحیح = 0 | وضعیت HTTP پراکسی، مثل ۲۰۰، ۴۰۷ (ورود لازم است)، ۴۰۳ یا ۵۰۲. |
| خطا | err | رشته = "" | دلیل خوانا در صورت شکست. |
| جریان | stream | dyn تونل.جریان | جریان باز به مقصد، وقتی موفق درست است معتبر است. بایتها در هر دو جهت دستنخورده میگذرند، پس TLS میتواند درونش اجرا شود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Connect.salam
پاسخ Response
ساختار پاسخدریافت، ارسال یا درخواست از راه پراکسی گرفته شده.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی پاسخ کامل رسید. ۴۰۴ هم ok است؛ بدنهی بریدهشده نه. |
| خطا | err | رشته = "" | دلیل خوانا وقتی موفق نادرست است. |
| وضعیت | status | صحیح = 0 | کد وضعیت HTTP. |
| سرآیند | head | سرآیند | سطر وضعیت و سرآیندهای تجزیهشده. با گرفتن سرآیند بخوانیدشان. |
| بدنه | body | رشته = "" | بدنه به شکل متن. در نخستین بایت NUL تمام میشود. |
| طول بدنه | length | صحیح = 0 | طول بدنه به بایت. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Get.salam
پیکربندی سرور ServerConfig
ساختار پیکربندی سرورپیکربندی سرور جدید شروع کنید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| درگاه | 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 | کل زمانی که یک اتصال برای پایان دستدهی دارد، به میلیثانیه، هر قدر هم آهسته بفرستد. پیشفرض ۱۰۰۰۰ است و ۰ آن را خاموش میکند. |
// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا 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.اجازه درخواست ساده
پایانسرور Server
ساختار سرورشروع آن را برمیگرداند و توقف پایانش میدهد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی درگاه بسته شد و کارساز در حال اجراست. |
| درگاه | port | صحیح = 0 | درگاهی که روی آن گوش میدهد؛ وقتی ۰ خواستهاید به کار میآید. |
| میزبان | host | رشته = "" | نشانیای که کارساز روی آن گوش میدهد. |
| شنونده | listener | تی سی پی.سرور | شنوندهی TCP زیرین. |
| پرچم توقف | stop_cell | صحیح۶۴* | پرچمی که توقف پاکش میکند تا حلقهی پذیرش تمام شود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Get.salam
ورودی اچتیتیپی HttpInbound
ساختار ورودی اچتیتیپیتونل.پذیرنده: یک درخواست CONNECT یا نشانی مطلق را از یک جریان میخواند و به یک تونل.نشست تبدیل میکند، پس میتواند در یک تونل.پروتکل ترکیبی درگاه را شریک شود. با ورودی جدید ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| پیکربندی | config | پیکربندی سرور | تنظیمات کارساز: ورود، روشهای مجاز و حدها. |
// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا 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.نام()
پایاننام 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
ساختار رابط اچتیتیپیتونل.زنجیره: به یک پراکسی وصل میشود و از آن یک تونل CONNECT به جای بعدی میخواهد. با رابط جدید ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کلاینت | client | کلاینت | تنظیمات کارخواه: نشانی پراکسی، ورود و TLS. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Inbound.salam
کارساز Server
تابع کارساز(): تونل.نشانینمونهی این مورد همراه با موارد بالاتر آمده است: 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: رشته): کلاینت// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی
ناپایا 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)
پایاندستدهی کلاینت 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://، سطرهای سرآیند اضافه (هر یک با شکست سطر) و یک بدنه. برای https:// از اتصال استفاده کنید و TLS را روی تونل اجرا کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Get.salam
دریافت Get
تابع دریافت(c: کلاینت، url: رشته): پاسخhttp:// را با GET از راه پراکسی میگیرد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Get.salam
ارسال Post
تابع ارسال(c: کلاینت، url: رشته، content_type: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: 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: رشته): منطقی// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
تابع ریشه:
ناپایا 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 تونل.جریان)// زبان: فارسی
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا 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").بدنه
پایانشروع Start
تابع شروع(cfg: پیکربندی سرور): سرورموفق را بررسی کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Get.salam
توقف Stop
تابع توقف(sv: سرور)نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Get.salam
خدمترسانی Serve
تابع خدمترسانی(cfg: پیکربندی سرور): منطقیورودی جدید NewInbound
تابع ورودی جدید(cfg: پیکربندی سرور): ورودی اچتیتیپینمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Inbound.salam
رابط جدید NewConnector
تابع رابط جدید(c: کلاینت): رابط اچتیتیپیرابط اچتیتیپی میسازد. آن را با تونل.از طریق یا تونل.افزودن گام به کار ببرید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Inbound.salam
تعیین شمارهگیر SetDialer
تابع تعیین شمارهگیر(cfg &: پیکربندی سرور، d: dyn تونل.شمارهگیر)تونل.شمارهگیر به مقصدها برسد، پس میتواند قاعده، زنجیره یا فهرست مسدود به کار ببرد. جای تابع بازخوان اتصال را میگیرد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-httpproxy-Policy.salam