Add cookie editing and inherited request settings

This commit is contained in:
Gregory Schier
2026-05-17 07:58:12 -07:00
parent dcfdf077e7
commit dc47b54b1c
42 changed files with 3789 additions and 932 deletions
+82 -47
View File
@@ -115,10 +115,17 @@ pub trait SendRequestExecutor: Send + Sync {
&self,
sendable_request: SendableHttpRequest,
event_tx: mpsc::Sender<SenderHttpResponseEvent>,
cookie_store: Option<CookieStore>,
cookie_behavior: CookieBehavior,
) -> yaak_http::error::Result<yaak_http::sender::HttpResponse>;
}
#[derive(Clone)]
pub struct CookieBehavior {
pub store: Option<CookieStore>,
pub send_cookies: bool,
pub store_cookies: bool,
}
struct DefaultSendRequestExecutor;
#[async_trait]
@@ -127,11 +134,16 @@ impl SendRequestExecutor for DefaultSendRequestExecutor {
&self,
sendable_request: SendableHttpRequest,
event_tx: mpsc::Sender<SenderHttpResponseEvent>,
cookie_store: Option<CookieStore>,
cookie_behavior: CookieBehavior,
) -> yaak_http::error::Result<yaak_http::sender::HttpResponse> {
let sender = ReqwestSender::new()?;
let transaction = match cookie_store {
Some(store) => HttpTransaction::with_cookie_store(sender, store),
let transaction = match cookie_behavior.store {
Some(store) => HttpTransaction::with_cookie_behavior(
sender,
store,
cookie_behavior.send_cookies,
cookie_behavior.store_cookies,
),
None => HttpTransaction::new(sender),
};
let (_cancel_tx, cancel_rx) = watch::channel(false);
@@ -182,7 +194,7 @@ struct ConnectionManagerSendRequestExecutor<'a> {
connection_manager: &'a HttpConnectionManager,
plugin_context_id: String,
query_manager: QueryManager,
workspace_id: String,
request: HttpRequest,
cancelled_rx: Option<watch::Receiver<bool>>,
}
@@ -192,11 +204,10 @@ impl SendRequestExecutor for ConnectionManagerSendRequestExecutor<'_> {
&self,
sendable_request: SendableHttpRequest,
event_tx: mpsc::Sender<SenderHttpResponseEvent>,
cookie_store: Option<CookieStore>,
cookie_behavior: CookieBehavior,
) -> yaak_http::error::Result<yaak_http::sender::HttpResponse> {
let runtime_config =
resolve_http_send_runtime_config(&self.query_manager, &self.workspace_id)
.map_err(|e| yaak_http::error::Error::RequestError(e.to_string()))?;
let runtime_config = resolve_http_send_runtime_config(&self.query_manager, &self.request)
.map_err(|e| yaak_http::error::Error::RequestError(e.to_string()))?;
let client_certificate =
find_client_certificate(&sendable_request.url, &runtime_config.client_certificates);
let cached_client = self
@@ -213,8 +224,13 @@ impl SendRequestExecutor for ConnectionManagerSendRequestExecutor<'_> {
cached_client.resolver.set_event_sender(Some(event_tx.clone())).await;
let sender = ReqwestSender::with_client(cached_client.client);
let transaction = match cookie_store {
Some(cs) => HttpTransaction::with_cookie_store(sender, cs),
let transaction = match cookie_behavior.store {
Some(cs) => HttpTransaction::with_cookie_behavior(
sender,
cs,
cookie_behavior.send_cookies,
cookie_behavior.store_cookies,
),
None => HttpTransaction::new(sender),
};
@@ -315,24 +331,28 @@ pub struct HttpSendRuntimeConfig {
pub fn resolve_http_send_runtime_config(
query_manager: &QueryManager,
workspace_id: &str,
request: &HttpRequest,
) -> Result<HttpSendRuntimeConfig> {
let db = query_manager.connect();
let workspace = db.get_workspace(workspace_id).map_err(SendHttpRequestError::LoadWorkspace)?;
let workspace =
db.get_workspace(&request.workspace_id).map_err(SendHttpRequestError::LoadWorkspace)?;
let resolved_settings = db
.resolve_settings_for_http_request(request)
.map_err(SendHttpRequestError::ResolveRequestInheritance)?;
let settings = db.get_settings();
Ok(HttpSendRuntimeConfig {
send_options: SendableHttpRequestOptions {
follow_redirects: workspace.setting_follow_redirects,
timeout: if workspace.setting_request_timeout > 0 {
follow_redirects: resolved_settings.follow_redirects,
timeout: if resolved_settings.request_timeout > 0 {
Some(std::time::Duration::from_millis(
workspace.setting_request_timeout.unsigned_abs() as u64,
resolved_settings.request_timeout.unsigned_abs() as u64,
))
} else {
None
},
},
validate_certificates: workspace.setting_validate_certificates,
validate_certificates: resolved_settings.validate_certificates,
proxy: proxy_setting_from_settings(settings.proxy),
dns_overrides: workspace.setting_dns_overrides,
client_certificates: settings.client_certificates,
@@ -387,7 +407,7 @@ pub async fn send_http_request_with_plugins(
connection_manager,
plugin_context_id: params.plugin_context.id.clone(),
query_manager: params.query_manager.clone(),
workspace_id: params.request.workspace_id.clone(),
request: params.request.clone(),
cancelled_rx: params.cancelled_rx.clone(),
});
@@ -454,12 +474,21 @@ pub async fn send_http_request<T: TemplateCallback>(
} else {
resolve_inherited_request(params.query_manager, &params.request)?
};
let runtime_config =
resolve_http_send_runtime_config(params.query_manager, &params.request.workspace_id)?;
let runtime_config = resolve_http_send_runtime_config(params.query_manager, &params.request)?;
let send_options = params.send_options.unwrap_or(runtime_config.send_options);
let resolved_settings = params
.query_manager
.connect()
.resolve_settings_for_http_request(&params.request)
.map_err(SendHttpRequestError::ResolveRequestInheritance)?;
let mut cookie_jar = load_cookie_jar(params.query_manager, params.cookie_jar_id.as_deref())?;
let cookie_store =
cookie_jar.as_ref().map(|jar| CookieStore::from_cookies(jar.cookies.clone()));
let cookie_behavior = CookieBehavior {
store: cookie_store,
send_cookies: resolved_settings.send_cookies,
store_cookies: resolved_settings.store_cookies,
};
let rendered_request = render_http_request(
&resolved_request,
@@ -585,33 +614,35 @@ pub async fn send_http_request<T: TemplateCallback>(
let started_at = Instant::now();
let request_started_url = sendable_request.url.clone();
let mut http_response = match executor
.send(sendable_request, event_tx, cookie_store.clone())
.await
{
Ok(response) => response,
Err(err) => {
persist_cookie_jar(params.query_manager, cookie_jar.as_mut(), cookie_store.as_ref())?;
if persist_response {
let _ = persist_response_error(
let mut http_response =
match executor.send(sendable_request, event_tx, cookie_behavior.clone()).await {
Ok(response) => response,
Err(err) => {
persist_cookie_jar(
params.query_manager,
params.blob_manager,
&params.update_source,
&response,
started_at,
err.to_string(),
request_started_url,
);
cookie_jar.as_mut(),
cookie_behavior.store.as_ref(),
)?;
if persist_response {
let _ = persist_response_error(
params.query_manager,
params.blob_manager,
&params.update_source,
&response,
started_at,
err.to_string(),
request_started_url,
);
}
if let Err(join_err) = event_handle.await {
warn!("Failed to join response event task: {}", join_err);
}
if let Some(task) = request_body_capture_task.take() {
let _ = task.await;
}
return Err(SendHttpRequestError::SendRequest(err));
}
if let Err(join_err) = event_handle.await {
warn!("Failed to join response event task: {}", join_err);
}
if let Some(task) = request_body_capture_task.take() {
let _ = task.await;
}
return Err(SendHttpRequestError::SendRequest(err));
}
};
};
let headers_elapsed = duration_to_i32(started_at.elapsed());
std::fs::create_dir_all(params.response_dir).map_err(|source| {
@@ -781,7 +812,11 @@ pub async fn send_http_request<T: TemplateCallback>(
request_started_url,
);
}
persist_cookie_jar(params.query_manager, cookie_jar.as_mut(), cookie_store.as_ref())?;
persist_cookie_jar(
params.query_manager,
cookie_jar.as_mut(),
cookie_behavior.store.as_ref(),
)?;
return Err(err);
}
@@ -806,7 +841,7 @@ pub async fn send_http_request<T: TemplateCallback>(
response = final_response;
}
persist_cookie_jar(params.query_manager, cookie_jar.as_mut(), cookie_store.as_ref())?;
persist_cookie_jar(params.query_manager, cookie_jar.as_mut(), cookie_behavior.store.as_ref())?;
Ok(SendHttpRequestResult { rendered_request, response, response_body })
}