{"record":{"id":"3c1aca7dbd0597ce","repo":"chenhg5/cc-connect","slug":"cloud-web-register-http-d-s-3c1aca","errorCode":null,"errorMessage":"cloud_web: register HTTP %d: %s","messagePattern":"cloud_web: register HTTP (.+?): (.+?)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"platform/cloud-web/poll.go","lineNumber":114,"sourceCode":"\t}\n\turl := joinURL(t.baseURL, defaultRegister)\n\treq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\tauthHTTP(req, t.token)\n\tresp, err := t.client.Do(req)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cloud_web: register request: %w\", err)\n\t}\n\tdefer func() { _ = resp.Body.Close() }()\n\traw, err := io.ReadAll(io.LimitReader(resp.Body, 1<<20))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn nil, fmt.Errorf(\"cloud_web: register HTTP %d: %s\", resp.StatusCode, string(raw))\n\t}\n\treturn parseRegisterAck(raw)\n}\n\nfunc (t *pollTransport) pollLoop(ctx context.Context) {\n\tfor {\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn\n\t\tdefault:\n\t\t}\n\t\tif err := t.pollOnce(ctx); err != nil {\n\t\t\tif ctx.Err() != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tslog.Debug(\"cloud_web: long poll error\", \"error\", err)\n\t\t\ttime.Sleep(time.Second)\n\t\t}","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/platform/cloud-web/poll.go#L96-L132","documentation":"The long-poll transport's register call reached the cloud-web server but got a response with a status code other than HTTP 200. The status and the first up-to-1MB of the response body are included so the cause (auth rejection, bad path, server error) is visible. This aborts Platform.Start for poll mode.","triggerScenarios":"POST to {base_url}/register returns 401 (token rejected), 404 (wrong register path/base_url), 405 (method mismatch on a proxy), or 5xx (server fault).","commonSituations":"Token mismatch after rotating the shared secret; base_url missing an API path prefix so /register 404s; an intermediary (nginx/CDN) intercepting with 403/502; older server version that doesn't implement the register endpoint.","solutions":["Decode the error: 401 -> correct the token in config; 404/405 -> fix base_url/register path; 5xx -> inspect cloud-web server logs.","Verify the token exactly matches the server's configured secret.","curl -X POST -H 'Authorization: Bearer <token>' -H 'Content-Type: application/json' -d '{}' {base_url}/register to reproduce outside cc-connect.","Upgrade/align server and client versions if the register endpoint is missing."],"exampleFix":"// config.toml — before\ntoken = \"stale-token\"  # server rotated -> 401\n\n// after\ntoken = \"<current-shared-secret>\"","handlingStrategy":"try-catch","validationCode":"// reproduce register outside the app before startup\nbody := strings.NewReader(fmt.Sprintf(`{\"register\":{\"name\":\"%s\",\"project\":\"%s\"}}`, name, project))\nreq, _ := http.NewRequest(\"POST\", baseURL+\"/register\", body)\nreq.Header.Set(\"Authorization\", \"Bearer \"+token)\nreq.Header.Set(\"Content-Type\", \"application/json\")\nresp, err := http.DefaultClient.Do(req)\nif err == nil {\n    defer resp.Body.Close()\n    if resp.StatusCode != 200 {\n        return fmt.Errorf(\"register endpoint returned %d; check token/path\", resp.StatusCode)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := platform.Start(ctx, handler); err != nil {\n    if strings.Contains(err.Error(), \"register HTTP 401\") {\n        slog.Error(\"cloud-web rejected the token; update token in config.toml\")\n    } else if strings.Contains(err.Error(), \"register HTTP 404\") {\n        slog.Error(\"register path wrong; fix base_url in config.toml\")\n    }\n    return err\n}","preventionTips":["Rotate the shared token on server and cc-connect config together","Pin register_url to the server's real register route","Include the register endpoint in deployment smoke tests","Check the status code inside the error before choosing a fix"],"tags":["http","registration","authentication","cloud-web"],"backgroundTag":"http-error-response","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"}