{"record":{"id":"e00ef312ad47f267","repo":"siyuan-note/siyuan","slug":"parse-t-failed-s","errorCode":null,"errorMessage":"parse [t] failed: %s","messagePattern":"parse \\[t\\] failed: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/api/network.go","lineNumber":378,"sourceCode":"\t\t}\n\t\tvar record map[string][]string\n\t\tif jsonErr := json.Unmarshal(hBytes, &record); jsonErr != nil {\n\t\t\terr = fmt.Errorf(\"parse [h] failed: %s\", jsonErr.Error())\n\t\t\treturn\n\t\t}\n\n\t\tfor k, vs := range record {\n\t\t\tfor _, v := range vs {\n\t\t\t\th.Add(k, v)\n\t\t\t}\n\t\t}\n\t}\n\n\ttimeout = 30 * time.Second\n\ttParam := c.Query(\"t\")\n\tif tParam != \"\" {\n\t\tif t, parseErr := time.ParseDuration(tParam); parseErr != nil {\n\t\t\terr = fmt.Errorf(\"parse [t] failed: %s\", parseErr.Error())\n\t\t\treturn\n\t\t} else {\n\t\t\ttimeout = t\n\t\t}\n\t}\n\n\treturn\n}\n\n// forwardResponseHeaders copies src headers into dst with a \"Siyuan-Proxy-\" prefix on each key.\nfunc forwardResponseHeaders(dst http.Header, src http.Header) {\n\tfor k, vs := range src {\n\t\tfor _, v := range vs {\n\t\t\tdst.Add(\"Siyuan-Proxy-\"+k, v)\n\t\t}\n\t}\n}\n","sourceCodeStart":360,"sourceCodeEnd":396,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/api/network.go#L360-L396","documentation":"Error from parseForwardProxyParams in the network forward-proxy endpoint: the [t] query parameter (request timeout) is present but time.ParseDuration cannot parse it, so the caller supplied an invalid duration string instead of something like \"30s\".","triggerScenarios":"Sending `t` values like \"30\" (no unit), \"30S\", \"30sec\", \"0.5\", or any non-duration string. Omitting `t` is fine (defaults to 30s).","commonSituations":"Clients passing milliseconds as a bare integer assuming it means ms; seconds written without the 's' suffix; locale-formatted numbers like \"1,5s\".","solutions":["Use a valid Go duration string: \"30s\", \"5s\", \"1500ms\", \"2m\"","Include the unit suffix always; a bare number is invalid for ParseDuration","Omit `t` to use the default 30s timeout"],"exampleFix":"// before\nfetch(\"/api/network/forwardProxy?u=\" + u + \"&t=30\") // no unit\n// after\nfetch(\"/api/network/forwardProxy?u=\" + u + \"&t=30s\")","handlingStrategy":"validation","validationCode":"if (timeoutMs != null) {\n  const t = (timeoutMs / 1000) + \"s\"; // Go duration string, e.g. \"30s\"\n}","typeGuard":"function isGoDuration(s) {\n  return /^\\d+(\\.\\d+)?(ns|us|µs|ms|s|m|h)$/.test(s);\n}","tryCatchPattern":null,"preventionTips":["Always include a unit suffix in the t param (s, ms, m)","Convert milliseconds to seconds client-side before sending","Omit t to accept the 30s default"],"tags":["duration","timeout","query-param","parsing"],"backgroundTag":"invalid-duration-format","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}