Skip to content
forked from six-ddc/plow

A high-performance HTTP benchmarking tool that includes a real-time web UI and terminal display

License

Notifications You must be signed in to change notification settings

0xKismetDev/plow

 
 

Repository files navigation

plow (with tls fingerprint (ja3/ja4) and UA Randomizing)

  • Added Random (Updated) User Agents for each instance.
  • Added Randomizing of TLS Config to Spoof JA3 & JA4 Fingerprinting

Sadly, only the entire instance can be only randomized once due to how plow works and what makes it so fast.
You would have to rebuild the Requestor on each request which is not efficient at all or change how plow works from the ground up :(.

build Homebrew GitHub license made-with-Go

Plow is an HTTP(S) benchmarking tool, written in Golang. It uses excellent fasthttp instead of Go's default net/http due to its lightning fast performance.

Plow runs at a specified connections(option -c) concurrently and real-time records a summary statistics, histogram of execution time and calculates percentiles to display on Web UI and terminal. It can run for a set duration( option -d), for a fixed number of requests(option -n), or until Ctrl-C interrupted.

The implementation of real-time computing Histograms and Quantiles using stream-based algorithms inspired by prometheus with low memory and CPU bounds. so it's almost no additional performance overhead for benchmarking.

❯ ./plow http://127.0.0.1:8080/hello -c 20
Benchmarking http://127.0.0.1:8080/hello using 20 connection(s).
@ Real-time charts is listening on http://[::]:18888

Summary:
  Elapsed        8.6s
  Count        969657
    2xx        776392
    4xx        193265
  RPS      112741.713
  Reads    10.192MB/s
  Writes    6.774MB/s

Statistics    Min       Mean     StdDev      Max
  Latency     32µs      176µs     37µs     1.839ms
  RPS       108558.4  112818.12  2456.63  115949.98

Latency Percentile:
  P50     P75    P90    P95    P99   P99.9  P99.99
  173µs  198µs  222µs  238µs  274µs  352µs  498µs

Latency Histogram:
  141µs  273028  ■■■■■■■■■■■■■■■■■■■■■■■■
  177µs  458955  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  209µs  204717  ■■■■■■■■■■■■■■■■■■
  235µs   26146  ■■
  269µs    6029  ■
  320µs     721
  403µs      58
  524µs       3

Installation

Binary and image distributions are available through the releases assets page.

Via Go

go install github.com/six-ddc/plow@latest

Via Homebrew

# brew update
brew install plow

Via Docker

docker run --rm --net=host ghcr.io/six-ddc/plow
# docker run --rm -p 18888:18888 ghcr.io/six-ddc/plow

Usage

Options

usage: plow [<flags>] <url>

A high-performance HTTP benchmarking tool with real-time web UI and terminal displaying

Examples:

  plow http://127.0.0.1:8080/ -c 20 -n 100000
  plow https://httpbin.org/post -c 20 -d 5m --body @file.json -T 'application/json' -m POST

Flags:
      --help                   Show context-sensitive help.
  -c, --concurrency=1          Number of connections to run concurrently
      --rate=infinity          Number of requests per time unit, examples: --rate 50 --rate 10/ms
  -n, --requests=-1            Number of requests to run
  -d, --duration=DURATION      Duration of test, examples: -d 10s -d 3m
  -i, --interval=200ms         Print snapshot result every interval, use 0 to print once at the end
      --seconds                Use seconds as time unit to print
      --json                   Print snapshot result as JSON
  -b, --body=BODY              HTTP request body, if start the body with @, the rest should be a filename to read
      --stream                 Specify whether to stream file specified by '--body @file' using chunked encoding or to read into memory
  -m, --method="GET"           HTTP method
  -H, --header=K:V ...         Custom HTTP headers
      --host=HOST              Host header
  -T, --content=CONTENT        Content-Type header
      --cert=CERT              Path to the client's TLS Certificate
      --key=KEY                Path to the client's TLS Certificate Private Key
  -k, --insecure               Controls whether a client verifies the server's certificate chain and host name
      --listen=":18888"        Listen addr to serve Web UI
      --timeout=DURATION       Timeout for each http request
      --dial-timeout=DURATION  Timeout for dial addr
      --req-timeout=DURATION   Timeout for full request writing
      --resp-timeout=DURATION  Timeout for full response reading
      --socks5=ip:port         Socks5 proxy
      --auto-open-browser      Specify whether auto open browser to show Web charts
      --[no-]clean             Clean the histogram bar once its finished. Default is true
      --summary                Only print the summary without realtime reports
      --version                Show application version.

  Flags default values also read from env PLOW_SOME_FLAG, such as PLOW_TIMEOUT=5s equals to --timeout=5s

Args:
  <url>  request url

Examples

Basic usage:

plow http://127.0.0.1:8080/ -c 20 -n 10000 -d 10s

POST a json file:

plow https://httpbin.org/post -c 20 --body @file.json -T 'application/json' -m POST

Bash/ZSH Shell Completion

# Add the statement to their bash_profile (or equivalent):
eval "$(plow --completion-script-bash)"
# Or for ZSH
eval "$(plow --completion-script-zsh)"

Stargazers

Stargazers over time

License

See LICENSE.

About

A high-performance HTTP benchmarking tool that includes a real-time web UI and terminal display

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 99.9%
  • Dockerfile 0.1%