@@ -750,75 +750,75 @@ func (app *App) Use(args ...any) Router {
750
750
return app
751
751
}
752
752
753
- app .register ([]string {methodUse }, prefix , nil , nil , handlers ... )
753
+ app .register ([]string {methodUse }, prefix , nil , handlers ... )
754
754
}
755
755
756
756
return app
757
757
}
758
758
759
759
// Get registers a route for GET methods that requests a representation
760
760
// of the specified resource. Requests using GET should only retrieve data.
761
- func (app * App ) Get (path string , handler Handler , middleware ... Handler ) Router {
762
- return app .Add ([]string {MethodGet }, path , handler , middleware ... )
761
+ func (app * App ) Get (path string , handler Handler , handlers ... Handler ) Router {
762
+ return app .Add ([]string {MethodGet }, path , handler , handlers ... )
763
763
}
764
764
765
765
// Head registers a route for HEAD methods that asks for a response identical
766
766
// to that of a GET request, but without the response body.
767
- func (app * App ) Head (path string , handler Handler , middleware ... Handler ) Router {
768
- return app .Add ([]string {MethodHead }, path , handler , middleware ... )
767
+ func (app * App ) Head (path string , handler Handler , handlers ... Handler ) Router {
768
+ return app .Add ([]string {MethodHead }, path , handler , handlers ... )
769
769
}
770
770
771
771
// Post registers a route for POST methods that is used to submit an entity to the
772
772
// specified resource, often causing a change in state or side effects on the server.
773
- func (app * App ) Post (path string , handler Handler , middleware ... Handler ) Router {
774
- return app .Add ([]string {MethodPost }, path , handler , middleware ... )
773
+ func (app * App ) Post (path string , handler Handler , handlers ... Handler ) Router {
774
+ return app .Add ([]string {MethodPost }, path , handler , handlers ... )
775
775
}
776
776
777
777
// Put registers a route for PUT methods that replaces all current representations
778
778
// of the target resource with the request payload.
779
- func (app * App ) Put (path string , handler Handler , middleware ... Handler ) Router {
780
- return app .Add ([]string {MethodPut }, path , handler , middleware ... )
779
+ func (app * App ) Put (path string , handler Handler , handlers ... Handler ) Router {
780
+ return app .Add ([]string {MethodPut }, path , handler , handlers ... )
781
781
}
782
782
783
783
// Delete registers a route for DELETE methods that deletes the specified resource.
784
- func (app * App ) Delete (path string , handler Handler , middleware ... Handler ) Router {
785
- return app .Add ([]string {MethodDelete }, path , handler , middleware ... )
784
+ func (app * App ) Delete (path string , handler Handler , handlers ... Handler ) Router {
785
+ return app .Add ([]string {MethodDelete }, path , handler , handlers ... )
786
786
}
787
787
788
788
// Connect registers a route for CONNECT methods that establishes a tunnel to the
789
789
// server identified by the target resource.
790
- func (app * App ) Connect (path string , handler Handler , middleware ... Handler ) Router {
791
- return app .Add ([]string {MethodConnect }, path , handler , middleware ... )
790
+ func (app * App ) Connect (path string , handler Handler , handlers ... Handler ) Router {
791
+ return app .Add ([]string {MethodConnect }, path , handler , handlers ... )
792
792
}
793
793
794
794
// Options registers a route for OPTIONS methods that is used to describe the
795
795
// communication options for the target resource.
796
- func (app * App ) Options (path string , handler Handler , middleware ... Handler ) Router {
797
- return app .Add ([]string {MethodOptions }, path , handler , middleware ... )
796
+ func (app * App ) Options (path string , handler Handler , handlers ... Handler ) Router {
797
+ return app .Add ([]string {MethodOptions }, path , handler , handlers ... )
798
798
}
799
799
800
800
// Trace registers a route for TRACE methods that performs a message loop-back
801
801
// test along the path to the target resource.
802
- func (app * App ) Trace (path string , handler Handler , middleware ... Handler ) Router {
803
- return app .Add ([]string {MethodTrace }, path , handler , middleware ... )
802
+ func (app * App ) Trace (path string , handler Handler , handlers ... Handler ) Router {
803
+ return app .Add ([]string {MethodTrace }, path , handler , handlers ... )
804
804
}
805
805
806
806
// Patch registers a route for PATCH methods that is used to apply partial
807
807
// modifications to a resource.
808
- func (app * App ) Patch (path string , handler Handler , middleware ... Handler ) Router {
809
- return app .Add ([]string {MethodPatch }, path , handler , middleware ... )
808
+ func (app * App ) Patch (path string , handler Handler , handlers ... Handler ) Router {
809
+ return app .Add ([]string {MethodPatch }, path , handler , handlers ... )
810
810
}
811
811
812
812
// Add allows you to specify multiple HTTP methods to register a route.
813
- func (app * App ) Add (methods []string , path string , handler Handler , middleware ... Handler ) Router {
814
- app .register (methods , path , nil , handler , middleware ... )
813
+ func (app * App ) Add (methods []string , path string , handler Handler , handlers ... Handler ) Router {
814
+ app .register (methods , path , nil , append ([] Handler { handler }, handlers ... ) ... )
815
815
816
816
return app
817
817
}
818
818
819
819
// All will register the handler on all HTTP methods
820
- func (app * App ) All (path string , handler Handler , middleware ... Handler ) Router {
821
- return app .Add (app .config .RequestMethods , path , handler , middleware ... )
820
+ func (app * App ) All (path string , handler Handler , handlers ... Handler ) Router {
821
+ return app .Add (app .config .RequestMethods , path , handler , handlers ... )
822
822
}
823
823
824
824
// Group is used for Routes with common prefix to define a new sub-router with optional middleware.
@@ -828,7 +828,7 @@ func (app *App) All(path string, handler Handler, middleware ...Handler) Router
828
828
func (app * App ) Group (prefix string , handlers ... Handler ) Router {
829
829
grp := & Group {Prefix : prefix , app : app }
830
830
if len (handlers ) > 0 {
831
- app .register ([]string {methodUse }, prefix , grp , nil , handlers ... )
831
+ app .register ([]string {methodUse }, prefix , grp , handlers ... )
832
832
}
833
833
if err := app .hooks .executeOnGroupHooks (* grp ); err != nil {
834
834
panic (err )
@@ -894,6 +894,13 @@ func (app *App) HandlersCount() uint32 {
894
894
//
895
895
// Make sure the program doesn't exit and waits instead for Shutdown to return.
896
896
//
897
+ // Important: app.Listen() must be called in a separate goroutine, otherwise shutdown hooks will not work
898
+ // as Listen() is a blocking operation. Example:
899
+ //
900
+ // go app.Listen(":3000")
901
+ // // ...
902
+ // app.Shutdown()
903
+ //
897
904
// Shutdown does not close keepalive connections so its recommended to set ReadTimeout to something else than 0.
898
905
func (app * App ) Shutdown () error {
899
906
return app .ShutdownWithContext (context .Background ())
@@ -918,17 +925,21 @@ func (app *App) ShutdownWithTimeout(timeout time.Duration) error {
918
925
//
919
926
// ShutdownWithContext does not close keepalive connections so its recommended to set ReadTimeout to something else than 0.
920
927
func (app * App ) ShutdownWithContext (ctx context.Context ) error {
921
- if app .hooks != nil {
922
- // TODO: check should be defered?
923
- app .hooks .executeOnShutdownHooks ()
924
- }
925
-
926
928
app .mutex .Lock ()
927
929
defer app .mutex .Unlock ()
930
+
931
+ var err error
932
+
928
933
if app .server == nil {
929
934
return ErrNotRunning
930
935
}
931
- return app .server .ShutdownWithContext (ctx )
936
+
937
+ // Execute the Shutdown hook
938
+ app .hooks .executeOnPreShutdownHooks ()
939
+ defer app .hooks .executeOnPostShutdownHooks (err )
940
+
941
+ err = app .server .ShutdownWithContext (ctx )
942
+ return err
932
943
}
933
944
934
945
// Server returns the underlying fasthttp server
0 commit comments