func (proxy *Proxy) ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) { startedAt := time.Now() originalURL := request.URL request.URL = &url.URL{Host: originalURL.Host, Opaque: request.RequestURI} handler := NewRequestHandler(request, responseWriter) accessLog := access_log.AccessLogRecord{ Request: request, StartedAt: startedAt, } defer func() { proxy.AccessLogger.Log(accessLog) }() if !isProtocolSupported(request) { handler.HandleUnsupportedProtocol() return } if isLoadBalancerHeartbeat(request) { handler.HandleHeartbeat() return } routeEndpoint, found := proxy.Lookup(request) if !found { proxy.Varz.CaptureBadRequest(request) handler.HandleMissingRoute() return } handler.logger.Set("RouteEndpoint", routeEndpoint.ToLogData()) accessLog.RouteEndpoint = routeEndpoint proxy.Varz.CaptureRoutingRequest(routeEndpoint, handler.request) if isTcpUpgrade(request) { handler.HandleTcpRequest(routeEndpoint) return } if isWebSocketUpgrade(request) { handler.HandleWebSocketRequest(routeEndpoint) return } endpointResponse, err := handler.HandleHttpRequest(proxy.Transport, routeEndpoint) latency := time.Since(startedAt) proxy.Registry.CaptureRoutingRequest(routeEndpoint, startedAt) proxy.Varz.CaptureRoutingResponse(routeEndpoint, endpointResponse, latency) if err != nil { proxy.Varz.CaptureBadGateway(request) handler.HandleBadGateway(err) return } accessLog.FirstByteAt = time.Now() accessLog.Response = endpointResponse if proxy.Config.TraceKey != "" && request.Header.Get(VcapTraceHeader) == proxy.Config.TraceKey { handler.SetTraceHeaders(proxy.Config.Ip, routeEndpoint.CanonicalAddr()) } bytesSent := handler.WriteResponse(endpointResponse) accessLog.FinishedAt = time.Now() accessLog.BodyBytesSent = bytesSent }