[Groonga-commit] groonga/groonga [master] Support "; " as a query parameter separator

Back to archive index

null+****@clear***** null+****@clear*****
2012年 7月 8日 (日) 18:46:05 JST


Kouhei Sutou	2012-07-08 18:46:05 +0900 (Sun, 08 Jul 2012)

  New Revision: bb6af7e0e3e8c8cb9bfef6a9ea70488f26a984e1
  https://github.com/groonga/groonga/commit/bb6af7e0e3e8c8cb9bfef6a9ea70488f26a984e1

  Log:
    Support ";" as a query parameter separator
    
    fixes #1406
    
    Suggested by IWAI, Masaharu. Thanks!!!

  Modified files:
    lib/ctx.c
    lib/str.c
    lib/str.h
    test/unit/util/test-string.c

  Modified: lib/ctx.c (+4 -4)
===================================================================
--- lib/ctx.c    2012-07-08 17:33:21 +0900 (070c1a4)
+++ lib/ctx.c    2012-07-08 18:46:05 +0900 (5920a0b)
@@ -1215,18 +1215,18 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
     while (p < e) {
       int l;
       GRN_BULK_REWIND(&buf);
-      p = grn_text_cgidec(ctx, &buf, p, e, '=');
+      p = grn_text_cgidec(ctx, &buf, p, e, "=");
       v = GRN_TEXT_VALUE(&buf);
       l = GRN_TEXT_LEN(&buf);
       if (l == OUTPUT_TYPE_LEN && !memcmp(v, OUTPUT_TYPE, OUTPUT_TYPE_LEN)) {
         GRN_BULK_REWIND(&buf);
-        p = grn_text_cgidec(ctx, &buf, p, e, '&');
+        p = grn_text_cgidec(ctx, &buf, p, e, "&;");
         v = GRN_TEXT_VALUE(&buf);
         get_content_mime_type(ctx, v, GRN_BULK_CURR(&buf));
       } else if (l == COMMAND_VERSION_LEN &&
                  !memcmp(v, COMMAND_VERSION, COMMAND_VERSION_LEN)) {
         GRN_BULK_REWIND(&buf);
-        p = grn_text_cgidec(ctx, &buf, p, e, '&');
+        p = grn_text_cgidec(ctx, &buf, p, e, "&;");
         get_command_version(ctx, GRN_TEXT_VALUE(&buf), GRN_BULK_CURR(&buf));
         if (ctx->rc) { goto exit; }
       } else {
@@ -1234,7 +1234,7 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
           val = &buf;
         }
         grn_obj_reinit(ctx, val, GRN_DB_TEXT, 0);
-        p = grn_text_cgidec(ctx, val, p, e, '&');
+        p = grn_text_cgidec(ctx, val, p, e, "&;");
       }
     }
     ctx->impl->curr_expr = expr;

  Modified: lib/str.c (+16 -4)
===================================================================
--- lib/str.c    2012-07-08 17:33:21 +0900 (be15102)
+++ lib/str.c    2012-07-08 18:46:05 +0900 (9a0c40d)
@@ -3176,12 +3176,24 @@ grn_text_urldec(grn_ctx *ctx, grn_obj *buf, const char *p, const char *e, char d
 }
 
 const char *
-grn_text_cgidec(grn_ctx *ctx, grn_obj *buf, const char *p, const char *e, char d)
+grn_text_cgidec(grn_ctx *ctx, grn_obj *buf, const char *p, const char *e,
+                const char *delimiters)
 {
   while (p < e) {
-    if (*p == d) {
-      p++; break;
-    } else if (*p == '+') {
+    grn_bool found_delimiter = GRN_FALSE;
+    const char *delimiter;
+    for (delimiter = delimiters; *delimiter; delimiter++) {
+      if (*p == *delimiter) {
+        found_delimiter = GRN_TRUE;
+        break;
+      }
+    }
+    if (found_delimiter) {
+      p++;
+      break;
+    }
+
+    if (*p == '+') {
       GRN_TEXT_PUTC(ctx, buf, ' ');
       p++;
     } else if (*p == '%' && p + 3 <= e) {

  Modified: lib/str.h (+2 -1)
===================================================================
--- lib/str.h    2012-07-08 17:33:21 +0900 (e4413ce)
+++ lib/str.h    2012-07-08 18:46:05 +0900 (7bcb955)
@@ -101,7 +101,8 @@ GRN_API grn_str *grn_str_open_(grn_ctx *ctx, const char *str, unsigned int str_l
 grn_rc grn_text_ulltoa(grn_ctx *ctx, grn_obj *buf, unsigned long long int i);
 
 GRN_API const char *grn_text_cgidec(grn_ctx *ctx, grn_obj *buf,
-                                    const char *p, const char *e, char d);
+                                    const char *p, const char *e,
+                                    const char *delimiters);
 
 #define GRN_TOK_VOID                   (0x00)
 #define GRN_TOK_SYMBOL                 (0x01)

  Modified: test/unit/util/test-string.c (+11 -8)
===================================================================
--- test/unit/util/test-string.c    2012-07-08 17:33:21 +0900 (a87d3c5)
+++ test/unit/util/test-string.c    2012-07-08 18:46:05 +0900 (de2621c)
@@ -1,6 +1,6 @@
 /* -*- c-basic-offset: 2; coding: utf-8 -*- */
 /*
-  Copyright (C) 2008-2011  Kouhei Sutou <kou****@clear*****>
+  Copyright (C) 2008-2012  Kouhei Sutou <kou****@clear*****>
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -415,20 +415,23 @@ test_urldec(gconstpointer data)
 void
 data_cgidec(void)
 {
-#define ADD_DATUM(label, expected, input, input_length, end_char)       \
+#define ADD_DATUM(label, expected, input, input_length, delimiter)      \
   gcut_add_datum(label,                                                 \
                  "expected", G_TYPE_STRING, expected,                   \
                  "input", G_TYPE_STRING, input,                         \
                  "input-length", G_TYPE_INT, input_length,              \
-                 "end-char", G_TYPE_CHAR, end_char,                     \
+                 "delimiter", G_TYPE_STRING, delimiter,                 \
                  NULL)
 
+  ADD_DATUM("?", "/d/select?table=users&limit=10", "/d/select", -1, "?");
+  ADD_DATUM("&", "table=users&limit=10", "table=users", -1, "&;");
+  ADD_DATUM(";", "table=users;limit=10", "table=users", -1, "&;");
   ADD_DATUM("Japanese",
             " 日本語です。 ",
             "+%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%81%a7%e3%81%99%e3%80%82+$yo",
             -1,
-            '$');
-  ADD_DATUM("invalid", "%1%2%3", "%1%2%3", -1, '\0');
+            "$");
+  ADD_DATUM("invalid", "%1%2%3", "%1%2%3", -1, "");
 
 #undef ADD_DATUM
 }
@@ -439,19 +442,19 @@ test_cgidec(gconstpointer data)
   grn_obj buffer;
   const gchar *expected, *input;
   gint input_length;
-  gchar end_char;
+  const gchar *delimiter;
 
   expected = gcut_data_get_string(data, "expected");
   input = gcut_data_get_string(data, "input");
   input_length = gcut_data_get_int(data, "input-length");
-  end_char = gcut_data_get_char(data, "end-char");
+  delimiter = gcut_data_get_string(data, "delimiter");
 
   if (input_length < 0) {
     input_length = strchr(input, '\0') - input;
   }
 
   GRN_TEXT_INIT(&buffer, 0);
-  grn_text_cgidec(&context, &buffer, input, input + input_length, end_char);
+  grn_text_cgidec(&context, &buffer, input, input + input_length, delimiter);
   cut_assert_equal_substring(expected,
                              GRN_TEXT_VALUE(&buffer),
                              GRN_TEXT_LEN(&buffer));
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Download 



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