in pkg/common/grpc/manager.go [61:105]
func (gcm *GrpcConnectionManager) ServeHTTP(w stdHttp.ResponseWriter, r *stdHttp.Request) {
ra, err := gcm.routerCoordinator.RouteByPathAndName(r.RequestURI, r.Method)
if err != nil {
logger.Infof("GrpcConnectionManager can't find route %v", err)
gcm.writeStatus(w, status.New(codes.NotFound, fmt.Sprintf("proxy can't find route error = %v", err)))
return
}
logger.Debugf("[dubbo-go-pixiu] client choose endpoint from cluster :%v", ra.Cluster)
clusterName := ra.Cluster
clusterManager := server.GetClusterManager()
endpoint := clusterManager.PickEndpoint(clusterName, &http.HttpContext{Request: r})
if endpoint == nil {
logger.Infof("GrpcConnectionManager can't find endpoint in cluster")
gcm.writeStatus(w, status.New(codes.Unknown, "can't find endpoint in cluster"))
return
}
ctx := context.Background()
// timeout
ctx, cancel := context.WithTimeout(ctx, gcm.config.Timeout)
defer cancel()
newReq := r.Clone(ctx)
newReq.URL.Scheme = "http"
newReq.URL.Host = endpoint.Address.GetAddress()
// todo: need cache?
forwarder := gcm.newHttpForwarder()
res, err := forwarder.Forward(newReq)
if err != nil {
logger.Infof("GrpcConnectionManager forward request error %v", err)
if err == context.DeadlineExceeded {
gcm.writeStatus(w, status.New(codes.DeadlineExceeded, fmt.Sprintf("forward timeout error = %v", err)))
return
}
gcm.writeStatus(w, status.New(codes.Unknown, fmt.Sprintf("forward error not = %v", err)))
return
}
if err := gcm.response(w, res); err != nil {
logger.Infof("GrpcConnectionManager response error %v", err)
}
}