mirror of
https://github.com/maride/pancap.git
synced 2024-11-25 09:54:25 +00:00
68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package http
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"github.com/google/gopacket"
|
|
"github.com/google/gopacket/tcpassembly"
|
|
"github.com/google/gopacket/tcpassembly/tcpreader"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
)
|
|
|
|
var (
|
|
requestSummaryLines []string
|
|
)
|
|
|
|
type httpRequestFactory struct{}
|
|
|
|
type httpRequestStream struct {
|
|
net, transport gopacket.Flow
|
|
r tcpreader.ReaderStream
|
|
}
|
|
|
|
// Creates a new HTTPRequestStream for the given packet flow, and analyzes it in a separate thread
|
|
func (h *httpRequestFactory) New(net, transport gopacket.Flow) tcpassembly.Stream {
|
|
hstream := &httpRequestStream{
|
|
net: net,
|
|
transport: transport,
|
|
r: tcpreader.NewReaderStream(),
|
|
}
|
|
|
|
// Start analyzer as thread and return TCP reader stream
|
|
go hstream.run()
|
|
return &hstream.r
|
|
}
|
|
|
|
// Analyzes the given request
|
|
func (h *httpRequestStream) run() {
|
|
iobuf := bufio.NewReader(&h.r)
|
|
|
|
for {
|
|
req, reqErr := http.ReadRequest(iobuf)
|
|
|
|
if reqErr == io.EOF {
|
|
// That's ok, we can ignore EOF errors
|
|
return
|
|
} else if reqErr != nil {
|
|
// Ignore, because it may be a response
|
|
} else {
|
|
// Try to process assembled request
|
|
tcpreader.DiscardBytesToEOF(req.Body)
|
|
req.Body.Close()
|
|
|
|
// Build summary
|
|
line := fmt.Sprintf("Request %s http://%s%s", req.Method, req.Host, req.RequestURI)
|
|
requestSummaryLines = append(requestSummaryLines, line)
|
|
|
|
// Check for file uploads
|
|
if req.MultipartForm != nil && req.MultipartForm.File != nil {
|
|
for k, v := range req.MultipartForm.File {
|
|
log.Println(k, v)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|