begin refactor of proxy engine
This commit is contained in:
58
proxychain/rsm/block_incoming_cookies.go
Normal file
58
proxychain/rsm/block_incoming_cookies.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package rsm // ReSponseModifers
|
||||
|
||||
import (
|
||||
"ladder/proxychain"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// BlockIncomingCookies prevents ALL cookies from being sent from the proxy server
|
||||
// to the client.
|
||||
func BlockIncomingCookies(whitelist ...string) proxychain.ResponseModification {
|
||||
return func(px *proxychain.ProxyChain) error {
|
||||
px.Response.Header.Del("Set-Cookie")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// BlockIncomingCookiesExcept prevents non-whitelisted cookies from being sent from the proxy server
|
||||
// to the client. Cookies whose names are in the whitelist are not removed.
|
||||
func BlockIncomingCookiesExcept(whitelist ...string) proxychain.ResponseModification {
|
||||
return func(px *proxychain.ProxyChain) error {
|
||||
// Convert whitelist slice to a map for efficient lookups
|
||||
whitelistMap := make(map[string]struct{})
|
||||
for _, cookieName := range whitelist {
|
||||
whitelistMap[cookieName] = struct{}{}
|
||||
}
|
||||
|
||||
// If the response has no cookies, return early
|
||||
if px.Response.Header == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Filter the cookies in the response
|
||||
filteredCookies := []string{}
|
||||
for _, cookieStr := range px.Response.Header["Set-Cookie"] {
|
||||
cookie := parseCookie(cookieStr)
|
||||
if _, found := whitelistMap[cookie.Name]; found {
|
||||
filteredCookies = append(filteredCookies, cookieStr)
|
||||
}
|
||||
}
|
||||
|
||||
// Update the Set-Cookie header with the filtered cookies
|
||||
if len(filteredCookies) > 0 {
|
||||
px.Response.Header["Set-Cookie"] = filteredCookies
|
||||
} else {
|
||||
px.Response.Header.Del("Set-Cookie")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// parseCookie parses a cookie string and returns an http.Cookie object.
|
||||
func parseCookie(cookieStr string) *http.Cookie {
|
||||
header := http.Header{}
|
||||
header.Add("Set-Cookie", cookieStr)
|
||||
request := http.Request{Header: header}
|
||||
return request.Cookies()[0]
|
||||
}
|
||||
20
proxychain/rsm/bypass_cors.go
Normal file
20
proxychain/rsm/bypass_cors.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package rsm // ReSponseModifers
|
||||
|
||||
import (
|
||||
"ladder/proxychain"
|
||||
)
|
||||
|
||||
// BypassCORs modifies response headers to prevent the browser
|
||||
// from enforcing any CORS restrictions
|
||||
func BypassCORS() proxychain.ResponseModification {
|
||||
return func(px *proxychain.ProxyChain) error {
|
||||
px.AddResultModifications(
|
||||
ModifyResponseHeader("Access-Control-Allow-Origin", "*"),
|
||||
ModifyResponseHeader("Access-Control-Expose-Headers", "*"),
|
||||
ModifyResponseHeader("Access-Control-Allow-Credentials", "true"),
|
||||
ModifyResponseHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH"),
|
||||
DeleteResponseHeader("X-Frame-Options"),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
19
proxychain/rsm/bypass_csp.go
Normal file
19
proxychain/rsm/bypass_csp.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package rsm // ReSponseModifers
|
||||
|
||||
import (
|
||||
"ladder/proxychain"
|
||||
)
|
||||
|
||||
// BypassCSP modifies response headers to prevent the browser
|
||||
// from enforcing any CORS restrictions
|
||||
func BypassCSP() proxychain.ResponseModification {
|
||||
return func(px *proxychain.ProxyChain) error {
|
||||
px.AddResultModifications(
|
||||
ModifyResponseHeader("Access-Control-Allow-Origin", "*"),
|
||||
ModifyResponseHeader("Access-Control-Expose-Headers", "*"),
|
||||
ModifyResponseHeader("Access-Control-Allow-Credentials", "true"),
|
||||
ModifyResponseHeader("Access-Control-Allow-Methods", ""),
|
||||
)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
26
proxychain/rsm/modify_response_header.go
Normal file
26
proxychain/rsm/modify_response_header.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package rsm // ReSponseModifers
|
||||
|
||||
import (
|
||||
"ladder/proxychain"
|
||||
)
|
||||
|
||||
// ModifyResponseHeader modifies response headers from the upstream server
|
||||
// if value is "", then the response header is deleted.
|
||||
func ModifyResponseHeader(key string, value string) proxychain.ResponseModification {
|
||||
return func(px *proxychain.ProxyChain) error {
|
||||
if value == "" {
|
||||
px.Context.Response().Header.Del(key)
|
||||
return nil
|
||||
}
|
||||
px.Context.Response().Header.Set(key, value)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// DeleteResponseHeader removes response headers from the upstream server
|
||||
func DeleteResponseHeader(key string) proxychain.ResponseModification {
|
||||
return func(px *proxychain.ProxyChain) error {
|
||||
px.Context.Response().Header.Del(key)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user