Compare commits

...

2 Commits

Author SHA1 Message Date
74b728c10d implement oneshot 2025-09-04 01:42:38 +09:00
344e383a18 save 2025-09-04 01:21:44 +09:00
3 changed files with 36 additions and 4 deletions

View File

@@ -1,12 +1,14 @@
use crate::http::header_config::HeadersConfig; use crate::http::header_config::HeadersConfig;
use crate::http::simple::HttpSwardArray; use crate::http::simple::HttpSwardArray;
use crate::http::{RandomUrlGenerator, SimpleHttpSward}; use crate::http::{RandomUrlGenerator, SimpleHttpRequest, SimpleHttpSward};
use crate::utils::multiplexed::MultiplexedSward; use crate::utils::multiplexed::{MultiplexedSward, MultiplexedSwardError};
use rand::Rng; use rand::Rng;
use reqwest::Method; use reqwest::Method;
use std::net::{IpAddr, SocketAddr}; use std::net::{IpAddr, SocketAddr};
use std::sync::Arc; use std::sync::Arc;
use thiserror::Error; use thiserror::Error;
use tower::ServiceExt;
use tower::{BoxError, Service};
use url::Url; use url::Url;
use wyrand::WyRand; use wyrand::WyRand;
@@ -21,6 +23,26 @@ pub struct IntegratedHttpSward {
request_sender: MultiplexedSward<HttpSwardArray<Box<[SimpleHttpSward]>>>, request_sender: MultiplexedSward<HttpSwardArray<Box<[SimpleHttpSward]>>>,
} }
impl IntegratedHttpSward {
pub async fn oneshot(&mut self) -> Result<reqwest::Response, HttpSwardError> {
let url = match &mut self.attack_target {
AttackTarget::Random(random) => random.generate_url()?,
AttackTarget::Fixed(url) => url.clone(),
};
let request = SimpleHttpRequest { body: None, url };
let res = self
.request_sender
.ready()
.await
.map_err(HttpSwardError::MultiplexError)?
.call(request)
.await
.map_err(HttpSwardError::MultiplexError)?;
Ok(res)
}
}
impl IntegratedHttpSward { impl IntegratedHttpSward {
pub fn builder() -> IntegratedHttpSwardBuilder { pub fn builder() -> IntegratedHttpSwardBuilder {
IntegratedHttpSwardBuilder::new() IntegratedHttpSwardBuilder::new()
@@ -180,3 +202,12 @@ pub enum HttpSwardBuildError {
#[error("Failed to build reqwest client {0}")] #[error("Failed to build reqwest client {0}")]
ReqwestBuildError(#[from] reqwest::Error), ReqwestBuildError(#[from] reqwest::Error),
} }
#[derive(Debug, Error)]
pub enum HttpSwardError {
#[error("Error when pooling")]
MultiplexError(MultiplexedSwardError<BoxError>),
#[error(transparent)]
BadUrl(#[from] url::ParseError),
}

View File

@@ -1,6 +1,7 @@
use bytes::Bytes; use bytes::Bytes;
use reqwest::header::HeaderMap; use reqwest::header::HeaderMap;
use reqwest::{Client, Method}; use reqwest::{Client, Method};
use std::future::Future;
use std::pin::Pin; use std::pin::Pin;
use std::task::{Context, Poll}; use std::task::{Context, Poll};
use tower::Service; use tower::Service;
@@ -52,7 +53,7 @@ pub struct SimpleHttpRequest {
impl Service<SimpleHttpRequest> for SimpleHttpSward { impl Service<SimpleHttpRequest> for SimpleHttpSward {
type Response = reqwest::Response; type Response = reqwest::Response;
type Error = reqwest::Error; type Error = reqwest::Error;
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>; type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(())) Poll::Ready(Ok(()))
} }

View File

@@ -64,7 +64,7 @@ where
/// Error that can occur when multiplexing requests. /// Error that can occur when multiplexing requests.
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum MultiplexedSwardError<E> { pub enum MultiplexedSwardError<E> {
#[error("{0}")] #[error(transparent)]
Inner(E), Inner(E),
#[error("Semaphore is closed.")] #[error("Semaphore is closed.")]