如何阻止 ReverseProxy 代理请求

问题描述

有没有办法阻止 httputil.ReverseProxy 向目标服务器发送传入请求?例如,如果我有一个缓存并且我可以仅使用本地数据响应客户端。或者验证后,我想返回一个错误给客户端。

解决方法

您应该能够使用缓存包装 http.DefaultTransport,该缓存可以根据请求使用缓存或回退 http.DefaultTransport

package main

import (
    "net/http"
    "net/http/httputil"
)

var _ http.RoundTripper = &CachingTransport{}

type CachingTransport struct {
    // put your cache here  
}

func (c *CachingTransport) RoundTrip(request *http.Request) (*http.Response,error) {
    // determine whether to use the cache and return,or use the default transport
    return http.DefaultTransport.RoundTrip(request)
}

func main() {
    _ = httputil.ReverseProxy{
        Transport: &CachingTransport{},}
}
,

httputil.ReverseProxy 有一个导出方法 ServeHTTP(rw http.ResponseWriter,req *http.Request),这使它实现了 net/http.Handler 接口。

所以基本上在你现在使用普通 httputil.ReverseProxy 实例的地方,而是使用实现 net/http.Handler 的自定义类型的实例,保留指向 {{1} 实例的指针}},然后处理请求本身或调用该 httputil.ReverseProxy 实例的 ReverseProxy