attack validates the attack arguments, sets up the required resources, launches the attack and writes the results
(opts *attackOpts)
| 115 | // attack validates the attack arguments, sets up the |
| 116 | // required resources, launches the attack and writes the results |
| 117 | func attack(opts *attackOpts) (err error) { |
| 118 | if opts.maxWorkers == vegeta.DefaultMaxWorkers && opts.rate.Freq == 0 { |
| 119 | return fmt.Errorf("-rate=0 requires setting -max-workers") |
| 120 | } |
| 121 | |
| 122 | if len(opts.resolvers) > 0 { |
| 123 | res, err := resolver.NewResolver(opts.resolvers) |
| 124 | if err != nil { |
| 125 | return err |
| 126 | } |
| 127 | net.DefaultResolver = res |
| 128 | } |
| 129 | |
| 130 | net.DefaultResolver.PreferGo = true |
| 131 | |
| 132 | files := map[string]io.Reader{} |
| 133 | for _, filename := range []string{opts.targetsf, opts.bodyf} { |
| 134 | if filename == "" { |
| 135 | continue |
| 136 | } |
| 137 | f, err := file(filename, false) |
| 138 | if err != nil { |
| 139 | return fmt.Errorf("error opening %s: %s", filename, err) |
| 140 | } |
| 141 | defer f.Close() |
| 142 | files[filename] = f |
| 143 | } |
| 144 | |
| 145 | var body []byte |
| 146 | if bodyf, ok := files[opts.bodyf]; ok { |
| 147 | if body, err = io.ReadAll(bodyf); err != nil { |
| 148 | return fmt.Errorf("error reading %s: %s", opts.bodyf, err) |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | var ( |
| 153 | tr vegeta.Targeter |
| 154 | src = files[opts.targetsf] |
| 155 | hdr = opts.headers.Header |
| 156 | proxyHdr = opts.proxyHeaders.Header |
| 157 | ) |
| 158 | |
| 159 | switch opts.format { |
| 160 | case vegeta.JSONTargetFormat: |
| 161 | tr = vegeta.NewJSONTargeter(src, body, hdr) |
| 162 | case vegeta.HTTPTargetFormat: |
| 163 | tr = vegeta.NewHTTPTargeter(src, body, hdr) |
| 164 | default: |
| 165 | return fmt.Errorf("format %q isn't one of [%s]", |
| 166 | opts.format, strings.Join(vegeta.TargetFormats, ", ")) |
| 167 | } |
| 168 | |
| 169 | if !opts.lazy { |
| 170 | targets, err := vegeta.ReadAllTargets(tr) |
| 171 | if err != nil { |
| 172 | return err |
| 173 | } |
| 174 | tr = vegeta.NewStaticTargeter(targets...) |
no test coverage detected