{"record":{"id":"010626234f64fc5e","repo":"router-for-me/CLIProxyAPI","slug":"xai-device-token-parse-response-w","errorCode":null,"errorMessage":"xai device token: parse response: %w","messagePattern":"xai device token: parse response: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/auth/xai/xai.go","lineNumber":296,"sourceCode":"\t\t}\n\t}()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"xai device token: read response: %w\", err), interval, false\n\t}\n\n\tvar payload struct {\n\t\tError            string `json:\"error\"`\n\t\tErrorDescription string `json:\"error_description\"`\n\t\tAccessToken      string `json:\"access_token\"`\n\t\tRefreshToken     string `json:\"refresh_token\"`\n\t\tIDToken          string `json:\"id_token\"`\n\t\tTokenType        string `json:\"token_type\"`\n\t\tExpiresIn        int    `json:\"expires_in\"`\n\t}\n\tif err = json.Unmarshal(body, &payload); err != nil {\n\t\treturn nil, fmt.Errorf(\"xai device token: parse response: %w\", err), interval, false\n\t}\n\n\tif payload.Error != \"\" {\n\t\tswitch payload.Error {\n\t\tcase \"authorization_pending\":\n\t\t\treturn nil, nil, interval, true\n\t\tcase \"slow_down\":\n\t\t\tnextInterval := interval + defaultPollInterval\n\t\t\treturn nil, nil, nextInterval, true\n\t\tcase \"expired_token\":\n\t\t\treturn nil, fmt.Errorf(\"xai device code expired\"), interval, false\n\t\tcase \"access_denied\":\n\t\t\treturn nil, fmt.Errorf(\"xai device authorization denied\"), interval, false\n\t\tdefault:\n\t\t\tdesc := strings.TrimSpace(payload.ErrorDescription)\n\t\t\tif desc != \"\" {\n\t\t\t\treturn nil, fmt.Errorf(\"xai device token error: %s: %s\", payload.Error, desc), interval, false\n\t\t\t}","sourceCodeStart":278,"sourceCodeEnd":314,"githubUrl":"https://github.com/router-for-me/CLIProxyAPI/blob/78f0c4079e3e6273d65d03b5549cffc898703264/internal/auth/xai/xai.go#L278-L314","documentation":"The token endpoint's response body was read successfully but is not valid JSON, so json.Unmarshal into the token payload struct failed. OAuth token endpoints must return JSON; anything else (HTML error page, empty body, plain text) triggers this.","triggerScenarios":"Non-JSON body from the token endpoint: an HTML 502/503 page from a gateway, an empty body, or a WAF/block page — with a status line that still allowed the read to succeed.","commonSituations":"Cloudflare/WAF challenge page returned instead of the API response; wrong endpoint that serves HTML; response encoding surprises from proxies.","solutions":["Log the raw body (already available) to identify what was actually returned","Confirm the token endpoint URL via discovery","If a WAF/block page appears, fix network egress or allowlisting for the auth domain"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil {\n    var syntaxErr *json.SyntaxError\n    if errors.As(err, &syntaxErr) || strings.Contains(err.Error(), \"parse response\") {\n        log.Errorf(\"token endpoint returned non-JSON (gateway/WAF page?); inspect raw body\")\n    }\n    return err\n}","preventionTips":["Log raw bodies at debug level around OAuth endpoints to catch HTML error pages","Allowlist auth domains through corporate proxies/WAFs"],"tags":["xai","auth","json","response-parse"],"backgroundTag":null,"analyzedSha":"78f0c4079e3e6273d65d03b5549cffc898703264","analyzedAt":"2026-08-15T12:26:37.444Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}