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