diff options
Diffstat (limited to 'internal/ipc/server.go')
| -rw-r--r-- | internal/ipc/server.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/internal/ipc/server.go b/internal/ipc/server.go index 28279a7..9602912 100644 --- a/internal/ipc/server.go +++ b/internal/ipc/server.go @@ -6,6 +6,7 @@ import ( "io" "log" "net" + "regexp" "sync" "mitmux/internal/rules" @@ -155,6 +156,23 @@ func (s *Server) handleConn(conn net.Conn) { enc.Encode(Response{Type: "error", Error: "intruder not available"}) continue } + var grepMatchRe, grepExtractRe *regexp.Regexp + if req.GrepMatch != "" { + re, err := regexp.Compile(req.GrepMatch) + if err != nil { + enc.Encode(Response{Type: "error", Error: "grep-match: " + err.Error()}) + continue + } + grepMatchRe = re + } + if req.GrepExtract != "" { + re, err := regexp.Compile(req.GrepExtract) + if err != nil { + enc.Encode(Response{Type: "error", Error: "grep-extract: " + err.Error()}) + continue + } + grepExtractRe = re + } err := s.intruder.Intrude(context.Background(), req.Scheme, req.Host, req.Raw, req.Payloads, func(position int, payload string, entry *store.Entry, sendErr error) bool { r := IntrudeResultMsg{Position: position, Payload: payload} @@ -169,6 +187,18 @@ func (s *Server) handleConn(conn net.Conn) { if entry.Error != "" && r.Error == "" { r.Error = entry.Error } + if grepMatchRe != nil { + r.GrepMatch = grepMatchRe.Match(entry.ResponseRaw) + } + if grepExtractRe != nil { + if m := grepExtractRe.FindSubmatch(entry.ResponseRaw); m != nil { + if len(m) > 1 { + r.GrepExtract = string(m[1]) + } else { + r.GrepExtract = string(m[0]) + } + } + } } return enc.Encode(Response{Type: "intrude_result", IntrudeResult: &r}) == nil }) |