diff --git a/doc/configuration.txt b/doc/configuration.txt index 50fe882d0..47c9c5759 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -18423,10 +18423,18 @@ json([]) {"ip":"127.0.0.1","user-agent":"Very \"Ugly\" UA 1\/2"} json_query(,[]) - The json_query converter supports the JSON types string, boolean and - number. Floating point numbers will be returned as a string. By + The json_query converter supports the JSON types string, boolean, number + and array. Floating point numbers will be returned as a string. By specifying the output_type 'int' the value will be converted to an - Integer. If conversion is not possible the json_query converter fails. + Integer. Arrays will be returned as string, starting and ending with a + square brackets. The content is a CSV. Depending on the data type, the + array values might be quoted. If the array values are complex types, + the string contains the complete json representation of each value + separated by a comma. Example result for a roles query to a JWT: + + ["manage-account","manage-account-links","view-profile"] + + If conversion is not possible the json_query converter fails. must be a valid JSON Path string as defined in https://datatracker.ietf.org/doc/draft-ietf-jsonpath-base/ diff --git a/reg-tests/converter/json_query.vtc b/reg-tests/converter/json_query.vtc index f78c393f0..f4e3bb203 100644 --- a/reg-tests/converter/json_query.vtc +++ b/reg-tests/converter/json_query.vtc @@ -98,4 +98,10 @@ client c1 -connect ${h1_fe_sock} { rxresp expect resp.status == 200 expect resp.http.x-var_body_mykey ~ "myvalue" -} -run \ No newline at end of file + + txreq -url "/" \ + -body "{\"my.key\":[\"val1\",\"val2\",\"val3\"],\"key2\":\"val4\"}" + expect resp.status == 200 + expect resp.http.x-var_body_mykey ~ "[\"val1\",\"val2\",\"val3\"]" + +} -run diff --git a/src/sample.c b/src/sample.c index f1705ea47..3d9958645 100644 --- a/src/sample.c +++ b/src/sample.c @@ -4212,8 +4212,15 @@ static int sample_conv_json_query(const struct arg *args, struct sample *smp, vo return 1; } + case MJSON_TOK_ARRAY: { + // We copy the complete array, including square brackets into the return buffer + // result looks like: ["manage-account","manage-account-links","view-profile"] + trash->data = b_putblk(trash, token, token_size); + smp->data.u.str = *trash; + smp->data.type = SMP_T_STR; + return 1; + } case MJSON_TOK_NULL: - case MJSON_TOK_ARRAY: case MJSON_TOK_OBJECT: /* We cannot handle these. */ return 0;