@@ -21,6 +21,7 @@ import (
2121 "io"
2222 "net"
2323 "net/http"
24+ "net/http/pprof"
2425 "os"
2526 "reflect"
2627 "strings"
@@ -574,10 +575,10 @@ func TestOptionsConfig(t *testing.T) {
574575
575576func httpRequest (method string , url string , body string ) ([]byte , error ) {
576577 request , err := http .NewRequest (method , url , strings .NewReader (body ))
577- request .Header .Set ("content-type" , "application/x-www-form-urlencoded" )
578578 if err != nil {
579579 return nil , err
580580 }
581+ request .Header .Set ("content-type" , "application/x-www-form-urlencoded" )
581582
582583 response , err := http .DefaultClient .Do (request )
583584 if err != nil {
@@ -599,72 +600,84 @@ func panicHandle(w http.ResponseWriter, r *http.Request) {
599600 panic ("panic error handle" )
600601}
601602
602- func TestUnregisterHandlers (t * testing.T ) {
603- _ = newDefaultAdminServer ()
604- mux , err := extractServeMuxData ()
605- require .Nil (t , err )
606- require .Len (t , mux .m , 0 )
607- require .Len (t , mux .es , 0 )
608- require .False (t , mux .hosts )
609-
610- http .HandleFunc ("/usercmd" , userCmd )
611- http .HandleFunc ("/errout" , errOutput )
612- http .HandleFunc ("/panicHandle" , panicHandle )
613- http .HandleFunc ("www.qq.com/" , userCmd )
614- http .HandleFunc ("anything/" , userCmd )
603+ func Test_init (t * testing.T ) {
604+ t .Run ("reset default serve mux to remove pprof registration at admin init func" , func (t * testing.T ) {
605+ l , err := net .Listen ("tcp" , "127.0.0.1:0" )
606+ require .Nil (t , err )
607+ go func () {
608+ server := & http.Server {
609+ Handler : nil ,
610+ ReadTimeout : 15 * time .Second ,
611+ WriteTimeout : 15 * time .Second ,
612+ IdleTimeout : 60 * time .Second ,
613+ }
614+
615+ if err := server .Serve (l ); err != nil && err != http .ErrServerClosed {
616+ t .Logf ("http serving: %v" , err )
617+ }
618+ }()
619+ time .Sleep (200 * time .Millisecond )
620+
621+ r , err := http .Get (fmt .Sprintf ("http://%s/debug/pprof/" , l .Addr ().String ()))
622+ require .Nil (t , err )
623+ require .Equal (t , http .StatusNotFound , r .StatusCode )
615624
616- l := mustListenTCP (t )
617- go func () {
618- if err := http .Serve (l , nil ); err != nil {
619- t .Log (err )
620- }
621- }()
622- time .Sleep (200 * time .Millisecond )
625+ r , err = http .Get (fmt .Sprintf ("http://%s/debug/pprof/cmdline" , l .Addr ().String ()))
626+ require .Nil (t , err )
627+ require .Equal (t , http .StatusNotFound , r .StatusCode )
623628
624- mux , err = extractServeMuxData ()
625- require .Nil (t , err )
626- require .Equal (t , 5 , len (mux .m ))
627- require .Equal (t , 2 , len (mux .es ))
628- require .Equal (t , true , mux .hosts )
629-
630- err = unregisterHandlers (
631- []string {
632- "/usercmd" ,
633- "/errout" ,
634- "/panicHandle" ,
635- "www.qq.com/" ,
636- "anything/" ,
637- },
638- )
639- require .Nil (t , err )
629+ r , err = http .Get (fmt .Sprintf ("http://%s/debug/pprof/profile" , l .Addr ().String ()))
630+ require .Nil (t , err )
631+ require .Equal (t , http .StatusNotFound , r .StatusCode )
640632
641- mux , err = extractServeMuxData ()
642- require .Nil (t , err )
643- require .Len (t , mux .m , 0 )
644- require .Len (t , mux .es , 0 )
645- require .False (t , mux .hosts )
633+ r , err = http .Get (fmt .Sprintf ("http://%s/debug/pprof/symbol" , l .Addr ().String ()))
634+ require .Nil (t , err )
635+ require .Equal (t , http .StatusNotFound , r .StatusCode )
646636
647- resp1 , err := http .Get (fmt .Sprintf ("http://%v/usercmd" , l .Addr ()))
648- require .Nil (t , err )
649- defer resp1 .Body .Close ()
650- require .Equal (t , http .StatusNotFound , resp1 .StatusCode )
637+ r , err = http .Get (fmt .Sprintf ("http://%s/debug/pprof/trace" , l .Addr ().String ()))
638+ require .Nil (t , err )
639+ require .Equal (t , http .StatusNotFound , r .StatusCode )
640+ })
641+ t .Run ("register pprof handler explicitly after importing the admin package" , func (t * testing.T ) {
642+ http .DefaultServeMux .HandleFunc ("/debug/pprof/" , pprof .Index )
643+ http .DefaultServeMux .HandleFunc ("/debug/pprof/cmdline" , pprof .Cmdline )
644+ http .DefaultServeMux .HandleFunc ("/debug/pprof/profile" , pprof .Profile )
645+ http .DefaultServeMux .HandleFunc ("/debug/pprof/symbol" , pprof .Symbol )
646+ http .DefaultServeMux .HandleFunc ("/debug/pprof/trace" , pprof .Trace )
647+ t .Cleanup (func () {
648+ http .DefaultServeMux = http .NewServeMux ()
649+ })
650+ l , err := net .Listen ("tcp" , "127.0.0.1:0" )
651+ require .Nil (t , err )
652+ go func () {
653+ server := & http.Server {
654+ Handler : nil ,
655+ ReadTimeout : 15 * time .Second ,
656+ WriteTimeout : 15 * time .Second ,
657+ IdleTimeout : 60 * time .Second ,
658+ }
659+ if err := server .Serve (l ); err != nil && err != http .ErrServerClosed {
660+ t .Logf ("http serving: %v" , err )
661+ }
662+ }()
663+ time .Sleep (200 * time .Millisecond )
664+
665+ r , err := http .Get (fmt .Sprintf ("http://%s/debug/pprof/" , l .Addr ().String ()))
666+ require .Nil (t , err )
667+ require .Equal (t , http .StatusOK , r .StatusCode )
651668
652- http .HandleFunc ( "/usercmd " , userCmd )
653- http . HandleFunc ( "/errout" , errOutput )
654- http . HandleFunc ( "/panicHandle" , panicHandle )
669+ r , err = http .Get ( fmt . Sprintf ( "http://%s/debug/pprof/cmdline " , l . Addr (). String ()) )
670+ require . Nil ( t , err )
671+ require . Equal ( t , http . StatusOK , r . StatusCode )
655672
656- mux , err = extractServeMuxData ()
657- require .Nil (t , err )
658- require .Len (t , mux .m , 3 )
659- require .Len (t , mux .es , 0 )
660- require .False (t , mux .hosts )
673+ r , err = http .Get (fmt .Sprintf ("http://%s/debug/pprof/symbol" , l .Addr ().String ()))
674+ require .Nil (t , err )
675+ require .Equal (t , http .StatusOK , r .StatusCode )
661676
662- resp2 , err := http .Get (fmt .Sprintf ("http://%v/usercmd" , l .Addr ()))
663- require .Nil (t , err )
664- defer resp2 .Body .Close ()
665- respBody , err := io .ReadAll (resp2 .Body )
666- require .Nil (t , err )
667- require .Equal (t , []byte ("usercmd" ), respBody )
677+ r , err = http .Get (fmt .Sprintf ("http://%s/debug/pprof/trace" , l .Addr ().String ()))
678+ require .Nil (t , err )
679+ require .Equal (t , http .StatusOK , r .StatusCode )
680+ })
668681}
669682func mustListenTCP (t * testing.T ) * net.TCPListener {
670683 l , err := net .Listen ("tcp" , testAddress )
0 commit comments