{"record":{"id":"93e7c632dbbca5eb","repo":"XTLS/Xray-core","slug":"length-can-t-be-empty","errorCode":null,"errorMessage":"Length can't be empty","messagePattern":"Length can't be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/freedom.go","lineNumber":120,"sourceCode":"\t\t\t// TCP Segmentation (all packets)\n\t\t\tconfig.Fragment.PacketsFrom = 0\n\t\t\tconfig.Fragment.PacketsTo = 0\n\t\tdefault:\n\t\t\t// TCP Segmentation (range)\n\t\t\tfrom, to, err := ParseRangeString(c.Fragment.Packets)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.New(\"Invalid PacketsFrom\").Base(err)\n\t\t\t}\n\t\t\tconfig.Fragment.PacketsFrom = uint64(from)\n\t\t\tconfig.Fragment.PacketsTo = uint64(to)\n\t\t\tif config.Fragment.PacketsFrom == 0 {\n\t\t\t\treturn nil, errors.New(\"PacketsFrom can't be 0\")\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tif c.Fragment.Length == nil {\n\t\t\t\treturn nil, errors.New(\"Length can't be empty\")\n\t\t\t}\n\t\t\tconfig.Fragment.LengthMin = uint64(c.Fragment.Length.From)\n\t\t\tconfig.Fragment.LengthMax = uint64(c.Fragment.Length.To)\n\t\t\tif config.Fragment.LengthMin == 0 {\n\t\t\t\treturn nil, errors.New(\"LengthMin can't be 0\")\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\tif c.Fragment.Interval == nil {\n\t\t\t\treturn nil, errors.New(\"Interval can't be empty\")\n\t\t\t}\n\t\t\tconfig.Fragment.IntervalMin = uint64(c.Fragment.Interval.From)\n\t\t\tconfig.Fragment.IntervalMax = uint64(c.Fragment.Interval.To)\n\t\t}\n\n\t\t{\n\t\t\tif c.Fragment.MaxSplit != nil {","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/freedom.go#L102-L138","documentation":"Thrown when the freedom outbound has a fragment block but no 'length' range defined. Fragmentation requires a segment length range; unlike packets/interval there is no default, so a nil Length pointer inside the fragment config is an immediate Build()-time error.","triggerScenarios":"\"fragment\": {\"packets\": \"1-3\", \"interval\": \"10-20\"} with \"length\" missing — any fragment object without a \"length\" key triggers it.","commonSituations":"Copying a partial fragment example; assuming length defaults to something sensible; JSON key typo like \"Length\" (parsed case-insensitively by encoding/json, so typo is the usual cause).","solutions":["Add a length range, e.g. \"length\": \"100-200\" (bytes per segment).","If you did not intend fragmentation, delete the whole \"fragment\" object.","Keep packets/length/interval together — all are required once fragment is present (interval likewise)."],"exampleFix":"// before\n\"fragment\": {\"packets\": \"1-3\", \"interval\": \"10-20\"}\n\n// after\n\"fragment\": {\"packets\": \"1-3\", \"length\": \"100-200\", \"interval\": \"10-20\"}","handlingStrategy":"validation","validationCode":"if fragment != nil && fragment.Length == nil {\n    return errors.New(\"fragment requires a length range, e.g. '100-200'\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always specify packets, length, and interval together in a fragment block.","Start from a complete working example when enabling fragmentation."],"tags":["go","xray","freedom","fragment","config","missing-field"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}