From: William Lallemand Date: Tue, 4 Feb 2014 23:30:02 +0000 (+0100) Subject: MINOR: http: optimize capture.req.method and capture.req.uri X-Git-Tag: v1.5-dev23~177 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=96a7785429d8dfb3c0df4fb83a08fe5600dab440;p=thirdparty%2Fhaproxy.git MINOR: http: optimize capture.req.method and capture.req.uri Useless strncpy were done in those two sample fetches, the "struct chunk" allows us to dump the specified len. The encode_string() in capture.req.uri was judged inappropriate and was deleted. The return type was fixed to SMP_T_CSTR. --- diff --git a/src/proto_http.c b/src/proto_http.c index 211a37af08..6c4ba7a7b8 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -9778,26 +9778,21 @@ smp_fetch_capture_req_method(struct proxy *px, struct session *l4, void *l7, uns { struct chunk *temp; struct http_txn *txn = l7; - char *spc; - int len; + char *ptr; if (!txn->uri) return 0; - spc = strchr(txn->uri, ' '); /* first space before URI */ - if (likely(spc)) - len = spc - txn->uri; - else - len = strlen(txn->uri); + ptr = txn->uri; - temp = get_trash_chunk(); - len = MIN(len, temp->size - 1); - strncpy(temp->str, txn->uri, len); - temp->str[len] = '\0'; + while (*ptr != ' ' && *ptr != '\0') /* find first space */ + ptr++; + temp = get_trash_chunk(); + temp->str = txn->uri; + temp->len = ptr - txn->uri; smp->data.str = *temp; - smp->data.str.len = len; - smp->type = SMP_T_STR; + smp->type = SMP_T_CSTR; return 1; @@ -9811,33 +9806,30 @@ smp_fetch_capture_req_uri(struct proxy *px, struct session *l4, void *l7, unsign struct chunk *temp; struct http_txn *txn = l7; char *ptr; - char *ret; if (!txn->uri) return 0; + ptr = txn->uri; while (*ptr != ' ' && *ptr != '\0') /* find first space */ ptr++; + if (!*ptr) return 0; ptr++; /* skip the space */ temp = get_trash_chunk(); - ret = encode_string(temp->str, temp->str + temp->size, '#', url_encode_map, ptr); - if (ret == NULL || *ret != '\0') - return 0; - ptr = temp->str = http_get_path_from_string(temp->str); + ptr = temp->str = http_get_path_from_string(ptr); if (!ptr) return 0; while (*ptr != ' ' && *ptr != '\0') /* find space after URI */ ptr++; - *ptr = '\0'; smp->data.str = *temp; - smp->data.str.len = strlen(smp->data.str.str); - smp->type = SMP_T_STR; + smp->data.str.len = ptr - temp->str; + smp->type = SMP_T_CSTR; return 1; }