پرش به مطلب اصلی

HttpServer

HttpServer سمت معکوس HttpClient است. درخواست HTTP را می‌خواند، فقط body را به نود بعدی می‌دهد و payload برگشتی را به response body تبدیل می‌کند. این نود HTTP/1.1، HTTP/2 مستقیم، h2c upgrade و WebSocket را پشتیبانی می‌کند.

جایگاه رایج

TcpListener -> HttpServer -> SomeServiceTunnel
TcpListener -> TlsServer -> HttpServer -> SomeServiceTunnel

اگر ترافیک ورودی HTTPS است، ابتدا باید با TlsServer باز شود و بعد به HttpServer برسد.

نمونه تنظیم

{
"name": "http-server",
"type": "HttpServer",
"settings": {
"http-version": "both",
"upgrade": true,
"websocket": false,
"host": "example.com",
"path": "/api/upload",
"status": 200,
"headers": {
"server": "waterwall"
}
},
"next": "service"
}

تنظیمات مهم

گزینهتوضیح
http-versionانتخاب HTTP/1.1، HTTP/2 یا both
upgradeپذیرش h2c upgrade در حالت مناسب
upgrade-protocoltoken ارتقای HTTP/1.1؛ پیش‌فرض h2c
upgrade-request-headersheaderهایی که در request ارتقا باید وجود داشته باشند
upgrade-response-headersheaderهای اضافه برای پاسخ 101 Switching Protocols
websocketپذیرش WebSocket handshake و frameهای binary
websocket-originاگر تنظیم شود، مقدار Origin باید همین باشد
websocket-subprotocolsubprotocol مورد انتظار که در پاسخ هم echo می‌شود
hostاگر تنظیم شود، درخواست باید با host مورد انتظار سازگار باشد
pathاگر تنظیم شود، path درخواست کنترل می‌شود
methodمحدود کردن متد مورد انتظار
statusstatus code پاسخ
headersheaderهای اضافه پاسخ
content-typeContent-Type پاسخ
full-duplexکنترل اینکه پایان request چطور به finish واتروال تبدیل شود
http1-modesingle یا split برای HTTP/1.1
splitتنظیمات pairing در حالت split
verboselog بیشتر برای تشخیص پروتکل و framing
no-split-upload-buffering-limitگزینه خاص تست برای محدود نکردن upload قبل از join شدن download

HTTP/1.1 split mode

در http1-mode: "split"، HttpServer دو اتصال HTTP/1.1 را به یک line واتروال تبدیل می‌کند:

  • upload request: body آن decode می‌شود و به نود بعدی می‌رود.
  • download request: response chunked را دریافت می‌کند و payload برگشتی از نود بعدی داخل آن نوشته می‌شود.

دو نیمه با شناسه و جهت pair می‌شوند. این حالت باید با HttpClient split mode در سمت مقابل هماهنگ باشد.

نمونه:

{
"name": "http-server",
"type": "HttpServer",
"settings": {
"http-version": 1,
"http1-mode": "split",
"path": "/tunnel",
"split": {
"upload-method": "POST",
"download-method": "GET",
"id-placement": "query",
"id-name": "sid",
"direction-name": "part",
"token": "shared-edge-token",
"token-placement": "header",
"token-name": "X-Tunnel-Token"
},
"headers": {
"Cache-Control": "no-store"
}
},
"next": "service"
}

فیلدهای رایج داخل split:

گزینهپیش‌فرضتوضیح
upload-methodمقدار top-level methodمتد سمت upload
download-methodGETمتد سمت download
upload-pathمقدار top-level pathpath سمت upload
download-pathمقدار top-level pathpath سمت download
id-placementqueryجای شناسه: query، header، cookie یا path
id-namewwidنام شناسه مشترک
direction-placementqueryجای marker جهت
direction-namewwdirنام marker جهت
upload-value / download-valueupload / downloadمقدارهای جهت
token, token-placement, token-name-token مشترک اختیاری که هر دو نیمه باید داشته باشند
هشدار

Split mode فقط برای http-version = 1 است و با websocket ترکیب نمی‌شود.

full-duplex

در حالت پیش‌فرض، پایان request body می‌تواند به upstream Finish در واتروال تبدیل شود. اگر می‌خواهید HTTP مثل transport دوطرفه طولانی‌تر رفتار کند، full-duplex: true باعث می‌شود پایان request فقط در state داخلی ثبت شود و line سرویس تا بسته شدن transport واقعی باز بماند.

رفتار مهم

  • headerهای HTTP به نود بعدی داده نمی‌شوند؛ فقط body عبور می‌کند.
  • در HTTP/1.1 response معمولا به صورت chunked body تولید می‌شود.
  • در HTTP/2، DATA frameها روی یک stream منطقی استفاده می‌شوند.
  • اگر peer streamهای HTTP/2 اضافه باز کند، طراحی فعلی آن را به عنوان چند connection مستقل پشتیبانی نمی‌کند.
  • h2c upgrade همراه با request body برای طراحی فعلی مناسب نیست و باید محافظه‌کارانه استفاده شود.
  • اگر upgrade-protocol غیر از h2c باشد و upgrade موفق شود، مسیر بعد از 101 خام و bidirectional می‌شود.