(ctx context.Context, client *http.Client)
| 126 | } |
| 127 | |
| 128 | func requestCodexDeviceUserCode(ctx context.Context, client *http.Client) (*codexDeviceUserCodeResponse, error) { |
| 129 | body, err := json.Marshal(codexDeviceUserCodeRequest{ClientID: codex.ClientID}) |
| 130 | if err != nil { |
| 131 | return nil, fmt.Errorf("failed to encode codex device request: %w", err) |
| 132 | } |
| 133 | |
| 134 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, codexDeviceUserCodeURL, bytes.NewReader(body)) |
| 135 | if err != nil { |
| 136 | return nil, fmt.Errorf("failed to create codex device request: %w", err) |
| 137 | } |
| 138 | req.Header.Set("Content-Type", "application/json") |
| 139 | req.Header.Set("Accept", "application/json") |
| 140 | |
| 141 | resp, err := client.Do(req) |
| 142 | if err != nil { |
| 143 | return nil, fmt.Errorf("failed to request codex device code: %w", err) |
| 144 | } |
| 145 | defer func() { _ = resp.Body.Close() }() |
| 146 | |
| 147 | respBody, err := io.ReadAll(resp.Body) |
| 148 | if err != nil { |
| 149 | return nil, fmt.Errorf("failed to read codex device code response: %w", err) |
| 150 | } |
| 151 | |
| 152 | if !codexDeviceIsSuccessStatus(resp.StatusCode) { |
| 153 | trimmed := strings.TrimSpace(string(respBody)) |
| 154 | if resp.StatusCode == http.StatusNotFound { |
| 155 | return nil, fmt.Errorf("codex device endpoint is unavailable (status %d)", resp.StatusCode) |
| 156 | } |
| 157 | if trimmed == "" { |
| 158 | trimmed = "empty response body" |
| 159 | } |
| 160 | return nil, fmt.Errorf("codex device code request failed with status %d: %s", resp.StatusCode, trimmed) |
| 161 | } |
| 162 | |
| 163 | var parsed codexDeviceUserCodeResponse |
| 164 | if err := json.Unmarshal(respBody, &parsed); err != nil { |
| 165 | return nil, fmt.Errorf("failed to decode codex device code response: %w", err) |
| 166 | } |
| 167 | |
| 168 | return &parsed, nil |
| 169 | } |
| 170 | |
| 171 | func pollCodexDeviceToken(ctx context.Context, client *http.Client, deviceAuthID, userCode string, interval time.Duration) (*codexDeviceTokenResponse, error) { |
| 172 | deadline := time.Now().Add(codexDeviceTimeout) |
no test coverage detected