98 lines
2.7 KiB
Go
98 lines
2.7 KiB
Go
package requestmodifers
|
|
|
|
import (
|
|
"ladder/proxychain"
|
|
"net/http"
|
|
)
|
|
|
|
// SetOutgoingCookie modifes a specific cookie name
|
|
// by modifying the request cookie headers going to the upstream server.
|
|
// If the cookie name does not already exist, it is created.
|
|
func SetOutgoingCookie(name string, val string) proxychain.RequestModification {
|
|
return func(chain *proxychain.ProxyChain) error {
|
|
cookies := chain.Request.Cookies()
|
|
hasCookie := false
|
|
for _, cookie := range cookies {
|
|
if cookie.Name != name {
|
|
continue
|
|
}
|
|
hasCookie = true
|
|
cookie.Value = val
|
|
}
|
|
|
|
if hasCookie {
|
|
return nil
|
|
}
|
|
|
|
chain.Request.AddCookie(&http.Cookie{
|
|
Domain: chain.Request.URL.Host,
|
|
Name: name,
|
|
Value: val,
|
|
})
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// SetOutgoingCookies modifies a client request's cookie header
|
|
// to a raw Cookie string, overwriting existing cookies
|
|
func SetOutgoingCookies(cookies string) proxychain.RequestModification {
|
|
return func(chain *proxychain.ProxyChain) error {
|
|
chain.Request.Header.Set("Cookies", cookies)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// DeleteOutgoingCookie modifies the http request's cookies header to
|
|
// delete a specific request cookie going to the upstream server.
|
|
// If the cookie does not exist, it does not do anything.
|
|
func DeleteOutgoingCookie(name string) proxychain.RequestModification {
|
|
return func(chain *proxychain.ProxyChain) error {
|
|
cookies := chain.Request.Cookies()
|
|
chain.Request.Header.Del("Cookies")
|
|
|
|
for _, cookie := range cookies {
|
|
if cookie.Name == name {
|
|
chain.Request.AddCookie(cookie)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// DeleteOutgoingCookies removes the cookie header entirely,
|
|
// preventing any cookies from reaching the upstream server.
|
|
func DeleteOutgoingCookies() proxychain.RequestModification {
|
|
return func(px *proxychain.ProxyChain) error {
|
|
px.Request.Header.Del("Cookie")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// DeleteOutGoingCookiesExcept prevents non-whitelisted cookies from being sent from the client
|
|
// to the upstream proxy server. Cookies whose names are in the whitelist are not removed.
|
|
func DeleteOutgoingCookiesExcept(whitelist ...string) proxychain.RequestModification {
|
|
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{}{}
|
|
}
|
|
|
|
// Get all cookies from the request header
|
|
cookies := px.Request.Cookies()
|
|
|
|
// Clear the original Cookie header
|
|
px.Request.Header.Del("Cookie")
|
|
|
|
// Re-add cookies that are in the whitelist
|
|
for _, cookie := range cookies {
|
|
if _, found := whitelistMap[cookie.Name]; found {
|
|
px.Request.AddCookie(cookie)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
}
|