From c28470e6197fa61f7c4baf4ac71f2be687956a8b Mon Sep 17 00:00:00 2001 From: Kevin Pham Date: Mon, 4 Dec 2023 11:10:55 -0600 Subject: [PATCH] improve codegen for JSON serialization of response/request modifiers --- proxychain/codegen/codegen.go | 137 +++++++-- .../resolve_with_google_doh.go | 2 +- proxychain/ruleset/rule.go | 17 +- proxychain/ruleset/rule_reqmod_types.gen.go | 267 +++++++++--------- proxychain/ruleset/rule_resmod_types.gen.go | 225 +++++---------- 5 files changed, 344 insertions(+), 304 deletions(-) diff --git a/proxychain/codegen/codegen.go b/proxychain/codegen/codegen.go index 9c2f09e..f628810 100644 --- a/proxychain/codegen/codegen.go +++ b/proxychain/codegen/codegen.go @@ -5,6 +5,8 @@ import ( "go/ast" "go/parser" "go/token" + "io" + //"io/fs" "os" "path/filepath" @@ -12,30 +14,27 @@ import ( //"strings" ) -func modToFactoryMap(fn *ast.FuncDecl) (modMap string) { +func responseModToFactoryMap(fn *ast.FuncDecl) (modMap string) { paramCount := len(fn.Type.Params.List) name := fn.Name.Name var x string switch paramCount { case 0: - x = fmt.Sprintf(" resModMap[\"%s\"] = func(_ ...string) proxychain.ResponseModification {\n return rx.%s()\n }\n", name, name) + x = fmt.Sprintf(" rsmModMap[\"%s\"] = func(_ ...string) proxychain.ResponseModification {\n return tx.%s()\n }\n", name, name) default: p := []string{} for i := 0; i < paramCount; i++ { p = append(p, fmt.Sprintf("params[%d]", i)) } params := strings.Join(p, ", ") - x = fmt.Sprintf(" resModMap[\"%s\"] = func(params, ...string) proxychain.ResponseModification {\n return rx.%s(%s)\n }\n", name, name, params) + x = fmt.Sprintf(" rsmModMap[\"%s\"] = func(params ...string) proxychain.ResponseModification {\n return tx.%s(%s)\n }\n", name, name, params) } return x } -func main() { +func responseModCodeGen(dir string) (code string, err error) { fset := token.NewFileSet() - // Directory containing your Go files - dir := "../requestmodifiers/" - files, err := os.ReadDir(dir) if err != nil { panic(err) @@ -50,37 +49,143 @@ func main() { // Parse each Go file node, err := parser.ParseFile(fset, filepath.Join(dir, file.Name()), nil, parser.ParseComments) if err != nil { - panic(err) + return "", err } ast.Inspect(node, func(n ast.Node) bool { fn, ok := n.(*ast.FuncDecl) if ok && fn.Recv == nil && fn.Name.IsExported() { - factoryMaps = append(factoryMaps, modToFactoryMap(fn)) + factoryMaps = append(factoryMaps, responseModToFactoryMap(fn)) } return true }) } - code := fmt.Sprintf(` + code = fmt.Sprintf(` package ruleset_v2 +// DO NOT EDIT THIS FILE. It is automatically generated by ladder/proxychain/codegen/codegen.go +// The purpose of this is serialization of rulesets from JSON or YAML into functional options suitable +// for use in proxychains. import ( "ladder/proxychain" - rx "ladder/proxychain/responsemodifiers" + tx "ladder/proxychain/responsemodifiers" ) type ResponseModifierFactory func(params ...string) proxychain.ResponseModification -var resModMap map[string]ResponseModifierFactory +var rsmModMap map[string]ResponseModifierFactory -// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go func init() { - resModMap = make(map[string]ResponseModifierFactory) + rsmModMap = make(map[string]ResponseModifierFactory) %s }`, strings.Join(factoryMaps, "\n")) - fmt.Println(code) - + //fmt.Println(code) + return code, nil +} + +func requestModToFactoryMap(fn *ast.FuncDecl) (modMap string) { + paramCount := len(fn.Type.Params.List) + name := fn.Name.Name + var x string + switch paramCount { + case 0: + x = fmt.Sprintf(" rqmModMap[\"%s\"] = func(_ ...string) proxychain.RequestModification {\n return rx.%s()\n }\n", name, name) + default: + p := []string{} + for i := 0; i < paramCount; i++ { + p = append(p, fmt.Sprintf("params[%d]", i)) + } + params := strings.Join(p, ", ") + x = fmt.Sprintf(" rqmModMap[\"%s\"] = func(params ...string) proxychain.RequestModification {\n return rx.%s(%s)\n }\n", name, name, params) + } + return x +} + +func requestModCodeGen(dir string) (code string, err error) { + fset := token.NewFileSet() + + files, err := os.ReadDir(dir) + if err != nil { + panic(err) + } + + factoryMaps := []string{} + for _, file := range files { + if filepath.Ext(file.Name()) != ".go" { + continue + } + + // Parse each Go file + node, err := parser.ParseFile(fset, filepath.Join(dir, file.Name()), nil, parser.ParseComments) + if err != nil { + return "", err + } + + ast.Inspect(node, func(n ast.Node) bool { + fn, ok := n.(*ast.FuncDecl) + if ok && fn.Recv == nil && fn.Name.IsExported() { + factoryMaps = append(factoryMaps, requestModToFactoryMap(fn)) + } + return true + }) + + } + + code = fmt.Sprintf(` +package ruleset_v2 +// DO NOT EDIT THIS FILE. It is automatically generated by ladder/proxychain/codegen/codegen.go +// The purpose of this is serialization of rulesets from JSON or YAML into functional options suitable +// for use in proxychains. + +import ( + "ladder/proxychain" + rx "ladder/proxychain/requestmodifiers" +) + +type RequestModifierFactory func(params ...string) proxychain.RequestModification + +var rqmModMap map[string]RequestModifierFactory + +func init() { + rqmModMap = make(map[string]RequestModifierFactory) + + %s +}`, strings.Join(factoryMaps, "\n")) + //fmt.Println(code) + return code, nil +} + +func main() { + rqmCode, err := requestModCodeGen("../requestmodifiers/") + if err != nil { + panic(err) + } + //fmt.Println(rqmCode) + + fq, err := os.Create("../ruleset/rule_reqmod_types.gen.go") + if err != nil { + panic(err) + } + _, err = io.WriteString(fq, rqmCode) + if err != nil { + panic(err) + } + + rsmCode, err := responseModCodeGen("../responsemodifiers/") + if err != nil { + panic(err) + } + //fmt.Println(rsmCode) + + fs, err := os.Create("../ruleset/rule_resmod_types.gen.go") + if err != nil { + panic(err) + } + _, err = io.WriteString(fs, rsmCode) + if err != nil { + panic(err) + } } diff --git a/proxychain/requestmodifiers/resolve_with_google_doh.go b/proxychain/requestmodifiers/resolve_with_google_doh.go index 4d3a41d..c94ac5b 100644 --- a/proxychain/requestmodifiers/resolve_with_google_doh.go +++ b/proxychain/requestmodifiers/resolve_with_google_doh.go @@ -47,7 +47,7 @@ type CustomDialer struct { *net.Dialer } -func NewCustomDialer(timeout, keepAlive time.Duration) *CustomDialer { +func newCustomDialer(timeout, keepAlive time.Duration) *CustomDialer { return &CustomDialer{ Dialer: &net.Dialer{ Timeout: timeout, diff --git a/proxychain/ruleset/rule.go b/proxychain/ruleset/rule.go index 63f48ba..9551dcf 100644 --- a/proxychain/ruleset/rule.go +++ b/proxychain/ruleset/rule.go @@ -34,11 +34,24 @@ func (rule *Rule) UnmarshalJSON(data []byte) error { if err != nil { return fmt.Errorf("Rule::UnmarshalJSON invalid function call syntax => '%s'", err) } - f, exists := resModMap[name] + f, exists := rsmModMap[name] + if !exists { + return fmt.Errorf("Rule::UnmarshalJSON => responseModifer '%s' does not exist, please check spelling", err) + } + rule.ResponseModifications = append(rule.ResponseModifications, f(params...)) + } + + // convert responseModification function call string into actual functional option + for _, rqmModStr := range aux.RequestModifications { + name, params, err := parseFuncCall(rqmModStr) + if err != nil { + return fmt.Errorf("Rule::UnmarshalJSON invalid function call syntax => '%s'", err) + } + f, exists := rqmModMap[name] if !exists { return fmt.Errorf("Rule::UnmarshalJSON => requestModifier '%s' does not exist, please check spelling", err) } - rule.ResponseModifications = append(rule.ResponseModifications, f(params...)) + rule.RequestModifications = append(rule.RequestModifications, f(params...)) } return nil diff --git a/proxychain/ruleset/rule_reqmod_types.gen.go b/proxychain/ruleset/rule_reqmod_types.gen.go index 88ecddf..7f22c3e 100644 --- a/proxychain/ruleset/rule_reqmod_types.gen.go +++ b/proxychain/ruleset/rule_reqmod_types.gen.go @@ -1,184 +1,183 @@ -package ruleset + +package ruleset_v2 +// DO NOT EDIT THIS FILE. It is automatically generated by ladder/proxychain/codegen/codegen.go +// The purpose of this is serialization of rulesets from JSON or YAML into functional options suitable +// for use in proxychains. import ( "ladder/proxychain" - rx "ladder/proxychain/responsemodifiers" + rx "ladder/proxychain/requestmodifiers" ) -type ResponseModifierFactory func(params ...string) proxychain.ResponseModification +type RequestModifierFactory func(params ...string) proxychain.RequestModification -var resModMap map[string]ResponseModifierFactory +var rqmModMap map[string]RequestModifierFactory -// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go func init() { - resModMap = make(map[string]ResponseModifierFactory) + rqmModMap = make(map[string]RequestModifierFactory) - resModMap["ForwardRequestHeaders"] = func(_ ...string) proxychain.ResponseModification { - return rx.ForwardRequestHeaders() - } + rqmModMap["ForwardRequestHeaders"] = func(_ ...string) proxychain.RequestModification { + return rx.ForwardRequestHeaders() + } - resModMap["MasqueradeAsGoogleBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsGoogleBot() - } + rqmModMap["MasqueradeAsGoogleBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsGoogleBot() + } - resModMap["MasqueradeAsBingBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsBingBot() - } + rqmModMap["MasqueradeAsBingBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsBingBot() + } - resModMap["MasqueradeAsWaybackMachineBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsWaybackMachineBot() - } + rqmModMap["MasqueradeAsWaybackMachineBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsWaybackMachineBot() + } - resModMap["MasqueradeAsFacebookBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsFacebookBot() - } + rqmModMap["MasqueradeAsFacebookBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsFacebookBot() + } - resModMap["MasqueradeAsYandexBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsYandexBot() - } + rqmModMap["MasqueradeAsYandexBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsYandexBot() + } - resModMap["MasqueradeAsBaiduBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsBaiduBot() - } + rqmModMap["MasqueradeAsBaiduBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsBaiduBot() + } - resModMap["MasqueradeAsDuckDuckBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsDuckDuckBot() - } + rqmModMap["MasqueradeAsDuckDuckBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsDuckDuckBot() + } - resModMap["MasqueradeAsYahooBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsYahooBot() - } + rqmModMap["MasqueradeAsYahooBot"] = func(_ ...string) proxychain.RequestModification { + return rx.MasqueradeAsYahooBot() + } - resModMap["ModifyDomainWithRegex"] = func(params, ...string) proxychain.ResponseModification { - return rx.ModifyDomainWithRegex(params[0], params[1]) - } + rqmModMap["ModifyDomainWithRegex"] = func(params ...string) proxychain.RequestModification { + return rx.ModifyDomainWithRegex(params[0], params[1]) + } - resModMap["SetOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { - return rx.SetOutgoingCookie(params[0], params[1]) - } + rqmModMap["SetOutgoingCookie"] = func(params ...string) proxychain.RequestModification { + return rx.SetOutgoingCookie(params[0], params[1]) + } - resModMap["SetOutgoingCookies"] = func(params, ...string) proxychain.ResponseModification { - return rx.SetOutgoingCookies(params[0]) - } + rqmModMap["SetOutgoingCookies"] = func(params ...string) proxychain.RequestModification { + return rx.SetOutgoingCookies(params[0]) + } - resModMap["DeleteOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { - return rx.DeleteOutgoingCookie(params[0]) - } + rqmModMap["DeleteOutgoingCookie"] = func(params ...string) proxychain.RequestModification { + return rx.DeleteOutgoingCookie(params[0]) + } - resModMap["DeleteOutgoingCookies"] = func(_ ...string) proxychain.ResponseModification { - return rx.DeleteOutgoingCookies() - } + rqmModMap["DeleteOutgoingCookies"] = func(_ ...string) proxychain.RequestModification { + return rx.DeleteOutgoingCookies() + } - resModMap["DeleteOutgoingCookiesExcept"] = func(params, ...string) proxychain.ResponseModification { - return rx.DeleteOutgoingCookiesExcept(params[0]) - } + rqmModMap["DeleteOutgoingCookiesExcept"] = func(params ...string) proxychain.RequestModification { + return rx.DeleteOutgoingCookiesExcept(params[0]) + } - resModMap["ModifyPathWithRegex"] = func(params, ...string) proxychain.ResponseModification { - return rx.ModifyPathWithRegex(params[0], params[1]) - } + rqmModMap["ModifyPathWithRegex"] = func(params ...string) proxychain.RequestModification { + return rx.ModifyPathWithRegex(params[0], params[1]) + } - resModMap["ModifyQueryParams"] = func(params, ...string) proxychain.ResponseModification { - return rx.ModifyQueryParams(params[0], params[1]) - } + rqmModMap["ModifyQueryParams"] = func(params ...string) proxychain.RequestModification { + return rx.ModifyQueryParams(params[0], params[1]) + } - resModMap["SetRequestHeader"] = func(params, ...string) proxychain.ResponseModification { - return rx.SetRequestHeader(params[0], params[1]) - } + rqmModMap["SetRequestHeader"] = func(params ...string) proxychain.RequestModification { + return rx.SetRequestHeader(params[0], params[1]) + } - resModMap["DeleteRequestHeader"] = func(params, ...string) proxychain.ResponseModification { - return rx.DeleteRequestHeader(params[0]) - } + rqmModMap["DeleteRequestHeader"] = func(params ...string) proxychain.RequestModification { + return rx.DeleteRequestHeader(params[0]) + } - resModMap["RequestArchiveIs"] = func(_ ...string) proxychain.ResponseModification { - return rx.RequestArchiveIs() - } + rqmModMap["RequestArchiveIs"] = func(_ ...string) proxychain.RequestModification { + return rx.RequestArchiveIs() + } - resModMap["RequestGoogleCache"] = func(_ ...string) proxychain.ResponseModification { - return rx.RequestGoogleCache() - } + rqmModMap["RequestGoogleCache"] = func(_ ...string) proxychain.RequestModification { + return rx.RequestGoogleCache() + } - resModMap["RequestWaybackMachine"] = func(_ ...string) proxychain.ResponseModification { - return rx.RequestWaybackMachine() - } + rqmModMap["RequestWaybackMachine"] = func(_ ...string) proxychain.RequestModification { + return rx.RequestWaybackMachine() + } - resModMap["NewCustomDialer"] = func(params, ...string) proxychain.ResponseModification { - return rx.NewCustomDialer(params[0]) - } + rqmModMap["ResolveWithGoogleDoH"] = func(_ ...string) proxychain.RequestModification { + return rx.ResolveWithGoogleDoH() + } - resModMap["ResolveWithGoogleDoH"] = func(_ ...string) proxychain.ResponseModification { - return rx.ResolveWithGoogleDoH() - } + rqmModMap["SpoofOrigin"] = func(params ...string) proxychain.RequestModification { + return rx.SpoofOrigin(params[0]) + } - resModMap["SpoofOrigin"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofOrigin(params[0]) - } + rqmModMap["HideOrigin"] = func(_ ...string) proxychain.RequestModification { + return rx.HideOrigin() + } - resModMap["HideOrigin"] = func(_ ...string) proxychain.ResponseModification { - return rx.HideOrigin() - } + rqmModMap["SpoofReferrer"] = func(params ...string) proxychain.RequestModification { + return rx.SpoofReferrer(params[0]) + } - resModMap["SpoofReferrer"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofReferrer(params[0]) - } + rqmModMap["HideReferrer"] = func(_ ...string) proxychain.RequestModification { + return rx.HideReferrer() + } - resModMap["HideReferrer"] = func(_ ...string) proxychain.ResponseModification { - return rx.HideReferrer() - } + rqmModMap["SpoofReferrerFromBaiduSearch"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromBaiduSearch() + } - resModMap["SpoofReferrerFromBaiduSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromBaiduSearch() - } + rqmModMap["SpoofReferrerFromBingSearch"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromBingSearch() + } - resModMap["SpoofReferrerFromBingSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromBingSearch() - } + rqmModMap["SpoofReferrerFromGoogleSearch"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromGoogleSearch() + } - resModMap["SpoofReferrerFromGoogleSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromGoogleSearch() - } + rqmModMap["SpoofReferrerFromLinkedInPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromLinkedInPost() + } - resModMap["SpoofReferrerFromLinkedInPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromLinkedInPost() - } + rqmModMap["SpoofReferrerFromNaverSearch"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromNaverSearch() + } - resModMap["SpoofReferrerFromNaverSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromNaverSearch() - } + rqmModMap["SpoofReferrerFromPinterestPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromPinterestPost() + } - resModMap["SpoofReferrerFromPinterestPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromPinterestPost() - } + rqmModMap["SpoofReferrerFromQQPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromQQPost() + } - resModMap["SpoofReferrerFromQQPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromQQPost() - } + rqmModMap["SpoofReferrerFromRedditPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromRedditPost() + } - resModMap["SpoofReferrerFromRedditPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromRedditPost() - } + rqmModMap["SpoofReferrerFromTumblrPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromTumblrPost() + } - resModMap["SpoofReferrerFromTumblrPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromTumblrPost() - } + rqmModMap["SpoofReferrerFromTwitterPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromTwitterPost() + } - resModMap["SpoofReferrerFromTwitterPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromTwitterPost() - } + rqmModMap["SpoofReferrerFromVkontaktePost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromVkontaktePost() + } - resModMap["SpoofReferrerFromVkontaktePost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromVkontaktePost() - } + rqmModMap["SpoofReferrerFromWeiboPost"] = func(_ ...string) proxychain.RequestModification { + return rx.SpoofReferrerFromWeiboPost() + } - resModMap["SpoofReferrerFromWeiboPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromWeiboPost() - } + rqmModMap["SpoofUserAgent"] = func(params ...string) proxychain.RequestModification { + return rx.SpoofUserAgent(params[0]) + } - resModMap["SpoofUserAgent"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofUserAgent(params[0]) - } + rqmModMap["SpoofXForwardedFor"] = func(params ...string) proxychain.RequestModification { + return rx.SpoofXForwardedFor(params[0]) + } - resModMap["SpoofXForwardedFor"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofXForwardedFor(params[0]) - } - -} +} \ No newline at end of file diff --git a/proxychain/ruleset/rule_resmod_types.gen.go b/proxychain/ruleset/rule_resmod_types.gen.go index 21984b3..a3cbde0 100644 --- a/proxychain/ruleset/rule_resmod_types.gen.go +++ b/proxychain/ruleset/rule_resmod_types.gen.go @@ -1,184 +1,107 @@ + package ruleset_v2 +// DO NOT EDIT THIS FILE. It is automatically generated by ladder/proxychain/codegen/codegen.go +// The purpose of this is serialization of rulesets from JSON or YAML into functional options suitable +// for use in proxychains. import ( "ladder/proxychain" - rx "ladder/proxychain/responsemodifiers" + tx "ladder/proxychain/responsemodifiers" ) type ResponseModifierFactory func(params ...string) proxychain.ResponseModification -var resModMap map[string]ResponseModifierFactory +var rsmModMap map[string]ResponseModifierFactory -// TODO: create codegen using AST parsing of exported methods in ladder/proxychain/responsemodifiers/*.go func init() { - resModMap = make(map[string]ResponseModifierFactory) + rsmModMap = make(map[string]ResponseModifierFactory) - resModMap["ForwardRequestHeaders"] = func(_ ...string) proxychain.ResponseModification { - return rx.ForwardRequestHeaders() - } + rsmModMap["APIContent"] = func(_ ...string) proxychain.ResponseModification { + return tx.APIContent() + } - resModMap["MasqueradeAsGoogleBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsGoogleBot() - } + rsmModMap["TestCreateAPIErrReader"] = func(params ...string) proxychain.ResponseModification { + return tx.TestCreateAPIErrReader(params[0]) + } - resModMap["MasqueradeAsBingBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsBingBot() - } + rsmModMap["TestCreateAPIErrReader2"] = func(params ...string) proxychain.ResponseModification { + return tx.TestCreateAPIErrReader2(params[0]) + } - resModMap["MasqueradeAsWaybackMachineBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsWaybackMachineBot() - } + rsmModMap["BlockElementRemoval"] = func(params ...string) proxychain.ResponseModification { + return tx.BlockElementRemoval(params[0]) + } - resModMap["MasqueradeAsFacebookBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsFacebookBot() - } + rsmModMap["BypassCORS"] = func(_ ...string) proxychain.ResponseModification { + return tx.BypassCORS() + } - resModMap["MasqueradeAsYandexBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsYandexBot() - } + rsmModMap["BypassContentSecurityPolicy"] = func(_ ...string) proxychain.ResponseModification { + return tx.BypassContentSecurityPolicy() + } - resModMap["MasqueradeAsBaiduBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsBaiduBot() - } + rsmModMap["SetContentSecurityPolicy"] = func(params ...string) proxychain.ResponseModification { + return tx.SetContentSecurityPolicy(params[0]) + } - resModMap["MasqueradeAsDuckDuckBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsDuckDuckBot() - } + rsmModMap["ForwardResponseHeaders"] = func(_ ...string) proxychain.ResponseModification { + return tx.ForwardResponseHeaders() + } - resModMap["MasqueradeAsYahooBot"] = func(_ ...string) proxychain.ResponseModification { - return rx.MasqueradeAsYahooBot() - } + rsmModMap["GenerateReadableOutline"] = func(_ ...string) proxychain.ResponseModification { + return tx.GenerateReadableOutline() + } - resModMap["ModifyDomainWithRegex"] = func(params, ...string) proxychain.ResponseModification { - return rx.ModifyDomainWithRegex(params[0], params[1]) - } + rsmModMap["InjectScriptBeforeDOMContentLoaded"] = func(params ...string) proxychain.ResponseModification { + return tx.InjectScriptBeforeDOMContentLoaded(params[0]) + } - resModMap["SetOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { - return rx.SetOutgoingCookie(params[0], params[1]) - } + rsmModMap["InjectScriptAfterDOMContentLoaded"] = func(params ...string) proxychain.ResponseModification { + return tx.InjectScriptAfterDOMContentLoaded(params[0]) + } - resModMap["SetOutgoingCookies"] = func(params, ...string) proxychain.ResponseModification { - return rx.SetOutgoingCookies(params[0]) - } + rsmModMap["InjectScriptAfterDOMIdle"] = func(params ...string) proxychain.ResponseModification { + return tx.InjectScriptAfterDOMIdle(params[0]) + } - resModMap["DeleteOutgoingCookie"] = func(params, ...string) proxychain.ResponseModification { - return rx.DeleteOutgoingCookie(params[0]) - } + rsmModMap["DeleteIncomingCookies"] = func(params ...string) proxychain.ResponseModification { + return tx.DeleteIncomingCookies(params[0]) + } - resModMap["DeleteOutgoingCookies"] = func(_ ...string) proxychain.ResponseModification { - return rx.DeleteOutgoingCookies() - } + rsmModMap["DeleteIncomingCookiesExcept"] = func(params ...string) proxychain.ResponseModification { + return tx.DeleteIncomingCookiesExcept(params[0]) + } - resModMap["DeleteOutgoingCookiesExcept"] = func(params, ...string) proxychain.ResponseModification { - return rx.DeleteOutgoingCookiesExcept(params[0]) - } + rsmModMap["SetIncomingCookies"] = func(params ...string) proxychain.ResponseModification { + return tx.SetIncomingCookies(params[0]) + } - resModMap["ModifyPathWithRegex"] = func(params, ...string) proxychain.ResponseModification { - return rx.ModifyPathWithRegex(params[0], params[1]) - } + rsmModMap["SetIncomingCookie"] = func(params ...string) proxychain.ResponseModification { + return tx.SetIncomingCookie(params[0], params[1]) + } - resModMap["ModifyQueryParams"] = func(params, ...string) proxychain.ResponseModification { - return rx.ModifyQueryParams(params[0], params[1]) - } + rsmModMap["SetResponseHeader"] = func(params ...string) proxychain.ResponseModification { + return tx.SetResponseHeader(params[0], params[1]) + } - resModMap["SetRequestHeader"] = func(params, ...string) proxychain.ResponseModification { - return rx.SetRequestHeader(params[0], params[1]) - } + rsmModMap["DeleteResponseHeader"] = func(params ...string) proxychain.ResponseModification { + return tx.DeleteResponseHeader(params[0]) + } - resModMap["DeleteRequestHeader"] = func(params, ...string) proxychain.ResponseModification { - return rx.DeleteRequestHeader(params[0]) - } + rsmModMap["PatchDynamicResourceURLs"] = func(_ ...string) proxychain.ResponseModification { + return tx.PatchDynamicResourceURLs() + } - resModMap["RequestArchiveIs"] = func(_ ...string) proxychain.ResponseModification { - return rx.RequestArchiveIs() - } + rsmModMap["PatchGoogleAnalytics"] = func(_ ...string) proxychain.ResponseModification { + return tx.PatchGoogleAnalytics() + } - resModMap["RequestGoogleCache"] = func(_ ...string) proxychain.ResponseModification { - return rx.RequestGoogleCache() - } + rsmModMap["PatchTrackerScripts"] = func(_ ...string) proxychain.ResponseModification { + return tx.PatchTrackerScripts() + } - resModMap["RequestWaybackMachine"] = func(_ ...string) proxychain.ResponseModification { - return rx.RequestWaybackMachine() - } + rsmModMap["RewriteHTMLResourceURLs"] = func(_ ...string) proxychain.ResponseModification { + return tx.RewriteHTMLResourceURLs() + } - resModMap["NewCustomDialer"] = func(params, ...string) proxychain.ResponseModification { - return rx.NewCustomDialer(params[0]) - } - - resModMap["ResolveWithGoogleDoH"] = func(_ ...string) proxychain.ResponseModification { - return rx.ResolveWithGoogleDoH() - } - - resModMap["SpoofOrigin"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofOrigin(params[0]) - } - - resModMap["HideOrigin"] = func(_ ...string) proxychain.ResponseModification { - return rx.HideOrigin() - } - - resModMap["SpoofReferrer"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofReferrer(params[0]) - } - - resModMap["HideReferrer"] = func(_ ...string) proxychain.ResponseModification { - return rx.HideReferrer() - } - - resModMap["SpoofReferrerFromBaiduSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromBaiduSearch() - } - - resModMap["SpoofReferrerFromBingSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromBingSearch() - } - - resModMap["SpoofReferrerFromGoogleSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromGoogleSearch() - } - - resModMap["SpoofReferrerFromLinkedInPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromLinkedInPost() - } - - resModMap["SpoofReferrerFromNaverSearch"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromNaverSearch() - } - - resModMap["SpoofReferrerFromPinterestPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromPinterestPost() - } - - resModMap["SpoofReferrerFromQQPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromQQPost() - } - - resModMap["SpoofReferrerFromRedditPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromRedditPost() - } - - resModMap["SpoofReferrerFromTumblrPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromTumblrPost() - } - - resModMap["SpoofReferrerFromTwitterPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromTwitterPost() - } - - resModMap["SpoofReferrerFromVkontaktePost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromVkontaktePost() - } - - resModMap["SpoofReferrerFromWeiboPost"] = func(_ ...string) proxychain.ResponseModification { - return rx.SpoofReferrerFromWeiboPost() - } - - resModMap["SpoofUserAgent"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofUserAgent(params[0]) - } - - resModMap["SpoofXForwardedFor"] = func(params, ...string) proxychain.ResponseModification { - return rx.SpoofXForwardedFor(params[0]) - } - -} +} \ No newline at end of file