4 Commits

Author SHA1 Message Date
a170588574 Merge pull request #100 from aykhans/refactor/config
All checks were successful
golangci-lint / lint (push) Successful in 25s
🔨 Add 'User-Agent' in 'SetDefaults' function
2025-03-23 21:19:31 +04:00
2a0ac390d8 🔨 Add 'User-Agent'in 'SetDefaults' function 2025-03-22 22:25:54 +04:00
11bb8b3fb0 Merge pull request #99 from aykhans/docs/update-readme
All checks were successful
golangci-lint / lint (push) Successful in 21s
📚 Update README.md
2025-03-20 19:23:41 +04:00
1aadc3419a 📚 Update README.md 2025-03-20 19:23:14 +04:00
5 changed files with 25 additions and 27 deletions

View File

@ -45,28 +45,11 @@ Download the latest binaries from the [releases](https://github.com/aykhans/dodo
### Building from Source ### Building from Source
To build Dodo from source, ensure you have [Go 1.24+](https://golang.org/dl/) installed. Then follow these steps: To build Dodo from source, ensure you have [Go 1.24+](https://golang.org/dl/) installed.
1. **Clone the repository:**
```sh ```sh
git clone https://github.com/aykhans/dodo.git go install -ldflags "-s -w" github.com/aykhans/dodo@latest
``` ```
2. **Navigate to the project directory:**
```sh
cd dodo
```
3. **Build the project:**
```sh
go build -ldflags "-s -w" -o dodo
```
This will generate an executable named `dodo` in the project directory.
## Usage ## Usage
Dodo supports CLI arguments, configuration files (JSON/YAML), or a combination of both. If both are used, CLI arguments take precedence. Dodo supports CLI arguments, configuration files (JSON/YAML), or a combination of both. If both are used, CLI arguments take precedence.
@ -87,10 +70,10 @@ docker run --rm -i aykhans/dodo -u https://example.com -m GET -d 10 -r 1000 -t 2
### 2. Config File Usage ### 2. Config File Usage
#### 2.1 JSON Example
Send 1000 GET requests to https://example.com with 10 parallel dodos (threads) and a timeout of 800 milliseconds: Send 1000 GET requests to https://example.com with 10 parallel dodos (threads) and a timeout of 800 milliseconds:
#### 2.1 JSON Example
```jsonc ```jsonc
{ {
"method": "GET", "method": "GET",

View File

@ -233,4 +233,5 @@ func (config *Config) SetDefaults() {
if config.Yes == nil { if config.Yes == nil {
config.Yes = utils.ToPtr(DefaultYes) config.Yes = utils.ToPtr(DefaultYes)
} }
config.Headers.SetIfNotExists("User-Agent", DefaultUserAgent)
} }

View File

@ -166,9 +166,6 @@ func setRequestHeaders(req *fasthttp.Request, headers []types.KeyValue[string, s
for _, header := range headers { for _, header := range headers {
req.Header.Add(header.Key, header.Value) req.Header.Add(header.Key, header.Value)
} }
if req.Header.UserAgent() == nil {
req.Header.SetUserAgent(config.DefaultUserAgent)
}
} }
// setRequestCookies adds the cookies of the given request with the provided key-value pairs. // setRequestCookies adds the cookies of the given request with the provided key-value pairs.

View File

@ -73,6 +73,15 @@ func (headers Headers) GetValue(key string) *[]string {
return nil return nil
} }
func (headers Headers) Has(key string) bool {
for i := range headers {
if headers[i].Key == key {
return true
}
}
return false
}
func (headers *Headers) UnmarshalJSON(b []byte) error { func (headers *Headers) UnmarshalJSON(b []byte) error {
var data []map[string]any var data []map[string]any
if err := json.Unmarshal(b, &data); err != nil { if err := json.Unmarshal(b, &data); err != nil {
@ -137,3 +146,11 @@ func (headers *Headers) Set(value string) error {
return nil return nil
} }
func (headers *Headers) SetIfNotExists(key string, value string) bool {
if headers.Has(key) {
return false
}
*headers = append(*headers, KeyValue[string, []string]{Key: key, Value: []string{value}})
return true
}