Compare commits

..

3 Commits

Author SHA1 Message Date
Richard
0a790ccaaa fix query paris 2026-02-04 19:33:27 +00:00
Richard
4bca336048 attempt to fix query params 2026-02-04 19:29:03 +00:00
Richard
7f32f34ca3 bad language model 2026-02-04 19:25:22 +00:00
3 changed files with 43 additions and 1 deletions

1
Cargo.lock generated
View File

@@ -1289,6 +1289,7 @@ dependencies = [
"tokio-tungstenite", "tokio-tungstenite",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"url",
] ]
[[package]] [[package]]

View File

@@ -11,3 +11,4 @@ tracing-subscriber = { version = "0.3", features = ["fmt"] }
clap = { version = "4", features = ["derive"] } clap = { version = "4", features = ["derive"] }
futures-util = "0.3" futures-util = "0.3"
chrono = "0.4" chrono = "0.4"
url = "2"

View File

@@ -3,6 +3,7 @@ use std::path::PathBuf;
use chrono::Local; use chrono::Local;
use clap::Parser; use clap::Parser;
use url::{form_urlencoded, Url};
use futures_util::StreamExt; use futures_util::StreamExt;
use tokio::task::JoinSet; use tokio::task::JoinSet;
use tokio_tungstenite::{ use tokio_tungstenite::{
@@ -30,6 +31,10 @@ struct Args {
/// Enable debug logging (shows request/response headers) /// Enable debug logging (shows request/response headers)
#[arg(long)] #[arg(long)]
debug: bool, debug: bool,
/// Query string parameters to add to all URLs (pre-encoded, e.g., "name=First%20Last&key=value")
#[arg(short = 'q', long = "query-string-all")]
query_string_all: Option<String>,
} }
#[tokio::main] #[tokio::main]
@@ -53,9 +58,44 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
fs::create_dir_all(&session_dir)?; fs::create_dir_all(&session_dir)?;
info!("Created session directory: {}", session_dir.display()); info!("Created session directory: {}", session_dir.display());
// Parse extra query params once if specified
let extra_params: Vec<(String, String)> = args
.query_string_all
.as_ref()
.map(|qs| {
form_urlencoded::parse(qs.as_bytes())
.map(|(k, v)| (k.into_owned(), v.into_owned()))
.collect()
})
.unwrap_or_default();
// Process URLs and add query string parameters if specified
let mut processed_urls = Vec::new();
for url_str in &args.urls {
let mut url = Url::parse(url_str)?;
if !extra_params.is_empty() {
let existing: Vec<(String, String)> = url
.query_pairs()
.map(|(k, v)| (k.into_owned(), v.into_owned()))
.collect();
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
for (k, v) in &existing {
query_pairs.append_pair(k, v);
}
for (k, v) in &extra_params {
query_pairs.append_pair(k, v);
}
}
processed_urls.push(url.to_string());
}
// Connect to all URLs simultaneously // Connect to all URLs simultaneously
let mut connect_futures = Vec::new(); let mut connect_futures = Vec::new();
for (idx, url) in args.urls.iter().enumerate() { for (idx, url) in processed_urls.iter().enumerate() {
let letter = (b'A' + idx as u8) as char; let letter = (b'A' + idx as u8) as char;
let bearer_token = args.bearer_token.clone(); let bearer_token = args.bearer_token.clone();
let url = url.clone(); let url = url.clone();