2025-02-28 03:18:50 +04:00
2025-03-20 03:19:28 +04:00
2025-03-19 01:18:36 +04:00
2025-03-16 21:20:33 +04:00
2024-06-01 19:25:30 +04:00
2025-03-11 00:25:32 +04:00
2025-03-16 21:20:33 +04:00
2025-03-16 21:20:33 +04:00
2025-03-16 21:20:33 +04:00
2024-06-02 01:21:37 +04:00
2025-03-19 05:28:14 +04:00
2025-02-28 03:41:33 +04:00
2025-03-18 23:41:20 +04:00

Dodo - A Fast and Easy-to-Use HTTP Benchmarking Tool

Installation

Pull the Dodo image from Docker Hub:

docker pull aykhans/dodo:latest

When using Dodo with Docker and a local config file, you must provide the config.json file as a volume to the Docker run command (not as the "-f config.json" argument):

docker run -v /path/to/config.json:/config.json aykhans/dodo

If you're using Dodo with Docker and providing a config file via URL, you don't need to set a volume:

docker run aykhans/dodo -f https://raw.githubusercontent.com/aykhans/dodo/main/config.json

Using Binary Files

You can download pre-built binaries from the releases section.

Building from Source

To build Dodo from source, you need to have Go 1.24+ installed. Follow these steps:

  1. Clone the repository:

    git clone https://github.com/aykhans/dodo.git
    
  2. Navigate to the project directory:

    cd dodo
    
  3. Build the project:

    go build -ldflags "-s -w" -o dodo
    

This will generate an executable named dodo in the project directory.

Usage

You can use Dodo with CLI arguments, a JSON config file, or both. When using both, CLI arguments will override JSON config values if there's a conflict.

1. CLI

Send 1000 GET requests to https://example.com with 10 parallel dodos (threads) and a timeout of 2 seconds:

dodo -u https://example.com -m GET -d 10 -r 1000 -t 2s

With Docker:

docker run --rm -i aykhans/dodo -u https://example.com -m GET -d 10 -r 1000 -t 2s

2. JSON Config File

Send 1000 GET requests to https://example.com with 10 parallel dodos (threads) and a timeout of 800 milliseconds:

{
    "method": "GET",
    "url": "https://example.com",
    "yes": false,
    "timeout": "800ms",
    "dodos": 10,
    "requests": 1000,

    "params": [
        // A random value will be selected from the list for first "key1" param on each request
        // And always "value" for second "key1" param on each request
        // e.g. "?key1=value2&key1=value"
        { "key1": ["value1", "value2", "value3", "value4"] },
        { "key1": "value" },

        // A random value will be selected from the list for param "key2" on each request
        // e.g. "?key2=value2"
        { "key2": ["value1", "value2"] },
    ],

    "headers": [
        // A random value will be selected from the list for first "key1" header on each request
        // And always "value" for second "key1" header on each request
        // e.g. "key1: value3", "key1: value"
        { "key1": ["value1", "value2", "value3", "value4"] },
        { "key1": "value" },

        // A random value will be selected from the list for header "key2" on each request
        // e.g. "key2: value2"
        { "key2": ["value1", "value2"] },
    ],

    "cookies": [
        // A random value will be selected from the list for first "key1" cookie on each request
        // And always "value" for second "key1" cookie on each request
        // e.g. "key1=value4; key1=value"
        { "key1": ["value1", "value2", "value3", "value4"] },
        { "key1": "value" },

        // A random value will be selected from the list for cookie "key2" on each request
        // e.g. "key2=value1"
        { "key2": ["value1", "value2"] },
    ],

    "body": "body-text",
    // OR
    // A random body value will be selected from the list for each request
    "body": ["body-text1", "body-text2", "body-text3"],

    "proxy": "http://example.com:8080",
    // OR
    // A random proxy will be selected from the list for each request
    "proxy": [
        "http://example.com:8080",
        "http://username:password@example.com:8080",
        "socks5://example.com:8080",
        "socks5h://example.com:8080",
    ],
}
dodo -f /path/config.json
# OR
dodo -f https://example.com/config.json

With Docker:

docker run --rm -i -v /path/to/config.json:/config.json aykhans/dodo
# OR
docker run --rm -i aykhans/dodo -f https://example.com/config.json

3. Combined (CLI & JSON)

Override the config file arguments with CLI arguments:

dodo -f /path/to/config.json -u https://example.com -m GET -d 10 -r 1000 -t 5s

With Docker:

docker run --rm -i -v /path/to/config.json:/config.json aykhans/dodo -u https://example.com -m GET -d 10 -r 1000 -t 5s

CLI and JSON Config Parameters

If Headers, Params, Cookies, Body, or Proxy fields have multiple values, each request will choose a random value from the list.

Parameter JSON config file CLI Flag CLI Short Flag Type Description Default
Config file - -config-file -f String Path to local config file or http(s) URL of the config file -
Yes yes -yes -y Boolean Answer yes to all questions false
URL url -url -u String URL to send the request to -
Method method -method -m String HTTP method GET
Requests requests -requests -r UnsignedInteger Total number of requests to send 1000
Dodos (Threads) dodos -dodos -d UnsignedInteger Number of dodos (threads) to send requests in parallel 1
Timeout timeout -timeout -t Duration Timeout for canceling each request 10s
Params params -param -p [{String: String OR [String]}] Request parameters -
Headers headers -header -H [{String: String OR [String]}] Request headers -
Cookies cookies -cookie -c [{String: String OR [String]}] Request cookies -
Body body -body -b String OR [String] Request body or list of request bodies -
Proxy proxies -proxy -x String OR [String] Proxy URL or list of proxy URLs -
Description
Simple, easy-to-use HTTP benchmarking tool
Readme MIT 1.1 MiB
Languages
Go 99.6%
Dockerfile 0.4%