From 7432cc7fa4d275d6e0f57b672a0677358fc538a6 Mon Sep 17 00:00:00 2001
From: Sutou Kouhei <kou@clear-code.com>
Date: Fri, 5 May 2023 12:57:05 +0900
Subject: [PATCH] GH-35435: [Ruby][Flight] Add
 ArrowFlight::Client#authenticate_basic (#35436)

### Rationale for this change

`ArrowFlight::Client#authenticate_basic_token` is inconvenient because users need to set a returned Bearer token manually.

### What changes are included in this PR?

Adds a convenient method for a common Basic authentication use case.

### Are these changes tested?

Yes.

### Are there any user-facing changes?

Yes.
* Closes: #35435

Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
---
 .../lib/arrow-flight/client.rb                | 51 +++++++++++++++++++
 .../lib/arrow-flight/loader.rb                |  1 +
 2 files changed, 52 insertions(+)
 create mode 100644 ruby/red-arrow-flight/lib/arrow-flight/client.rb

diff --git a/ruby/red-arrow-flight/lib/arrow-flight/client.rb b/ruby/red-arrow-flight/lib/arrow-flight/client.rb
new file mode 100644
index 0000000000000..ad45a4e403559
--- /dev/null
+++ b/ruby/red-arrow-flight/lib/arrow-flight/client.rb
@@ -0,0 +1,51 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+module ArrowFlight
+  class Client
+    # Authenticates by Basic authentication.
+    #
+    # @param user [String] User name to be used.
+    # @param password [String] Password to be used.
+    # @param options [ArrowFlight::CallOptions, Hash, nil] (nil)
+    #   The options to be used.
+    #
+    # @return [ArrowFlight::CallOptions] The options that can be used
+    #   for following calls. It includes Bearer token for @user.
+    #
+    #   If @options is an ArrowFlight::CallOptions, the given @options
+    #   is returned with Bearer token.
+    #
+    #   If @options isn't an ArrowFlight::CallOptions, a new
+    #   ArrowFlight::CallOptions is created and it's returned.
+    #
+    # @since 13.0.0
+    def authenticate_basic(user, password, options=nil)
+      unless options.is_a?(CallOptions)
+        options = CallOptions.try_convert(options)
+      end
+      options ||= CallOptions.new
+      _success, bearer_name, bearer_value =
+        authenticate_basic_token(user, password, options)
+      invalid_bearer = (bearer_name.empty? or bearer_value.empty?)
+      unless invalid_bearer
+        options.add_header(bearer_name, bearer_value)
+      end
+      options
+    end
+  end
+end
diff --git a/ruby/red-arrow-flight/lib/arrow-flight/loader.rb b/ruby/red-arrow-flight/lib/arrow-flight/loader.rb
index 4fb88d4296cbd..042e15769368e 100644
--- a/ruby/red-arrow-flight/lib/arrow-flight/loader.rb
+++ b/ruby/red-arrow-flight/lib/arrow-flight/loader.rb
@@ -30,6 +30,7 @@ def post_load(repository, namespace)
 
     def require_libraries
       require "arrow-flight/call-options"
+      require "arrow-flight/client"
       require "arrow-flight/client-options"
       require "arrow-flight/location"
       require "arrow-flight/record-batch-reader"