diff --git a/plugin/business/pangu-http/CMakeLists.txt b/plugin/business/pangu-http/CMakeLists.txt index 55d6dbf..27ac4ee 100644 --- a/plugin/business/pangu-http/CMakeLists.txt +++ b/plugin/business/pangu-http/CMakeLists.txt @@ -6,3 +6,6 @@ target_link_libraries(pangu-http maatframe) add_executable(test_pattern_replace test_pattern_replace.cpp pattern_replace.cpp) target_link_libraries(test_pattern_replace common gtest pcre2-static) file(COPY test_data DESTINATION ./) + +add_executable(replace_tool replace_tool.cpp pattern_replace.cpp) +target_link_libraries(replace_tool common pcre2-static) \ No newline at end of file diff --git a/plugin/business/pangu-http/pangu_http.cpp b/plugin/business/pangu-http/pangu_http.cpp index dd3525b..1b0ead0 100644 --- a/plugin/business/pangu-http/pangu_http.cpp +++ b/plugin/business/pangu-http/pangu_http.cpp @@ -228,6 +228,7 @@ struct replace_ctx size_t n_rule; struct tfe_http_half * replacing; struct evbuffer * http_body; + int actually_replaced; }; struct pangu_http_ctx @@ -440,7 +441,7 @@ void http_replace(const struct tfe_stream * stream, const struct tfe_http_sessio { rewrite_uri_sz = execute_replace_rule(in_req_spec->uri, strlen(in_req_spec->uri), kZoneRequestUri, rep_ctx->rule, rep_ctx->n_rule, &rewrite_uri); - + if(rewrite_uri_sz>0) rep_ctx->actually_replaced=1; rep_ctx->replacing = tfe_http_session_request_create(to_write_sess, in_req_spec->method, rewrite_uri_sz >0 ? rewrite_uri : in_req_spec->uri); @@ -475,6 +476,8 @@ void http_replace(const struct tfe_stream * stream, const struct tfe_http_sessio rewrite_sz = 0; rewrite_sz=execute_replace_rule(in_header_value, strlen(in_header_value), zone, rep_ctx->rule, rep_ctx->n_rule, &rewrite_buff); + + if(rewrite_sz>0) rep_ctx->actually_replaced=1; tfe_http_field_write(rep_ctx->replacing, &in_header_field, rewrite_sz>0? rewrite_buff : in_header_value); if(rewrite_buff != NULL) { @@ -511,6 +514,7 @@ void http_replace(const struct tfe_stream * stream, const struct tfe_http_sessio if (rewrite_sz >0 ) { tfe_http_half_append_body(rep_ctx->replacing, rewrite_buff, rewrite_sz, 0); + rep_ctx->actually_replaced=1; } else { @@ -746,7 +750,7 @@ void pangu_on_http_end(const struct tfe_stream * stream, { struct pangu_http_ctx * ctx = *(struct pangu_http_ctx **) pme; struct pangu_log log_msg = {.stream=stream, .http=session, .result=ctx->enforce_rules, .result_num=ctx->n_enforce}; - if (ctx->action != PG_ACTION_NONE) + if (ctx->action != PG_ACTION_NONE&& !(ctx->action == PG_ACTION_REPLACE && ctx->rep_ctx->actually_replaced==0)) { pangu_send_log(g_pangu_rt->send_logger, &log_msg); } diff --git a/plugin/business/pangu-http/pattern_replace.cpp b/plugin/business/pangu-http/pattern_replace.cpp index 44ac7cb..9e266b9 100644 --- a/plugin/business/pangu-http/pattern_replace.cpp +++ b/plugin/business/pangu-http/pattern_replace.cpp @@ -227,5 +227,16 @@ size_t execute_replace_rule(const char * in, size_t in_sz, return 0; } } +void simple_replace(const char* find, const char* replacement, const char* input, size_t in_sz, char** output, size_t *output_sz) +{ + char* exec_para=NULL; + asprintf(&exec_para,"zone=http_resp_body;substitute=/%s/%s", find, replacement); + size_t n_got_rule=0; + struct replace_rule rules[16]; + n_got_rule=format_replace_rule(exec_para, rules, sizeof(rules)/sizeof(rules[0])); + *output_sz=execute_replace_rule(input, strlen(input), kZoneResponseBody, rules, n_got_rule, output); + free(exec_para); + return; +} diff --git a/plugin/business/pangu-http/pattern_replace.h b/plugin/business/pangu-http/pattern_replace.h index d9d029a..3786999 100644 --- a/plugin/business/pangu-http/pattern_replace.h +++ b/plugin/business/pangu-http/pattern_replace.h @@ -22,4 +22,5 @@ struct replace_rule //@return formated rule number. size_t format_replace_rule(const char * exec_para, struct replace_rule * replace, size_t n_replace); size_t execute_replace_rule(const char * in, size_t in_sz, enum replace_zone zone, const struct replace_rule * rules, size_t n_rule, char** out); +void simple_replace(const char* find, const char* replacement, const char* input, size_t in_sz, char** output, size_t *output_sz); diff --git a/plugin/business/pangu-http/replace_tool.cpp b/plugin/business/pangu-http/replace_tool.cpp new file mode 100644 index 0000000..8fd577e --- /dev/null +++ b/plugin/business/pangu-http/replace_tool.cpp @@ -0,0 +1,55 @@ +#include "pattern_replace.h" + +#include //fstat +#include +#include +#include +#include +#include +void print_help(void) +{ + printf("Escape $ with \\$\n"); + printf("-i Input Text"); + printf("-f Find What\n"); + printf("-r Replace With\n"); +} +int main(int argc, char ** argv) +{ + const char* find=NULL, *replacement=NULL, *input=NULL; + + int oc=0; + if(argc<6) + { + print_help(); + return -1; + } + while((oc=getopt(argc,argv,"f:r:i:"))!=-1) + { + switch(oc) + { + case 'f': + find=strdup(optarg); + break; + case 'r': + replacement=strdup(optarg); + break; + case 'i': + input=strdup(optarg); + break; + default: + printf("Invalid parameter.\n"); + print_help(); + return -1; + } + } + char* output=NULL; + size_t output_sz=0; + + simple_replace(find, replacement, input, strlen(input),&output, &output_sz); + printf("Subject: %s\n", input); + printf("Subsitute: %s\n", output); + free(output); + return 0; +} + + diff --git a/plugin/business/pangu-http/test_pattern_replace.cpp b/plugin/business/pangu-http/test_pattern_replace.cpp index ff22ac6..573bf9a 100644 --- a/plugin/business/pangu-http/test_pattern_replace.cpp +++ b/plugin/business/pangu-http/test_pattern_replace.cpp @@ -6,23 +6,13 @@ #include #include -static void simple_replace(const char* find, const char* replacement, const char* input, size_t in_sz, char** output, size_t *output_sz) -{ - char* exec_para=NULL; - asprintf(&exec_para,"zone=http_resp_body;substitute=/%s/%s", find, replacement); - size_t n_got_rule=0; - struct replace_rule rules[16]; - n_got_rule=format_replace_rule(exec_para, rules, sizeof(rules)/sizeof(rules[0])); - *output_sz=execute_replace_rule(input, strlen(input), kZoneResponseBody, rules, n_got_rule, output); - free(exec_para); - return; -} -TEST(PatternReplace, Grouping) + +TEST(PatternReplace, Grouping1) { const char* find="(?John)|(?李梅梅)|(?Jake)"; const char* replacement="${name1:+Joseph:${name2:+王桃花:Keith}}"; const char* input="John loves 李梅梅, 李梅梅 loves Jake and Jake doesn't care about John and 李梅梅."; - const char* expect="Joseph loves Jessica, Jessica loves Keith and Keith doesn't care about Joseph and Jessica."; + const char* expect="Joseph loves 王桃花, 王桃花 loves Keith and Keith doesn't care about Joseph and 王桃花."; char* output=NULL; size_t output_sz=0; @@ -33,6 +23,22 @@ TEST(PatternReplace, Grouping) free(output); return; } +TEST(PatternReplace, Grouping2) +{ + const char* find="(?<=中央)(?空调)|(?<=家用)(?空调)"; + const char* replacement="${ac1:+Air conditioner:${ac2:+立式空调}}"; + const char* input="中央空调,家用空调,只有第一个空调会被替换。"; + char* output=NULL; + size_t output_sz=0; + + simple_replace(find, replacement, input, strlen(input),&output, &output_sz); + EXPECT_TRUE(output_sz>0); +// EXPECT_STREQ(output, expect); + printf("%s\n", output); + free(output); + return; +} + TEST(PatternReplace, Non_Zero_Terminated) {