public NettyChannelBuilder build()

in flight/flight-core/src/main/java/org/apache/arrow/flight/grpc/NettyClientBuilder.java [134:231]


  public NettyChannelBuilder build() {
    final NettyChannelBuilder builder;

    switch (location.getUri().getScheme()) {
      case LocationSchemes.GRPC:
      case LocationSchemes.GRPC_INSECURE:
      case LocationSchemes.GRPC_TLS:
        {
          builder = NettyChannelBuilder.forAddress(location.toSocketAddress());
          break;
        }
      case LocationSchemes.GRPC_DOMAIN_SOCKET:
        {
          // The implementation is platform-specific, so we have to find the classes at runtime
          builder = NettyChannelBuilder.forAddress(location.toSocketAddress());
          try {
            try {
              // Linux
              builder.channelType(
                  Class.forName("io.netty.channel.epoll.EpollDomainSocketChannel")
                      .asSubclass(ServerChannel.class));
              final EventLoopGroup elg =
                  Class.forName("io.netty.channel.epoll.EpollEventLoopGroup")
                      .asSubclass(EventLoopGroup.class)
                      .getDeclaredConstructor()
                      .newInstance();
              builder.eventLoopGroup(elg);
            } catch (ClassNotFoundException e) {
              // BSD
              builder.channelType(
                  Class.forName("io.netty.channel.kqueue.KQueueDomainSocketChannel")
                      .asSubclass(ServerChannel.class));
              final EventLoopGroup elg =
                  Class.forName("io.netty.channel.kqueue.KQueueEventLoopGroup")
                      .asSubclass(EventLoopGroup.class)
                      .getDeclaredConstructor()
                      .newInstance();
              builder.eventLoopGroup(elg);
            }
          } catch (ClassNotFoundException
              | InstantiationException
              | IllegalAccessException
              | NoSuchMethodException
              | InvocationTargetException e) {
            throw new UnsupportedOperationException(
                "Could not find suitable Netty native transport implementation for domain socket address.");
          }
          break;
        }
      default:
        throw new IllegalArgumentException(
            "Scheme is not supported: " + location.getUri().getScheme());
    }

    if (this.forceTls || LocationSchemes.GRPC_TLS.equals(location.getUri().getScheme())) {
      builder.useTransportSecurity();

      final boolean hasTrustedCerts = this.trustedCertificates != null;
      final boolean hasKeyCertPair = this.clientCertificate != null && this.clientKey != null;
      if (!this.verifyServer && (hasTrustedCerts || hasKeyCertPair)) {
        throw new IllegalArgumentException(
            "FlightClient has been configured to disable server verification, "
                + "but certificate options have been specified.");
      }

      final SslContextBuilder sslContextBuilder = GrpcSslContexts.forClient();

      if (!this.verifyServer) {
        sslContextBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE);
      } else if (this.trustedCertificates != null
          || this.clientCertificate != null
          || this.clientKey != null) {
        if (this.trustedCertificates != null) {
          sslContextBuilder.trustManager(this.trustedCertificates);
        }
        if (this.clientCertificate != null && this.clientKey != null) {
          sslContextBuilder.keyManager(this.clientCertificate, this.clientKey);
        }
      }
      try {
        builder.sslContext(sslContextBuilder.build());
      } catch (SSLException e) {
        throw new RuntimeException(e);
      }

      if (this.overrideHostname != null) {
        builder.overrideAuthority(this.overrideHostname);
      }
    } else {
      builder.usePlaintext();
    }

    builder
        .maxTraceEvents(MAX_CHANNEL_TRACE_EVENTS)
        .maxInboundMessageSize(maxInboundMessageSize)
        .maxInboundMetadataSize(maxInboundMessageSize);
    return builder;
  }