66 "crypto/tls"
77 "crypto/x509"
88 "errors"
9+ "fmt"
910 "io"
1011 "net"
1112 "net/http"
@@ -143,7 +144,7 @@ func NewMitmProxyHandler(opt ...Option) (MitmProxyHandler, error) {
143144 var err error
144145 opts .caCert , err = cert .LoadCACertificate (opts .caCertPath , opts .caKeyPath )
145146 if err != nil {
146- return nil , err
147+ return nil , fmt . Errorf ( "failed to load ca cert: %s" , err )
147148 }
148149 if len (opts .rootCAs ) > 0 {
149150 opts .rootCACertPool , err = x509 .SystemCertPool ()
@@ -153,7 +154,7 @@ func NewMitmProxyHandler(opt ...Option) (MitmProxyHandler, error) {
153154 for _ , path := range opts .rootCAs {
154155 ca , err := os .ReadFile (path )
155156 if err != nil {
156- return nil , err
157+ return nil , fmt . Errorf ( "failed to read root ca file: %s" , err )
157158 }
158159 if ok := opts .rootCACertPool .AppendCertsFromPEM (ca ); ! ok {
159160 return nil , errors .New ("failed to append ca file to cert pool" )
@@ -162,7 +163,7 @@ func NewMitmProxyHandler(opt ...Option) (MitmProxyHandler, error) {
162163 }
163164 proxyURL , err := parseProxyFrom (opts .disableProxy , opts .proxy )
164165 if err != nil {
165- return nil , err
166+ return nil , fmt . Errorf ( "failed to parse proxy url: %s" , err )
166167 }
167168
168169 dialFn := func (ctx context.Context , network , addr string ) (net.Conn , error ) {
@@ -274,7 +275,7 @@ func (r *mitmProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
274275 err = ErrInvalidProxyRequest
275276 return
276277 }
277- err = r .Serve (AppendToRequestContext (req .Context (), hostport , request ), conn )
278+ _ = r .Serve (AppendToRequestContext (req .Context (), hostport , request ), conn )
278279}
279280
280281func (r * mitmProxyHandler ) ServeSOCKS5 (ctx context.Context , conn net.Conn ) error {
@@ -283,7 +284,7 @@ func (r *mitmProxyHandler) ServeSOCKS5(ctx context.Context, conn net.Conn) error
283284 defer func () {
284285 if err != nil {
285286 r .handleError (ErrorContext {
286- RemoteAddr : conn .RemoteAddr (). String ( ),
287+ RemoteAddr : remoteAddrOrDefault ( conn .RemoteAddr ()),
287288 Hostport : hostport ,
288289 Error : err ,
289290 })
@@ -295,16 +296,26 @@ func (r *mitmProxyHandler) ServeSOCKS5(ctx context.Context, conn net.Conn) error
295296 if hostport , err = r .handleSocks5Request (ctx , conn ); err != nil {
296297 return err
297298 }
298- err = r .Serve (AppendToRequestContext (ctx , hostport , nil ), conn )
299- return err
299+ retErr : = r .Serve (AppendToRequestContext (ctx , hostport , nil ), conn )
300+ return retErr
300301}
301302
302- func (r * mitmProxyHandler ) Serve (ctx context.Context , conn net.Conn ) error {
303+ func (r * mitmProxyHandler ) Serve (ctx context.Context , conn net.Conn ) ( err error ) {
303304 reqCtx , ok := FromRequestContext (ctx )
304305 if ! ok {
305306 return ErrRequestContextMissing
306307 }
307308
309+ defer func () {
310+ if err != nil {
311+ r .handleError (ErrorContext {
312+ RemoteAddr : remoteAddrOrDefault (conn .RemoteAddr ()),
313+ Hostport : reqCtx .Hostport ,
314+ Error : err ,
315+ })
316+ }
317+ }()
318+
308319 nowTs := time .Now ()
309320
310321 if r .shouldPassthroughRequest (reqCtx .Hostport ) {
@@ -482,7 +493,7 @@ func (r *mitmProxyHandler) handleTunnelRequest(ctx context.Context, conn net.Con
482493 bufConn := newBufConn (conn )
483494 data , err = bufConn .Peek (6 )
484495 if err != nil {
485- return err
496+ return fmt . Errorf ( "short buffer to peek: %s" , err )
486497 }
487498 conn = bufConn
488499 }
@@ -531,7 +542,7 @@ func (r *mitmProxyHandler) handleTunnelRequest(ctx context.Context, conn net.Con
531542 default :
532543 // tls handshake failed if GetConfigForClient() failed
533544 }
534- return err
545+ return fmt . Errorf ( "tls server handshake failed: %s" , err )
535546 }
536547 // wait for tls handshake
537548 dstConn = <- tlsConnCh
@@ -833,3 +844,10 @@ func getAddrPortFromConn(conn net.Conn) (addrport netip.AddrPort) {
833844 }
834845 return
835846}
847+
848+ func remoteAddrOrDefault (addr net.Addr ) string {
849+ if addr == nil {
850+ return ""
851+ }
852+ return addr .String ()
853+ }
0 commit comments