build: upgraded to the most recent version of reqwest

This commit is contained in:
2026-05-19 11:05:40 -06:00
parent 696ce03ee4
commit eb2843d38a
4 changed files with 172 additions and 80 deletions
+41 -32
View File
@@ -2,9 +2,9 @@ use super::{ToolCall, catch_error};
use crate::utils::AbortSignal;
use anyhow::{Context, Result, anyhow, bail};
use eventsource_stream::Eventsource;
use futures_util::{Stream, StreamExt};
use reqwest::RequestBuilder;
use reqwest_eventsource::{Error as EventSourceError, Event, RequestBuilderExt};
use reqwest::{header, RequestBuilder};
use serde_json::Value;
use tokio::sync::mpsc::UnboundedSender;
@@ -193,11 +193,46 @@ pub async fn sse_stream<F>(builder: RequestBuilder, mut handle: F) -> Result<()>
where
F: FnMut(SseMessage) -> Result<bool>,
{
let mut es = builder.eventsource()?;
let res = builder
.header(header::ACCEPT, "text/event-stream")
.header(header::CACHE_CONTROL, "no-store")
.send()
.await?;
let status = res.status();
if !status.is_success() {
let text = res.text().await?;
let data: Value = match text.parse() {
Ok(data) => data,
Err(_) => {
bail!(
"Invalid response data: {text} (status: {})",
status.as_u16()
);
}
};
catch_error(&data, status.as_u16())?;
return Ok(());
}
let content_type = res
.headers()
.get(header::CONTENT_TYPE)
.and_then(|value| value.to_str().ok())
.map(|value| value.to_string());
let is_event_stream = content_type
.as_deref()
.map(|ct| ct.starts_with("text/event-stream"))
.unwrap_or(false);
if !is_event_stream {
let header_value = content_type.unwrap_or_default();
let text = res.text().await?;
bail!("Invalid response event-stream. content-type: {header_value}, data: {text}");
}
let mut es = res.bytes_stream().boxed().eventsource();
while let Some(event) = es.next().await {
match event {
Ok(Event::Open) => {}
Ok(Event::Message(message)) => {
Ok(message) => {
let message = SseMessage {
event: message.event,
data: message.data,
@@ -207,33 +242,7 @@ where
}
}
Err(err) => {
match err {
EventSourceError::StreamEnded => {}
EventSourceError::InvalidStatusCode(status, res) => {
let text = res.text().await?;
let data: Value = match text.parse() {
Ok(data) => data,
Err(_) => {
bail!(
"Invalid response data: {text} (status: {})",
status.as_u16()
);
}
};
catch_error(&data, status.as_u16())?;
}
EventSourceError::InvalidContentType(header_value, res) => {
let text = res.text().await?;
bail!(
"Invalid response event-stream. content-type: {}, data: {text}",
header_value.to_str().unwrap_or_default()
);
}
_ => {
bail!("{}", err);
}
}
es.close();
bail!("{err}");
}
}
}