-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Open
Description
Now, in net/http, for server side, we have Handler & HandlerFunc, HandlerFunc is the convenient way for user to define new handler, but in client side, we only have RoundTripper, so I proposal to add RoundTripperFunc to net/http.
// RoundTripperFn implement http.RoundTripper for convenient usage.
type RoundTripperFunc func(request *http.Request) (*http.Response, error)
func (fn RoundTripperFunc) RoundTrip(request *http.Request) (*http.Response, error) { return fn(request) }With this new type, we can easily implement RoundTripper interface.
In modern web application, middleware pattern is widely used. With Middleware we can add more action before/after handler/request call.
For the server side, we can define Middleware or similar:
type Middleware interface {
Next(h http.Handler) http.Handler
}
// MiddlewareFn support wrap function with same signature as Middleware.
type MiddlewareFn func(h http.Handler) http.Handler
func (fn MiddlewareFn) Next(h http.Handler) http.Handler { return fn(h) }
// and compose chains of middleware
// ComposeInterceptor compose interceptors to given http.RoundTripper
func ComposeInterceptor(rt http.RoundTripper, interceptors ...Interceptor) http.RoundTripper {
if len(interceptors) == 0 {
return rt
}
return ComposeInterceptor(interceptors[0].Next(rt), interceptors[1:]...)
}For the client side, we define Interceptor or similar:
type Interceptor interface {
Next(fn http.RoundTripper) http.RoundTripper
}
// InterceptorFn implement Interceptor for convenient usage.
type InterceptorFn func(rt http.RoundTripper) http.RoundTripper
func (fn InterceptorFn) Next(rt http.RoundTripper) http.RoundTripper { return fn(rt) }
// and a function compose chains of interceptor
func ComposeInterceptor(rt http.RoundTripper, interceptors ...Interceptor) http.RoundTripper {
if len(interceptors) == 0 {
return rt
}
return ComposeInterceptor(interceptors[0].Next(rt), interceptors[1:]...)
}All the above are not necessary, but can reduce and simplify user's boilerplate code.
Please consider this proposal.
The original code is middleware, interceptor & RoundTripperFunc
qmuntal, CAFxX, pimousse1099, instabledesign, v3n and 6 moreericlagergren, mdlayher, seankhliao and rustatian
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Incoming