123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package dpcore
- import (
- "net"
- "net/http"
- "strings"
- )
- /*
- Header.go
- This script handles headers rewrite and remove
- in dpcore.
- Added in Zoraxy v3.0.6 by tobychui
- */
- // removeHeaders Remove hop-by-hop headers listed in the "Connection" header, Remove hop-by-hop headers.
- func removeHeaders(header http.Header, noCache bool) {
- // Remove hop-by-hop headers listed in the "Connection" header.
- if c := header.Get("Connection"); c != "" {
- for _, f := range strings.Split(c, ",") {
- if f = strings.TrimSpace(f); f != "" {
- header.Del(f)
- }
- }
- }
- // Remove hop-by-hop headers
- for _, h := range hopHeaders {
- if header.Get(h) != "" {
- header.Del(h)
- }
- }
- //Restore the Upgrade header if any
- if header.Get("Zr-Origin-Upgrade") != "" {
- header.Set("Upgrade", header.Get("Zr-Origin-Upgrade"))
- header.Del("Zr-Origin-Upgrade")
- }
- //Disable cache if nocache is set
- if noCache {
- header.Del("Cache-Control")
- header.Set("Cache-Control", "no-store")
- }
- }
- // rewriteUserAgent rewrite the user agent based on incoming request
- func rewriteUserAgent(header http.Header, UA string) {
- //Hide Go-HTTP-Client UA if the client didnt sent us one
- if header.Get("User-Agent") == "" {
- // If the outbound request doesn't have a User-Agent header set,
- // don't send the default Go HTTP client User-Agent
- header.Del("User-Agent")
- header.Set("User-Agent", UA)
- }
- }
- // Add X-Forwarded-For Header and rewrite X-Real-Ip according to sniffing logics
- func addXForwardedForHeader(req *http.Request) {
- if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
- // If we aren't the first proxy retain prior
- // X-Forwarded-For information as a comma+space
- // separated list and fold multiple headers into one.
- if prior, ok := req.Header["X-Forwarded-For"]; ok {
- clientIP = strings.Join(prior, ", ") + ", " + clientIP
- }
- req.Header.Set("X-Forwarded-For", clientIP)
- if req.TLS != nil {
- req.Header.Set("X-Forwarded-Proto", "https")
- } else {
- req.Header.Set("X-Forwarded-Proto", "http")
- }
- if req.Header.Get("X-Real-Ip") == "" {
- //Check if CF-Connecting-IP header exists
- CF_Connecting_IP := req.Header.Get("CF-Connecting-IP")
- Fastly_Client_IP := req.Header.Get("Fastly-Client-IP")
- if CF_Connecting_IP != "" {
- //Use CF Connecting IP
- req.Header.Set("X-Real-Ip", CF_Connecting_IP)
- } else if Fastly_Client_IP != "" {
- //Use Fastly Client IP
- req.Header.Set("X-Real-Ip", Fastly_Client_IP)
- } else {
- // Not exists. Fill it in with first entry in X-Forwarded-For
- ips := strings.Split(clientIP, ",")
- if len(ips) > 0 {
- req.Header.Set("X-Real-Ip", strings.TrimSpace(ips[0]))
- }
- }
- }
- }
- }
- // injectUserDefinedHeaders inject the user headers from slice
- // if a value is empty string, the key will be removed from header.
- // if a key is empty string, the function will return immediately
- func injectUserDefinedHeaders(header http.Header, userHeaders [][]string) {
- for _, userHeader := range userHeaders {
- if len(userHeader) == 0 {
- //End of header slice
- return
- }
- headerKey := userHeader[0]
- headerValue := userHeader[1]
- if headerValue == "" {
- //Remove header from head
- header.Del(headerKey)
- continue
- }
- //Default: Set header value
- header.Del(headerKey) //Remove header if it already exists
- header.Set(headerKey, headerValue)
- }
- }
|