2020-04-26 23:32:58 +02:00
|
|
|
package matchers
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/http/httputil"
|
|
|
|
|
"strings"
|
2020-09-30 01:05:55 +02:00
|
|
|
"time"
|
2020-04-26 23:32:58 +02:00
|
|
|
|
|
|
|
|
"github.com/miekg/dns"
|
|
|
|
|
)
|
|
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
const defaultFormat = "%s"
|
|
|
|
|
|
2020-10-23 10:41:49 +02:00
|
|
|
// HTTPToMap Converts HTTP to Matcher Map
|
|
|
|
|
func HTTPToMap(resp *http.Response, body, headers string, duration time.Duration, format string) (m map[string]interface{}) {
|
2020-04-26 23:32:58 +02:00
|
|
|
m = make(map[string]interface{})
|
|
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
if format == "" {
|
|
|
|
|
format = defaultFormat
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m[fmt.Sprintf(format, "content_length")] = resp.ContentLength
|
|
|
|
|
m[fmt.Sprintf(format, "status_code")] = resp.StatusCode
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-04-26 23:32:58 +02:00
|
|
|
for k, v := range resp.Header {
|
2020-08-25 23:24:31 +02:00
|
|
|
k = strings.ToLower(strings.TrimSpace(strings.ReplaceAll(k, "-", "_")))
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, k)] = strings.Join(v, " ")
|
2020-04-26 23:32:58 +02:00
|
|
|
}
|
|
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "all_headers")] = headers
|
|
|
|
|
m[fmt.Sprintf(format, "body")] = body
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-04-26 23:32:58 +02:00
|
|
|
if r, err := httputil.DumpResponse(resp, true); err == nil {
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "raw")] = string(r)
|
2020-04-26 23:32:58 +02:00
|
|
|
}
|
|
|
|
|
|
2020-10-01 18:16:24 +02:00
|
|
|
// Converts duration to seconds (floating point) for DSL syntax
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "duration")] = duration.Seconds()
|
2020-09-30 01:05:55 +02:00
|
|
|
|
2020-04-26 23:32:58 +02:00
|
|
|
return m
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-23 10:41:49 +02:00
|
|
|
// DNSToMap Converts DNS to Matcher Map
|
|
|
|
|
func DNSToMap(msg *dns.Msg, format string) (m map[string]interface{}) {
|
2020-04-26 23:32:58 +02:00
|
|
|
m = make(map[string]interface{})
|
|
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
if format == "" {
|
|
|
|
|
format = defaultFormat
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m[fmt.Sprintf(format, "rcode")] = msg.Rcode
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-04-26 23:32:58 +02:00
|
|
|
var qs string
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-04-26 23:32:58 +02:00
|
|
|
for _, question := range msg.Question {
|
|
|
|
|
qs += fmt.Sprintln(question.String())
|
|
|
|
|
}
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "question")] = qs
|
2020-04-26 23:32:58 +02:00
|
|
|
|
|
|
|
|
var exs string
|
|
|
|
|
for _, extra := range msg.Extra {
|
|
|
|
|
exs += fmt.Sprintln(extra.String())
|
|
|
|
|
}
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "extra")] = exs
|
2020-04-26 23:32:58 +02:00
|
|
|
|
|
|
|
|
var ans string
|
|
|
|
|
for _, answer := range msg.Answer {
|
|
|
|
|
ans += fmt.Sprintln(answer.String())
|
|
|
|
|
}
|
2020-08-25 23:24:31 +02:00
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "answer")] = ans
|
2020-04-26 23:32:58 +02:00
|
|
|
|
|
|
|
|
var nss string
|
|
|
|
|
for _, ns := range msg.Ns {
|
|
|
|
|
nss += fmt.Sprintln(ns.String())
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 22:30:53 +02:00
|
|
|
m[fmt.Sprintf(format, "ns")] = nss
|
|
|
|
|
m[fmt.Sprintf(format, "raw")] = msg.String()
|
2020-04-26 23:32:58 +02:00
|
|
|
|
|
|
|
|
return m
|
|
|
|
|
}
|