{"record":{"id":"e09a326de16dda57","repo":"XTLS/Xray-core","slug":"interval-can-t-be-empty","errorCode":null,"errorMessage":"Interval can't be empty","messagePattern":"Interval can't be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"infra/conf/freedom.go","lineNumber":131,"sourceCode":"\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 {\n\t\t\t\tconfig.Fragment.MaxSplitMin = uint64(c.Fragment.MaxSplit.From)\n\t\t\t\tconfig.Fragment.MaxSplitMax = uint64(c.Fragment.MaxSplit.To)\n\t\t\t}\n\t\t}\n\t}\n\n\tif c.Noise != nil {\n\t\treturn nil, errors.PrintRemovedFeatureError(\"noise = { ... }\", \"noises = [ { ... } ]\")\n\t}\n\n\tif c.Noises != nil {","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/infra/conf/freedom.go#L113-L149","documentation":"Thrown when the freedom fragment block omits the 'interval' range. Interval (delay between segments, in ms) is a mandatory field of the fragment config alongside length; a nil Interval pointer fails immediately. MaxSplit is the only optional fragment sub-field.","triggerScenarios":"\"fragment\": {\"packets\": \"tlshello\", \"length\": \"100-200\"} without \"interval\" — any fragment object lacking the interval key.","commonSituations":"Docs examples that elide interval for brevity being copied verbatim; assuming interval defaults to 0 when absent.","solutions":["Add an interval range in milliseconds, e.g. \"interval\": \"10-20\".","Use \"1-1\" or a small fixed value if you want minimal delay between fragments.","Remove the fragment block entirely if fragmentation is not wanted."],"exampleFix":"// before\n\"fragment\": {\"packets\": \"tlshello\", \"length\": \"100-200\"}\n\n// after\n\"fragment\": {\"packets\": \"tlshello\", \"length\": \"100-200\", \"interval\": \"10-20\"}","handlingStrategy":"validation","validationCode":"if fragment != nil && fragment.Interval == nil {\n    return errors.New(\"fragment requires an interval range in ms, e.g. '10-20'\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat interval as required once fragment exists (only MaxSplit is optional).","Use \"1-1\" for near-zero deliberate delay."],"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"}