MCPcopy Create free account
hub / github.com/chainreactors/EvilProxy / pollCodexDeviceToken

Function pollCodexDeviceToken

sdk/auth/codex_device.go:171–227  ·  view source on GitHub ↗
(ctx context.Context, client *http.Client, deviceAuthID, userCode string, interval time.Duration)

Source from the content-addressed store, hash-verified

169}
170
171func pollCodexDeviceToken(ctx context.Context, client *http.Client, deviceAuthID, userCode string, interval time.Duration) (*codexDeviceTokenResponse, error) {
172 deadline := time.Now().Add(codexDeviceTimeout)
173
174 for {
175 if time.Now().After(deadline) {
176 return nil, fmt.Errorf("codex device authentication timed out after 15 minutes")
177 }
178
179 body, err := json.Marshal(codexDeviceTokenRequest{
180 DeviceAuthID: deviceAuthID,
181 UserCode: userCode,
182 })
183 if err != nil {
184 return nil, fmt.Errorf("failed to encode codex device poll request: %w", err)
185 }
186
187 req, err := http.NewRequestWithContext(ctx, http.MethodPost, codexDeviceTokenURL, bytes.NewReader(body))
188 if err != nil {
189 return nil, fmt.Errorf("failed to create codex device poll request: %w", err)
190 }
191 req.Header.Set("Content-Type", "application/json")
192 req.Header.Set("Accept", "application/json")
193
194 resp, err := client.Do(req)
195 if err != nil {
196 return nil, fmt.Errorf("failed to poll codex device token: %w", err)
197 }
198
199 respBody, readErr := io.ReadAll(resp.Body)
200 _ = resp.Body.Close()
201 if readErr != nil {
202 return nil, fmt.Errorf("failed to read codex device poll response: %w", readErr)
203 }
204
205 switch {
206 case codexDeviceIsSuccessStatus(resp.StatusCode):
207 var parsed codexDeviceTokenResponse
208 if err := json.Unmarshal(respBody, &parsed); err != nil {
209 return nil, fmt.Errorf("failed to decode codex device token response: %w", err)
210 }
211 return &parsed, nil
212 case resp.StatusCode == http.StatusForbidden || resp.StatusCode == http.StatusNotFound:
213 select {
214 case <-ctx.Done():
215 return nil, ctx.Err()
216 case <-time.After(interval):
217 continue
218 }
219 default:
220 trimmed := strings.TrimSpace(string(respBody))
221 if trimmed == "" {
222 trimmed = "empty response body"
223 }
224 return nil, fmt.Errorf("codex device token polling failed with status %d: %s", resp.StatusCode, trimmed)
225 }
226 }
227}
228

Callers 1

loginWithDeviceFlowMethod · 0.85

Calls 4

DoMethod · 0.65
CloseMethod · 0.65
SetMethod · 0.45

Tested by

no test coverage detected