go-sniffer/plugSrc/http/build/entry.go

108 lines
1.5 KiB
Go

package build
import (
"bufio"
"fmt"
"io"
"net/http"
"os"
"strconv"
"time"
"github.com/google/gopacket"
)
const (
Port = 80
Version = "0.1"
)
const (
CmdPort = "-p"
)
type H struct {
port int
version string
}
var hp *H
func NewInstance() *H {
if hp == nil {
hp = &H{
port: Port,
version: Version,
}
}
return hp
}
func (m *H) ResolveStream(net, transport gopacket.Flow, buf io.Reader) {
bio := bufio.NewReader(buf)
for {
req, err := http.ReadRequest(bio)
if err == io.EOF {
return
} else if err != nil {
continue
} else {
var msg = "["
msg += req.Method
msg += "] ["
msg += req.Host + req.URL.String()
msg += "] ["
req.ParseForm()
msg += req.Form.Encode()
msg += "]"
fmt.Println(time.Now().Format("2006-01-02 15:04:05.000") + " | " + msg)
// log.Println()
req.Body.Close()
}
}
}
func (m *H) BPFFilter() string {
return "tcp and port " + strconv.Itoa(m.port)
}
func (m *H) Version() string {
return Version
}
func (m *H) SetFlag(flg []string) {
c := len(flg)
if c == 0 {
return
}
if c>>1 == 0 {
fmt.Println("ERR : Http Number of parameters")
os.Exit(1)
}
for i := 0; i < c; i = i + 2 {
key := flg[i]
val := flg[i+1]
switch key {
case CmdPort:
port, err := strconv.Atoi(val)
m.port = port
if err != nil {
panic("ERR : port")
}
if port < 0 || port > 65535 {
panic("ERR : port(0-65535)")
}
break
default:
panic("ERR : mysql's params")
}
}
}