summaryrefslogtreecommitdiffstats
path: root/src/http_htx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http_htx.c')
-rw-r--r--src/http_htx.c65
1 files changed, 24 insertions, 41 deletions
diff --git a/src/http_htx.c b/src/http_htx.c
index 004d343..36356ed 100644
--- a/src/http_htx.c
+++ b/src/http_htx.c
@@ -1117,7 +1117,6 @@ error:
void release_http_reply(struct http_reply *http_reply)
{
- struct logformat_node *lf, *lfb;
struct http_reply_hdr *hdr, *hdrb;
if (!http_reply)
@@ -1126,12 +1125,7 @@ void release_http_reply(struct http_reply *http_reply)
ha_free(&http_reply->ctype);
list_for_each_entry_safe(hdr, hdrb, &http_reply->hdrs, list) {
LIST_DELETE(&hdr->list);
- list_for_each_entry_safe(lf, lfb, &hdr->value, list) {
- LIST_DELETE(&lf->list);
- release_sample_expr(lf->expr);
- free(lf->arg);
- free(lf);
- }
+ lf_expr_deinit(&hdr->value);
istfree(&hdr->name);
free(hdr);
}
@@ -1141,14 +1135,8 @@ void release_http_reply(struct http_reply *http_reply)
}
else if (http_reply->type == HTTP_REPLY_RAW)
chunk_destroy(&http_reply->body.obj);
- else if (http_reply->type == HTTP_REPLY_LOGFMT) {
- list_for_each_entry_safe(lf, lfb, &http_reply->body.fmt, list) {
- LIST_DELETE(&lf->list);
- release_sample_expr(lf->expr);
- free(lf->arg);
- free(lf);
- }
- }
+ else if (http_reply->type == HTTP_REPLY_LOGFMT)
+ lf_expr_deinit(&http_reply->body.fmt);
free(http_reply);
}
@@ -1497,7 +1485,6 @@ int http_check_http_reply(struct http_reply *reply, struct proxy *px, char **err
struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struct proxy *px,
int default_status, char **errmsg)
{
- struct logformat_node *lf, *lfb;
struct http_reply *reply = NULL;
struct http_reply_hdr *hdr, *hdrb;
struct stat stat;
@@ -1682,7 +1669,7 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
fd = -1;
obj[objlen] = '\0';
reply->type = HTTP_REPLY_LOGFMT;
- LIST_INIT(&reply->body.fmt);
+ lf_expr_init(&reply->body.fmt);
cur_arg++;
}
else if (strcmp(args[cur_arg], "lf-string") == 0) {
@@ -1699,7 +1686,7 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
obj = strdup(args[cur_arg]);
objlen = strlen(args[cur_arg]);
reply->type = HTTP_REPLY_LOGFMT;
- LIST_INIT(&reply->body.fmt);
+ lf_expr_init(&reply->body.fmt);
cur_arg++;
}
else if (strcmp(args[cur_arg], "hdr") == 0) {
@@ -1722,7 +1709,7 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
goto error;
}
LIST_APPEND(&reply->hdrs, &hdr->list);
- LIST_INIT(&hdr->value);
+ lf_expr_init(&hdr->value);
hdr->name = ist(strdup(args[cur_arg]));
if (!isttest(hdr->name)) {
memprintf(errmsg, "out of memory");
@@ -1731,9 +1718,6 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
if (!parse_logformat_string(args[cur_arg+1], px, &hdr->value, LOG_OPT_HTTP, cap, errmsg))
goto error;
- free(px->conf.lfs_file);
- px->conf.lfs_file = strdup(px->conf.args.file);
- px->conf.lfs_line = px->conf.args.line;
cur_arg += 2;
}
else
@@ -1778,12 +1762,7 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
px->conf.args.file, px->conf.args.line);
list_for_each_entry_safe(hdr, hdrb, &reply->hdrs, list) {
LIST_DELETE(&hdr->list);
- list_for_each_entry_safe(lf, lfb, &hdr->value, list) {
- LIST_DELETE(&lf->list);
- release_sample_expr(lf->expr);
- free(lf->arg);
- free(lf);
- }
+ lf_expr_deinit(&hdr->value);
istfree(&hdr->name);
free(hdr);
}
@@ -1811,7 +1790,7 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
}
}
else if (reply->type == HTTP_REPLY_LOGFMT) { /* log-format payload using 'lf-file' of 'lf-string' parameter */
- LIST_INIT(&reply->body.fmt);
+ lf_expr_init(&reply->body.fmt);
if ((reply->status == 204 || reply->status == 304)) {
memprintf(errmsg, "No body expected for %d responses", reply->status);
goto error;
@@ -1822,10 +1801,6 @@ struct http_reply *http_parse_http_reply(const char **args, int *orig_arg, struc
}
if (!parse_logformat_string(obj, px, &reply->body.fmt, LOG_OPT_HTTP, cap, errmsg))
goto error;
-
- free(px->conf.lfs_file);
- px->conf.lfs_file = strdup(px->conf.args.file);
- px->conf.lfs_line = px->conf.args.line;
}
free(obj);
@@ -1853,8 +1828,9 @@ int http_scheme_based_normalize(struct htx *htx)
{
struct http_hdr_ctx ctx;
struct htx_sl *sl;
- struct ist uri, scheme, authority, host, port;
+ struct ist uri, scheme, authority, host, port, path;
struct http_uri_parser parser;
+ int normalize = 0;
sl = http_get_stline(htx);
@@ -1871,14 +1847,21 @@ int http_scheme_based_normalize(struct htx *htx)
/* Extract the port if present in authority */
authority = http_parse_authority(&parser, 1);
+ path = http_parse_path(&parser);
port = http_get_host_port(authority);
- if (!isttest(port)) {
- /* if no port found, no normalization to proceed */
- return 0;
+ if (!isttest(port) || !http_is_default_port(scheme, port))
+ host = authority;
+ else {
+ host = isttrim(authority, istlen(authority) - istlen(port) - 1);
+ normalize = 1;
+ }
+
+ if (!isttest(path)) {
+ path = ist("/");
+ normalize = 1;
}
- host = isttrim(authority, istlen(authority) - istlen(port) - 1);
- if (http_is_default_port(scheme, port)) {
+ if (normalize) {
/* reconstruct the uri with removal of the port */
struct buffer *temp = get_trash_chunk();
struct ist meth, vsn;
@@ -1894,8 +1877,8 @@ int http_scheme_based_normalize(struct htx *htx)
/* reconstruct uri without port */
chunk_memcat(temp, uri.ptr, authority.ptr - uri.ptr);
chunk_istcat(temp, host);
- chunk_memcat(temp, istend(authority), istend(uri) - istend(authority));
- uri = ist2(temp->area + meth.len + vsn.len, host.len + uri.len - authority.len); /* uri */
+ chunk_istcat(temp, path);
+ uri = ist2(temp->area + meth.len + vsn.len, host.len + path.len + authority.ptr - uri.ptr); /* uri */
http_replace_stline(htx, meth, uri, vsn);