{"record":{"id":"84781a0d4663d164","repo":"XTLS/Xray-core","slug":"unsupported-session-placement","errorCode":null,"errorMessage":"unsupported session placement: ","messagePattern":"unsupported session placement: ","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/transport_method.go","lineNumber":388,"sourceCode":"\tdefault:\n\t\treturn nil, errors.New(\"unsupported uplink data placement: \" + c.UplinkDataPlacement)\n\t}\n\n\tif c.UplinkHTTPMethod == \"\" {\n\t\tc.UplinkHTTPMethod = \"POST\"\n\t}\n\tc.UplinkHTTPMethod = strings.ToUpper(c.UplinkHTTPMethod)\n\n\tif c.UplinkHTTPMethod == \"GET\" && c.Mode != \"packet-up\" {\n\t\treturn nil, errors.New(\"uplinkHTTPMethod can be GET only in packet-up mode\")\n\t}\n\n\tswitch c.SessionIDPlacement {\n\tcase \"\":\n\t\tc.SessionIDPlacement = \"path\"\n\tcase \"path\", \"cookie\", \"header\", \"query\":\n\tdefault:\n\t\treturn nil, errors.New(\"unsupported session placement: \" + c.SessionIDPlacement)\n\t}\n\n\tswitch c.SeqPlacement {\n\tcase \"\":\n\t\tc.SeqPlacement = \"path\"\n\tcase \"path\", \"cookie\", \"header\", \"query\":\n\tdefault:\n\t\treturn nil, errors.New(\"unsupported seq placement: \" + c.SeqPlacement)\n\t}\n\n\tif c.SessionIDPlacement != \"path\" && c.SessionIDKey == \"\" {\n\t\tswitch c.SessionIDPlacement {\n\t\tcase \"cookie\", \"query\":\n\t\t\tc.SessionIDKey = \"x_session\"\n\t\tcase \"header\":\n\t\t\tc.SessionIDKey = \"X-Session\"\n\t\t}\n\t}","sourceCodeStart":370,"sourceCodeEnd":406,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/transport_method.go#L370-L406","documentation":"SplitHTTPConfig.Build() validates \"sessionIDPlacement\" at transport_method.go:383-389. Empty defaults to \"path\"; only \"path\", \"cookie\", \"header\", \"query\" are accepted; other values are appended to the error. Session ID placement controls where the per-connection session identifier travels.","triggerScenarios":"\"sessionIDPlacement\": \"Path\", \"url\", \"pathInQuery\", or any string outside the four allowed values in splithttp transportSettings.","commonSituations":"Typos and casing mistakes; confusion with xPaddingPlacement's \"queryInHeader\" value which is NOT valid here.","solutions":["Use one of: \"path\", \"cookie\", \"header\", \"query\"","Omit the field to use the \"path\" default"],"exampleFix":"// before\n\"sessionIDPlacement\": \"queryInHeader\"\n// after\n\"sessionIDPlacement\": \"query\"","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"func validSessionPlacement(p string) bool {\n\tswitch p {\n\tcase \"\", \"path\", \"cookie\", \"header\", \"query\":\n\t\treturn true\n\t}\n\treturn false\n}","tryCatchPattern":null,"preventionTips":["Only path/cookie/header/query — 'queryInHeader' is not valid here","Omit for the path default"],"tags":["config","splithttp","session","validation"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}