-
Notifications
You must be signed in to change notification settings - Fork 18k
proposal: net/http: add RoundTripperFunc
and Middleware
for server & client
#38479
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
RoundTripperFunc
and Middleware
for server & clientRoundTripperFunc
and Middleware
for server & client
I've done a similare library |
I definitely want the HTTP client to be composable like the server is and was assuming that would happen as part of the new HTTP client (#23707). I don't think there's a clean way to add it to the existing client so I'm not very excited about this particular proposal. |
It's sound good to me, is there any plan on that issue. |
Since we have generics in recent versions. We can write generic type Middleware[H any] interface {
Then(h H) H
}
type MiddlewareFunc[H any] func(H) H
func (fn MiddlewareFunc[H]) Then(h H) H { return fn(h) }
func Compose[H any](middlewares ...Middleware[H]) Middleware[H] {
for i := len(middlewares); i >= 0; i++ {
h = middlewares[i].Then(h)
}
return h
}
// And Server Middleware bacames:
type ServerMiddleware = Middleware[http.Handler]
// Client Middleware bacames:
type ClientMiddleware = Middleware[http.RoundTripper] |
I think some sort of standard library support for this pattern would be quite welcome. I came across this issue while researching how to apply multiple Adding to the variations already presented in this thread, here is my take on at least one of the articles I found on the topic: type Interceptor func(http.RoundTripper) InterceptorRT
type InterceptorRT func(*http.Request) (*http.Response, error)
func (irt InterceptorRT) RoundTrip(req *http.Request) (*http.Response, error) {
return irt(req)
}
// InterceptorChain is a series of [Interceptor] functions that will be applied
// on each request. A chain should be supplied as the [http.Client.Transport]
// on a http client.
func InterceptorChain(rt http.RoundTripper, interceptors ...Interceptor) http.RoundTripper {
if rt == nil {
rt = http.DefaultTransport
}
for _, interceptor := range interceptors {
rt = interceptor(rt)
}
return rt
} |
Now, in
net/http
, for server side, we haveHandler
&HandlerFunc
,HandlerFunc
is the convenient way for user to define new handler, but in client side, we only haveRoundTripper
, so I proposal to addRoundTripperFunc
tonet/http
.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:For the client side, we define
Interceptor
or similar: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
The text was updated successfully, but these errors were encountered: