Skip to content

Commit b1c8d15

Browse files
committed
Adds manyreqs
1 parent 907442c commit b1c8d15

File tree

2 files changed

+215
-0
lines changed

2 files changed

+215
-0
lines changed

manyreqs/.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
manyreqs
2+
headers
3+
params
4+
*.sw*

manyreqs/main.go

+211
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"crypto/tls"
6+
"flag"
7+
"fmt"
8+
"io"
9+
"io/ioutil"
10+
"log"
11+
"net"
12+
"net/http"
13+
"net/url"
14+
"os"
15+
"strings"
16+
"sync"
17+
"time"
18+
)
19+
20+
func main() {
21+
var paramCount int
22+
flag.IntVar(&paramCount, "p", 40, "params per request")
23+
24+
var concurrency int
25+
flag.IntVar(&concurrency, "c", 20, "concurrency level")
26+
27+
flag.Parse()
28+
29+
paramPatterns, err := getParamPatterns()
30+
if err != nil {
31+
log.Fatal(err)
32+
}
33+
34+
headerPatterns, err := getHeaderPatterns()
35+
if err != nil {
36+
log.Fatal(err)
37+
}
38+
39+
urls := make(chan string)
40+
41+
// workers
42+
var wg sync.WaitGroup
43+
for i := 0; i < concurrency; i++ {
44+
wg.Add(1)
45+
46+
c := getClient()
47+
go func() {
48+
defer wg.Done()
49+
50+
for u := range urls {
51+
sendRequests(c, u, headerPatterns, paramPatterns, paramCount)
52+
}
53+
}()
54+
}
55+
56+
sc := bufio.NewScanner(os.Stdin)
57+
58+
for sc.Scan() {
59+
urls <- sc.Text()
60+
}
61+
close(urls)
62+
63+
wg.Wait()
64+
65+
}
66+
67+
func getClient() *http.Client {
68+
tr := &http.Transport{
69+
MaxIdleConns: 30,
70+
IdleConnTimeout: time.Second,
71+
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
72+
DialContext: (&net.Dialer{
73+
Timeout: time.Second * 10,
74+
KeepAlive: time.Second,
75+
}).DialContext,
76+
}
77+
78+
re := func(req *http.Request, via []*http.Request) error {
79+
return http.ErrUseLastResponse
80+
}
81+
82+
return &http.Client{
83+
Transport: tr,
84+
CheckRedirect: re,
85+
Timeout: time.Second * 10,
86+
}
87+
}
88+
89+
func sendRequests(c *http.Client, u string, headerPatterns, paramPatterns map[string]string, paramCount int) {
90+
91+
params, err := getParams(u, paramPatterns)
92+
headers, err := getHeaders(u, headerPatterns)
93+
if err != nil {
94+
fmt.Fprintf(os.Stderr, "%s\n", err)
95+
return
96+
}
97+
98+
count := 0
99+
chunks := make([]string, 0)
100+
var buf strings.Builder
101+
for k, v := range params {
102+
buf.WriteString(k)
103+
buf.WriteRune('=')
104+
buf.WriteString(v)
105+
buf.WriteRune('&')
106+
107+
count++
108+
if count > paramCount {
109+
count = 0
110+
chunks = append(chunks, buf.String())
111+
buf.Reset()
112+
}
113+
}
114+
115+
for _, chunk := range chunks {
116+
117+
req, err := http.NewRequest("GET", u+"?"+chunk, nil)
118+
if err != nil {
119+
fmt.Println(err)
120+
return
121+
}
122+
for h, v := range headers {
123+
req.Header.Set(h, v)
124+
}
125+
126+
resp, err := c.Do(req)
127+
if resp != nil {
128+
io.Copy(ioutil.Discard, resp.Body)
129+
resp.Body.Close()
130+
}
131+
if err != nil {
132+
fmt.Fprintf(os.Stderr, "error requesting %s: %s\n", u, err)
133+
return
134+
}
135+
}
136+
137+
}
138+
139+
func getHeaders(raw string, patterns map[string]string) (map[string]string, error) {
140+
out := make(map[string]string)
141+
142+
u, err := url.Parse(raw)
143+
if err != nil {
144+
return out, err
145+
}
146+
147+
for h, v := range patterns {
148+
out[h] = fmt.Sprintf(v, u.Hostname())
149+
}
150+
151+
return out, nil
152+
}
153+
154+
func getHeaderPatterns() (map[string]string, error) {
155+
out := make(map[string]string)
156+
157+
f, err := os.Open("headers")
158+
if err != nil {
159+
return out, err
160+
}
161+
162+
sc := bufio.NewScanner(f)
163+
164+
for sc.Scan() {
165+
line := sc.Text()
166+
if line == "" {
167+
continue
168+
}
169+
parts := strings.SplitN(line, ":", 2)
170+
out[parts[0]] = strings.TrimSpace(parts[1])
171+
}
172+
173+
return out, nil
174+
}
175+
176+
func getParamPatterns() (map[string]string, error) {
177+
out := make(map[string]string)
178+
179+
f, err := os.Open("params")
180+
if err != nil {
181+
return out, err
182+
}
183+
184+
sc := bufio.NewScanner(f)
185+
186+
for sc.Scan() {
187+
line := sc.Text()
188+
if line == "" {
189+
continue
190+
}
191+
parts := strings.SplitN(line, "=", 2)
192+
out[parts[0]] = strings.TrimSpace(parts[1])
193+
}
194+
195+
return out, nil
196+
}
197+
198+
func getParams(raw string, patterns map[string]string) (map[string]string, error) {
199+
out := make(map[string]string)
200+
201+
u, err := url.Parse(raw)
202+
if err != nil {
203+
return out, err
204+
}
205+
206+
for h, v := range patterns {
207+
out[h] = fmt.Sprintf(v, u.Hostname())
208+
}
209+
210+
return out, nil
211+
}

0 commit comments

Comments
 (0)