fix bot dpop
This commit is contained in:
@@ -406,27 +406,55 @@ fn handle_post_create(text: &str) -> Result<String> {
|
|||||||
let url = format!("https://{}/xrpc/com.atproto.repo.putRecord", pds);
|
let url = format!("https://{}/xrpc/com.atproto.repo.putRecord", pds);
|
||||||
let client = reqwest::blocking::Client::new();
|
let client = reqwest::blocking::Client::new();
|
||||||
|
|
||||||
// Build request with appropriate auth (DPoP or Bearer)
|
// Build and send request with appropriate auth (DPoP with nonce retry, or Bearer)
|
||||||
let request = if oauth::has_oauth_session(true) {
|
let (status, resp_body) = if oauth::has_oauth_session(true) {
|
||||||
let oauth_session = oauth::load_oauth_session(true)?;
|
let oauth_session = oauth::load_oauth_session(true)?;
|
||||||
let full_url = format!("https://{}/xrpc/com.atproto.repo.putRecord", pds);
|
let full_url = format!("https://{}/xrpc/com.atproto.repo.putRecord", pds);
|
||||||
let dpop_proof = oauth::create_dpop_proof_for_request_with_nonce(
|
let mut dpop_nonce: Option<String> = None;
|
||||||
&oauth_session, "POST", &full_url, None,
|
let mut last_status = reqwest::StatusCode::INTERNAL_SERVER_ERROR;
|
||||||
)?;
|
let mut last_body = String::new();
|
||||||
client.post(&url)
|
|
||||||
.header("Authorization", format!("DPoP {}", bot_session.access_jwt))
|
for _attempt in 0..3 {
|
||||||
.header("DPoP", dpop_proof)
|
let dpop_proof = oauth::create_dpop_proof_for_request_with_nonce(
|
||||||
.json(&body)
|
&oauth_session, "POST", &full_url, dpop_nonce.as_deref(),
|
||||||
|
)?;
|
||||||
|
let res = client.post(&url)
|
||||||
|
.header("Authorization", format!("DPoP {}", bot_session.access_jwt))
|
||||||
|
.header("DPoP", dpop_proof)
|
||||||
|
.json(&body)
|
||||||
|
.send()
|
||||||
|
.map_err(|e| anyhow::anyhow!("HTTP request failed: {}", e))?;
|
||||||
|
|
||||||
|
last_status = res.status();
|
||||||
|
|
||||||
|
// Check for dpop-nonce requirement
|
||||||
|
if last_status == reqwest::StatusCode::UNAUTHORIZED {
|
||||||
|
let nonce = res.headers().get("dpop-nonce").and_then(|v| v.to_str().ok()).map(|s| s.to_string());
|
||||||
|
last_body = res.text().unwrap_or_default();
|
||||||
|
if let Some(n) = nonce {
|
||||||
|
if last_body.contains("use_dpop_nonce") {
|
||||||
|
dpop_nonce = Some(n);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_body = res.text().unwrap_or_default();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
(last_status, last_body)
|
||||||
} else {
|
} else {
|
||||||
client.post(&url)
|
let res = client.post(&url)
|
||||||
.header("Authorization", format!("Bearer {}", bot_session.access_jwt))
|
.header("Authorization", format!("Bearer {}", bot_session.access_jwt))
|
||||||
.json(&body)
|
.json(&body)
|
||||||
|
.send()
|
||||||
|
.map_err(|e| anyhow::anyhow!("HTTP request failed: {}", e))?;
|
||||||
|
let status = res.status();
|
||||||
|
let resp_body = res.text().unwrap_or_default();
|
||||||
|
(status, resp_body)
|
||||||
};
|
};
|
||||||
|
|
||||||
let res = request.send().map_err(|e| anyhow::anyhow!("HTTP request failed: {}", e))?;
|
|
||||||
let status = res.status();
|
|
||||||
let resp_body = res.text().unwrap_or_default();
|
|
||||||
|
|
||||||
if !status.is_success() {
|
if !status.is_success() {
|
||||||
return Err(anyhow::anyhow!("Post failed ({}): {}", status, resp_body));
|
return Err(anyhow::anyhow!("Post failed ({}): {}", status, resp_body));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user