108 lines
3.1 KiB
Go
108 lines
3.1 KiB
Go
package responsemodifers
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
http "github.com/bogdanfinn/fhttp"
|
|
//"net/http"
|
|
//http "github.com/Danny-Dasilva/fhttp"
|
|
|
|
"ladder/proxychain"
|
|
)
|
|
|
|
// DeleteIncomingCookies prevents ALL cookies from being sent from the proxy server
|
|
// back down to the client.
|
|
func DeleteIncomingCookies(_ ...string) proxychain.ResponseModification {
|
|
return func(px *proxychain.ProxyChain) error {
|
|
px.Response.Header.Del("Set-Cookie")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// DeleteIncomingCookiesExcept 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 DeleteIncomingCookiesExcept(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]
|
|
}
|
|
|
|
// SetIncomingCookies adds a raw cookie string being sent from the proxy server down to the client
|
|
func SetIncomingCookies(cookies string) proxychain.ResponseModification {
|
|
return func(px *proxychain.ProxyChain) error {
|
|
px.Response.Header.Set("Set-Cookie", cookies)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// SetIncomingCookie modifies a specific cookie in the response from the proxy server to the client.
|
|
func SetIncomingCookie(name string, val string) proxychain.ResponseModification {
|
|
return func(px *proxychain.ProxyChain) error {
|
|
if px.Response.Header == nil {
|
|
return nil
|
|
}
|
|
|
|
updatedCookies := []string{}
|
|
found := false
|
|
|
|
// Iterate over existing cookies and modify the one that matches the cookieName
|
|
for _, cookieStr := range px.Response.Header["Set-Cookie"] {
|
|
cookie := parseCookie(cookieStr)
|
|
if cookie.Name == name {
|
|
// Replace the cookie with the new value
|
|
updatedCookies = append(updatedCookies, fmt.Sprintf("%s=%s", name, val))
|
|
found = true
|
|
} else {
|
|
// Keep the cookie as is
|
|
updatedCookies = append(updatedCookies, cookieStr)
|
|
}
|
|
}
|
|
|
|
// If the specified cookie wasn't found, add it
|
|
if !found {
|
|
updatedCookies = append(updatedCookies, fmt.Sprintf("%s=%s", name, val))
|
|
}
|
|
|
|
// Update the Set-Cookie header
|
|
px.Response.Header["Set-Cookie"] = updatedCookies
|
|
|
|
return nil
|
|
}
|
|
}
|