{"record":{"id":"a14c918ce4b97448","repo":"chenhg5/cc-connect","slug":"parse-ws-url-w","errorCode":null,"errorMessage":"parse ws url: %w","messagePattern":"parse ws url: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"platform/cloud-web/ws.go","lineNumber":119,"sourceCode":"\t\t}\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn\n\t\tcase <-time.After(delay):\n\t\t}\n\t\tif delay < wsReconnectMax {\n\t\t\tdelay *= 2\n\t\t\tif delay > wsReconnectMax {\n\t\t\t\tdelay = wsReconnectMax\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (t *wsTransport) connectOnce(ctx context.Context) error {\n\tu, err := url.Parse(t.wsURL)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"parse ws url: %w\", err)\n\t}\n\tif t.token != \"\" {\n\t\tq := u.Query()\n\t\tif q.Get(\"token\") == \"\" {\n\t\t\tq.Set(\"token\", t.token)\n\t\t\tu.RawQuery = q.Encode()\n\t\t}\n\t}\n\n\theader := http.Header{}\n\tif t.token != \"\" {\n\t\theader.Set(\"Authorization\", \"Bearer \"+t.token)\n\t\theader.Set(\"X-Cloud-Web-Token\", t.token)\n\t}\n\n\tconn, _, err := websocket.DefaultDialer.DialContext(ctx, u.String(), header)\n\tif err != nil {\n\t\treturn err","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/platform/cloud-web/ws.go#L101-L137","documentation":"wsTransport.connectOnce parses the configured wsURL with net/url.Parse before dialing; any parse failure is wrapped as 'parse ws url: %w'. This is a local configuration error — the WebSocket URL string supplied to the cloud-web platform is not a valid URL at all.","triggerScenarios":"url.Parse(t.wsURL) returns an error due to malformed URL syntax: control characters, bad percent-encoding, spaces, or otherwise unparseable text in the configured wsURL.","commonSituations":"Typo or unescaped characters in config.toml ws URL; environment variable interpolation producing garbage; trailing whitespace/quotes pasted into config; TOML multi-line string accidentally including newlines.","solutions":["Fix the wsURL value in config.toml — it must be a well-formed URL like wss://host/path","Trim whitespace and quotes from the configured value; validate it with a quick url.Parse in a scratch program or `cc-connect doctor` if available","Check where wsURL is assembled (resolveWSURL / env vars) for injected invalid characters","Add startup-time validation so an invalid wsURL fails fast with the URL included in the message"],"exampleFix":"// before\nwsURL = \"wss://hub.example.com/ws \"\n// after\nwsURL = \"wss://hub.example.com/ws\"","handlingStrategy":"validation","validationCode":"u, err := url.Parse(cfg.WSURL)\nif err != nil {\n    return fmt.Errorf(\"bad cloud-web wsURL %q: %w\", cfg.WSURL, err)\n}\nif u.Scheme != \"ws\" && u.Scheme != \"wss\" {\n    return fmt.Errorf(\"cloud-web wsURL must use ws:// or wss://, got %q\", cfg.WSURL)\n}","typeGuard":"func isValidWSURL(s string) bool {\n    u, err := url.Parse(strings.TrimSpace(s))\n    return err == nil && (u.Scheme == \"ws\" || u.Scheme == \"wss\") && u.Host != \"\"\n}","tryCatchPattern":"// Fail fast at startup, not at connect time\nif !isValidWSURL(cfg.WSURL) {\n    return fmt.Errorf(\"config: invalid cloud-web wsURL %q\", cfg.WSURL)\n}","preventionTips":["Trim whitespace/quotes from URLs pasted into config","Validate wsURL at config-load time with url.Parse","Prefer wss:// in production; avoid hand-assembling URLs from env vars","Run `cc-connect doctor` or equivalent config validation before launch"],"tags":["url","config","websocket","cloud-web"],"backgroundTag":"invalid-url","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}