Skip to content

Commit 35a2902

Browse files
impoved sniffreporter matching logic (still do not account for corner cases)
1 parent c2f22de commit 35a2902

File tree

1 file changed

+46
-13
lines changed

1 file changed

+46
-13
lines changed

gohpts.go

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,7 @@ func (p *proxyapp) colorizeTunnel(req, resp layers.Layer, sniffheader *[]string,
403403
switch reqt := req.(type) {
404404
case *layers.HTTPMessage:
405405
var reqBodySaved, respBodySaved []byte
406-
rest, ok := resp.(*layers.HTTPMessage)
407-
if !ok {
408-
return fmt.Errorf("failed parsing HTTP response")
409-
}
406+
rest := resp.(*layers.HTTPMessage)
410407
if p.body {
411408
reqBodySaved, _ = io.ReadAll(reqt.Request.Body)
412409
respBodySaved, _ = io.ReadAll(rest.Response.Body)
@@ -1001,27 +998,63 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) {
1001998
func (p *proxyapp) sniffreporter(wg *sync.WaitGroup, sniffheader *[]string, reqChan, respChan <-chan layers.Layer, id string) {
1002999
defer wg.Done()
10031000
sniffheaderlen := len(*sniffheader)
1004-
var reqQueue, respQueue []layers.Layer
1001+
var reqTLSQueue, respTLSQueue, reqHTTPQueue, respHTTPQueue []layers.Layer
10051002
for {
10061003
select {
10071004
case req, ok := <-reqChan:
10081005
if !ok {
10091006
return
10101007
} else {
1011-
reqQueue = append(reqQueue, req)
1008+
switch req.(type) {
1009+
case *layers.TLSMessage:
1010+
reqTLSQueue = append(reqTLSQueue, req)
1011+
case *layers.HTTPMessage:
1012+
reqHTTPQueue = append(reqHTTPQueue, req)
1013+
}
10121014
}
10131015
case resp, ok := <-respChan:
10141016
if !ok {
10151017
return
1016-
} else if len(reqQueue) > 0 { // HACK: is this right?
1017-
respQueue = append(respQueue, resp)
1018+
} else {
1019+
switch resp.(type) {
1020+
case *layers.TLSMessage:
1021+
// request comes first or response arrived first
1022+
if len(reqTLSQueue) > 0 || len(respTLSQueue) == 0 {
1023+
respTLSQueue = append(respTLSQueue, resp)
1024+
// remove unmatched response if still no requests
1025+
} else if len(reqTLSQueue) == 0 && len(respTLSQueue) == 1 {
1026+
respTLSQueue = respTLSQueue[1:]
1027+
}
1028+
case *layers.HTTPMessage:
1029+
if len(reqHTTPQueue) > 0 || len(respHTTPQueue) == 0 {
1030+
respHTTPQueue = append(respHTTPQueue, resp)
1031+
} else if len(reqHTTPQueue) == 0 && len(respHTTPQueue) == 1 {
1032+
respHTTPQueue = respHTTPQueue[1:]
1033+
}
1034+
}
10181035
}
10191036
}
1020-
if len(reqQueue) > 0 && len(respQueue) > 0 {
1021-
req := reqQueue[0]
1022-
resp := respQueue[0]
1023-
reqQueue = reqQueue[1:]
1024-
respQueue = respQueue[1:]
1037+
if len(reqHTTPQueue) > 0 && len(respHTTPQueue) > 0 {
1038+
req := reqHTTPQueue[0]
1039+
resp := respHTTPQueue[0]
1040+
reqHTTPQueue = reqHTTPQueue[1:]
1041+
respHTTPQueue = respHTTPQueue[1:]
1042+
1043+
err := p.colorizeTunnel(req, resp, sniffheader, id)
1044+
if err == nil && len(*sniffheader) > sniffheaderlen {
1045+
if p.json {
1046+
p.snifflogger.Log().Msg(fmt.Sprintf("[%s]", strings.Join(*sniffheader, ",")))
1047+
} else {
1048+
p.snifflogger.Log().Msg(strings.Join(*sniffheader, "\n"))
1049+
}
1050+
}
1051+
*sniffheader = (*sniffheader)[:sniffheaderlen]
1052+
}
1053+
if len(reqTLSQueue) > 0 && len(respTLSQueue) > 0 {
1054+
req := reqTLSQueue[0]
1055+
resp := respTLSQueue[0]
1056+
reqTLSQueue = reqTLSQueue[1:]
1057+
respTLSQueue = respTLSQueue[1:]
10251058

10261059
err := p.colorizeTunnel(req, resp, sniffheader, id)
10271060
if err == nil && len(*sniffheader) > sniffheaderlen {

0 commit comments

Comments
 (0)