mirror of
https://github.com/kataras/iris.git
synced 2025-03-11 17:24:14 +01:00
add ProxyHandlerRemote and NewProxyRemote
This commit is contained in:
parent
93fa23befa
commit
9eb7d9386d
core/host
|
@ -12,27 +12,20 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProxyHandler returns a new ReverseProxy that rewrites
|
// ProxyHandler returns a new ReverseProxy that rewrites
|
||||||
// URLs to the scheme, host, and base path provided in target.
|
// URLs to the scheme, host, and base path provided in target. If the
|
||||||
// Case 1: req.Host == target.Host
|
// target's path is "/base" and the incoming request was for "/dir",
|
||||||
// If the target's path is "/base" and the incoming request was for "/dir",
|
|
||||||
// the target request will be for /base/dir.
|
// the target request will be for /base/dir.
|
||||||
// Case 2: req.Host != target.Host
|
//
|
||||||
// the target request will be forwarded to the target's url
|
|
||||||
// Relative to httputil.NewSingleHostReverseProxy with some additions.
|
// Relative to httputil.NewSingleHostReverseProxy with some additions.
|
||||||
func ProxyHandler(target *url.URL) *httputil.ReverseProxy {
|
func ProxyHandler(target *url.URL) *httputil.ReverseProxy {
|
||||||
targetQuery := target.RawQuery
|
targetQuery := target.RawQuery
|
||||||
director := func(req *http.Request) {
|
director := func(req *http.Request) {
|
||||||
req.URL.Scheme = target.Scheme
|
req.URL.Scheme = target.Scheme
|
||||||
|
|
||||||
if req.Host != target.Host {
|
|
||||||
req.URL.Path = target.Path
|
|
||||||
} else {
|
|
||||||
req.URL.Path = path.Join(target.Path, req.URL.Path)
|
|
||||||
}
|
|
||||||
|
|
||||||
req.URL.Host = target.Host
|
req.URL.Host = target.Host
|
||||||
req.Host = target.Host
|
req.Host = target.Host
|
||||||
|
|
||||||
|
req.URL.Path = path.Join(target.Path, req.URL.Path)
|
||||||
|
|
||||||
if targetQuery == "" || req.URL.RawQuery == "" {
|
if targetQuery == "" || req.URL.RawQuery == "" {
|
||||||
req.URL.RawQuery = targetQuery + req.URL.RawQuery
|
req.URL.RawQuery = targetQuery + req.URL.RawQuery
|
||||||
} else {
|
} else {
|
||||||
|
@ -56,6 +49,51 @@ func ProxyHandler(target *url.URL) *httputil.ReverseProxy {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ProxyHandlerRemote returns a new ReverseProxy that rewrites
|
||||||
|
// URLs to the scheme, host, and path provided in target.
|
||||||
|
// Case 1: req.Host == target.Host
|
||||||
|
// behavior same as ProxyHandler
|
||||||
|
// Case 2: req.Host != target.Host
|
||||||
|
// the target request will be forwarded to the target's url
|
||||||
|
// insecureSkipVerify indicates enable ssl certificate verification or not
|
||||||
|
func ProxyHandlerRemote(target *url.URL, insecureSkipVerify bool) *httputil.ReverseProxy {
|
||||||
|
targetQuery := target.RawQuery
|
||||||
|
director := func(req *http.Request) {
|
||||||
|
req.URL.Scheme = target.Scheme
|
||||||
|
|
||||||
|
if req.Host != target.Host {
|
||||||
|
req.URL.Path = target.Path
|
||||||
|
} else {
|
||||||
|
req.URL.Path = path.Join(target.Path, req.URL.Path)
|
||||||
|
}
|
||||||
|
|
||||||
|
req.URL.Host = target.Host
|
||||||
|
req.Host = target.Host
|
||||||
|
|
||||||
|
if targetQuery == "" || req.URL.RawQuery == "" {
|
||||||
|
req.URL.RawQuery = targetQuery + req.URL.RawQuery
|
||||||
|
} else {
|
||||||
|
req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := req.Header["User-Agent"]; !ok {
|
||||||
|
// explicitly disable User-Agent so it's not set to default value
|
||||||
|
req.Header.Set("User-Agent", "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p := &httputil.ReverseProxy{Director: director}
|
||||||
|
|
||||||
|
if netutil.IsLoopbackHost(target.Host) {
|
||||||
|
insecureSkipVerify = true
|
||||||
|
}
|
||||||
|
|
||||||
|
transport := &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: insecureSkipVerify}, // lint:ignore
|
||||||
|
}
|
||||||
|
p.Transport = transport
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
// NewProxy returns a new host (server supervisor) which
|
// NewProxy returns a new host (server supervisor) which
|
||||||
// proxies all requests to the target.
|
// proxies all requests to the target.
|
||||||
// It uses the httputil.NewSingleHostReverseProxy.
|
// It uses the httputil.NewSingleHostReverseProxy.
|
||||||
|
@ -74,6 +112,24 @@ func NewProxy(hostAddr string, target *url.URL) *Supervisor {
|
||||||
return proxy
|
return proxy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewProxyRemote returns a new host (server supervisor) which
|
||||||
|
// proxies all requests to the target.
|
||||||
|
// It uses the httputil.NewSingleHostReverseProxy.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
// target, _ := url.Parse("https://anotherdomain.com/abc")
|
||||||
|
// proxy := NewProxyRemote("mydomain.com", target, false)
|
||||||
|
// proxy.ListenAndServe() // use of `proxy.Shutdown` to close the proxy server.
|
||||||
|
func NewProxyRemote(hostAddr string, target *url.URL, insecureSkipVerify bool) *Supervisor {
|
||||||
|
proxyHandler := ProxyHandlerRemote(target, insecureSkipVerify)
|
||||||
|
proxy := New(&http.Server{
|
||||||
|
Addr: hostAddr,
|
||||||
|
Handler: proxyHandler,
|
||||||
|
})
|
||||||
|
|
||||||
|
return proxy
|
||||||
|
}
|
||||||
|
|
||||||
// NewRedirection returns a new host (server supervisor) which
|
// NewRedirection returns a new host (server supervisor) which
|
||||||
// redirects all requests to the target.
|
// redirects all requests to the target.
|
||||||
// Usage:
|
// Usage:
|
||||||
|
|
|
@ -64,6 +64,6 @@ func TestProxy(t *testing.T) {
|
||||||
|
|
||||||
e := httptest.NewInsecure(t, httptest.URL("http://"+listener.Addr().String()))
|
e := httptest.NewInsecure(t, httptest.URL("http://"+listener.Addr().String()))
|
||||||
e.GET("/").Expect().Status(iris.StatusOK).Body().Equal(expectedIndex)
|
e.GET("/").Expect().Status(iris.StatusOK).Body().Equal(expectedIndex)
|
||||||
e.GET("/about").Expect().Status(iris.StatusOK).Body().Equal(expectedIndex)
|
e.GET("/about").Expect().Status(iris.StatusOK).Body().Equal(expectedAbout)
|
||||||
e.GET("/notfound").Expect().Status(iris.StatusOK).Body().Equal(expectedIndex)
|
e.GET("/notfound").Expect().Status(iris.StatusNotFound).Body().Equal(unexpectedRoute)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user