@@ -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) {
1001998func (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