|
@@ -10,6 +10,7 @@ import (
|
|
|
"sort"
|
|
|
"strings"
|
|
|
|
|
|
+ "imuslab.com/zoraxy/mod/dynamicproxy/domainsniff"
|
|
|
"imuslab.com/zoraxy/mod/dynamicproxy/dpcore"
|
|
|
"imuslab.com/zoraxy/mod/dynamicproxy/rewrite"
|
|
|
"imuslab.com/zoraxy/mod/netutils"
|
|
@@ -143,10 +144,15 @@ func (h *ProxyHandler) hostRequest(w http.ResponseWriter, r *http.Request, targe
|
|
|
u, _ = url.Parse("wss://" + wsRedirectionEndpoint + requestURL)
|
|
|
}
|
|
|
h.Parent.logRequest(r, true, 101, "host-websocket", selectedUpstream.OriginIpOrDomain)
|
|
|
+
|
|
|
+ if target.HeaderRewriteRules == nil {
|
|
|
+ target.HeaderRewriteRules = GetDefaultHeaderRewriteRules()
|
|
|
+ }
|
|
|
+
|
|
|
wspHandler := websocketproxy.NewProxy(u, websocketproxy.Options{
|
|
|
SkipTLSValidation: selectedUpstream.SkipCertValidations,
|
|
|
SkipOriginCheck: selectedUpstream.SkipWebSocketOriginCheck,
|
|
|
- CopyAllHeaders: true,
|
|
|
+ CopyAllHeaders: domainsniff.RequireWebsocketHeaderCopy(r),
|
|
|
UserDefinedHeaders: target.HeaderRewriteRules.UserDefinedHeaders,
|
|
|
Logger: h.Parent.Option.Logger,
|
|
|
})
|
|
@@ -163,15 +169,19 @@ func (h *ProxyHandler) hostRequest(w http.ResponseWriter, r *http.Request, targe
|
|
|
}
|
|
|
|
|
|
//Populate the user-defined headers with the values from the request
|
|
|
- rewrittenUserDefinedHeaders := rewrite.PopulateRequestHeaderVariables(r, target.HeaderRewriteRules.UserDefinedHeaders)
|
|
|
+ headerRewriteOptions := GetDefaultHeaderRewriteRules()
|
|
|
+ if target.HeaderRewriteRules != nil {
|
|
|
+ headerRewriteOptions = target.HeaderRewriteRules
|
|
|
+ }
|
|
|
+ rewrittenUserDefinedHeaders := rewrite.PopulateRequestHeaderVariables(r, headerRewriteOptions.UserDefinedHeaders)
|
|
|
|
|
|
//Build downstream and upstream header rules
|
|
|
upstreamHeaders, downstreamHeaders := rewrite.SplitUpDownStreamHeaders(&rewrite.HeaderRewriteOptions{
|
|
|
UserDefinedHeaders: rewrittenUserDefinedHeaders,
|
|
|
- HSTSMaxAge: target.HeaderRewriteRules.HSTSMaxAge,
|
|
|
+ HSTSMaxAge: headerRewriteOptions.HSTSMaxAge,
|
|
|
HSTSIncludeSubdomains: target.ContainsWildcardName(true),
|
|
|
- EnablePermissionPolicyHeader: target.HeaderRewriteRules.EnablePermissionPolicyHeader,
|
|
|
- PermissionPolicy: target.HeaderRewriteRules.PermissionPolicy,
|
|
|
+ EnablePermissionPolicyHeader: headerRewriteOptions.EnablePermissionPolicyHeader,
|
|
|
+ PermissionPolicy: headerRewriteOptions.PermissionPolicy,
|
|
|
})
|
|
|
|
|
|
//Handle the request reverse proxy
|
|
@@ -183,8 +193,8 @@ func (h *ProxyHandler) hostRequest(w http.ResponseWriter, r *http.Request, targe
|
|
|
PathPrefix: "",
|
|
|
UpstreamHeaders: upstreamHeaders,
|
|
|
DownstreamHeaders: downstreamHeaders,
|
|
|
- HostHeaderOverwrite: target.HeaderRewriteRules.RequestHostOverwrite,
|
|
|
- NoRemoveHopByHop: target.HeaderRewriteRules.DisableHopByHopHeaderRemoval,
|
|
|
+ HostHeaderOverwrite: headerRewriteOptions.RequestHostOverwrite,
|
|
|
+ NoRemoveHopByHop: headerRewriteOptions.DisableHopByHopHeaderRemoval,
|
|
|
Version: target.parent.Option.HostVersion,
|
|
|
})
|
|
|
|
|
@@ -225,8 +235,8 @@ func (h *ProxyHandler) vdirRequest(w http.ResponseWriter, r *http.Request, targe
|
|
|
h.Parent.logRequest(r, true, 101, "vdir-websocket", target.Domain)
|
|
|
wspHandler := websocketproxy.NewProxy(u, websocketproxy.Options{
|
|
|
SkipTLSValidation: target.SkipCertValidations,
|
|
|
- SkipOriginCheck: true, //You should not use websocket via virtual directory. But keep this to true for compatibility
|
|
|
- CopyAllHeaders: true,
|
|
|
+ SkipOriginCheck: true, //You should not use websocket via virtual directory. But keep this to true for compatibility
|
|
|
+ CopyAllHeaders: domainsniff.RequireWebsocketHeaderCopy(r), //Left this as default to prevent nginx user setting / as vdir
|
|
|
UserDefinedHeaders: target.parent.HeaderRewriteRules.UserDefinedHeaders,
|
|
|
Logger: h.Parent.Option.Logger,
|
|
|
})
|
|
@@ -243,15 +253,20 @@ func (h *ProxyHandler) vdirRequest(w http.ResponseWriter, r *http.Request, targe
|
|
|
}
|
|
|
|
|
|
//Populate the user-defined headers with the values from the request
|
|
|
- rewrittenUserDefinedHeaders := rewrite.PopulateRequestHeaderVariables(r, target.parent.HeaderRewriteRules.UserDefinedHeaders)
|
|
|
+ headerRewriteOptions := GetDefaultHeaderRewriteRules()
|
|
|
+ if target.parent.HeaderRewriteRules != nil {
|
|
|
+ headerRewriteOptions = target.parent.HeaderRewriteRules
|
|
|
+ }
|
|
|
+
|
|
|
+ rewrittenUserDefinedHeaders := rewrite.PopulateRequestHeaderVariables(r, headerRewriteOptions.UserDefinedHeaders)
|
|
|
|
|
|
//Build downstream and upstream header rules, use the parent (subdomain) endpoint's headers
|
|
|
upstreamHeaders, downstreamHeaders := rewrite.SplitUpDownStreamHeaders(&rewrite.HeaderRewriteOptions{
|
|
|
UserDefinedHeaders: rewrittenUserDefinedHeaders,
|
|
|
- HSTSMaxAge: target.parent.HeaderRewriteRules.HSTSMaxAge,
|
|
|
+ HSTSMaxAge: headerRewriteOptions.HSTSMaxAge,
|
|
|
HSTSIncludeSubdomains: target.parent.ContainsWildcardName(true),
|
|
|
- EnablePermissionPolicyHeader: target.parent.HeaderRewriteRules.EnablePermissionPolicyHeader,
|
|
|
- PermissionPolicy: target.parent.HeaderRewriteRules.PermissionPolicy,
|
|
|
+ EnablePermissionPolicyHeader: headerRewriteOptions.EnablePermissionPolicyHeader,
|
|
|
+ PermissionPolicy: headerRewriteOptions.PermissionPolicy,
|
|
|
})
|
|
|
|
|
|
//Handle the virtual directory reverse proxy request
|
|
@@ -262,7 +277,7 @@ func (h *ProxyHandler) vdirRequest(w http.ResponseWriter, r *http.Request, targe
|
|
|
PathPrefix: target.MatchingPath,
|
|
|
UpstreamHeaders: upstreamHeaders,
|
|
|
DownstreamHeaders: downstreamHeaders,
|
|
|
- HostHeaderOverwrite: target.parent.HeaderRewriteRules.RequestHostOverwrite,
|
|
|
+ HostHeaderOverwrite: headerRewriteOptions.RequestHostOverwrite,
|
|
|
Version: target.parent.parent.Option.HostVersion,
|
|
|
})
|
|
|
|