Add cookie editing and inherited request settings (#463)

This commit is contained in:
Gregory Schier
2026-05-18 08:59:49 -07:00
committed by GitHub
parent dcfdf077e7
commit fa40ceaa31
54 changed files with 5203 additions and 1101 deletions
+59 -2
View File
@@ -2,8 +2,9 @@ use crate::client_db::ClientDb;
use crate::connection_or_tx::ConnectionOrTx;
use crate::error::Result;
use crate::models::{
Environment, EnvironmentIden, Folder, FolderIden, GrpcRequest, GrpcRequestIden, HttpRequest,
HttpRequestHeader, HttpRequestIden, WebsocketRequest, WebsocketRequestIden,
AnyModel, Environment, EnvironmentIden, Folder, FolderIden, GrpcRequest, GrpcRequestIden,
HttpRequest, HttpRequestHeader, HttpRequestIden, ResolvedHttpRequestSettings, ResolvedSetting,
WebsocketRequest, WebsocketRequestIden,
};
use crate::util::UpdateSource;
use serde_json::Value;
@@ -141,4 +142,60 @@ impl<'a> ClientDb<'a> {
Ok(headers)
}
pub fn resolve_settings_for_folder(
&self,
folder: &Folder,
) -> Result<ResolvedHttpRequestSettings> {
let parent = if let Some(folder_id) = folder.folder_id.clone() {
let parent_folder = self.get_folder(&folder_id)?;
self.resolve_settings_for_folder(&parent_folder)?
} else {
let workspace = self.get_workspace(&folder.workspace_id)?;
self.resolve_settings_for_workspace(&workspace)
};
Ok(ResolvedHttpRequestSettings {
validate_certificates: if folder.setting_validate_certificates.enabled {
ResolvedSetting::from_model(
folder.setting_validate_certificates.value,
AnyModel::Folder(folder.clone()),
)
} else {
parent.validate_certificates
},
follow_redirects: if folder.setting_follow_redirects.enabled {
ResolvedSetting::from_model(
folder.setting_follow_redirects.value,
AnyModel::Folder(folder.clone()),
)
} else {
parent.follow_redirects
},
request_timeout: if folder.setting_request_timeout.enabled {
ResolvedSetting::from_model(
folder.setting_request_timeout.value,
AnyModel::Folder(folder.clone()),
)
} else {
parent.request_timeout
},
send_cookies: if folder.setting_send_cookies.enabled {
ResolvedSetting::from_model(
folder.setting_send_cookies.value,
AnyModel::Folder(folder.clone()),
)
} else {
parent.send_cookies
},
store_cookies: if folder.setting_store_cookies.enabled {
ResolvedSetting::from_model(
folder.setting_store_cookies.value,
AnyModel::Folder(folder.clone()),
)
} else {
parent.store_cookies
},
})
}
}
@@ -1,7 +1,10 @@
use super::dedupe_headers;
use crate::client_db::ClientDb;
use crate::error::Result;
use crate::models::{Folder, FolderIden, GrpcRequest, GrpcRequestIden, HttpRequestHeader};
use crate::models::{
AnyModel, Folder, FolderIden, GrpcRequest, GrpcRequestIden, HttpRequestHeader,
ResolvedHttpRequestSettings, ResolvedSetting,
};
use crate::util::UpdateSource;
use serde_json::Value;
use std::collections::BTreeMap;
@@ -104,4 +107,29 @@ impl<'a> ClientDb<'a> {
Ok(dedupe_headers(metadata))
}
pub fn resolve_settings_for_grpc_request(
&self,
grpc_request: &GrpcRequest,
) -> Result<ResolvedHttpRequestSettings> {
let parent = if let Some(folder_id) = grpc_request.folder_id.clone() {
let folder = self.get_folder(&folder_id)?;
self.resolve_settings_for_folder(&folder)?
} else {
let workspace = self.get_workspace(&grpc_request.workspace_id)?;
self.resolve_settings_for_workspace(&workspace)
};
Ok(ResolvedHttpRequestSettings {
validate_certificates: if grpc_request.setting_validate_certificates.enabled {
ResolvedSetting::from_model(
grpc_request.setting_validate_certificates.value,
AnyModel::GrpcRequest(grpc_request.clone()),
)
} else {
parent.validate_certificates
},
..parent
})
}
}
@@ -1,7 +1,10 @@
use super::dedupe_headers;
use crate::client_db::ClientDb;
use crate::error::Result;
use crate::models::{Folder, FolderIden, HttpRequest, HttpRequestHeader, HttpRequestIden};
use crate::models::{
AnyModel, Folder, FolderIden, HttpRequest, HttpRequestHeader, HttpRequestIden,
ResolvedHttpRequestSettings, ResolvedSetting,
};
use crate::util::UpdateSource;
use serde_json::Value;
use std::collections::BTreeMap;
@@ -91,6 +94,62 @@ impl<'a> ClientDb<'a> {
Ok(dedupe_headers(headers))
}
pub fn resolve_settings_for_http_request(
&self,
http_request: &HttpRequest,
) -> Result<ResolvedHttpRequestSettings> {
let parent = if let Some(folder_id) = http_request.folder_id.clone() {
let folder = self.get_folder(&folder_id)?;
self.resolve_settings_for_folder(&folder)?
} else {
let workspace = self.get_workspace(&http_request.workspace_id)?;
self.resolve_settings_for_workspace(&workspace)
};
Ok(ResolvedHttpRequestSettings {
validate_certificates: if http_request.setting_validate_certificates.enabled {
ResolvedSetting::from_model(
http_request.setting_validate_certificates.value,
AnyModel::HttpRequest(http_request.clone()),
)
} else {
parent.validate_certificates
},
follow_redirects: if http_request.setting_follow_redirects.enabled {
ResolvedSetting::from_model(
http_request.setting_follow_redirects.value,
AnyModel::HttpRequest(http_request.clone()),
)
} else {
parent.follow_redirects
},
request_timeout: if http_request.setting_request_timeout.enabled {
ResolvedSetting::from_model(
http_request.setting_request_timeout.value,
AnyModel::HttpRequest(http_request.clone()),
)
} else {
parent.request_timeout
},
send_cookies: if http_request.setting_send_cookies.enabled {
ResolvedSetting::from_model(
http_request.setting_send_cookies.value,
AnyModel::HttpRequest(http_request.clone()),
)
} else {
parent.send_cookies
},
store_cookies: if http_request.setting_store_cookies.enabled {
ResolvedSetting::from_model(
http_request.setting_store_cookies.value,
AnyModel::HttpRequest(http_request.clone()),
)
} else {
parent.store_cookies
},
})
}
pub fn list_http_requests_for_folder_recursive(
&self,
folder_id: &str,
@@ -2,7 +2,8 @@ use super::dedupe_headers;
use crate::client_db::ClientDb;
use crate::error::Result;
use crate::models::{
Folder, FolderIden, HttpRequestHeader, WebsocketRequest, WebsocketRequestIden,
AnyModel, Folder, FolderIden, HttpRequestHeader, ResolvedHttpRequestSettings, ResolvedSetting,
WebsocketRequest, WebsocketRequestIden,
};
use crate::util::UpdateSource;
use serde_json::Value;
@@ -116,4 +117,45 @@ impl<'a> ClientDb<'a> {
Ok(dedupe_headers(headers))
}
pub fn resolve_settings_for_websocket_request(
&self,
websocket_request: &WebsocketRequest,
) -> Result<ResolvedHttpRequestSettings> {
let parent = if let Some(folder_id) = websocket_request.folder_id.clone() {
let folder = self.get_folder(&folder_id)?;
self.resolve_settings_for_folder(&folder)?
} else {
let workspace = self.get_workspace(&websocket_request.workspace_id)?;
self.resolve_settings_for_workspace(&workspace)
};
Ok(ResolvedHttpRequestSettings {
validate_certificates: if websocket_request.setting_validate_certificates.enabled {
ResolvedSetting::from_model(
websocket_request.setting_validate_certificates.value,
AnyModel::WebsocketRequest(websocket_request.clone()),
)
} else {
parent.validate_certificates
},
send_cookies: if websocket_request.setting_send_cookies.enabled {
ResolvedSetting::from_model(
websocket_request.setting_send_cookies.value,
AnyModel::WebsocketRequest(websocket_request.clone()),
)
} else {
parent.send_cookies
},
store_cookies: if websocket_request.setting_store_cookies.enabled {
ResolvedSetting::from_model(
websocket_request.setting_store_cookies.value,
AnyModel::WebsocketRequest(websocket_request.clone()),
)
} else {
parent.store_cookies
},
..parent
})
}
}
+30 -2
View File
@@ -1,8 +1,8 @@
use crate::client_db::ClientDb;
use crate::error::Result;
use crate::models::{
EnvironmentIden, FolderIden, GrpcRequestIden, HttpRequestHeader, HttpRequestIden,
WebsocketRequestIden, Workspace, WorkspaceIden,
AnyModel, EnvironmentIden, FolderIden, GrpcRequestIden, HttpRequestHeader, HttpRequestIden,
ResolvedHttpRequestSettings, ResolvedSetting, WebsocketRequestIden, Workspace, WorkspaceIden,
};
use crate::util::UpdateSource;
use serde_json::Value;
@@ -84,6 +84,34 @@ impl<'a> ClientDb<'a> {
headers.extend(workspace.headers.clone());
headers
}
pub fn resolve_settings_for_workspace(
&self,
workspace: &Workspace,
) -> ResolvedHttpRequestSettings {
ResolvedHttpRequestSettings {
validate_certificates: ResolvedSetting::from_model(
workspace.setting_validate_certificates,
AnyModel::Workspace(workspace.clone()),
),
follow_redirects: ResolvedSetting::from_model(
workspace.setting_follow_redirects,
AnyModel::Workspace(workspace.clone()),
),
request_timeout: ResolvedSetting::from_model(
workspace.setting_request_timeout,
AnyModel::Workspace(workspace.clone()),
),
send_cookies: ResolvedSetting::from_model(
workspace.setting_send_cookies,
AnyModel::Workspace(workspace.clone()),
),
store_cookies: ResolvedSetting::from_model(
workspace.setting_store_cookies,
AnyModel::Workspace(workspace.clone()),
),
}
}
}
/// Global default headers that are always sent with requests unless overridden.