From 5b6e05a0fc4e6861cdd214f5ff53ab0080d53ebc Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Mon, 1 Jun 2026 23:48:53 +0200 Subject: [PATCH] fix(raw): complete the HTTP header section for inbound and outbound Align both raw (TCP) transport forms with the Xray docs: request {version, method, path, headers} + response {version, status, reason, headers}. The outbound form was missing the request.path input, so panel-created outbounds were stuck on GET / and could not match a custom inbound path; add it with the same comma-separated array handling as the inbound. Also drop a stale inbound comment that claimed xray-core ignores the inbound request object, which contradicts both the code and the docs (request and response must match on both sides). --- .../src/pages/inbounds/form/transport/raw.tsx | 7 ------- .../pages/xray/outbounds/transport/raw.tsx | 21 ++++++++++++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/frontend/src/pages/inbounds/form/transport/raw.tsx b/frontend/src/pages/inbounds/form/transport/raw.tsx index b1731514..f8d44d6d 100644 --- a/frontend/src/pages/inbounds/form/transport/raw.tsx +++ b/frontend/src/pages/inbounds/form/transport/raw.tsx @@ -56,13 +56,6 @@ export default function RawForm() { }} - {/* Per Xray docs (transports/raw.html#httpheaderobject), the - `request` object is honored only by outbound proxies; the - inbound listener reads `response`. Showing Host / Path / - Method / Version / request-headers on the inbound side was - a regression from this modal's earlier iteration — those - inputs wrote to the wire but xray-core ignored them. The - inbound modal now only exposes the response side. */} diff --git a/frontend/src/pages/xray/outbounds/transport/raw.tsx b/frontend/src/pages/xray/outbounds/transport/raw.tsx index 9ee64a80..18c646f7 100644 --- a/frontend/src/pages/xray/outbounds/transport/raw.tsx +++ b/frontend/src/pages/xray/outbounds/transport/raw.tsx @@ -47,6 +47,15 @@ export default function RawForm({ form }: { form: FormInstance {type === 'http' && ( <> + + + ({ value: Array.isArray(v) ? v.join(',') : v })} + getValueFromEvent={(e) => { + const raw = (e?.target?.value ?? '') as string; + const parts = raw.split(',').map((s) => s.trim()).filter(Boolean); + return parts.length > 0 ? parts : ['/']; + }} > - +