[Groonga-commit] groonga/grntest [master] Translater: Fix translate_command to escape http command

Back to archive index

null+****@clear***** null+****@clear*****
2012年 6月 5日 (火) 17:37:25 JST


Haruka Yoshihara	2012-06-05 17:37:25 +0900 (Tue, 05 Jun 2012)

  New Revision: d08c4b5ae94ca06f85c2fb5e52b25868855ab3dd

  Log:
    Translater: Fix translate_command to escape http command

  Modified files:
    lib/groonga/tester.rb
    test/test-executor.rb

  Modified: lib/groonga/tester.rb (+7 -11)
===================================================================
--- lib/groonga/tester.rb    2012-06-05 16:47:53 +0900 (3bfa687)
+++ lib/groonga/tester.rb    2012-06-05 17:37:25 +0900 (77a2cb0)
@@ -620,7 +620,8 @@ module Groonga
         command = command.chomp
         return "" if command.empty?
 
-        return command if command =~ /\A(?!\s+)\W/
+        return command if command =~ /\A\s*\#/
+        return Rack::Utils.escape(command) if command =~ /\A(?!\s+)\W/
 
         now_command, *arguments = Shellwords.split(command)
 
@@ -689,16 +690,11 @@ module Groonga
         end
       end
 
-      def build_http_command(now_command, arguments)
-        translated_command = "/d/#{now_command}"
-        unless arguments.empty?
-          translated_command << "?"
-          query = arguments.collect do |parameter, value|
-            "#{parameter}=#{value}"
-          end
-          translated_command << query.join("&")
-        end
-        translated_command
+      def build_http_command(command, arguments)
+        http_command = "/d/#{command}"
+        query = Rack::Utils.build_query(arguments)
+        http_command << "?#{query}" unless query.empty?
+        http_command
       end
     end
 

  Modified: test/test-executor.rb (+34 -11)
===================================================================
--- test/test-executor.rb    2012-06-05 16:47:53 +0900 (760f09b)
+++ test/test-executor.rb    2012-06-05 17:37:25 +0900 (117bfa9)
@@ -14,6 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 require "stringio"
+require "rack/utils"
 require "groonga/tester"
 
 class TestExecutor < Test::Unit::TestCase
@@ -59,25 +60,29 @@ class TestExecutor < Test::Unit::TestCase
 
     def test_command
       command = "table_create Site TABLE_HASH_KEY ShortText"
-      expected_command =
-        "/d/table_create?name=Site&flags=TABLE_HASH_KEY&key_type=ShortText"
+      arguments = {
+        "name" => "Site",
+        "flags" => "TABLE_HASH_KEY",
+        "key_type" => "ShortText",
+      }
       actual_command = translate(command)
+      expected_command = build_http_command("table_create", arguments)
 
       assert_equal(expected_command, actual_command)
     end
 
     def test_command_with_argument_name
       command = "select --table Sites"
-      expected_command = "/d/select?table=Sites"
       actual_command = translate(command)
+      expected_command = build_http_command("select", "table" => "Sites")
 
       assert_equal(expected_command, actual_command)
     end
 
     def test_command_without_arguments
       command = "dump"
-      expected_command = "/d/dump"
       actual_command = translate(command)
+      expected_command = build_http_command(command, {})
 
       assert_equal(expected_command, actual_command)
     end
@@ -91,14 +96,14 @@ class TestExecutor < Test::Unit::TestCase
 ["razil","http://razil.jp/"]
 ]
 EOF
-      load_values = load_values.chomp
       commands = "#{load_command}\n#{load_values}"
-
-      expected_command = "/d/load?table=Sites&values=\n#{load_values}"
       actual_commands = commands.lines.collect do |line|
         translate(line)
       end
 
+      expected_command = build_http_command("load", "table" => "Sites")
+      expected_command << load_values_query(load_values)
+
       assert_equal(expected_command, actual_commands.join("\n"))
     end
 
@@ -109,21 +114,25 @@ EOF
 {"_key": "ruby", "uri": "http://ruby-lang.org/"}
 ]
 EOF
-      load_values = load_values.chomp
       commands = "#{load_command}\n#{load_values}"
-
-      expected_command = "/d/load?table=Sites&values=\n#{load_values}"
       actual_commands = commands.lines.collect do |line|
         translate(line)
       end
 
+      expected_command = build_http_command("load", "table" => "Sites")
+      expected_command << load_values_query(load_values)
+
       assert_equal(expected_command, actual_commands.join("\n"))
     end
 
     def test_command_with_single_quote
       command = "select Sites --output_columns '_key, uri'"
-      expected_command = "/d/select?table=Sites&output_columns=_key,uri"
+      arguments = {
+        "table" => "Sites",
+        "output_columns" => "_key,uri",
+      }
       actual_command = translate(command)
+      expected_command = build_http_command("select", arguments)
 
       assert_equal(expected_command, actual_command)
     end
@@ -139,5 +148,19 @@ EOF
     def translate(command)
       @translater.translate_command(command)
     end
+
+    def build_http_command(command, arguments)
+      http_command = "/d/#{command}"
+      query = Rack::Utils.build_query(arguments)
+      http_command << "?#{query}" unless query.empty?
+      http_command
+    end
+
+    def load_values_query(values)
+      escaped_values = values.lines.collect do |line|
+        "#{Rack::Utils.escape(line.chomp)}"
+      end
+      "&values=\n#{escaped_values.join("\n")}"
+    end
   end
 end




Groonga-commit メーリングリストの案内
Back to archive index