mirror of
https://github.com/aykhans/sarin.git
synced 2026-01-13 20:11:21 +00:00
v1.0.0: here we go again
This commit is contained in:
712
docs/examples.md
Normal file
712
docs/examples.md
Normal file
@@ -0,0 +1,712 @@
|
||||
# Examples
|
||||
|
||||
This guide provides practical examples for common Sarin use cases.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Basic Usage](#basic-usage)
|
||||
- [Request-Based vs Duration-Based Tests](#request-based-vs-duration-based-tests)
|
||||
- [Dynamic Requests with Templating](#dynamic-requests-with-templating)
|
||||
- [Headers, Cookies, and Parameters](#headers-cookies-and-parameters)
|
||||
- [Request Bodies](#request-bodies)
|
||||
- [Using Proxies](#using-proxies)
|
||||
- [Output Formats](#output-formats)
|
||||
- [Docker Usage](#docker-usage)
|
||||
- [Dry Run Mode](#dry-run-mode)
|
||||
- [Show Configuration](#show-configuration)
|
||||
|
||||
---
|
||||
|
||||
## Basic Usage
|
||||
|
||||
Send 1000 GET requests with 10 concurrent workers:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Send requests with a custom timeout:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 -T 5s
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
timeout: 5s
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Request-Based vs Duration-Based Tests
|
||||
|
||||
**Request-based:** Stop after sending a specific number of requests:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 10000 -c 50
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 10000
|
||||
concurrency: 50
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Duration-based:** Run for a specific amount of time:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -d 5m -c 50
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
duration: 5m
|
||||
concurrency: 50
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Combined:** Stop when either limit is reached first:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 100000 -d 2m -c 100
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 100000
|
||||
duration: 2m
|
||||
concurrency: 100
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Dynamic Requests with Templating
|
||||
|
||||
Generate a random User-Agent for each request:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-H "User-Agent: {{ fakeit_UserAgent }}"
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
headers:
|
||||
User-Agent: "{{ fakeit_UserAgent }}"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Send requests with random user data:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/users -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-B '{"name": "{{ fakeit_Name }}", "email": "{{ fakeit_Email }}"}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/users
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
body: '{"name": "{{ fakeit_Name }}", "email": "{{ fakeit_Email }}"}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Use values to share generated data across headers and body:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/users -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-V "ID={{ fakeit_UUID }}" \
|
||||
-H "X-Request-ID: {{ .Values.ID }}" \
|
||||
-B '{"id": "{{ .Values.ID }}", "name": "{{ fakeit_Name }}"}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/users
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
values: "ID={{ fakeit_UUID }}"
|
||||
headers:
|
||||
X-Request-ID: "{{ .Values.ID }}"
|
||||
body: '{"id": "{{ .Values.ID }}", "name": "{{ fakeit_Name }}"}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Generate random IPs and timestamps:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/logs -r 500 -c 20 \
|
||||
-M POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-B '{"ip": "{{ fakeit_IPv4Address }}", "timestamp": "{{ fakeit_Date }}", "action": "{{ fakeit_HackerVerb }}"}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/logs
|
||||
requests: 500
|
||||
concurrency: 20
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
body: '{"ip": "{{ fakeit_IPv4Address }}", "timestamp": "{{ fakeit_Date }}", "action": "{{ fakeit_HackerVerb }}"}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
> For the complete list of 320+ template functions, see the **[Templating Guide](templating.md)**.
|
||||
|
||||
## Headers, Cookies, and Parameters
|
||||
|
||||
**Custom headers:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-H "Authorization: Bearer token123" \
|
||||
-H "X-Custom-Header: value"
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
headers:
|
||||
Authorization: Bearer token123
|
||||
X-Custom-Header: value
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Random headers from multiple values:**
|
||||
|
||||
> **Note:** When multiple values are provided for the same header, Sarin starts at a random index and cycles through all values in order. Once the cycle completes, it picks a new random starting point. This ensures all values are used while maintaining some randomness.
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-H "X-Region: us-east" \
|
||||
-H "X-Region: us-west" \
|
||||
-H "X-Region: eu-central"
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
headers:
|
||||
X-Region:
|
||||
- us-east
|
||||
- us-west
|
||||
- eu-central
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Query parameters:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/search -r 1000 -c 10 \
|
||||
-P "query=test" \
|
||||
-P "limit=10"
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/search
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
params:
|
||||
query: test
|
||||
limit: "10"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Dynamic query parameters:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/users -r 1000 -c 10 \
|
||||
-P "id={{ fakeit_IntRange 1 1000 }}" \
|
||||
-P "fields=name,email"
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/users
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
params:
|
||||
id: "{{ fakeit_IntRange 1 1000 }}"
|
||||
fields: name,email
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Cookies:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-C "session_id=abc123" \
|
||||
-C "user_id={{ fakeit_UUID }}"
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
cookies:
|
||||
session_id: abc123
|
||||
user_id: "{{ fakeit_UUID }}"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Request Bodies
|
||||
|
||||
**Simple JSON body:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/data -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-B '{"key": "value"}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/data
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
body: '{"key": "value"}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Multiple bodies (randomly cycled):**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/products -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-B '{"product": "laptop", "price": 999}' \
|
||||
-B '{"product": "phone", "price": 599}' \
|
||||
-B '{"product": "tablet", "price": 399}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/products
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
body:
|
||||
- '{"product": "laptop", "price": 999}'
|
||||
- '{"product": "phone", "price": 599}'
|
||||
- '{"product": "tablet", "price": 399}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Dynamic body with fake data:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/orders -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-B '{
|
||||
"order_id": "{{ fakeit_UUID }}",
|
||||
"customer": "{{ fakeit_Name }}",
|
||||
"email": "{{ fakeit_Email }}",
|
||||
"amount": {{ fakeit_Price 10 500 }},
|
||||
"currency": "{{ fakeit_CurrencyShort }}"
|
||||
}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/orders
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
headers:
|
||||
Content-Type: application/json
|
||||
body: |
|
||||
{
|
||||
"order_id": "{{ fakeit_UUID }}",
|
||||
"customer": "{{ fakeit_Name }}",
|
||||
"email": "{{ fakeit_Email }}",
|
||||
"amount": {{ fakeit_Price 10 500 }},
|
||||
"currency": "{{ fakeit_CurrencyShort }}"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Multipart form data:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/upload -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-B '{{ body_FormData (dict_Str "username" "john" "email" "john@example.com") }}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/upload
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
body: '{{ body_FormData (dict_Str "username" "john" "email" "john@example.com") }}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Multipart form data with dynamic values:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com/api/users -r 1000 -c 10 \
|
||||
-M POST \
|
||||
-B '{{ body_FormData (dict_Str "name" (fakeit_Name) "email" (fakeit_Email) "phone" (fakeit_Phone)) }}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com/api/users
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
method: POST
|
||||
body: '{{ body_FormData (dict_Str "name" (fakeit_Name) "email" (fakeit_Email) "phone" (fakeit_Phone)) }}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
> **Note:** `body_FormData` automatically sets the `Content-Type` header to `multipart/form-data` with the appropriate boundary.
|
||||
|
||||
## Using Proxies
|
||||
|
||||
**Single HTTP proxy:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-X http://proxy.example.com:8080
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
proxy: http://proxy.example.com:8080
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**SOCKS5 proxy:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-X socks5://proxy.example.com:1080
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
proxy: socks5://proxy.example.com:1080
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Multiple proxies (load balanced):**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-X http://proxy1.example.com:8080 \
|
||||
-X http://proxy2.example.com:8080 \
|
||||
-X socks5://proxy3.example.com:1080
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
proxy:
|
||||
- http://proxy1.example.com:8080
|
||||
- http://proxy2.example.com:8080
|
||||
- socks5://proxy3.example.com:1080
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Proxy with authentication:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-X http://user:password@proxy.example.com:8080
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
proxy: http://user:password@proxy.example.com:8080
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Output Formats
|
||||
|
||||
**Table output (default):**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 -o table
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
output: table
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**JSON output (useful for parsing):**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 -o json
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
output: json
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**YAML output:**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 -o yaml
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
output: yaml
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**No output (minimal memory usage):**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 -o none
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
output: none
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
**Quiet mode (hide progress bar):**
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 -q
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
quiet: true
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Docker Usage
|
||||
|
||||
**Basic Docker usage:**
|
||||
|
||||
```sh
|
||||
docker run --rm aykhans/sarin -U http://example.com -r 1000 -c 10
|
||||
```
|
||||
|
||||
**With local config file:**
|
||||
|
||||
```sh
|
||||
docker run --rm -v $(pwd)/config.yaml:/config.yaml aykhans/sarin -f /config.yaml
|
||||
```
|
||||
|
||||
**With remote config file:**
|
||||
|
||||
```sh
|
||||
docker run --rm aykhans/sarin -f https://example.com/config.yaml
|
||||
```
|
||||
|
||||
**Interactive mode with TTY:**
|
||||
|
||||
```sh
|
||||
docker run --rm -it aykhans/sarin -U http://example.com -r 1000 -c 10
|
||||
```
|
||||
|
||||
## Dry Run Mode
|
||||
|
||||
Test your configuration without sending actual requests:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 10 -c 1 -z \
|
||||
-H "X-Request-ID: {{ fakeit_UUID }}" \
|
||||
-B '{"user": "{{ fakeit_Name }}"}'
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 10
|
||||
concurrency: 1
|
||||
dryRun: true
|
||||
headers:
|
||||
X-Request-ID: "{{ fakeit_UUID }}"
|
||||
body: '{"user": "{{ fakeit_Name }}"}'
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
This validates templates.
|
||||
|
||||
## Show Configuration
|
||||
|
||||
Preview the merged configuration before running:
|
||||
|
||||
```sh
|
||||
sarin -U http://example.com -r 1000 -c 10 \
|
||||
-H "Authorization: Bearer token" \
|
||||
-s
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>YAML equivalent</summary>
|
||||
|
||||
```yaml
|
||||
url: http://example.com
|
||||
requests: 1000
|
||||
concurrency: 10
|
||||
showConfig: true
|
||||
headers:
|
||||
Authorization: Bearer token
|
||||
```
|
||||
|
||||
</details>
|
||||
Reference in New Issue
Block a user