(wr http.ResponseWriter, req *http.Request, username string)
| 166 | } |
| 167 | |
| 168 | func (s *ProxyHandler) HandleRequest(wr http.ResponseWriter, req *http.Request, username string) { |
| 169 | req.RequestURI = "" |
| 170 | forwardReqBody := newH1ReqBodyPipe() |
| 171 | origBody := req.Body |
| 172 | req.Body = forwardReqBody.Body() |
| 173 | address := addressFromURL(req.URL) |
| 174 | go func() { |
| 175 | s.forward(req.Context(), username, wrapH1ReqBody(origBody), forwardReqBody, "tcp", address) |
| 176 | }() |
| 177 | if req.ProtoMajor == 2 { |
| 178 | req.URL.Scheme = "http" // We can't access :scheme pseudo-header, so assume http |
| 179 | req.URL.Host = req.Host |
| 180 | } |
| 181 | resp, err := s.httptransport.RoundTrip(req) |
| 182 | if err != nil { |
| 183 | var accessErr derrors.ErrAccessDenied |
| 184 | if errors.As(err, &accessErr) { |
| 185 | s.logger.Warning("Access denied: %v", err) |
| 186 | s.rejectAccess(wr, req) |
| 187 | return |
| 188 | } |
| 189 | s.logger.Error("HTTP fetch error: %v", err) |
| 190 | http.Error(wr, "Server Error", http.StatusInternalServerError) |
| 191 | return |
| 192 | } |
| 193 | defer resp.Body.Close() |
| 194 | s.logger.Info("%v %v %v %v", req.RemoteAddr, req.Method, req.URL, resp.Status) |
| 195 | delHopHeaders(resp.Header) |
| 196 | copyHeader(wr.Header(), resp.Header) |
| 197 | wr.WriteHeader(resp.StatusCode) |
| 198 | flush(wr) |
| 199 | s.forward(req.Context(), username, wrapH1RespWriter(wr), wrapH1ReqBody(resp.Body), "tcp", address) |
| 200 | } |
| 201 | |
| 202 | func (s *ProxyHandler) HandleGetRandom(wr http.ResponseWriter, req *http.Request, username string) { |
| 203 | if len(req.URL.Path) <= 1 || req.URL.Path[0] != '/' { |
no test coverage detected