(
mut req: Request,
credential: &CredentialConfig,
)
| 32 | } |
| 33 | |
| 34 | pub async fn proxy_request( |
| 35 | mut req: Request, |
| 36 | credential: &CredentialConfig, |
| 37 | ) -> Result<ProxyOutcome> { |
| 38 | let upstream_url = build_upstream_url(&req)?; |
| 39 | let method = req.method(); |
| 40 | let prepared = maybe_prepare_request(&mut req, credential).await?; |
| 41 | let context_1m_enabled = |
| 42 | claudecode_1m_enabled_for_credential(credential, prepared.context_1m_target.as_ref()); |
| 43 | |
| 44 | let mut headers = build_upstream_headers( |
| 45 | req.headers(), |
| 46 | credential.access_token.as_str(), |
| 47 | context_1m_enabled, |
| 48 | )?; |
| 49 | let sent_with_context_1m = has_context_1m_beta(&headers); |
| 50 | |
| 51 | let mut upstream_resp = send_upstream_request( |
| 52 | upstream_url.as_str(), |
| 53 | &method, |
| 54 | headers, |
| 55 | prepared.body.as_deref(), |
| 56 | ) |
| 57 | .await?; |
| 58 | let mut status_code = upstream_resp.status_code(); |
| 59 | let mut disable_sonnet_1m = false; |
| 60 | let mut disable_opus_1m = false; |
| 61 | |
| 62 | if sent_with_context_1m && context_1m_enabled && status_code >= 400 { |
| 63 | headers = build_upstream_headers(req.headers(), credential.access_token.as_str(), false)?; |
| 64 | let retry_resp = send_upstream_request( |
| 65 | upstream_url.as_str(), |
| 66 | &method, |
| 67 | headers, |
| 68 | prepared.body.as_deref(), |
| 69 | ) |
| 70 | .await?; |
| 71 | if retry_resp.status_code() < 400 { |
| 72 | match prepared.context_1m_target.as_ref() { |
| 73 | Some(ClaudeCode1mTarget::Sonnet) => disable_sonnet_1m = true, |
| 74 | Some(ClaudeCode1mTarget::Opus) => disable_opus_1m = true, |
| 75 | None => {} |
| 76 | } |
| 77 | } |
| 78 | upstream_resp = retry_resp; |
| 79 | status_code = upstream_resp.status_code(); |
| 80 | } |
| 81 | |
| 82 | let rate_limit_usage = extract_rate_limit_usage(upstream_resp.headers(), status_code)?; |
| 83 | let response_headers = filter_response_headers(upstream_resp.headers())?; |
| 84 | let (_, body) = upstream_resp.into_parts(); |
| 85 | let response = Response::builder() |
| 86 | .with_status(status_code) |
| 87 | .with_headers(response_headers) |
| 88 | .body(body); |
| 89 | |
| 90 | Ok(ProxyOutcome { |
| 91 | response, |
no test coverage detected