(req *http.Request)
| 139 | } |
| 140 | |
| 141 | func (p *ProxyServer) modifyRequest(req *http.Request) { |
| 142 | target := *p.Target |
| 143 | isProxyUrl := req.URL.Query().Get("forward_url") != "" |
| 144 | |
| 145 | if isProxyUrl { |
| 146 | if unescapeUrl, err := url.QueryUnescape(strings.TrimLeft(req.URL.RawQuery, "forward_url=")); err == nil { |
| 147 | if u, err := url.Parse(unescapeUrl); err == nil { |
| 148 | if u.Scheme == "" { |
| 149 | if p.UseSSL { |
| 150 | u.Scheme = "https" |
| 151 | } else { |
| 152 | u.Scheme = "http" |
| 153 | } |
| 154 | } |
| 155 | target = *u |
| 156 | } |
| 157 | } |
| 158 | } else if req.Header.Get(headerXProxyTarget) != "" { |
| 159 | targetUrl := req.Header.Get(headerXProxyTarget) |
| 160 | |
| 161 | if u, err := url.Parse(targetUrl); err == nil { |
| 162 | if u.Scheme == "" { |
| 163 | if p.UseSSL { |
| 164 | u.Scheme = "https" |
| 165 | } else { |
| 166 | u.Scheme = "http" |
| 167 | } |
| 168 | } |
| 169 | target = *u |
| 170 | } |
| 171 | } |
| 172 | |
| 173 | req.Header.Set(headerXOriginHost, req.Host) |
| 174 | req.Host = target.Host |
| 175 | if isProxyUrl { |
| 176 | req.URL = &target |
| 177 | } else { |
| 178 | req.URL.Host = target.Host |
| 179 | req.URL.Scheme = target.Scheme |
| 180 | } |
| 181 | |
| 182 | log.Printf("[%s]: %s", req.Method, req.URL.String()) |
| 183 | |
| 184 | req.Header.Set("Host", target.Host) |
| 185 | req.Header.Set("Origin", fmt.Sprintf("%s://%s", target.Scheme, target.Host)) |
| 186 | req.Header.Set("Referrer", fmt.Sprintf("%s://%s%s", target.Scheme, target.Host, req.URL.RawPath)) |
| 187 | req.Header.Set("X-Real-IP", req.RemoteAddr) |
| 188 | |
| 189 | for k := range p.ReqHeaders { |
| 190 | req.Header.Add(k, p.ReqHeaders.Get(k)) |
| 191 | } |
| 192 | } |
| 193 | |
| 194 | func (p *ProxyServer) modifyContent(extNames []string, body []byte, originHost string, proxyHost string) []byte { |
| 195 | bodyStr := string(body) |
no test coverage detected