Пример #1
0
// HandleStreamingRPC is an internal method. Do not use!
func (server *Server) HandleStreamingRPC(
	grpcStream core.LeverRPC_HandleStreamingRPCServer) error {
	ctx := grpcStream.Context()
	err := setInternalRPCGateway(ctx)
	if err != nil {
		return err
	}
	leverURL, err := extractLeverURL(ctx)
	if err != nil {
		return err
	}

	fstMsg, err := grpcStream.Recv()
	if err != nil {
		return err
	}
	rpc := fstMsg.GetRpc()
	if rpc == nil {
		return fmt.Errorf("First message needs to have RPC field set")
	}
	if rpc.GetArgsOneof() == nil {
		return fmt.Errorf("RPC has no args oneof")
	}
	// Reply with an empty msg (first response message must be empty).
	grpcStream.Send(&core.StreamMessage{})

	server.lock.RLock()
	entry, handlerOK := server.streamingHandlers[leverURL.Method]
	resourceOK := true
	if leverURL.Resource != "" {
		_, resourceOK = server.resources[leverURL.Resource]
	}
	server.lock.RUnlock()
	if !handlerOK {
		return fmt.Errorf("Method not found")
	}
	if !resourceOK {
		return fmt.Errorf("Resource not found")
	}

	_, err = callHandler(ctx, leverURL.Resource, entry, rpc, grpcStream)
	return err
}