@@ -532,7 +532,7 @@ func (p *proxyapp) sniffreporter(wg *sync.WaitGroup, sniffheader *[]string, reqC
532532 defer wg .Done ()
533533 sniffheaderlen := len (* sniffheader )
534534 for {
535- req , okreq := <- reqChan // if resp comes first it blocks
535+ req , okreq := <- reqChan // FIX: if resp comes first it blocks
536536 resp , okresp := <- respChan
537537 if ! okreq || ! okresp {
538538 return
@@ -543,7 +543,7 @@ func (p *proxyapp) sniffreporter(wg *sync.WaitGroup, sniffheader *[]string, reqC
543543 }
544544}
545545
546- func sniff (data []byte , logger * zerolog. Logger ) ([]byte , error ) {
546+ func sniff (data []byte ) ([]byte , error ) {
547547 // TODO: check if it is http or tls beforehand
548548 h := & layers.HTTPMessage {}
549549 if err := h .Parse (data ); err == nil && ! h .IsEmpty () {
@@ -559,26 +559,13 @@ func sniff(data []byte, logger *zerolog.Logger) ([]byte, error) {
559559 if len (m .Records ) > 0 {
560560 hsrec := m .Records [0 ]
561561 if hsrec .ContentType == layers .HandshakeTLSVal { // TODO: add more cases, parse all records
562- parser := layers .HSTLSParserByType (hsrec .Data [0 ])
563- switch parser .(type ) {
564- case * layers.TLSClientHello :
565- tc := parser .(* layers.TLSClientHello )
566- err := tc .ParseHS (hsrec .Data )
562+ switch parser := layers .HSTLSParserByType (hsrec .Data [0 ]).(type ) {
563+ case * layers.TLSClientHello , * layers.TLSServerHello :
564+ err := parser .ParseHS (hsrec .Data )
567565 if err != nil {
568566 return nil , err
569567 }
570- j , err := json .Marshal (tc )
571- if err != nil {
572- return nil , err
573- }
574- return j , nil
575- case * layers.TLSServerHello :
576- ts := parser .(* layers.TLSServerHello )
577- err := ts .ParseHS (hsrec .Data )
578- if err != nil {
579- return nil , err
580- }
581- j , err := json .Marshal (ts )
568+ j , err := json .Marshal (parser )
582569 if err != nil {
583570 return nil , err
584571 }
@@ -605,7 +592,7 @@ func (p *proxyapp) copyWithTimeout(dst net.Conn, src net.Conn, msgChan chan<- []
605592 break
606593 }
607594 if p .sniff {
608- s , err := sniff (buf [0 :nr ], p . logger )
595+ s , err := sniff (buf [0 :nr ])
609596 if err == nil {
610597 msgChan <- s
611598 }
@@ -665,7 +652,7 @@ func parseProxyAuth(auth string) (username, password string, ok bool) {
665652 return "" , "" , false
666653 }
667654 const prefix = "Basic "
668- if len (auth ) < len (prefix ) || strings .ToLower (prefix ) != strings . ToLower ( auth [:len (prefix )]) {
655+ if len (auth ) < len (prefix ) || ! strings .EqualFold (prefix , auth [:len (prefix )]) {
669656 return "" , "" , false
670657 }
671658 c , err := base64 .StdEncoding .DecodeString (auth [len (prefix ):])
@@ -797,23 +784,24 @@ type Config struct {
797784 Json bool
798785 Sniff bool
799786 SniffLogFile string
787+ Color bool
800788}
801789
802790type logWriter struct {
803791 file * os.File
804792}
805793
806794func (writer logWriter ) Write (bytes []byte ) (int , error ) {
807- return fmt .Fprintf (writer .file , fmt . Sprintf ( "%s | ERROR | %s" , time .Now ().Format (time .RFC3339 ), string (bytes ) ))
795+ return fmt .Fprintf (writer .file , "%s ERR %s" , time .Now ().Format (time .RFC3339 ), string (bytes ))
808796}
809797
810798type jsonLogWriter struct {
811799 file * os.File
812800}
813801
814802func (writer jsonLogWriter ) Write (bytes []byte ) (int , error ) {
815- return fmt .Fprintf (writer .file , fmt . Sprintf ( "{\" level\" :\" error\" ,\" time\" :\" %s\" ,\" message\" :\" %s\" }\n " ,
816- time .Now ().Format (time .RFC3339 ), strings .TrimRight (string (bytes ), "\n " )))
803+ return fmt .Fprintf (writer .file , "{\" level\" :\" error\" ,\" time\" :\" %s\" ,\" message\" :\" %s\" }\n " ,
804+ time .Now ().Format (time .RFC3339 ), strings .TrimRight (string (bytes ), "\n " ))
817805}
818806
819807type proxyEntry struct {
@@ -902,8 +890,8 @@ func New(conf *Config) *proxyapp {
902890 log .SetFlags (0 )
903891 logWriter := logWriter {file : logfile }
904892 log .SetOutput (logWriter )
905- noColor := logfile != os .Stdout
906- sniffNoColor := snifflog != os .Stdout
893+ noColor := ! conf . Color || logfile != os .Stdout
894+ sniffNoColor := ! conf . Color || snifflog != os .Stdout
907895 output := zerolog.ConsoleWriter {Out : logfile , TimeFormat : time .RFC3339 , NoColor : noColor }
908896 logger = zerolog .New (output ).With ().Timestamp ().Logger ()
909897 sniffoutput := zerolog.ConsoleWriter {Out : snifflog , TimeFormat : time .RFC3339 , NoColor : sniffNoColor }
0 commit comments