コード例 #1
0
ファイル: proxy.go プロジェクト: ninglipeng/gorouter
func (p *proxyRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) {
	var err error
	var res *http.Response
	var endpoint *route.Endpoint
	retry := 0
	for {
		endpoint = p.iter.Next()

		if endpoint == nil {
			p.handler.reporter.CaptureBadGateway(request)
			err = noEndpointsAvailable
			p.handler.HandleBadGateway(err)
			return nil, err
		}

		request.URL.Host = endpoint.CanonicalAddr()
		request.Header.Set("X-CF-ApplicationID", endpoint.CanonicalAddr())
		setRequestXCfInstanceId(request, endpoint)

		res, err = p.transport.RoundTrip(request)
		if err == nil {
			break
		}

		if ne, netErr := err.(*net.OpError); !netErr || ne.Op != "dial" {
			break
		}

		p.iter.EndpointFailed()

		p.handler.Logger().Set("Error", err.Error())
		p.handler.Logger().Warnf("proxy.endpoint.failed")

		retry++
		if retry == retries {
			break
		}
	}

	if p.after != nil {
		p.after(res, endpoint, err)
	}

	p.response = res
	p.err = err

	return res, err
}
コード例 #2
0
func setRequestXCfInstanceId(request *http.Request, endpoint *route.Endpoint) {
	value := endpoint.CanonicalAddr()

	request.Header.Set(router_http.CfInstanceIdHeader, value)
}
コード例 #3
0
ファイル: varz.go プロジェクト: ninglipeng/gorouter
func (x *RealVarz) CaptureAppStats(b *route.Endpoint, t time.Time) {
	if b.CanonicalAddr() != "" {
		x.activeApps.Mark(b.CanonicalAddr(), t)
		x.topApps.Mark(b.CanonicalAddr(), t)
	}
}
コード例 #4
0
func (h *RequestHandler) setupRequest(endpoint *route.Endpoint) {
	h.setRequestURL(endpoint.CanonicalAddr())
	h.setRequestXForwardedFor()
	setRequestXRequestStart(h.request)
	setRequestXVcapRequestId(h.request, h.logger)
}