diff options
| author | Shulhan <ms@kilabit.info> | 2024-02-16 00:24:47 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2024-02-16 01:38:51 +0700 |
| commit | 2b6dc0730aa3c30787e440c1090b8041ff6b4ca8 (patch) | |
| tree | 588439eafdb7cdae7d5d469e7f688e6fd206c00a /http_attack_handler.go | |
| parent | 372d10a3e1ea01f8d03e44e6ab8be673d05c0773 (diff) | |
| download | gorankusu-2b6dc0730aa3c30787e440c1090b8041ff6b4ca8.tar.xz | |
all: set default HTTPTarget Attack if its not set
Previously, the function for Attack need to be coded manually.
This changes introduce new function DefaultHTTPAttack that generate
HTTPAttackHandler based on the HTTPTarget method, request type, and
Params; if AllowAttack is true and Attack is nil.
Implements: https://todo.sr.ht/~shulhan/gorankusu/4
Diffstat (limited to 'http_attack_handler.go')
| -rw-r--r-- | http_attack_handler.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/http_attack_handler.go b/http_attack_handler.go new file mode 100644 index 0000000..8a70416 --- /dev/null +++ b/http_attack_handler.go @@ -0,0 +1,82 @@ +// SPDX-FileCopyrightText: 2024 M. Shulhan <ms@kilabit.info> +// SPDX-License-Identifier: GPL-3.0-or-later + +package gorankusu + +import ( + "encoding/json" + "fmt" + + libhttp "github.com/shuLhan/share/lib/http" + vegeta "github.com/tsenart/vegeta/v12/lib" +) + +// HTTPAttackHandler define the function type that will be called when client +// send request to attack HTTP target. +type HTTPAttackHandler func(rr *RunRequest) vegeta.Targeter + +// DefaultHTTPAttack define the default value for [HTTPTarget.Attack] handler +// that return [vegeta.Targeter]. +func DefaultHTTPAttack() HTTPAttackHandler { + return func(rr *RunRequest) vegeta.Targeter { + var err error + + rr.HTTPTarget.Lock() + defer rr.HTTPTarget.Unlock() + + rr.HTTPTarget.paramsToPath() + + var vegetaTarget = vegeta.Target{ + Method: rr.HTTPTarget.Method.String(), + URL: fmt.Sprintf(`%s%s`, rr.Target.BaseURL, rr.HTTPTarget.Path), + Header: rr.HTTPTarget.Headers.ToHTTPHeader(), + } + + var contentType = rr.HTTPTarget.RequestType.String() + if len(contentType) != 0 { + vegetaTarget.Header.Set(libhttp.HeaderContentType, contentType) + } + + if rr.HTTPTarget.WithRawBody { + vegetaTarget.Body = rr.HTTPTarget.RawBody + } else { + switch rr.HTTPTarget.RequestType { + case libhttp.RequestTypeQuery: + var q = rr.HTTPTarget.Params.ToURLValues().Encode() + if len(q) > 0 { + vegetaTarget.URL += `?` + q + } + + case libhttp.RequestTypeForm: + var form = rr.HTTPTarget.Params.ToURLValues().Encode() + vegetaTarget.Body = []byte(form) + + case libhttp.RequestTypeJSON: + var mapStringAny = rr.HTTPTarget.Params.ToJSONObject() + + vegetaTarget.Body, err = json.Marshal(mapStringAny) + + case libhttp.RequestTypeMultipartForm: + var ( + params map[string][]byte + body string + ) + + params = rr.HTTPTarget.Params.ToMultipartFormData() + contentType, body, err = libhttp.GenerateFormData(params) + if err == nil { + vegetaTarget.Body = []byte(body) + vegetaTarget.Header.Set(libhttp.HeaderContentType, contentType) + } + } + } + + return func(tgt *vegeta.Target) error { + if err != nil { + return fmt.Errorf(`DefaultHTTPAttack: %w`, err) + } + *tgt = vegetaTarget + return nil + } + } +} |
