@@ -29,7 +29,7 @@ package main
2929import (
3030 "bufio"
3131 "fmt"
32- "log "
32+ "io "
3333 "net/http"
3434 "os"
3535 "os/exec"
@@ -66,20 +66,26 @@ type FetchHandler struct {
6666}
6767
6868func (h * FetchHandler ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
69- if r .FormValue ("event" ) != "" {
70- h .HandleEventRequest (w , r )
71- } else if r .FormValue ("filter" ) != "" {
69+
70+ queryType := r .FormValue ("query-type" )
71+
72+ switch queryType {
73+ case "pcap-filter" :
7274 h .HandleFilterRequest (w , r )
73- } else {
74- http .Error (w , "Missing fetch request type (filter or event)" ,
75- http .StatusBadRequest )
75+ case "event" :
76+ h .HandleEventRequest (w , r )
77+ case "" :
78+ HttpErrorAndLog (w , r , http .StatusBadRequest ,
79+ "Missing query-type parameter." )
80+ default :
81+ HttpErrorAndLog (w , r , http .StatusBadRequest ,
82+ "Unknown query-type: %s" , queryType )
7683 }
7784}
7885
7986func (h * FetchHandler ) HandleFilterRequest (w http.ResponseWriter , r * http.Request ) {
8087
8188 filter := r .FormValue ("filter" )
82-
8389 argStartTime := r .FormValue ("start-time" )
8490 argDuration := r .FormValue ("duration" )
8591 argSpool := r .FormValue ("spool" )
@@ -115,6 +121,13 @@ func (h *FetchHandler) HandleFilterRequest(w http.ResponseWriter, r *http.Reques
115121 return
116122 }
117123
124+ logger .PrintfWithRequest (r , "Preparing dumper request: %s" ,
125+ map [string ]string {
126+ "start-time" : startTime .String (),
127+ "duration" : duration .String (),
128+ "pcap-filter" : filter ,
129+ })
130+
118131 dumperArgs := []string {
119132 "-directory" , spool .Directory ,
120133 "-prefix" , spool .Prefix ,
@@ -127,9 +140,9 @@ func (h *FetchHandler) HandleFilterRequest(w http.ResponseWriter, r *http.Reques
127140
128141func (h * FetchHandler ) HandleEventRequest (w http.ResponseWriter , r * http.Request ) {
129142
130- event , _ := DecodeEvent (r .FormValue ("event" ))
131- if event = = nil {
132- http . Error (w , "failed to decode event" , http .StatusBadRequest )
143+ event , err := DecodeEvent (r .FormValue ("event" ))
144+ if err ! = nil {
145+ HttpErrorAndLog (w , r , http .StatusBadRequest , err . Error () )
133146 return
134147 }
135148
@@ -168,6 +181,14 @@ func (h *FetchHandler) HandleEventRequest(w http.ResponseWriter, r *http.Request
168181 return
169182 }
170183
184+ logger .PrintfWithRequest (r , "Preparing dumper request: %s" ,
185+ map [string ]string {
186+ "start-time" : startTime .String (),
187+ "duration" : duration .String (),
188+ "pcap-filter" : event .ToPcapFilter (),
189+ "event" : event .Original ,
190+ })
191+
171192 dumperArgs := []string {
172193 "-directory" , spool .Directory ,
173194 "-prefix" , spool .Prefix ,
@@ -204,23 +225,27 @@ func (h *FetchHandler) RunDumper(w http.ResponseWriter, r *http.Request, args []
204225 if err != nil {
205226 break
206227 }
207- log .Printf ("dumpy dumper (stderr): %s" , line )
228+ logger .Printf ("dumpy dumper [%d] (stderr) %s" , dumper . Process . Pid , line )
208229 }
209230 }()
210231
211232 err = dumper .Start ()
212233 if err != nil {
213- http . Error (w , "failed to execute dumper: " + err . Error () ,
214- http . StatusInternalServerError )
234+ HttpErrorAndLog (w , r , http . StatusInternalServerError ,
235+ "failed to execute dumper: %s" , err )
215236 return
216237 }
238+ logger .PrintfWithRequest (r , "dumper with pid %d started: %s" ,
239+ dumper .Process .Pid , dumper .Args )
217240
218241 bytesWritten := 0
219242 for {
220243 buf := make ([]byte , 8192 )
221244 n , err := stdout .Read (buf )
222245 if err != nil {
223- log .Print (err )
246+ if err != io .EOF {
247+ logger .PrintfWithRequest (r , "unexpected dump error: %s" , err )
248+ }
224249 break
225250 }
226251
@@ -231,13 +256,17 @@ func (h *FetchHandler) RunDumper(w http.ResponseWriter, r *http.Request, args []
231256 }
232257 n , err = w .Write (buf [0 :n ])
233258 if err != nil {
234- log .Printf ("write to client failed: %s" , err )
259+ logger .PrintfWithRequest (r ,
260+ "Write failed; client may have disconnected: %s" , err )
235261 break
236262 }
237263 bytesWritten += n
238264 }
239265
240266 if bytesWritten == 0 {
241267 http .Error (w , "No packets found." , http .StatusNotFound )
268+ } else {
269+ logger .PrintfWithRequest (r , "Wrote %d bytes of packet data" ,
270+ bytesWritten )
242271 }
243272}
0 commit comments