fix(sub): include xhttp mode in extra JSON for karing compatibility (#4365)

- Add mode to buildXhttpExtra() so clients reading xtra param
  (karing, etc.) receive the xhttp mode alongside other bidirectional
  SplitHTTP fields. Previously mode was only a flat URL param and was
  silently dropped when xtra was present.
- Add xhttp case to streamData() to strip acceptProxyProtocol and
  server-only fields (noSSEHeader, scMaxBufferedPosts,
  scStreamUpServerSecs, serverMaxHeaderBytes) from JSON sub configs.
- Sync frontend buildXhttpExtra() with the same mode addition.

Closes #4364
This commit is contained in:
Abdalrahman
2026-05-14 11:02:45 +03:00
committed by GitHub
parent 6bf4a2c4f0
commit 01a7dc807b
3 changed files with 16 additions and 0 deletions
+4
View File
@@ -1595,6 +1595,10 @@ export class Inbound extends XrayCommonClass {
}); });
} }
if (typeof xhttp.mode === 'string' && xhttp.mode.length > 0) {
extra.mode = xhttp.mode;
}
const stringFields = [ const stringFields = [
"sessionPlacement", "sessionKey", "sessionPlacement", "sessionKey",
"seqPlacement", "seqKey", "seqPlacement", "seqKey",
+8
View File
@@ -265,6 +265,14 @@ func (s *SubJsonService) streamData(stream string) map[string]any {
streamSettings["wsSettings"] = s.removeAcceptProxy(streamSettings["wsSettings"]) streamSettings["wsSettings"] = s.removeAcceptProxy(streamSettings["wsSettings"])
case "httpupgrade": case "httpupgrade":
streamSettings["httpupgradeSettings"] = s.removeAcceptProxy(streamSettings["httpupgradeSettings"]) streamSettings["httpupgradeSettings"] = s.removeAcceptProxy(streamSettings["httpupgradeSettings"])
case "xhttp":
streamSettings["xhttpSettings"] = s.removeAcceptProxy(streamSettings["xhttpSettings"])
if xhttp, ok := streamSettings["xhttpSettings"].(map[string]any); ok {
delete(xhttp, "noSSEHeader")
delete(xhttp, "scMaxBufferedPosts")
delete(xhttp, "scStreamUpServerSecs")
delete(xhttp, "serverMaxHeaderBytes")
}
} }
return streamSettings return streamSettings
} }
+4
View File
@@ -1025,6 +1025,10 @@ func buildXhttpExtra(xhttp map[string]any) map[string]any {
} }
} }
if mode, ok := xhttp["mode"].(string); ok && len(mode) > 0 {
extra["mode"] = mode
}
stringFields := []string{ stringFields := []string{
"sessionPlacement", "sessionKey", "sessionPlacement", "sessionKey",
"seqPlacement", "seqKey", "seqPlacement", "seqKey",