diff --git a/core/AmUtils.cpp b/core/AmUtils.cpp index 13596f5d..b64049bc 100644 --- a/core/AmUtils.cpp +++ b/core/AmUtils.cpp @@ -801,116 +801,145 @@ string get_header_keyvalue(const string& param_hdr, const string& name) { string get_header_keyvalue_single(const string& param_hdr, const string& name) { // ugly, but we need escaping -#define ST_FINDKEY 0 -#define ST_FK_ESC 1 -#define ST_CMPKEY 2 -#define ST_SRCHEND 3 -#define ST_SE_VAL 4 -#define ST_SE_ESC 5 - - size_t p=0, s_begin=0, corr=0, +#define ST_FINDBGN 0 +#define ST_FB_ESC 1 +#define ST_BEGINKEY 2 +#define ST_CMPKEY 3 +#define ST_FINDEQ 4 +#define ST_FINDVAL 5 +#define ST_VALUE 6 +#define ST_VAL_ESC 7 + + size_t p=0, k_begin=0, corr=0, v_begin=0, v_end=0; - unsigned int st = ST_FINDKEY; + char last = ' '; + char esc_char = ' '; + + unsigned int st = ST_BEGINKEY; - while (p 1) && + (param_hdr[v_begin] == param_hdr[v_end-1]) && + ((param_hdr[v_begin] == '\'') || (param_hdr[v_begin] == '"'))) + return param_hdr.substr(v_begin+1, v_end-v_begin-2); // whole value quoted + + return param_hdr.substr(v_begin, v_end-v_begin); + } else return ""; } diff --git a/core/tests/test_headers.cpp b/core/tests/test_headers.cpp index 75a7c795..e9eb135e 100644 --- a/core/tests/test_headers.cpp +++ b/core/tests/test_headers.cpp @@ -41,7 +41,20 @@ FCTMF_SUITE_BGN(test_headers) { fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval;myotherfunkykey=myval", "P-My-Test", true), "mykey") == "myval" ); - fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval;myotherfunkykey=myval2", "P-My-Test", true), "myotherfunkykey") == "myval2" ); + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval;myotherfunkykey=myval;andsomemore", "P-My-Test", true), "mykey") == "myval" ); + + fct_chk(get_header_keyvalue(getHeader("P-App-Param: product_id=1;productid=1;bla=blub ", "P-App-Param"), "product_id") == "1"); + fct_chk(get_header_keyvalue(getHeader("P-App-Param: product_id=11;productid=1;bla=blub ", "P-App-Param"), "product_id") == "11"); + + + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval; myotherfunkykey=myval;andsomemore", "P-My-Test", true), "mykey") == "myval" ); + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval; myotherfunkykey= myval;andsomemore", "P-My-Test", true), "myotherfunkykey") == "myval" ); + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval; myotherfunkykey= \"myval\";andsomemore", "P-My-Test", true), "myotherfunkykey") == "myval" ); + + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval; myotherfunkykey='myval';andsomemore", "P-My-Test", true), "myotherfunkykey") == "myval" ); + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval; myotherfunkykey= '';andsomemore", "P-My-Test", true), "myotherfunkykey") == ""); + + fct_chk(get_header_keyvalue(getHeader("P-My-Test: mykey=myval; myotherfunkykey= 'test \\' escaped';andsomemore", "P-My-Test", true), "test \\' escaped") == ""); } FCT_TEST_END();