summaryrefslogtreecommitdiff
path: root/src/http_header.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2019-10-02 01:54:15 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2020-02-24 11:15:32 -0500
commitb2991c686da3c8dbdd7d056b0eaf316af1428a79 (patch)
tree4c01182e42f85810d307bfb2d978c366745f2766 /src/http_header.c
parent2fd0faf1bfeae09bbd683e656f59fbe7d8de8e74 (diff)
downloadlighttpd-git-b2991c686da3c8dbdd7d056b0eaf316af1428a79.tar.gz
[core] perf: array.c performance enhancements
mark array_get_index() as hot, rewrite to be pure and return sorted pos mark routines as pure, as appropriate mark routines as cold if used only at startup for config processing mark params const, as appropriate array_get_buf_ptr() for modifiable value buffer after insert into array uint32_t used and size members instead of size_t remove a->unique_ndx member; simply add to end of array for value lists remove du->is_index_key member; simply check buffer_is_empty(du->key) array_insert_key_value() used to be a hint that lookup could be skipped, but the state from array_get_index() is now saved and reused internally, so the distinction is no longer needed. Use array_set_key_value().
Diffstat (limited to 'src/http_header.c')
-rw-r--r--src/http_header.c84
1 files changed, 26 insertions, 58 deletions
diff --git a/src/http_header.c b/src/http_header.c
index c07ae079..b0c6aaeb 100644
--- a/src/http_header.c
+++ b/src/http_header.c
@@ -102,42 +102,24 @@ void http_header_response_set(connection *con, enum http_header_e id, const char
}
void http_header_response_append(connection *con, enum http_header_e id, const char *k, size_t klen, const char *v, size_t vlen) {
- if (vlen) {
- data_string *ds= (id <= HTTP_HEADER_OTHER || (con->response.htags & id))
- ? (data_string *)array_get_element_klen(con->response.headers,k,klen)
- : NULL;
- if (id > HTTP_HEADER_OTHER) con->response.htags |= id;
- if (NULL == ds) {
- array_insert_key_value(con->response.headers, k, klen, v, vlen);
- }
- else { /* append value */
- buffer *vb = ds->value;
- if (!buffer_string_is_empty(vb))
- buffer_append_string_len(vb, CONST_STR_LEN(", "));
- buffer_append_string_len(vb, v, vlen);
- }
- }
+ if (0 == vlen) return;
+ if (id > HTTP_HEADER_OTHER) con->response.htags |= id;
+ buffer * const vb = array_get_buf_ptr(con->response.headers, k, klen);
+ if (!buffer_string_is_empty(vb)) /* append value */
+ buffer_append_string_len(vb, CONST_STR_LEN(", "));
+ buffer_append_string_len(vb, v, vlen);
}
void http_header_response_insert(connection *con, enum http_header_e id, const char *k, size_t klen, const char *v, size_t vlen) {
- if (vlen) {
- data_string *ds= (id <= HTTP_HEADER_OTHER || (con->response.htags & id))
- ? (data_string *)array_get_element_klen(con->response.headers,k,klen)
- : NULL;
- if (id > HTTP_HEADER_OTHER) con->response.htags |= id;
- if (NULL == ds) {
- array_insert_key_value(con->response.headers, k, klen, v, vlen);
- }
- else { /* append value */
- buffer *vb = ds->value;
- if (!buffer_string_is_empty(vb)) {
- buffer_append_string_len(vb, CONST_STR_LEN("\r\n"));
- buffer_append_string_len(vb, k, klen);
- buffer_append_string_len(vb, CONST_STR_LEN(": "));
- }
- buffer_append_string_len(vb, v, vlen);
- }
+ if (0 == vlen) return;
+ if (id > HTTP_HEADER_OTHER) con->response.htags |= id;
+ buffer * const vb = array_get_buf_ptr(con->response.headers, k, klen);
+ if (!buffer_string_is_empty(vb)) { /* append value */
+ buffer_append_string_len(vb, CONST_STR_LEN("\r\n"));
+ buffer_append_string_len(vb, k, klen);
+ buffer_append_string_len(vb, CONST_STR_LEN(": "));
}
+ buffer_append_string_len(vb, v, vlen);
}
@@ -167,21 +149,12 @@ void http_header_request_set(connection *con, enum http_header_e id, const char
}
void http_header_request_append(connection *con, enum http_header_e id, const char *k, size_t klen, const char *v, size_t vlen) {
- if (vlen) {
- data_string *ds = (id <= HTTP_HEADER_OTHER || (con->request.htags & id))
- ? (data_string *)array_get_element_klen(con->request.headers, k, klen)
- : NULL;
- if (id > HTTP_HEADER_OTHER) con->request.htags |= id;
- if (NULL == ds) {
- array_insert_key_value(con->request.headers, k, klen, v, vlen);
- }
- else { /* append value */
- buffer *vb = ds->value;
- if (!buffer_string_is_empty(vb))
- buffer_append_string_len(vb, CONST_STR_LEN(", "));
- buffer_append_string_len(vb, v, vlen);
- }
- }
+ if (0 == vlen) return;
+ if (id > HTTP_HEADER_OTHER) con->request.htags |= id;
+ buffer * const vb = array_get_buf_ptr(con->request.headers, k, klen);
+ if (!buffer_string_is_empty(vb)) /* append value */
+ buffer_append_string_len(vb, CONST_STR_LEN(", "));
+ buffer_append_string_len(vb, v, vlen);
}
@@ -196,15 +169,10 @@ void http_header_env_set(connection *con, const char *k, size_t klen, const char
}
void http_header_env_append(connection *con, const char *k, size_t klen, const char *v, size_t vlen) {
- /*if (vlen)*/ /* skip check; permit env var w/ blank value to be appended */
- {
- buffer * const vb = http_header_env_get(con, k, klen);
- if (NULL == vb) {
- array_insert_key_value(con->environment, k, klen, v, vlen);
- }
- else if (vlen) { /* append value */
- buffer_append_string_len(vb, CONST_STR_LEN(", "));
- buffer_append_string_len(vb, v, vlen);
- }
- }
+ /*if (0 == vlen) return;*//* skip check; permit env var w/ blank value */
+ buffer * const vb = array_get_buf_ptr(con->environment, k, klen);
+ if (0 == vlen) return;
+ if (!buffer_string_is_empty(vb)) /* append value */
+ buffer_append_string_len(vb, CONST_STR_LEN(", "));
+ buffer_append_string_len(vb, v, vlen);
}