aboutsummaryrefslogtreecommitdiffstats
path: root/main/lighttpd
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2015-07-27 08:08:54 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2015-07-27 11:13:28 +0000
commite6c1f4a663bf13c35e0a92ce7243d282a4a29c8c (patch)
tree0d6a91e95cc690d058f478f4543141ac060866e2 /main/lighttpd
parentaa12abff47161235a3c11ec5c92465e98674234b (diff)
downloadaports-e6c1f4a663bf13c35e0a92ce7243d282a4a29c8c.tar.bz2
aports-e6c1f4a663bf13c35e0a92ce7243d282a4a29c8c.tar.xz
main/lighttpd: upgrade to 1.4.36
Diffstat (limited to 'main/lighttpd')
-rw-r--r--main/lighttpd/0001-next-is-1.4.36.patch72
-rw-r--r--main/lighttpd/0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch72
-rw-r--r--main/lighttpd/0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch61
-rw-r--r--main/lighttpd/0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch857
-rw-r--r--main/lighttpd/0005-fix-typo-in-NEWS-entry-for-2579.patch31
-rw-r--r--main/lighttpd/0006-add-support-for-Free-BSD-extended-attributes.patch175
-rw-r--r--main/lighttpd/0007-build-use-fortify-flags-with-extra-warnings.patch88
-rw-r--r--main/lighttpd/0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch163
-rw-r--r--main/lighttpd/0009-ssl-disable-SSL3.0-by-default.patch44
-rw-r--r--main/lighttpd/0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch38
-rw-r--r--main/lighttpd/0011-add-NEWS-entry-for-previous-commit.patch30
-rw-r--r--main/lighttpd/0012-network-fix-compile-break-in-calculation-of-sockaddr.patch66
-rw-r--r--main/lighttpd/0013-connections-fix-bug-in-connection-state-handling.patch69
-rw-r--r--main/lighttpd/0014-print-backtrace-in-assert-logging-with-libunwind.patch187
-rw-r--r--main/lighttpd/0015-fix-buffer-chunk-and-http_chunk-API.patch6095
-rw-r--r--main/lighttpd/0016-Remove-chunkqueue_get_-append-prepend-API.patch1537
-rw-r--r--main/lighttpd/0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch1182
-rw-r--r--main/lighttpd/0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch79
-rw-r--r--main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch4346
-rw-r--r--main/lighttpd/0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch117
-rw-r--r--main/lighttpd/0021-buffer-constify-some-parameters.patch98
-rw-r--r--main/lighttpd/0022-bitset-unused-remove.patch170
-rw-r--r--main/lighttpd/0023-remove-unused-stuff-from-server.h.patch38
-rw-r--r--main/lighttpd/0024-crc32-fix-method-signature-const-pointer.patch44
-rw-r--r--main/lighttpd/0025-tests-fix-undefined-index-warning-in-sendfile.php.patch31
-rw-r--r--main/lighttpd/0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch102
-rw-r--r--main/lighttpd/0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch49
-rw-r--r--main/lighttpd/0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch447
-rw-r--r--main/lighttpd/0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch174
-rw-r--r--main/lighttpd/APKBUILD129
30 files changed, 6 insertions, 16585 deletions
diff --git a/main/lighttpd/0001-next-is-1.4.36.patch b/main/lighttpd/0001-next-is-1.4.36.patch
deleted file mode 100644
index 88512bbf3e..0000000000
--- a/main/lighttpd/0001-next-is-1.4.36.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From e1b1c52028b446fdef837d26341dd1431780e0f6 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Wed, 2 Apr 2014 10:04:09 +0000
-Subject: [PATCH 01/29] - next is 1.4.36
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2961 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- CMakeLists.txt | 2 +-
- NEWS | 7 +++++--
- SConstruct | 2 +-
- configure.ac | 2 +-
- 4 files changed, 8 insertions(+), 5 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 9f4c04a..b9bd48f 100644
---- a/NEWS
-+++ b/NEWS
-@@ -3,7 +3,10 @@
- NEWS
- ====
-
--- 1.4.35
-+- 1.4.36
-+ *
-+
-+- 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
- * [mod_fastcgi] fix use after free (only triggered if fastcgi debug is active)
- * [mod_rrdtool] fix invalid read (string not null terminated)
-@@ -23,7 +26,7 @@ NEWS
- * check length of unix domain socket filenames
- * fix SQL injection / host name validation (thx Jann Horn)
-
--- 1.4.34
-+- 1.4.34 - 2014-01-20
- * [mod_auth] explicitly link ssl for SHA1 (fixes #2517)
- * [mod_extforward] fix compilation without IPv6, (not) using undefined var (fixes #2515, thx mm)
- * [ssl] fix SNI handling; only use key+cert from SNI specific config (fixes #2525, CVE-2013-4508)
-diff --git a/SConstruct b/SConstruct
-index cb2a58f..d8bd98a 100644
---- a/SConstruct
-+++ b/SConstruct
-@@ -5,7 +5,7 @@ import string
- from stat import *
-
- package = 'lighttpd'
--version = '1.4.35'
-+version = '1.4.36'
-
- def checkCHeaders(autoconf, hdrs):
- p = re.compile('[^A-Z0-9]')
-diff --git a/configure.ac b/configure.ac
-index 682023b..ae35234 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -1,7 +1,7 @@
- dnl -*- Autoconf -*-
- dnl Process this file with autoconf to produce a configure script.
- AC_PREREQ(2.57)
--AC_INIT([lighttpd], [1.4.35], [contact@lighttpd.net])
-+AC_INIT([lighttpd], [1.4.36], [contact@lighttpd.net])
- AC_CONFIG_SRCDIR([src/server.c])
- AC_CONFIG_HEADER([config.h])
- AC_CONFIG_MACRO_DIR([m4])
---
-2.4.5
-
diff --git a/main/lighttpd/0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch b/main/lighttpd/0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
deleted file mode 100644
index 13774eb4e6..0000000000
--- a/main/lighttpd/0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From 3605a3bec31f5e1bc79fdfb830b84e188f060982 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Wed, 2 Apr 2014 10:04:11 +0000
-Subject: [PATCH 02/29] use keep-alive timeout while waiting for HTTP headers;
- use always the read timeout while waiting for the HTTP body
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2962 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 2 +-
- src/server.c | 20 +++++++++++---------
- 2 files changed, 12 insertions(+), 10 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index b9bd48f..e82b90b 100644
---- a/NEWS
-+++ b/NEWS
-@@ -4,7 +4,7 @@ NEWS
- ====
-
- - 1.4.36
-- *
-+ * use keep-alive timeout while waiting for HTTP headers; use always the read timeout while waiting for the HTTP body
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/server.c b/src/server.c
-index 5691921..d47fd62 100644
---- a/src/server.c
-+++ b/src/server.c
-@@ -1296,23 +1296,25 @@ int main (int argc, char **argv) {
-
- if (con->state == CON_STATE_READ ||
- con->state == CON_STATE_READ_POST) {
-- if (con->request_count == 1) {
-+ if (con->request_count == 1 || con->state == CON_STATE_READ_POST) {
- if (srv->cur_ts - con->read_idle_ts > con->conf.max_read_idle) {
- /* time - out */
--#if 0
-- log_error_write(srv, __FILE__, __LINE__, "sd",
-- "connection closed - read-timeout:", con->fd);
--#endif
-+ if (con->conf.log_request_handling) {
-+ log_error_write(srv, __FILE__, __LINE__, "sd",
-+ "connection closed - read timeout:", con->fd);
-+ }
-+
- connection_set_state(srv, con, CON_STATE_ERROR);
- changed = 1;
- }
- } else {
- if (srv->cur_ts - con->read_idle_ts > con->keep_alive_idle) {
- /* time - out */
--#if 0
-- log_error_write(srv, __FILE__, __LINE__, "sd",
-- "connection closed - read-timeout:", con->fd);
--#endif
-+ if (con->conf.log_request_handling) {
-+ log_error_write(srv, __FILE__, __LINE__, "sd",
-+ "connection closed - keep-alive timeout:", con->fd);
-+ }
-+
- connection_set_state(srv, con, CON_STATE_ERROR);
- changed = 1;
- }
---
-2.4.5
-
diff --git a/main/lighttpd/0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch b/main/lighttpd/0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
deleted file mode 100644
index 0a3b51f342..0000000000
--- a/main/lighttpd/0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From f8f335150675ed8f5d1cf3edadf74f7f6685f606 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Mon, 14 Apr 2014 16:12:11 +0000
-Subject: [PATCH 03/29] fix bad shift in conditional netmask ".../0" handling
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-config conditionals like $HTTP["remoteip"] == "a.b.c.d/0" (or completely
-broken netmasks) triggered bad shifts. Matching against "/0" is not very
-useful though - it is always true.
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2963 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/configfile-glue.c | 8 +++++++-
- 2 files changed, 8 insertions(+), 1 deletion(-)
-
-diff --git a/NEWS b/NEWS
-index e82b90b..780f4c6 100644
---- a/NEWS
-+++ b/NEWS
-@@ -5,6 +5,7 @@ NEWS
-
- - 1.4.36
- * use keep-alive timeout while waiting for HTTP headers; use always the read timeout while waiting for the HTTP body
-+ * fix bad shift in conditional netmask ".../0" handling
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/configfile-glue.c b/src/configfile-glue.c
-index 3efa46a..9f24dcb 100644
---- a/src/configfile-glue.c
-+++ b/src/configfile-glue.c
-@@ -357,6 +357,12 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
- return COND_RESULT_FALSE;
- }
-
-+ if (nm_bits > 32 || nm_bits < 0) {
-+ log_error_write(srv, __FILE__, __LINE__, "sbs", "ERROR: invalid netmask:", dc->string, err);
-+
-+ return COND_RESULT_FALSE;
-+ }
-+
- /* take IP convert to the native */
- buffer_copy_string_len(srv->cond_check_buf, dc->string->ptr, nm_slash - dc->string->ptr);
- #ifdef __WIN32
-@@ -375,7 +381,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
- #endif
-
- /* build netmask */
-- nm = htonl(~((1 << (32 - nm_bits)) - 1));
-+ nm = nm_bits ? htonl(~((1 << (32 - nm_bits)) - 1)) : 0;
-
- if ((val_inp.s_addr & nm) == (con->dst_addr.ipv4.sin_addr.s_addr & nm)) {
- return (dc->cond == CONFIG_COND_EQ) ? COND_RESULT_TRUE : COND_RESULT_FALSE;
---
-2.4.5
-
diff --git a/main/lighttpd/0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch b/main/lighttpd/0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
deleted file mode 100644
index 7803f68370..0000000000
--- a/main/lighttpd/0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
+++ /dev/null
@@ -1,857 +0,0 @@
-From 3b23130ea2c1dff470da0970ee8a75c7dafc90fe Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Tue, 13 May 2014 10:34:46 +0000
-Subject: [PATCH 04/29] add more mime types and a script to generate mime.conf
- (fxies #2579)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2964 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- doc/config/conf.d/mime.conf | 603 +++++++++++++++++++++++++++++++++++-----
- doc/scripts/create-mime.conf.pl | 197 +++++++++++++
- 3 files changed, 735 insertions(+), 66 deletions(-)
- create mode 100755 doc/scripts/create-mime.conf.pl
-
-diff --git a/NEWS b/NEWS
-index 780f4c6..8c34545 100644
---- a/NEWS
-+++ b/NEWS
-@@ -6,6 +6,7 @@ NEWS
- - 1.4.36
- * use keep-alive timeout while waiting for HTTP headers; use always the read timeout while waiting for the HTTP body
- * fix bad shift in conditional netmask ".../0" handling
-+ * add more mime types and a script to generate mime.conf (fxies #2579)
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/doc/config/conf.d/mime.conf b/doc/config/conf.d/mime.conf
-index 8cfdfe7..f65a02c 100644
---- a/doc/config/conf.d/mime.conf
-+++ b/doc/config/conf.d/mime.conf
-@@ -1,78 +1,549 @@
-+# created by create-mime.conf.pl
-+
- #######################################################################
- ##
- ## MimeType handling
- ## -------------------
- ##
--## http://www.lighttpd.net/documentation/configuration.html#mimetypes
-+## https://redmine.lighttpd.net/projects/lighttpd/wiki/Mimetype_assignDetails
-+
- ##
--## Use the "Content-Type" extended attribute to obtain mime type if
-+## Use the "Content-Type" extended file attribute to obtain mime type if
- ## possible
- ##
--mimetype.use-xattr = "disable"
-+## Disabled by default
-+##
-+#mimetype.use-xattr = "enable"
-
- ##
--## mimetype mapping
-+## mimetype ("Content-Type" HTTP header) mapping for static file handling
- ##
--mimetype.assign = (
-- ".pdf" => "application/pdf",
-- ".sig" => "application/pgp-signature",
-- ".spl" => "application/futuresplash",
-- ".class" => "application/octet-stream",
-- ".ps" => "application/postscript",
-- ".torrent" => "application/x-bittorrent",
-- ".dvi" => "application/x-dvi",
-- ".gz" => "application/x-gzip",
-- ".pac" => "application/x-ns-proxy-autoconfig",
-- ".swf" => "application/x-shockwave-flash",
-- ".tar.gz" => "application/x-tgz",
-- ".tgz" => "application/x-tgz",
-- ".tar" => "application/x-tar",
-- ".zip" => "application/zip",
-- ".mp3" => "audio/mpeg",
-- ".m3u" => "audio/x-mpegurl",
-- ".wma" => "audio/x-ms-wma",
-- ".wax" => "audio/x-ms-wax",
-- ".ogg" => "application/ogg",
-- ".wav" => "audio/x-wav",
-- ".gif" => "image/gif",
-- ".jpg" => "image/jpeg",
-- ".jpeg" => "image/jpeg",
-- ".png" => "image/png",
-- ".xbm" => "image/x-xbitmap",
-- ".xpm" => "image/x-xpixmap",
-- ".xwd" => "image/x-xwindowdump",
-- ".css" => "text/css",
-- ".html" => "text/html",
-- ".htm" => "text/html",
-- ".js" => "text/javascript",
-- ".asc" => "text/plain",
-- ".c" => "text/plain",
-- ".cpp" => "text/plain",
-- ".log" => "text/plain",
-- ".conf" => "text/plain",
-- ".text" => "text/plain",
-- ".txt" => "text/plain",
-- ".spec" => "text/plain",
-- ".dtd" => "text/xml",
-- ".xml" => "text/xml",
-- ".mpeg" => "video/mpeg",
-- ".mpg" => "video/mpeg",
-- ".mov" => "video/quicktime",
-- ".qt" => "video/quicktime",
-- ".avi" => "video/x-msvideo",
-- ".asf" => "video/x-ms-asf",
-- ".asx" => "video/x-ms-asf",
-- ".wmv" => "video/x-ms-wmv",
-- ".bz2" => "application/x-bzip",
-- ".tbz" => "application/x-bzip-compressed-tar",
-- ".tar.bz2" => "application/x-bzip-compressed-tar",
-- ".rpm" => "application/x-rpm",
-- ".json" => "application/json",
-- # make the default mime type application/octet-stream.
-- "" => "application/octet-stream",
-- )
--
--
--#
--#######################################################################
-+## The first matching suffix is used. If no mapping is found
-+## 'application/octet-stream' is used, and caching (etag/last-modified handling)
-+## is disabled to prevent clients from caching "unknown" mime types.
-+##
-+## Therefore the last mapping is:
-+## "" => "application/octet-stream"
-+## This matches all extensions and acts as default mime type, and enables
-+## caching for those.
-+mimetype.assign = (
-+ ".tar.bz2" => "application/x-gtar-compressed",
-+ ".tar.gz" => "application/x-gtar-compressed",
-+ ".ez" => "application/andrew-inset",
-+ ".anx" => "application/annodex",
-+ ".atom" => "application/atom+xml",
-+ ".atomcat" => "application/atomcat+xml",
-+ ".atomsrv" => "application/atomserv+xml",
-+ ".lin" => "application/bbolin",
-+ ".cu" => "application/cu-seeme",
-+ ".davmount" => "application/davmount+xml",
-+ ".dcm" => "application/dicom",
-+ ".tsp" => "application/dsptype",
-+ ".es" => "application/ecmascript",
-+ ".spl" => "application/futuresplash",
-+ ".hta" => "application/hta",
-+ ".jar" => "application/java-archive",
-+ ".ser" => "application/java-serialized-object",
-+ ".class" => "application/java-vm",
-+ ".js" => "application/javascript",
-+ ".json" => "application/json",
-+ ".m3g" => "application/m3g",
-+ ".hqx" => "application/mac-binhex40",
-+ ".cpt" => "application/mac-compactpro",
-+ ".nb" => "application/mathematica",
-+ ".nbp" => "application/mathematica",
-+ ".mbox" => "application/mbox",
-+ ".mdb" => "application/msaccess",
-+ ".doc" => "application/msword",
-+ ".dot" => "application/msword",
-+ ".mxf" => "application/mxf",
-+ ".asn" => "application/octet-stream",
-+ ".bin" => "application/octet-stream",
-+ ".ent" => "application/octet-stream",
-+ ".oda" => "application/oda",
-+ ".ogx" => "application/ogg",
-+ ".one" => "application/onenote",
-+ ".onepkg" => "application/onenote",
-+ ".onetmp" => "application/onenote",
-+ ".onetoc2" => "application/onenote",
-+ ".pdf" => "application/pdf",
-+ ".pgp" => "application/pgp-encrypted",
-+ ".key" => "application/pgp-keys",
-+ ".sig" => "application/pgp-signature",
-+ ".prf" => "application/pics-rules",
-+ ".ai" => "application/postscript",
-+ ".eps" => "application/postscript",
-+ ".eps2" => "application/postscript",
-+ ".eps3" => "application/postscript",
-+ ".epsf" => "application/postscript",
-+ ".epsi" => "application/postscript",
-+ ".ps" => "application/postscript",
-+ ".rar" => "application/rar",
-+ ".rdf" => "application/rdf+xml",
-+ ".rtf" => "application/rtf",
-+ ".stl" => "application/sla",
-+ ".smi" => "application/smil+xml",
-+ ".smil" => "application/smil+xml",
-+ ".xht" => "application/xhtml+xml",
-+ ".xhtml" => "application/xhtml+xml",
-+ ".xml" => "application/xml",
-+ ".xsd" => "application/xml",
-+ ".dtd" => "application/xml-dtd",
-+ ".xsl" => "application/xslt+xml",
-+ ".xslt" => "application/xslt+xml",
-+ ".xspf" => "application/xspf+xml",
-+ ".zip" => "application/zip",
-+ ".apk" => "application/vnd.android.package-archive",
-+ ".cdy" => "application/vnd.cinderella",
-+ ".kml" => "application/vnd.google-earth.kml+xml",
-+ ".kmz" => "application/vnd.google-earth.kmz",
-+ ".xul" => "application/vnd.mozilla.xul+xml",
-+ ".xlb" => "application/vnd.ms-excel",
-+ ".xls" => "application/vnd.ms-excel",
-+ ".xlt" => "application/vnd.ms-excel",
-+ ".eot" => "application/vnd.ms-fontobject",
-+ ".thmx" => "application/vnd.ms-officetheme",
-+ ".cat" => "application/vnd.ms-pki.seccat",
-+ ".pps" => "application/vnd.ms-powerpoint",
-+ ".ppt" => "application/vnd.ms-powerpoint",
-+ ".odc" => "application/vnd.oasis.opendocument.chart",
-+ ".odb" => "application/vnd.oasis.opendocument.database",
-+ ".odf" => "application/vnd.oasis.opendocument.formula",
-+ ".odg" => "application/vnd.oasis.opendocument.graphics",
-+ ".otg" => "application/vnd.oasis.opendocument.graphics-template",
-+ ".odi" => "application/vnd.oasis.opendocument.image",
-+ ".odp" => "application/vnd.oasis.opendocument.presentation",
-+ ".otp" => "application/vnd.oasis.opendocument.presentation-template",
-+ ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
-+ ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
-+ ".odt" => "application/vnd.oasis.opendocument.text",
-+ ".odm" => "application/vnd.oasis.opendocument.text-master",
-+ ".ott" => "application/vnd.oasis.opendocument.text-template",
-+ ".oth" => "application/vnd.oasis.opendocument.text-web",
-+ ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
-+ ".sldx" => "application/vnd.openxmlformats-officedocument.presentationml.slide",
-+ ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
-+ ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template",
-+ ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
-+ ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
-+ ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
-+ ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
-+ ".cod" => "application/vnd.rim.cod",
-+ ".mmf" => "application/vnd.smaf",
-+ ".sdc" => "application/vnd.stardivision.calc",
-+ ".sds" => "application/vnd.stardivision.chart",
-+ ".sda" => "application/vnd.stardivision.draw",
-+ ".sdd" => "application/vnd.stardivision.impress",
-+ ".sdf" => "application/vnd.stardivision.math",
-+ ".sdw" => "application/vnd.stardivision.writer",
-+ ".sgl" => "application/vnd.stardivision.writer-global",
-+ ".sxc" => "application/vnd.sun.xml.calc",
-+ ".stc" => "application/vnd.sun.xml.calc.template",
-+ ".sxd" => "application/vnd.sun.xml.draw",
-+ ".std" => "application/vnd.sun.xml.draw.template",
-+ ".sxi" => "application/vnd.sun.xml.impress",
-+ ".sti" => "application/vnd.sun.xml.impress.template",
-+ ".sxm" => "application/vnd.sun.xml.math",
-+ ".sxw" => "application/vnd.sun.xml.writer",
-+ ".sxg" => "application/vnd.sun.xml.writer.global",
-+ ".stw" => "application/vnd.sun.xml.writer.template",
-+ ".sis" => "application/vnd.symbian.install",
-+ ".cap" => "application/vnd.tcpdump.pcap",
-+ ".pcap" => "application/vnd.tcpdump.pcap",
-+ ".vsd" => "application/vnd.visio",
-+ ".wbxml" => "application/vnd.wap.wbxml",
-+ ".wmlc" => "application/vnd.wap.wmlc",
-+ ".wmlsc" => "application/vnd.wap.wmlscriptc",
-+ ".wpd" => "application/vnd.wordperfect",
-+ ".wp5" => "application/vnd.wordperfect5.1",
-+ ".wk" => "application/x-123",
-+ ".7z" => "application/x-7z-compressed",
-+ ".abw" => "application/x-abiword",
-+ ".dmg" => "application/x-apple-diskimage",
-+ ".bcpio" => "application/x-bcpio",
-+ ".torrent" => "application/x-bittorrent",
-+ ".bz2" => "application/x-bzip",
-+ ".cab" => "application/x-cab",
-+ ".cbr" => "application/x-cbr",
-+ ".cbz" => "application/x-cbz",
-+ ".cda" => "application/x-cdf",
-+ ".cdf" => "application/x-cdf",
-+ ".vcd" => "application/x-cdlink",
-+ ".pgn" => "application/x-chess-pgn",
-+ ".mph" => "application/x-comsol",
-+ ".cpio" => "application/x-cpio",
-+ ".deb" => "application/x-debian-package",
-+ ".udeb" => "application/x-debian-package",
-+ ".dcr" => "application/x-director",
-+ ".dir" => "application/x-director",
-+ ".dxr" => "application/x-director",
-+ ".dms" => "application/x-dms",
-+ ".wad" => "application/x-doom",
-+ ".dvi" => "application/x-dvi",
-+ ".woff" => "application/x-font-woff",
-+ ".mm" => "application/x-freemind",
-+ ".gan" => "application/x-ganttproject",
-+ ".gnumeric" => "application/x-gnumeric",
-+ ".sgf" => "application/x-go-sgf",
-+ ".gcf" => "application/x-graphing-calculator",
-+ ".gtar" => "application/x-gtar",
-+ ".taz" => "application/x-gtar-compressed",
-+ ".tbz" => "application/x-gtar-compressed",
-+ ".tgz" => "application/x-gtar-compressed",
-+ ".gz" => "application/x-gzip",
-+ ".hdf" => "application/x-hdf",
-+ ".hwp" => "application/x-hwp",
-+ ".ica" => "application/x-ica",
-+ ".info" => "application/x-info",
-+ ".ins" => "application/x-internet-signup",
-+ ".isp" => "application/x-internet-signup",
-+ ".iii" => "application/x-iphone",
-+ ".iso" => "application/x-iso9660-image",
-+ ".jam" => "application/x-jam",
-+ ".jnlp" => "application/x-java-jnlp-file",
-+ ".jmz" => "application/x-jmol",
-+ ".chrt" => "application/x-kchart",
-+ ".kil" => "application/x-killustrator",
-+ ".skd" => "application/x-koan",
-+ ".skm" => "application/x-koan",
-+ ".skp" => "application/x-koan",
-+ ".skt" => "application/x-koan",
-+ ".kpr" => "application/x-kpresenter",
-+ ".kpt" => "application/x-kpresenter",
-+ ".ksp" => "application/x-kspread",
-+ ".kwd" => "application/x-kword",
-+ ".kwt" => "application/x-kword",
-+ ".latex" => "application/x-latex",
-+ ".lha" => "application/x-lha",
-+ ".lyx" => "application/x-lyx",
-+ ".lzh" => "application/x-lzh",
-+ ".lzx" => "application/x-lzx",
-+ ".book" => "application/x-maker",
-+ ".fb" => "application/x-maker",
-+ ".fbdoc" => "application/x-maker",
-+ ".fm" => "application/x-maker",
-+ ".frame" => "application/x-maker",
-+ ".frm" => "application/x-maker",
-+ ".maker" => "application/x-maker",
-+ ".md5" => "application/x-md5",
-+ ".mif" => "application/x-mif",
-+ ".wmd" => "application/x-ms-wmd",
-+ ".wmz" => "application/x-ms-wmz",
-+ ".bat" => "application/x-msdos-program",
-+ ".com" => "application/x-msdos-program",
-+ ".dll" => "application/x-msdos-program",
-+ ".exe" => "application/x-msdos-program",
-+ ".msi" => "application/x-msi",
-+ ".nc" => "application/x-netcdf",
-+ ".dat" => "application/x-ns-proxy-autoconfig",
-+ ".pac" => "application/x-ns-proxy-autoconfig",
-+ ".nwc" => "application/x-nwc",
-+ ".o" => "application/x-object",
-+ ".oza" => "application/x-oz-application",
-+ ".p7r" => "application/x-pkcs7-certreqresp",
-+ ".crl" => "application/x-pkcs7-crl",
-+ ".pyc" => "application/x-python-code",
-+ ".pyo" => "application/x-python-code",
-+ ".qgs" => "application/x-qgis",
-+ ".shp" => "application/x-qgis",
-+ ".shx" => "application/x-qgis",
-+ ".qtl" => "application/x-quicktimeplayer",
-+ ".rdp" => "application/x-rdp",
-+ ".rpm" => "application/x-redhat-package-manager",
-+ ".rss" => "application/x-rss+xml",
-+ ".rb" => "application/x-ruby",
-+ ".sce" => "application/x-scilab",
-+ ".sci" => "application/x-scilab",
-+ ".xcos" => "application/x-scilab-xcos",
-+ ".sha1" => "application/x-sha1",
-+ ".shar" => "application/x-shar",
-+ ".swf" => "application/x-shockwave-flash",
-+ ".swfl" => "application/x-shockwave-flash",
-+ ".scr" => "application/x-silverlight",
-+ ".sql" => "application/x-sql",
-+ ".sit" => "application/x-stuffit",
-+ ".sitx" => "application/x-stuffit",
-+ ".sv4cpio" => "application/x-sv4cpio",
-+ ".sv4crc" => "application/x-sv4crc",
-+ ".tar" => "application/x-tar",
-+ ".gf" => "application/x-tex-gf",
-+ ".pk" => "application/x-tex-pk",
-+ ".texi" => "application/x-texinfo",
-+ ".texinfo" => "application/x-texinfo",
-+ ".roff" => "application/x-troff",
-+ ".t" => "application/x-troff",
-+ ".tr" => "application/x-troff",
-+ ".man" => "application/x-troff-man",
-+ ".me" => "application/x-troff-me",
-+ ".ms" => "application/x-troff-ms",
-+ ".ustar" => "application/x-ustar",
-+ ".src" => "application/x-wais-source",
-+ ".wz" => "application/x-wingz",
-+ ".crt" => "application/x-x509-ca-cert",
-+ ".xcf" => "application/x-xcf",
-+ ".fig" => "application/x-xfig",
-+ ".xpi" => "application/x-xpinstall",
-+ ".amr" => "audio/amr",
-+ ".awb" => "audio/amr-wb",
-+ ".axa" => "audio/annodex",
-+ ".au" => "audio/basic",
-+ ".snd" => "audio/basic",
-+ ".csd" => "audio/csound",
-+ ".orc" => "audio/csound",
-+ ".sco" => "audio/csound",
-+ ".flac" => "audio/flac",
-+ ".kar" => "audio/midi",
-+ ".mid" => "audio/midi",
-+ ".midi" => "audio/midi",
-+ ".m4a" => "audio/mpeg",
-+ ".mp2" => "audio/mpeg",
-+ ".mp3" => "audio/mpeg",
-+ ".mpega" => "audio/mpeg",
-+ ".mpga" => "audio/mpeg",
-+ ".m3u" => "audio/mpegurl",
-+ ".oga" => "audio/ogg",
-+ ".ogg" => "audio/ogg",
-+ ".opus" => "audio/ogg",
-+ ".spx" => "audio/ogg",
-+ ".sid" => "audio/prs.sid",
-+ ".aif" => "audio/x-aiff",
-+ ".aifc" => "audio/x-aiff",
-+ ".aiff" => "audio/x-aiff",
-+ ".gsm" => "audio/x-gsm",
-+ ".wax" => "audio/x-ms-wax",
-+ ".wma" => "audio/x-ms-wma",
-+ ".ra" => "audio/x-realaudio",
-+ ".ram" => "audio/x-realaudio",
-+ ".rm" => "audio/x-realaudio",
-+ ".pls" => "audio/x-scpls",
-+ ".sd2" => "audio/x-sd2",
-+ ".wav" => "audio/x-wav",
-+ ".alc" => "chemical/x-alchemy",
-+ ".cac" => "chemical/x-cache",
-+ ".cache" => "chemical/x-cache",
-+ ".csf" => "chemical/x-cache-csf",
-+ ".cascii" => "chemical/x-cactvs-binary",
-+ ".cbin" => "chemical/x-cactvs-binary",
-+ ".ctab" => "chemical/x-cactvs-binary",
-+ ".cdx" => "chemical/x-cdx",
-+ ".cer" => "chemical/x-cerius",
-+ ".c3d" => "chemical/x-chem3d",
-+ ".chm" => "chemical/x-chemdraw",
-+ ".cif" => "chemical/x-cif",
-+ ".cmdf" => "chemical/x-cmdf",
-+ ".cml" => "chemical/x-cml",
-+ ".cpa" => "chemical/x-compass",
-+ ".bsd" => "chemical/x-crossfire",
-+ ".csm" => "chemical/x-csml",
-+ ".csml" => "chemical/x-csml",
-+ ".ctx" => "chemical/x-ctx",
-+ ".cef" => "chemical/x-cxf",
-+ ".cxf" => "chemical/x-cxf",
-+ ".emb" => "chemical/x-embl-dl-nucleotide",
-+ ".embl" => "chemical/x-embl-dl-nucleotide",
-+ ".spc" => "chemical/x-galactic-spc",
-+ ".gam" => "chemical/x-gamess-input",
-+ ".gamin" => "chemical/x-gamess-input",
-+ ".inp" => "chemical/x-gamess-input",
-+ ".fch" => "chemical/x-gaussian-checkpoint",
-+ ".fchk" => "chemical/x-gaussian-checkpoint",
-+ ".cub" => "chemical/x-gaussian-cube",
-+ ".gau" => "chemical/x-gaussian-input",
-+ ".gjc" => "chemical/x-gaussian-input",
-+ ".gjf" => "chemical/x-gaussian-input",
-+ ".gal" => "chemical/x-gaussian-log",
-+ ".gcg" => "chemical/x-gcg8-sequence",
-+ ".gen" => "chemical/x-genbank",
-+ ".hin" => "chemical/x-hin",
-+ ".ist" => "chemical/x-isostar",
-+ ".istr" => "chemical/x-isostar",
-+ ".dx" => "chemical/x-jcamp-dx",
-+ ".jdx" => "chemical/x-jcamp-dx",
-+ ".kin" => "chemical/x-kinemage",
-+ ".mcm" => "chemical/x-macmolecule",
-+ ".mmd" => "chemical/x-macromodel-input",
-+ ".mmod" => "chemical/x-macromodel-input",
-+ ".mol" => "chemical/x-mdl-molfile",
-+ ".rd" => "chemical/x-mdl-rdfile",
-+ ".rxn" => "chemical/x-mdl-rxnfile",
-+ ".sd" => "chemical/x-mdl-sdfile",
-+ ".tgf" => "chemical/x-mdl-tgf",
-+ ".mcif" => "chemical/x-mmcif",
-+ ".mol2" => "chemical/x-mol2",
-+ ".gpt" => "chemical/x-mopac-graph",
-+ ".mop" => "chemical/x-mopac-input",
-+ ".mopcrt" => "chemical/x-mopac-input",
-+ ".mpc" => "chemical/x-mopac-input",
-+ ".zmt" => "chemical/x-mopac-input",
-+ ".moo" => "chemical/x-mopac-out",
-+ ".mvb" => "chemical/x-mopac-vib",
-+ ".prt" => "chemical/x-ncbi-asn1-ascii",
-+ ".aso" => "chemical/x-ncbi-asn1-binary",
-+ ".val" => "chemical/x-ncbi-asn1-binary",
-+ ".pdb" => "chemical/x-pdb",
-+ ".ros" => "chemical/x-rosdal",
-+ ".sw" => "chemical/x-swissprot",
-+ ".vms" => "chemical/x-vamas-iso14976",
-+ ".vmd" => "chemical/x-vmd",
-+ ".xtel" => "chemical/x-xtel",
-+ ".xyz" => "chemical/x-xyz",
-+ ".gif" => "image/gif",
-+ ".ief" => "image/ief",
-+ ".jp2" => "image/jp2",
-+ ".jpg2" => "image/jp2",
-+ ".jpe" => "image/jpeg",
-+ ".jpeg" => "image/jpeg",
-+ ".jpg" => "image/jpeg",
-+ ".jpm" => "image/jpm",
-+ ".jpf" => "image/jpx",
-+ ".jpx" => "image/jpx",
-+ ".pcx" => "image/pcx",
-+ ".png" => "image/png",
-+ ".svg" => "image/svg+xml",
-+ ".svgz" => "image/svg+xml",
-+ ".tif" => "image/tiff",
-+ ".tiff" => "image/tiff",
-+ ".djv" => "image/vnd.djvu",
-+ ".djvu" => "image/vnd.djvu",
-+ ".ico" => "image/vnd.microsoft.icon",
-+ ".wbmp" => "image/vnd.wap.wbmp",
-+ ".cr2" => "image/x-canon-cr2",
-+ ".crw" => "image/x-canon-crw",
-+ ".ras" => "image/x-cmu-raster",
-+ ".cdr" => "image/x-coreldraw",
-+ ".pat" => "image/x-coreldrawpattern",
-+ ".cdt" => "image/x-coreldrawtemplate",
-+ ".erf" => "image/x-epson-erf",
-+ ".art" => "image/x-jg",
-+ ".jng" => "image/x-jng",
-+ ".bmp" => "image/x-ms-bmp",
-+ ".nef" => "image/x-nikon-nef",
-+ ".orf" => "image/x-olympus-orf",
-+ ".psd" => "image/x-photoshop",
-+ ".pnm" => "image/x-portable-anymap",
-+ ".pbm" => "image/x-portable-bitmap",
-+ ".pgm" => "image/x-portable-graymap",
-+ ".ppm" => "image/x-portable-pixmap",
-+ ".rgb" => "image/x-rgb",
-+ ".xbm" => "image/x-xbitmap",
-+ ".xpm" => "image/x-xpixmap",
-+ ".xwd" => "image/x-xwindowdump",
-+ ".eml" => "message/rfc822",
-+ ".iges" => "model/iges",
-+ ".igs" => "model/iges",
-+ ".mesh" => "model/mesh",
-+ ".msh" => "model/mesh",
-+ ".silo" => "model/mesh",
-+ ".vrml" => "model/vrml",
-+ ".wrl" => "model/vrml",
-+ ".x3db" => "model/x3d+binary",
-+ ".x3dv" => "model/x3d+vrml",
-+ ".x3d" => "model/x3d+xml",
-+ ".appcache" => "text/cache-manifest",
-+ ".ics" => "text/calendar",
-+ ".icz" => "text/calendar",
-+ ".css" => "text/css; charset=utf-8",
-+ ".csv" => "text/csv; charset=utf-8",
-+ ".323" => "text/h323",
-+ ".htm" => "text/html",
-+ ".html" => "text/html",
-+ ".shtml" => "text/html",
-+ ".uls" => "text/iuls",
-+ ".mml" => "text/mathml",
-+ ".asc" => "text/plain; charset=utf-8",
-+ ".brf" => "text/plain; charset=utf-8",
-+ ".conf" => "text/plain; charset=utf-8",
-+ ".log" => "text/plain; charset=utf-8",
-+ ".pot" => "text/plain; charset=utf-8",
-+ ".spec" => "text/plain; charset=utf-8",
-+ ".srt" => "text/plain; charset=utf-8",
-+ ".text" => "text/plain; charset=utf-8",
-+ ".txt" => "text/plain; charset=utf-8",
-+ ".rtx" => "text/richtext",
-+ ".sct" => "text/scriptlet",
-+ ".wsc" => "text/scriptlet",
-+ ".tsv" => "text/tab-separated-values",
-+ ".tm" => "text/texmacs",
-+ ".ttl" => "text/turtle",
-+ ".jad" => "text/vnd.sun.j2me.app-descriptor",
-+ ".wml" => "text/vnd.wap.wml",
-+ ".wmls" => "text/vnd.wap.wmlscript",
-+ ".bib" => "text/x-bibtex; charset=utf-8",
-+ ".boo" => "text/x-boo; charset=utf-8",
-+ ".h++" => "text/x-c++hdr; charset=utf-8",
-+ ".hh" => "text/x-c++hdr; charset=utf-8",
-+ ".hpp" => "text/x-c++hdr; charset=utf-8",
-+ ".hxx" => "text/x-c++hdr; charset=utf-8",
-+ ".c++" => "text/x-c++src; charset=utf-8",
-+ ".cc" => "text/x-c++src; charset=utf-8",
-+ ".cpp" => "text/x-c++src; charset=utf-8",
-+ ".cxx" => "text/x-c++src; charset=utf-8",
-+ ".h" => "text/x-chdr; charset=utf-8",
-+ ".htc" => "text/x-component",
-+ ".csh" => "text/x-csh; charset=utf-8",
-+ ".c" => "text/x-csrc; charset=utf-8",
-+ ".diff" => "text/x-diff; charset=utf-8",
-+ ".patch" => "text/x-diff; charset=utf-8",
-+ ".d" => "text/x-dsrc; charset=utf-8",
-+ ".hs" => "text/x-haskell; charset=utf-8",
-+ ".java" => "text/x-java; charset=utf-8",
-+ ".ly" => "text/x-lilypond; charset=utf-8",
-+ ".lhs" => "text/x-literate-haskell; charset=utf-8",
-+ ".moc" => "text/x-moc; charset=utf-8",
-+ ".p" => "text/x-pascal; charset=utf-8",
-+ ".pas" => "text/x-pascal; charset=utf-8",
-+ ".gcd" => "text/x-pcs-gcd",
-+ ".pl" => "text/x-perl; charset=utf-8",
-+ ".pm" => "text/x-perl; charset=utf-8",
-+ ".py" => "text/x-python; charset=utf-8",
-+ ".scala" => "text/x-scala; charset=utf-8",
-+ ".etx" => "text/x-setext",
-+ ".sfv" => "text/x-sfv",
-+ ".sh" => "text/x-sh; charset=utf-8",
-+ ".tcl" => "text/x-tcl; charset=utf-8",
-+ ".tk" => "text/x-tcl; charset=utf-8",
-+ ".cls" => "text/x-tex; charset=utf-8",
-+ ".ltx" => "text/x-tex; charset=utf-8",
-+ ".sty" => "text/x-tex; charset=utf-8",
-+ ".tex" => "text/x-tex; charset=utf-8",
-+ ".vcs" => "text/x-vcalendar",
-+ ".vcf" => "text/x-vcard",
-+ ".3gp" => "video/3gpp",
-+ ".axv" => "video/annodex",
-+ ".dl" => "video/dl",
-+ ".dif" => "video/dv",
-+ ".dv" => "video/dv",
-+ ".fli" => "video/fli",
-+ ".gl" => "video/gl",
-+ ".mp4" => "video/mp4",
-+ ".mpe" => "video/mpeg",
-+ ".mpeg" => "video/mpeg",
-+ ".mpg" => "video/mpeg",
-+ ".ogv" => "video/ogg",
-+ ".mov" => "video/quicktime",
-+ ".qt" => "video/quicktime",
-+ ".webm" => "video/webm",
-+ ".mxu" => "video/vnd.mpegurl",
-+ ".flv" => "video/x-flv",
-+ ".lsf" => "video/x-la-asf",
-+ ".lsx" => "video/x-la-asf",
-+ ".mkv" => "video/x-matroska",
-+ ".mpv" => "video/x-matroska",
-+ ".mng" => "video/x-mng",
-+ ".asf" => "video/x-ms-asf",
-+ ".asx" => "video/x-ms-asf",
-+ ".wm" => "video/x-ms-wm",
-+ ".wmv" => "video/x-ms-wmv",
-+ ".wmx" => "video/x-ms-wmx",
-+ ".wvx" => "video/x-ms-wvx",
-+ ".avi" => "video/x-msvideo",
-+ ".movie" => "video/x-sgi-movie",
-+ ".ice" => "x-conference/x-cooltalk",
-+ ".sisx" => "x-epoc/x-sisx-app",
-+ ".vrm" => "x-world/x-vrml",
-+ "README" => "text/plain; charset=utf-8",
-+ "Makefile" => "text/x-makefile; charset=utf-8",
-
-+ # enable caching for unknown mime types:
-+ "" => "application/octet-stream"
-+)
-diff --git a/doc/scripts/create-mime.conf.pl b/doc/scripts/create-mime.conf.pl
-new file mode 100755
-index 0000000..7c9e378
---- /dev/null
-+++ b/doc/scripts/create-mime.conf.pl
-@@ -0,0 +1,197 @@
-+#!/usr/bin/perl -w
-+
-+# Based on create-mime.assign.pl in debian lighttpd (1.4.x) package
-+# Creates an example mime.conf from /etc/mime.types
-+
-+use strict;
-+
-+# text/* subtypes to serve as "text/...; charset=utf-8"
-+# text/html IS NOT INCLUDED: html has its own method for defining charset
-+# (<meta>), but the standards specify that content-type in HTTP wins over
-+# the setting in the html document.
-+my %text_utf8 = map { $_ => 1 } qw(
-+ css
-+ csv
-+ plain
-+ x-bibtex
-+ x-boo
-+ x-c++hdr
-+ x-c++src
-+ x-chdr
-+ x-csh
-+ x-csrc
-+ x-dsrc
-+ x-diff
-+ x-haskell
-+ x-java
-+ x-lilypond
-+ x-literate-haskell
-+ x-makefile
-+ x-moc
-+ x-pascal
-+ x-perl
-+ x-python
-+ x-scala
-+ x-sh
-+ x-tcl
-+ x-tex
-+);
-+
-+# map extension to hash which maps types to the type they should be replaced with
-+my %manual_conflicts_resolve = (
-+ '.ra' => {
-+ 'audio/x-pn-realaudio' => 'audio/x-realaudio',
-+ },
-+);
-+
-+open MIMETYPES, "/etc/mime.types" or die "Can't open /etc/mime.types: $!";
-+
-+my %extensions;
-+sub set {
-+ my ($extension, $mimetype) = @_;
-+ $extensions{$extension} = $mimetype;
-+}
-+sub add {
-+ my ($extension, $mimetype) = @_;
-+ my $have = $extensions{$extension};
-+
-+ my $r = $manual_conflicts_resolve{$extension};
-+ # update @_ too for calls to set
-+ $_[1] = $mimetype = $r->{$mimetype} if $r && $r->{$mimetype};
-+
-+ # mime.types can have same extension for different mime types
-+ if ($have) {
-+ # application/octet-stream means we couldn't resolve another conflict
-+ return if $have eq $mimetype || $have eq 'application/octet-stream';
-+
-+ my ($have_type, $have_subtype) = split /\//, $have, 2;
-+ my ($type, $subtype) = split /\//, $mimetype, 2;
-+
-+ my $have_x = ($have_type =~ /^x-/ || $have_subtype =~ /^x-/);
-+ my $x = ($type =~ /^x-/ || $subtype =~ /^x-/);
-+
-+ # entries without x- prefix in type/subtype win:
-+ if ($have_x && !$x) {
-+ return set @_; # overwrite
-+ } elsif ($x && !$have_x) {
-+ return; # ignore
-+ }
-+
-+ # text/ wins over application/ for same subtype
-+ if ($subtype eq $have_subtype) {
-+ if ($type eq "text" && $have_type eq "application") {
-+ return set @_; # overwrite
-+ } elsif ($have_type eq "text" && $type eq "application") {
-+ return; # ignore
-+ }
-+ }
-+
-+ print STDERR "Duplicate mimetype: '${extension}' => '${mimetype}' (already have '${have}'), merging to 'application/octet-stream'\n";
-+ set ($extension, 'application/octet-stream');
-+ } else {
-+ set @_;
-+ }
-+}
-+
-+sub print_type {
-+ my ($extension, $mimetype) = @_;
-+ if ($mimetype =~ /^text\/(.*)$/) {
-+ $mimetype .= "; charset=utf-8" if $text_utf8{$1};
-+ }
-+
-+ print "\t\"${extension}\" => \"${mimetype}\",\n";
-+}
-+
-+while (<MIMETYPES>) {
-+ chomp;
-+ s/\#.*//;
-+ next if /^\w*$/;
-+ if (/^([a-z0-9\/+-.]+)\s+((?:[a-z0-9.+-]+[ ]?)+)$/) {
-+ my $mimetype = $1;
-+ my @extensions = split / /, $2;
-+
-+ foreach my $ext (@extensions) {
-+ add(".${ext}", $mimetype);
-+ }
-+ }
-+}
-+
-+# missing in /etc/mime.types;
-+# from http://www.iana.org/assignments/media-types/media-types.xhtml
-+add(".dtd", "application/xml-dtd");
-+
-+# other useful mappings
-+my %useful = (
-+ ".tar.gz" => "application/x-gtar-compressed",
-+ ".gz" => "application/x-gzip",
-+ ".tbz" => "application/x-gtar-compressed",
-+ ".tar.bz2" => "application/x-gtar-compressed",
-+ ".bz2" => "application/x-bzip",
-+ ".log" => "text/plain",
-+ ".conf" => "text/plain",
-+ ".spec" => "text/plain",
-+ "README" => "text/plain",
-+ "Makefile" => "text/x-makefile",
-+);
-+
-+while (my ($ext, $mimetype) = each %useful) {
-+ add($ext, $mimetype) unless $extensions{$ext};
-+}
-+
-+
-+print <<EOF;
-+# created by create-mime.conf.pl
-+
-+#######################################################################
-+##
-+## MimeType handling
-+## -------------------
-+##
-+## https://redmine.lighttpd.net/projects/lighttpd/wiki/Mimetype_assignDetails
-+
-+##
-+## Use the "Content-Type" extended file attribute to obtain mime type if
-+## possible
-+##
-+## Disabled by default
-+##
-+#mimetype.use-xattr = "enable"
-+
-+##
-+## mimetype ("Content-Type" HTTP header) mapping for static file handling
-+##
-+## The first matching suffix is used. If no mapping is found
-+## 'application/octet-stream' is used, and caching (etag/last-modified handling)
-+## is disabled to prevent clients from caching "unknown" mime types.
-+##
-+## Therefore the last mapping is:
-+## "" => "application/octet-stream"
-+## This matches all extensions and acts as default mime type, and enables
-+## caching for those.
-+mimetype.assign = (
-+EOF
-+
-+# sort "x-" and "vnd." prefixed names after everything else
-+sub mimecmpvalue {
-+ my ($mimetype) = @_;
-+ $mimetype =~ s/(^|\/)(x-|vnd\.)/~$1$2/g;
-+ return $mimetype;
-+}
-+sub countdots {
-+ my ($s) = @_;
-+ return scalar(() = $s =~ /\./g);
-+}
-+# the first matching suffix wins, so we have to sort by "length"
-+# as all extensions start with "." we use the number of "."s as length
-+# the exceptions are "README" and "Makefile" which are assumed not to conflict
-+# (i.e. are not a suffix of any other extension)
-+for my $ext (sort { countdots($b) <=> countdots($a) || mimecmpvalue($extensions{$a}) cmp mimecmpvalue($extensions{$b}) || $a cmp $b } keys(%extensions)) {
-+ print_type($ext, $extensions{$ext});
-+}
-+
-+print <<EOF;
-+
-+ # enable caching for unknown mime types:
-+ "" => "application/octet-stream"
-+)
-+EOF
---
-2.4.5
-
diff --git a/main/lighttpd/0005-fix-typo-in-NEWS-entry-for-2579.patch b/main/lighttpd/0005-fix-typo-in-NEWS-entry-for-2579.patch
deleted file mode 100644
index 9f252e5306..0000000000
--- a/main/lighttpd/0005-fix-typo-in-NEWS-entry-for-2579.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 059a5a67ddff848385773162f90d6477b450d391 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Tue, 13 May 2014 13:04:35 +0000
-Subject: [PATCH 05/29] fix typo in NEWS entry for #2579
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2965 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/NEWS b/NEWS
-index 8c34545..0bf0313 100644
---- a/NEWS
-+++ b/NEWS
-@@ -6,7 +6,7 @@ NEWS
- - 1.4.36
- * use keep-alive timeout while waiting for HTTP headers; use always the read timeout while waiting for the HTTP body
- * fix bad shift in conditional netmask ".../0" handling
-- * add more mime types and a script to generate mime.conf (fxies #2579)
-+ * add more mime types and a script to generate mime.conf (fixes #2579)
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
---
-2.4.5
-
diff --git a/main/lighttpd/0006-add-support-for-Free-BSD-extended-attributes.patch b/main/lighttpd/0006-add-support-for-Free-BSD-extended-attributes.patch
deleted file mode 100644
index f3affb9119..0000000000
--- a/main/lighttpd/0006-add-support-for-Free-BSD-extended-attributes.patch
+++ /dev/null
@@ -1,175 +0,0 @@
-From 4d55d4ada3ebbdd6b99855fe0767d26490955a22 Mon Sep 17 00:00:00 2001
-From: Moritz Wilhelmy <mw@barfooze.de>
-Date: Thu, 22 May 2014 08:30:13 +0000
-Subject: [PATCH 06/29] add support for (Free)BSD extended attributes
-
-enable with `./configure --with-attr` and `mimetype.use-xattr =
-"enable"` in the config.
-
-set attribute with:
-
- setextattr user Content-Type text/plain path/to/www/file
-
-From: Moritz Wilhelmy <mw@barfooze.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2966 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- configure.ac | 25 +++++++++++++++++--------
- src/mod_dirlisting.c | 17 ++++++++++++++---
- src/stat_cache.c | 21 +++++++++++++++++++--
- 4 files changed, 51 insertions(+), 13 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 0bf0313..84a1c80 100644
---- a/NEWS
-+++ b/NEWS
-@@ -7,6 +7,7 @@ NEWS
- * use keep-alive timeout while waiting for HTTP headers; use always the read timeout while waiting for the HTTP body
- * fix bad shift in conditional netmask ".../0" handling
- * add more mime types and a script to generate mime.conf (fixes #2579)
-+ * add support for (Free)BSD extended attributes
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/configure.ac b/configure.ac
-index ae35234..48e6b52 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -218,14 +218,23 @@ AC_ARG_WITH(attr, AC_HELP_STRING([--with-attr],[enable extended attribute suppor
- [WITH_ATTR=$withval],[WITH_ATTR=no])
- AC_MSG_RESULT($withval)
- if test "$WITH_ATTR" != "no"; then
-- AC_CHECK_LIB(attr, attr_get, [
-- AC_CHECK_HEADERS([attr/attributes.h],[
-- ATTR_LIB=-lattr
-- AC_DEFINE([HAVE_XATTR], [1], [libattr])
-- AC_DEFINE([HAVE_ATTR_ATTRIBUTES_H], [1])
-- ])
-- ])
-- AC_SUBST(ATTR_LIB)
-+ # libattr (linux only?)
-+ AC_CHECK_LIB(attr, attr_get, [
-+ AC_CHECK_HEADERS([attr/attributes.h],[
-+ ATTR_LIB=-lattr
-+ AC_DEFINE([HAVE_XATTR], [1], [libattr])
-+ AC_DEFINE([HAVE_ATTR_ATTRIBUTES_H], [1])
-+ ])
-+ ])
-+ AC_SUBST(ATTR_LIB)
-+
-+ # (Free)BSD extattr
-+ AC_CHECK_FUNC([extattr_get_file], [
-+ AC_CHECK_HEADERS([sys/extattr.h],[
-+ AC_DEFINE([HAVE_EXTATTR], [1], [BSD extended attributes])
-+ AC_DEFINE([HAVE_SYS_EXTATTR_H], [1])
-+ ])
-+ ])
- fi
-
- dnl openssl on solaris needs -lsocket -lnsl
-diff --git a/src/mod_dirlisting.c b/src/mod_dirlisting.c
-index cd5809e..6aba403 100644
---- a/src/mod_dirlisting.c
-+++ b/src/mod_dirlisting.c
-@@ -31,6 +31,10 @@
- #include <attr/attributes.h>
- #endif
-
-+#ifdef HAVE_SYS_EXTATTR_H
-+#include <sys/extattr.h>
-+#endif
-+
- #include "version.h"
-
- /* plugin config for all request/connections */
-@@ -644,7 +648,7 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- size_t k;
- const char *content_type;
- long name_max;
--#ifdef HAVE_XATTR
-+#if defined(HAVE_XATTR) || defined(HAVE_EXTATTR)
- char attrval[128];
- int attrlen;
- #endif
-@@ -820,8 +824,7 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- tmp = files.ent[i];
-
- content_type = NULL;
--#ifdef HAVE_XATTR
--
-+#if defined(HAVE_XATTR)
- if (con->conf.use_xattr) {
- memcpy(path_file, DIRLIST_ENT_NAME(tmp), tmp->namelen + 1);
- attrlen = sizeof(attrval) - 1;
-@@ -830,6 +833,14 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- content_type = attrval;
- }
- }
-+#elif defined(HAVE_EXTATTR)
-+ if (con->conf.use_xattr) {
-+ memcpy(path_file, DIRLIST_ENT_NAME(tmp), tmp->namelen + 1);
-+ if(-1 != (attrlen = extattr_get_file(path, EXTATTR_NAMESPACE_USER, "Content-Type", attrval, sizeof(attrval)-1))) {
-+ attrval[attrlen] = '\0';
-+ content_type = attrval;
-+ }
-+ }
- #endif
-
- if (content_type == NULL) {
-diff --git a/src/stat_cache.c b/src/stat_cache.c
-index 480aae4..9007325 100644
---- a/src/stat_cache.c
-+++ b/src/stat_cache.c
-@@ -18,6 +18,10 @@
- # include <attr/attributes.h>
- #endif
-
-+#ifdef HAVE_SYS_EXTATTR_H
-+# include <sys/extattr.h>
-+#endif
-+
- #ifdef HAVE_FAM_H
- # include <fam.h>
- #endif
-@@ -210,7 +214,7 @@ void stat_cache_free(stat_cache *sc) {
- free(sc);
- }
-
--#ifdef HAVE_XATTR
-+#if defined(HAVE_XATTR)
- static int stat_cache_attr_get(buffer *buf, char *name) {
- int attrlen;
- int ret;
-@@ -224,6 +228,19 @@ static int stat_cache_attr_get(buffer *buf, char *name) {
- }
- return ret;
- }
-+#elif defined(HAVE_EXTATTR)
-+static int stat_cache_attr_get(buffer *buf, char *name) {
-+ ssize_t attrlen = 1024;
-+
-+ buffer_prepare_copy(buf, attrlen);
-+
-+ if (-1 != (attrlen = extattr_get_file(name, EXTATTR_NAMESPACE_USER, "Content-Type", buf->ptr, attrlen-1))) {
-+ buf->used = attrlen + 1;
-+ buf->ptr[attrlen] = '\0';
-+ return 0;
-+ }
-+ return -1;
-+}
- #endif
-
- /* the famous DJB hash function for strings */
-@@ -592,7 +609,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- if (S_ISREG(st.st_mode)) {
- /* determine mimetype */
- buffer_reset(sce->content_type);
--#ifdef HAVE_XATTR
-+#if defined(HAVE_XATTR) || defined(HAVE_EXTATTR)
- if (con->conf.use_xattr) {
- stat_cache_attr_get(sce->content_type, name->ptr);
- }
---
-2.4.5
-
diff --git a/main/lighttpd/0007-build-use-fortify-flags-with-extra-warnings.patch b/main/lighttpd/0007-build-use-fortify-flags-with-extra-warnings.patch
deleted file mode 100644
index 13db16ac19..0000000000
--- a/main/lighttpd/0007-build-use-fortify-flags-with-extra-warnings.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From c4f214584aeaa30214d5364ef8bc2171dbd7bb3c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 16 Oct 2014 17:52:10 +0000
-Subject: [PATCH 07/29] [build] use fortify flags with "extra-warnings"
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2967 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- configure.ac | 27 ++++++++++++++++++++++++---
- src/CMakeLists.txt | 2 +-
- 3 files changed, 26 insertions(+), 4 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 84a1c80..115e638 100644
---- a/NEWS
-+++ b/NEWS
-@@ -8,6 +8,7 @@ NEWS
- * fix bad shift in conditional netmask ".../0" handling
- * add more mime types and a script to generate mime.conf (fixes #2579)
- * add support for (Free)BSD extended attributes
-+ * [build] use fortify flags with "extra-warnings"
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/configure.ac b/configure.ac
-index 48e6b52..e804030 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -23,6 +23,26 @@ AM_INIT_AUTOMAKE([-Wall -Wno-portability -Wno-override foreign dist-bzip2 tar-us
- dnl enable with --enable-silent-rules or make V=0 (needs automake >= 1.11)
- m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES])
-
-+
-+dnl @synopsis TRY_CFLAGS [compiler flags]
-+dnl @summary check whether compiler supports given C flags and adds them to CFLAGS
-+AC_DEFUN([TRY_CFLAGS],
-+[dnl
-+ AC_MSG_CHECKING([if $CC supports $1])
-+ AC_LANG_PUSH([C])
-+ ac_try_cflags_saved_cflags="${CFLAGS}"
-+ CFLAGS="${CFLAGS} $1"
-+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
-+ [AC_MSG_RESULT([yes])],
-+ [
-+ AC_MSG_ERROR([no])
-+ CFLAGS="${ac_try_cflags_saved_cflags}"
-+ ]
-+ )
-+ AC_LANG_POP([C])
-+])
-+
-+
- dnl Checks for programs.
- AC_PROG_CC
- AM_PROG_CC_C_O
-@@ -394,7 +414,7 @@ if test "$WITH_FAM" != "no"; then
- LIBS=$FAM_LIBS
- AC_CHECK_FUNCS([FAMNoExists])
- LIBS=$OLD_LIBS
--
-+
- if test x$FAM_LIBS = x; then
- AC_MSG_ERROR([fam/gamin-headers and/or libs where not found, install them or build with --without-fam])
- fi
-@@ -622,7 +642,8 @@ AM_CONDITIONAL(CHECK_WITH_FASTCGI, test "x$fastcgi_found" = xyes)
-
- dnl check for extra compiler options (warning options)
- if test "${GCC}" = "yes"; then
-- CFLAGS="${CFLAGS} -Wall -W -Wshadow -pedantic -std=gnu99"
-+ TRY_CFLAGS([-Wall -W -Wshadow -pedantic])
-+ TRY_CFLAGS([-std=gnu99])
- fi
-
- AC_ARG_ENABLE(extra-warnings,
-@@ -634,7 +655,7 @@ AC_ARG_ENABLE(extra-warnings,
- esac],[extrawarnings=false])
-
- if test x$extrawarnings = xtrue; then
-- CFLAGS="${CFLAGS} -g -O2 -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wno-pointer-sign -Wcast-align -Winline -Wsign-compare -Wnested-externs -Wpointer-arith -Wl,--as-needed -Wformat-security"
-+ TRY_CFLAGS([-g -O2 -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wcast-align -Winline -Wsign-compare -Wnested-externs -Wpointer-arith -Wl,--as-needed -D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security])
- fi
-
- dnl build version-id
diff --git a/main/lighttpd/0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch b/main/lighttpd/0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
deleted file mode 100644
index 637f1721d0..0000000000
--- a/main/lighttpd/0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-From 4a6838103d8a6de025dcce1adfa6f508f17b3c16 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 16 Oct 2014 17:52:12 +0000
-Subject: [PATCH 08/29] [mod_dirlisting,mod_redirect,mod_rewrite] abort config
- parsing if pcre-compile fails or isn't available
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2968 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/mod_dirlisting.c | 80 +++++++++++++++++++++++++---------------------------
- src/mod_redirect.c | 1 +
- src/mod_rewrite.c | 1 +
- 4 files changed, 41 insertions(+), 42 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 115e638..7260fc5 100644
---- a/NEWS
-+++ b/NEWS
-@@ -9,6 +9,7 @@ NEWS
- * add more mime types and a script to generate mime.conf (fixes #2579)
- * add support for (Free)BSD extended attributes
- * [build] use fortify flags with "extra-warnings"
-+ * [mod_dirlisting,mod_redirect,mod_rewrite] abort config parsing if pcre-compile fails or isn't available
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/mod_dirlisting.c b/src/mod_dirlisting.c
-index 6aba403..6a2b139 100644
---- a/src/mod_dirlisting.c
-+++ b/src/mod_dirlisting.c
-@@ -198,47 +198,6 @@ FREE_FUNC(mod_dirlisting_free) {
- return HANDLER_GO_ON;
- }
-
--static int parse_config_entry(server *srv, plugin_config *s, array *ca, const char *option) {
-- data_unset *du;
--
-- if (NULL != (du = array_get_element(ca, option))) {
-- data_array *da;
-- size_t j;
--
-- if (du->type != TYPE_ARRAY) {
-- log_error_write(srv, __FILE__, __LINE__, "sss",
-- "unexpected type for key: ", option, "array of strings");
--
-- return HANDLER_ERROR;
-- }
--
-- da = (data_array *)du;
--
-- for (j = 0; j < da->value->used; j++) {
-- if (da->value->data[j]->type != TYPE_STRING) {
-- log_error_write(srv, __FILE__, __LINE__, "sssbs",
-- "unexpected type for key: ", option, "[",
-- da->value->data[j]->key, "](string)");
--
-- return HANDLER_ERROR;
-- }
--
-- if (0 != excludes_buffer_append(s->excludes,
-- ((data_string *)(da->value->data[j]))->value)) {
--#ifdef HAVE_PCRE_H
-- log_error_write(srv, __FILE__, __LINE__, "sb",
-- "pcre-compile failed for", ((data_string *)(da->value->data[j]))->value);
--#else
-- log_error_write(srv, __FILE__, __LINE__, "s",
-- "pcre support is missing, please install libpcre and the headers");
--#endif
-- }
-- }
-- }
--
-- return 0;
--}
--
- /* handle plugin config and check values */
-
- #define CONFIG_EXCLUDE "dir-listing.exclude"
-@@ -287,6 +246,7 @@ SETDEFAULTS_FUNC(mod_dirlisting_set_defaults) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s;
- array *ca;
-+ data_unset *du_excludes;
-
- s = calloc(1, sizeof(plugin_config));
- s->excludes = excludes_buffer_init();
-@@ -326,7 +286,43 @@ SETDEFAULTS_FUNC(mod_dirlisting_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- parse_config_entry(srv, s, ca, CONFIG_EXCLUDE);
-+ if (NULL != (du_excludes = array_get_element(ca, CONFIG_EXCLUDE))) {
-+ array *excludes_list;
-+ size_t j;
-+
-+ if (du_excludes->type != TYPE_ARRAY) {
-+ log_error_write(srv, __FILE__, __LINE__, "sss",
-+ "unexpected type for key: ", CONFIG_EXCLUDE, "array of strings");
-+ return HANDLER_ERROR;
-+ }
-+
-+ excludes_list = ((data_array*)du_excludes)->value;
-+
-+#ifndef HAVE_PCRE_H
-+ if (excludes_list->used > 0) {
-+ log_error_write(srv, __FILE__, __LINE__, "sss",
-+ "pcre support is missing for: ", CONFIG_EXCLUDE, ", please install libpcre and the headers");
-+ return HANDLER_ERROR;
-+ }
-+#else
-+ for (j = 0; j < excludes_list->used; j++) {
-+ data_unset *du_exclude = excludes_list->data[j];
-+
-+ if (du_exclude->type != TYPE_STRING) {
-+ log_error_write(srv, __FILE__, __LINE__, "sssbs",
-+ "unexpected type for key: ", CONFIG_EXCLUDE, "[",
-+ du_exclude->key, "](string)");
-+ return HANDLER_ERROR;
-+ }
-+
-+ if (0 != excludes_buffer_append(s->excludes, ((data_string*)(du_exclude))->value)) {
-+ log_error_write(srv, __FILE__, __LINE__, "sb",
-+ "pcre-compile failed for", ((data_string*)(du_exclude))->value);
-+ return HANDLER_ERROR;
-+ }
-+ }
-+#endif
-+ }
- }
-
- return HANDLER_GO_ON;
-diff --git a/src/mod_redirect.c b/src/mod_redirect.c
-index 3fdb4e3..bfc00d7 100644
---- a/src/mod_redirect.c
-+++ b/src/mod_redirect.c
-@@ -129,6 +129,7 @@ SETDEFAULTS_FUNC(mod_redirect_set_defaults) {
-
- log_error_write(srv, __FILE__, __LINE__, "sb",
- "pcre-compile failed for", da->value->data[j]->key);
-+ return HANDLER_ERROR;
- }
- }
- }
-diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c
-index 988dfd7..381f0ed 100644
---- a/src/mod_rewrite.c
-+++ b/src/mod_rewrite.c
-@@ -191,6 +191,7 @@ static int parse_config_entry(server *srv, array *ca, rewrite_rule_buffer *kvb,
- once)) {
- log_error_write(srv, __FILE__, __LINE__, "sb",
- "pcre-compile failed for", da->value->data[j]->key);
-+ return HANDLER_ERROR;
- }
- }
- }
---
-2.4.5
-
diff --git a/main/lighttpd/0009-ssl-disable-SSL3.0-by-default.patch b/main/lighttpd/0009-ssl-disable-SSL3.0-by-default.patch
deleted file mode 100644
index 6980a19497..0000000000
--- a/main/lighttpd/0009-ssl-disable-SSL3.0-by-default.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 084df7e99a8738be79f83e330415a8963280dc4a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 16 Oct 2014 17:52:14 +0000
-Subject: [PATCH 09/29] [ssl] disable SSL3.0 by default
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2969 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/configfile.c | 2 +-
- 2 files changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/NEWS b/NEWS
-index 7260fc5..a702941 100644
---- a/NEWS
-+++ b/NEWS
-@@ -10,6 +10,7 @@ NEWS
- * add support for (Free)BSD extended attributes
- * [build] use fortify flags with "extra-warnings"
- * [mod_dirlisting,mod_redirect,mod_rewrite] abort config parsing if pcre-compile fails or isn't available
-+ * [ssl] disable SSL3.0 by default
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/configfile.c b/src/configfile.c
-index 1e96ce0..bf9a34d 100644
---- a/src/configfile.c
-+++ b/src/configfile.c
-@@ -182,7 +182,7 @@ static int config_insert(server *srv) {
- s->ssl_honor_cipher_order = 1;
- s->ssl_empty_fragments = 0;
- s->ssl_use_sslv2 = 0;
-- s->ssl_use_sslv3 = 1;
-+ s->ssl_use_sslv3 = 0;
- s->use_ipv6 = 0;
- s->set_v6only = 1;
- s->defer_accept = 0;
---
-2.4.5
-
diff --git a/main/lighttpd/0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch b/main/lighttpd/0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
deleted file mode 100644
index 9f95d3ee41..0000000000
--- a/main/lighttpd/0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From e1aab1c420e8d291299d1024e1c3450d85bec772 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Marcus=20R=C3=BCckert?= <darix@opensu.se>
-Date: Thu, 5 Feb 2015 15:29:01 +0000
-Subject: [PATCH 10/29] Fixed typo found by openSUSE user (boo# 907709)
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2970 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- doc/config/vhosts.d/vhosts.template | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/doc/config/vhosts.d/vhosts.template b/doc/config/vhosts.d/vhosts.template
-index 2c443aa..efd441f 100644
---- a/doc/config/vhosts.d/vhosts.template
-+++ b/doc/config/vhosts.d/vhosts.template
-@@ -8,17 +8,17 @@ $HTTP["host"] == "download.example.com" {
- var.server_name = "download.example.com"
-
- server.name = server_name
-- ##
-+ ## example how to include another config:
- ## use trigger before download
- ##
-- include "conf.d/trigger_b4_dl.conf"
-+ # include "conf.d/trigger_b4_dl.conf"
-
- server.document-root = vhosts_dir + "/example.com/download/htdocs"
- ##
- ## use a seperate access log file
- ## At the moment you cant have different error log files.
- ##
-- accesslog.filename = log_root + "/" + server_name "/access.log"
-+ accesslog.filename = log_root + "/" + server_name + "/access.log"
- }
-
- $SERVER["socket"] == "127.0.0.1:443" {
---
-2.4.5
-
diff --git a/main/lighttpd/0011-add-NEWS-entry-for-previous-commit.patch b/main/lighttpd/0011-add-NEWS-entry-for-previous-commit.patch
deleted file mode 100644
index 791eafaf90..0000000000
--- a/main/lighttpd/0011-add-NEWS-entry-for-previous-commit.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 76870cfef1ae3a39c792ce9839e6191e0696c1cb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sat, 7 Feb 2015 11:33:28 +0000
-Subject: [PATCH 11/29] add NEWS entry for previous commit
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2971 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/NEWS b/NEWS
-index a702941..7347012 100644
---- a/NEWS
-+++ b/NEWS
-@@ -11,6 +11,7 @@ NEWS
- * [build] use fortify flags with "extra-warnings"
- * [mod_dirlisting,mod_redirect,mod_rewrite] abort config parsing if pcre-compile fails or isn't available
- * [ssl] disable SSL3.0 by default
-+ * fixed typo in example config found by openSUSE user (boo# 907709)
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
---
-2.4.5
-
diff --git a/main/lighttpd/0012-network-fix-compile-break-in-calculation-of-sockaddr.patch b/main/lighttpd/0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
deleted file mode 100644
index 9aa38e537d..0000000000
--- a/main/lighttpd/0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From b0a632f253737463138c182a3fb9c8be04caef5d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sat, 7 Feb 2015 11:33:30 +0000
-Subject: [PATCH 12/29] [network] fix compile break in calculation of
- sockaddr_un size if SUN_LEN is not defined (fixes #2609)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2972 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/network.c | 13 +++++++------
- 2 files changed, 8 insertions(+), 6 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 7347012..bf8984f 100644
---- a/NEWS
-+++ b/NEWS
-@@ -12,6 +12,7 @@ NEWS
- * [mod_dirlisting,mod_redirect,mod_rewrite] abort config parsing if pcre-compile fails or isn't available
- * [ssl] disable SSL3.0 by default
- * fixed typo in example config found by openSUSE user (boo# 907709)
-+ * [network] fix compile break in calculation of sockaddr_un size if SUN_LEN is not defined (fixes #2609)
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/network.c b/src/network.c
-index ebde43b..776a86c 100644
---- a/src/network.c
-+++ b/src/network.c
-@@ -349,6 +349,8 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
-
- break;
- case AF_UNIX:
-+ memset(&srv_socket->addr, 0, sizeof(struct sockaddr_un));
-+ srv_socket->addr.un.sun_family = AF_UNIX;
- {
- size_t hostlen = strlen(host) + 1;
- if (hostlen > sizeof(srv_socket->addr.un.sun_path)) {
-@@ -356,15 +358,14 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
- goto error_free_socket;
- }
- memcpy(srv_socket->addr.un.sun_path, host, hostlen);
-- }
-- srv_socket->addr.un.sun_family = AF_UNIX;
-
--#ifdef SUN_LEN
-- addr_len = SUN_LEN(&srv_socket->addr.un);
-+#if defined(SUN_LEN)
-+ addr_len = SUN_LEN(&srv_socket->addr.un);
- #else
-- /* stevens says: */
-- addr_len = hostlen + sizeof(srv_socket->addr.un.sun_family);
-+ /* stevens says: */
-+ addr_len = hostlen + sizeof(srv_socket->addr.un.sun_family);
- #endif
-+ }
-
- /* check if the socket exists and try to connect to it. */
- if (-1 != (fd = connect(srv_socket->fd, (struct sockaddr *) &(srv_socket->addr), addr_len))) {
---
-2.4.5
-
diff --git a/main/lighttpd/0013-connections-fix-bug-in-connection-state-handling.patch b/main/lighttpd/0013-connections-fix-bug-in-connection-state-handling.patch
deleted file mode 100644
index 1567759899..0000000000
--- a/main/lighttpd/0013-connections-fix-bug-in-connection-state-handling.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From d00e1e79b94e0f4da35292d2293595dac02993c7 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sat, 7 Feb 2015 13:32:54 +0000
-Subject: [PATCH 13/29] [connections] fix bug in connection state handling
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
- if a request was finished (con->file_finished = 1) and the state
- machine was triggered, but the write queue was empty, it didn't
- actually finish the request.
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2973 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/connections.c | 22 +++++++++-------------
- 2 files changed, 10 insertions(+), 13 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index bf8984f..9c579de 100644
---- a/NEWS
-+++ b/NEWS
-@@ -13,6 +13,7 @@ NEWS
- * [ssl] disable SSL3.0 by default
- * fixed typo in example config found by openSUSE user (boo# 907709)
- * [network] fix compile break in calculation of sockaddr_un size if SUN_LEN is not defined (fixes #2609)
-+ * [connections] fix bug in connection state handling
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/connections.c b/src/connections.c
-index bbaa632..fe683a2 100644
---- a/src/connections.c
-+++ b/src/connections.c
-@@ -1632,20 +1632,16 @@ int connection_state_machine(server *srv, connection *con) {
-
- /* only try to write if we have something in the queue */
- if (!chunkqueue_is_empty(con->write_queue)) {
--#if 0
-- log_error_write(srv, __FILE__, __LINE__, "dsd",
-- con->fd,
-- "packets to write:",
-- con->write_queue->used);
--#endif
-- }
-- if (!chunkqueue_is_empty(con->write_queue) && con->is_writable) {
-- if (-1 == connection_handle_write(srv, con)) {
-- log_error_write(srv, __FILE__, __LINE__, "ds",
-- con->fd,
-- "handle write failed.");
-- connection_set_state(srv, con, CON_STATE_ERROR);
-+ if (con->is_writable) {
-+ if (-1 == connection_handle_write(srv, con)) {
-+ log_error_write(srv, __FILE__, __LINE__, "ds",
-+ con->fd,
-+ "handle write failed.");
-+ connection_set_state(srv, con, CON_STATE_ERROR);
-+ }
- }
-+ } else if (con->file_finished) {
-+ connection_set_state(srv, con, CON_STATE_RESPONSE_END);
- }
-
- break;
---
-2.4.5
-
diff --git a/main/lighttpd/0014-print-backtrace-in-assert-logging-with-libunwind.patch b/main/lighttpd/0014-print-backtrace-in-assert-logging-with-libunwind.patch
deleted file mode 100644
index ff6ef06902..0000000000
--- a/main/lighttpd/0014-print-backtrace-in-assert-logging-with-libunwind.patch
+++ /dev/null
@@ -1,187 +0,0 @@
-From 3521be8b8599ae2cc12361c8f600fc58a473de91 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sat, 7 Feb 2015 13:32:56 +0000
-Subject: [PATCH 14/29] print backtrace in assert logging with libunwind
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2974 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- configure.ac | 11 +++++++++
- src/CMakeLists.txt | 11 +++++++++
- src/Makefile.am | 5 ++--
- src/buffer.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/buffer.h | 2 ++
- src/config.h.cmake | 3 +++
- 7 files changed, 102 insertions(+), 2 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 9c579de..fd537e8 100644
---- a/NEWS
-+++ b/NEWS
-@@ -14,6 +14,7 @@ NEWS
- * fixed typo in example config found by openSUSE user (boo# 907709)
- * [network] fix compile break in calculation of sockaddr_un size if SUN_LEN is not defined (fixes #2609)
- * [connections] fix bug in connection state handling
-+ * print backtrace in assert logging with libunwind
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/configure.ac b/configure.ac
-index e804030..63261ca 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -285,6 +285,17 @@ if test "$WITH_VALGRIND" != "no"; then
- AC_CHECK_HEADERS([valgrind/valgrind.h])
- fi
-
-+dnl Checking for libunwind
-+AC_MSG_CHECKING(for libunwind)
-+AC_ARG_WITH(libunwind,
-+ AC_HELP_STRING([--with-libunwind],[Include libunwind support for backtraces on assert failures]),
-+ [WITH_LIBUNWIND=$withval],[WITH_LIBUNWIND=no])
-+
-+if test "$WITH_LIBUNWIND" != "no"; then
-+ PKG_CHECK_MODULES(LIBUNWIND, libunwind)
-+ AC_DEFINE(HAVE_LIBUNWIND, 1, [Have libunwind support])
-+fi
-+
- dnl Check for openssl
- AC_MSG_CHECKING(for OpenSSL)
- AC_ARG_WITH(openssl,
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 4afdcc6..a5471ff 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -1,4 +1,4 @@
--AM_CFLAGS = $(FAM_CFLAGS)
-+AM_CFLAGS = $(FAM_CFLAGS) $(LIBUNWIND_CFLAGS)
-
- noinst_PROGRAMS=proc_open lemon # simple-fcgi #graphic evalo bench ajp ssl error_test adserver gen-license
- sbin_PROGRAMS=lighttpd lighttpd-angel
-@@ -284,11 +284,12 @@ hdr = server.h buffer.h network.h log.h keyvalue.h \
- DEFS= @DEFS@ -DHAVE_VERSION_H -DLIBRARY_DIR="\"$(libdir)\"" -DSBIN_DIR="\"$(sbindir)\""
-
- lighttpd_SOURCES = $(src)
--lighttpd_LDADD = $(PCRE_LIB) $(DL_LIB) $(SENDFILE_LIB) $(ATTR_LIB) $(common_libadd) $(SSL_LIB) $(FAM_LIBS) $(LIBEV_LIBS)
-+lighttpd_LDADD = $(PCRE_LIB) $(DL_LIB) $(SENDFILE_LIB) $(ATTR_LIB) $(common_libadd) $(SSL_LIB) $(FAM_LIBS) $(LIBEV_LIBS) $(LIBUNWIND_LIBS)
- lighttpd_LDFLAGS = -export-dynamic
- lighttpd_CCPFLAGS = $(FAM_CFLAGS) $(LIBEV_CFLAGS)
-
- proc_open_SOURCES = proc_open.c buffer.c
-+proc_open_LDADD = $(LIBUNWIND_LIBS)
- proc_open_CPPFLAGS= -DDEBUG_PROC_OPEN
-
- #gen_license_SOURCES = license.c md5.c buffer.c gen_license.c
-diff --git a/src/buffer.c b/src/buffer.c
-index 1199164..b4bd415 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -1059,9 +1059,80 @@ int buffer_to_upper(buffer *b) {
- return 0;
- }
-
-+#ifdef HAVE_LIBUNWIND
-+# define UNW_LOCAL_ONLY
-+# include <libunwind.h>
-+
-+void print_backtrace(FILE *file) {
-+ unw_cursor_t cursor;
-+ unw_context_t context;
-+ int ret;
-+ unsigned int frame = 0;
-+
-+ if (0 != (ret = unw_getcontext(&context))) goto error;
-+ if (0 != (ret = unw_init_local(&cursor, &context))) goto error;
-+
-+ fprintf(file, "Backtrace:\n");
-+
-+ while (0 < (ret = unw_step(&cursor))) {
-+ unw_word_t proc_ip = 0;
-+ unw_proc_info_t procinfo;
-+ char procname[256];
-+ unw_word_t proc_offset = 0;
-+
-+ if (0 != (ret = unw_get_reg(&cursor, UNW_REG_IP, &proc_ip))) goto error;
-+
-+ if (0 == proc_ip) {
-+ /* without an IP the other functions are useless; unw_get_proc_name would return UNW_EUNSPEC */
-+ ++frame;
-+ fprintf(file, "%u: (nil)\n", frame);
-+ continue;
-+ }
-+
-+ if (0 != (ret = unw_get_proc_info(&cursor, &procinfo))) goto error;
-+
-+ if (0 != (ret = unw_get_proc_name(&cursor, procname, sizeof(procname), &proc_offset))) {
-+ switch (-ret) {
-+ case UNW_ENOMEM:
-+ memset(procname + sizeof(procname) - 4, '.', 3);
-+ procname[sizeof(procname) - 1] = '\0';
-+ break;
-+ case UNW_ENOINFO:
-+ procname[0] = '?';
-+ procname[1] = '\0';
-+ proc_offset = 0;
-+ break;
-+ default:
-+ snprintf(procname, sizeof(procname), "?? (unw_get_proc_name error %d)", -ret);
-+ break;
-+ }
-+ }
-+
-+ ++frame;
-+ fprintf(file, "%u: %s (+0x%x) [%p]\n",
-+ frame,
-+ procname,
-+ (unsigned int) proc_offset,
-+ (void*)(uintptr_t)proc_ip);
-+ }
-+
-+ if (0 != ret) goto error;
-+
-+ return;
-+
-+error:
-+ fprintf(file, "Error while generating backtrace: unwind error %i\n", (int) -ret);
-+}
-+#else
-+void print_backtrace(FILE *file) {
-+ UNUSED(file);
-+}
-+#endif
-+
- void log_failed_assert(const char *filename, unsigned int line, const char *msg) {
- /* can't use buffer here; could lead to recursive assertions */
- fprintf(stderr, "%s.%d: %s\n", filename, line, msg);
-+ print_backtrace(stderr);
- fflush(stderr);
- abort();
- }
-diff --git a/src/buffer.h b/src/buffer.h
-index 20635e2..d2f5985 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -9,6 +9,7 @@
-
- #include <stdlib.h>
- #include <sys/types.h>
-+#include <stdio.h>
-
- typedef struct {
- char *ptr;
-@@ -128,6 +129,7 @@ int light_isalnum(int c);
-
- #define UNUSED(x) ( (void)(x) )
-
-+void print_backtrace(FILE *file);
- void log_failed_assert(const char *filename, unsigned int line, const char *msg) LI_NORETURN;
- #define force_assert(x) do { if (!(x)) log_failed_assert(__FILE__, __LINE__, "assertion failed: " #x); } while(0)
- #define SEGFAULT() log_failed_assert(__FILE__, __LINE__, "aborted");
---
-2.4.5
-
diff --git a/main/lighttpd/0015-fix-buffer-chunk-and-http_chunk-API.patch b/main/lighttpd/0015-fix-buffer-chunk-and-http_chunk-API.patch
deleted file mode 100644
index 7380ce5ce8..0000000000
--- a/main/lighttpd/0015-fix-buffer-chunk-and-http_chunk-API.patch
+++ /dev/null
@@ -1,6095 +0,0 @@
-From 6afad87d2ed66a48cda2a7c01dbcc59023774b73 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 12:37:10 +0000
-Subject: [PATCH 15/29] fix buffer, chunk and http_chunk API
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
- * remove unused structs and functions
- (buffer_array, read_buffer)
- * change return type from int to void for many functions,
- as the return value (indicating error/success) was never checked,
- and the function would only fail on programming errors and not on
- invalid input; changed functions to use force_assert instead of
- returning an error.
- * all "len" parameters now are the real size of the memory to be read.
- the length of strings is given always without the terminating 0.
- * the "buffer" struct still counts the terminating 0 in ->used,
- provide buffer_string_length() to get the length of a string in a
- buffer.
- unset config "strings" have used == 0, which is used in some places
- to distinguish unset values from "" (empty string) values.
- * most buffer usages should now use it as string container.
- * optimise some buffer copying by "moving" data to other buffers
- * use (u)intmax_t for generic int-to-string functions
- * remove unused enum values: UNUSED_CHUNK, ENCODING_UNSET
- * converted BUFFER_APPEND_SLASH to inline function (no macro feature
- needed)
- * refactor: create chunkqueue_steal: moving (partial) chunks into another
- queue
- * http_chunk: added separate function to terminate chunked body instead of
- magic handling in http_chunk_append_mem().
- http_chunk_append_* now handle empty chunks, and never terminate the
- chunked body.
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2975 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/array.c | 2 +-
- src/buffer.c | 752 ++++++++++++++++++----------------------------
- src/buffer.h | 170 ++++++-----
- src/chunk.c | 244 +++++++--------
- src/chunk.h | 18 +-
- src/configfile-glue.c | 16 +-
- src/configfile.c | 26 +-
- src/configparser.y | 26 +-
- src/connections.c | 28 +-
- src/data_array.c | 2 +-
- src/data_config.c | 4 +-
- src/data_count.c | 2 +-
- src/data_fastcgi.c | 4 +-
- src/data_integer.c | 2 +-
- src/data_string.c | 8 +-
- src/etag.c | 10 +-
- src/http-header-glue.c | 6 +-
- src/http_auth.c | 14 +-
- src/http_chunk.c | 71 ++---
- src/http_chunk.h | 8 +-
- src/log.c | 16 +-
- src/mod_access.c | 2 +-
- src/mod_accesslog.c | 22 +-
- src/mod_alias.c | 6 +-
- src/mod_auth.c | 6 +-
- src/mod_cgi.c | 49 ++-
- src/mod_cml.c | 10 +-
- src/mod_cml_lua.c | 14 +-
- src/mod_compress.c | 20 +-
- src/mod_dirlisting.c | 17 +-
- src/mod_evhost.c | 8 +-
- src/mod_expire.c | 2 +-
- src/mod_fastcgi.c | 219 ++++----------
- src/mod_flv_streaming.c | 4 +-
- src/mod_indexfile.c | 6 +-
- src/mod_magnet.c | 8 +-
- src/mod_magnet_cache.c | 4 +-
- src/mod_mysql_vhost.c | 18 +-
- src/mod_proxy.c | 77 +----
- src/mod_redirect.c | 2 +-
- src/mod_rewrite.c | 4 +-
- src/mod_rrdtool.c | 12 +-
- src/mod_scgi.c | 135 +++------
- src/mod_secure_download.c | 14 +-
- src/mod_setenv.c | 8 +-
- src/mod_simple_vhost.c | 26 +-
- src/mod_ssi.c | 33 +-
- src/mod_ssi_expr.c | 4 +-
- src/mod_staticfile.c | 16 +-
- src/mod_status.c | 50 +--
- src/mod_trigger_b4_dl.c | 10 +-
- src/mod_uploadprogress.c | 10 +-
- src/mod_userdir.c | 20 +-
- src/mod_usertrack.c | 16 +-
- src/mod_webdav.c | 62 ++--
- src/network.c | 28 +-
- src/plugin.c | 2 +-
- src/request.c | 6 +-
- src/response.c | 32 +-
- src/server.c | 2 +-
- src/stat_cache.c | 26 +-
- 62 files changed, 1044 insertions(+), 1396 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index fd537e8..ddb370d 100644
---- a/NEWS
-+++ b/NEWS
-@@ -15,6 +15,7 @@ NEWS
- * [network] fix compile break in calculation of sockaddr_un size if SUN_LEN is not defined (fixes #2609)
- * [connections] fix bug in connection state handling
- * print backtrace in assert logging with libunwind
-+ * major refactoring of internal buffer/chunk handling
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/array.c b/src/array.c
-index c9af995..9a15abd 100644
---- a/src/array.c
-+++ b/src/array.c
-@@ -188,7 +188,7 @@ int array_insert_unique(array *a, data_unset *str) {
-
- /* generate unique index if neccesary */
- if (str->key->used == 0 || str->is_index_key) {
-- buffer_copy_long(str->key, a->unique_ndx++);
-+ buffer_copy_int(str->key, a->unique_ndx++);
- str->is_index_key = 1;
- }
-
-diff --git a/src/buffer.c b/src/buffer.c
-index b4bd415..caaa5bb 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -7,12 +7,6 @@
- #include <assert.h>
- #include <ctype.h>
-
--#if defined HAVE_STDINT_H
--# include <stdint.h>
--#elif defined HAVE_INTTYPES_H
--# include <inttypes.h>
--#endif
--
- static const char hex_chars[] = "0123456789abcdef";
-
-
-@@ -34,177 +28,160 @@ buffer* buffer_init(void) {
- return b;
- }
-
--buffer *buffer_init_buffer(buffer *src) {
-+buffer *buffer_init_buffer(const buffer *src) {
- buffer *b = buffer_init();
-- buffer_copy_string_buffer(b, src);
-+ buffer_copy_buffer(b, src);
- return b;
- }
-
--/**
-- * free the buffer
-- *
-- */
-+buffer *buffer_init_string(const char *str) {
-+ buffer *b = buffer_init();
-+ buffer_copy_string(b, str);
-+ return b;
-+}
-
- void buffer_free(buffer *b) {
-- if (!b) return;
-+ if (NULL == b) return;
-
- free(b->ptr);
- free(b);
- }
-
- void buffer_reset(buffer *b) {
-- if (!b) return;
-+ if (NULL == b) return;
-
- /* limit don't reuse buffer larger than ... bytes */
- if (b->size > BUFFER_MAX_REUSE_SIZE) {
- free(b->ptr);
- b->ptr = NULL;
- b->size = 0;
-- } else if (b->size) {
-+ } else if (b->size > 0) {
- b->ptr[0] = '\0';
- }
-
- b->used = 0;
- }
-
-+void buffer_move(buffer *b, buffer *src) {
-+ buffer tmp;
-
--/**
-- *
-- * allocate (if neccessary) enough space for 'size' bytes and
-- * set the 'used' counter to 0
-- *
-- */
-+ if (NULL == b) {
-+ buffer_reset(src);
-+ return;
-+ }
-+ buffer_reset(b);
-+ if (NULL == src) return;
-+
-+ tmp = *src; *src = *b; *b = tmp;
-+}
-
- #define BUFFER_PIECE_SIZE 64
-+static size_t buffer_align_size(size_t size) {
-+ size_t align = BUFFER_PIECE_SIZE - (size % BUFFER_PIECE_SIZE);
-+ /* overflow on unsinged size_t is defined to wrap around */
-+ if (size + align < size) return size;
-+ return size + align;
-+}
-
--int buffer_prepare_copy(buffer *b, size_t size) {
-- if (!b) return -1;
-+char* buffer_prepare_copy(buffer *b, size_t size) {
-+ force_assert(NULL != b);
-
-- if ((0 == b->size) ||
-- (size > b->size)) {
-- if (b->size) free(b->ptr);
-+ /* also allocate space for terminating 0 */
-+ /* check for overflow: unsigned overflow is defined to wrap around */
-+ force_assert(1 + size > size);
-+ ++size;
-
-- b->size = size;
-+ if (0 == b->size || size > b->size) {
-+ if (NULL != b->ptr) free(b->ptr);
-+ b->ptr = NULL;
-
-- /* always allocate a multiply of BUFFER_PIECE_SIZE */
-- b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);
-+ b->size = buffer_align_size(size);
-+ force_assert(b->size > 0);
-
- b->ptr = malloc(b->size);
-- force_assert(b->ptr);
-+ force_assert(NULL != b->ptr);
- }
-- b->used = 0;
-- return 0;
--}
--
--/**
-- *
-- * increase the internal buffer (if neccessary) to append another 'size' byte
-- * ->used isn't changed
-- *
-- */
-
--int buffer_prepare_append(buffer *b, size_t size) {
-- if (!b) return -1;
--
-- if (0 == b->size) {
-- b->size = size;
--
-- /* always allocate a multiply of BUFFER_PIECE_SIZE */
-- b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);
-+ /* reset */
-+ b->used = 0;
-+ b->ptr[0] = '\0';
-
-- b->ptr = malloc(b->size);
-- b->used = 0;
-- force_assert(b->ptr);
-- } else if (b->used + size > b->size) {
-- b->size += size;
-+ return b->ptr;
-+}
-
-- /* always allocate a multiply of BUFFER_PIECE_SIZE */
-- b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);
-+char* buffer_prepare_append(buffer *b, size_t size) {
-+ size_t req_size;
-+ force_assert(NULL != b);
-
-- b->ptr = realloc(b->ptr, b->size);
-- force_assert(b->ptr);
-+ if (buffer_string_is_empty(b)) {
-+ size_t old_used = b->used; /* either 0 or 1 */
-+ /* just prepare copy (free+malloc instead of realloc) */
-+ buffer_prepare_copy(b, size);
-+ b->used = old_used; /* buffer_prepare_append mustn't modify b->used */
-+ return b->ptr;
- }
-- return 0;
--}
-
--int buffer_copy_string(buffer *b, const char *s) {
-- size_t s_len;
-+ /* not empty, b->used already includes a terminating 0 */
-+ req_size = b->used + size;
-
-- if (!s || !b) return -1;
-+ /* check for overflow: unsigned overflow is defined to wrap around */
-+ force_assert(req_size >= b->used);
-
-- s_len = strlen(s) + 1;
-- buffer_prepare_copy(b, s_len);
-+ if (req_size > b->size) {
-+ char *ptr;
-+ b->size = buffer_align_size(req_size);
-
-- memcpy(b->ptr, s, s_len);
-- b->used = s_len;
-+ ptr = realloc(b->ptr, b->size);
-+ force_assert(NULL != ptr);
-+ b->ptr = ptr;
-+ }
-
-- return 0;
-+ return b->ptr + b->used - 1;
- }
-
--int buffer_copy_string_len(buffer *b, const char *s, size_t s_len) {
-- if (!s || !b) return -1;
--#if 0
-- /* removed optimization as we have to keep the empty string
-- * in some cases for the config handling
-- *
-- * url.access-deny = ( "" )
-- */
-- if (s_len == 0) return 0;
--#endif
-- buffer_prepare_copy(b, s_len + 1);
--
-- memcpy(b->ptr, s, s_len);
-- b->ptr[s_len] = '\0';
-- b->used = s_len + 1;
-+void buffer_commit(buffer *b, size_t size)
-+{
-+ force_assert(NULL != b);
-+ force_assert(b->size > 0);
-
-- return 0;
--}
-+ if (0 == b->used) b->used = 1;
-
--int buffer_copy_string_buffer(buffer *b, const buffer *src) {
-- if (!src) return -1;
-+ if (size > 0) {
-+ /* check for overflow: unsigned overflow is defined to wrap around */
-+ force_assert(b->used + size > b->used);
-
-- if (src->used == 0) {
-- buffer_reset(b);
-- return 0;
-+ force_assert(b->used + size <= b->size);
-+ b->used += size;
- }
-- return buffer_copy_string_len(b, src->ptr, src->used - 1);
-+
-+ b->ptr[b->used - 1] = '\0';
- }
-
--int buffer_append_string(buffer *b, const char *s) {
-- size_t s_len;
-+void buffer_copy_string(buffer *b, const char *s) {
-+ buffer_copy_string_len(b, s, NULL != s ? strlen(s) : 0);
-+}
-
-- if (!s || !b) return -1;
-+void buffer_copy_string_len(buffer *b, const char *s, size_t s_len) {
-+ force_assert(NULL != b);
-+ force_assert(NULL != s || s_len == 0);
-
-- s_len = strlen(s);
-- buffer_prepare_append(b, s_len + 1);
-- if (b->used == 0)
-- b->used++;
-+ buffer_prepare_copy(b, s_len);
-
-- memcpy(b->ptr + b->used - 1, s, s_len + 1);
-- b->used += s_len;
-+ if (0 != s_len) memcpy(b->ptr, s, s_len);
-
-- return 0;
-+ buffer_commit(b, s_len);
- }
-
--int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen) {
-- size_t s_len;
--
-- if (!s || !b) return -1;
--
-- s_len = strlen(s);
-- if (s_len > maxlen) s_len = maxlen;
-- buffer_prepare_append(b, maxlen + 1);
-- if (b->used == 0)
-- b->used++;
--
-- memcpy(b->ptr + b->used - 1, s, s_len);
-- if (maxlen > s_len) {
-- memset(b->ptr + b->used - 1 + s_len, ' ', maxlen - s_len);
-+void buffer_copy_buffer(buffer *b, const buffer *src) {
-+ if (NULL == src || 0 == src->used) {
-+ buffer_prepare_copy(b, 0);
-+ } else {
-+ buffer_copy_string_len(b, src->ptr, buffer_string_length(src));
- }
-+}
-
-- b->used += maxlen;
-- b->ptr[b->used - 1] = '\0';
-- return 0;
-+void buffer_append_string(buffer *b, const char *s) {
-+ buffer_append_string_len(b, s, NULL != s ? strlen(s) : 0);
- }
-
- /**
-@@ -218,176 +195,138 @@ int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen) {
- * @param s_len size of the string (without the terminating \0)
- */
-
--int buffer_append_string_len(buffer *b, const char *s, size_t s_len) {
-- if (!s || !b) return -1;
-- if (s_len == 0) return 0;
--
-- buffer_prepare_append(b, s_len + 1);
-- if (b->used == 0)
-- b->used++;
--
-- memcpy(b->ptr + b->used - 1, s, s_len);
-- b->used += s_len;
-- b->ptr[b->used - 1] = '\0';
--
-- return 0;
--}
-+void buffer_append_string_len(buffer *b, const char *s, size_t s_len) {
-+ char *target_buf;
-
--int buffer_append_string_buffer(buffer *b, const buffer *src) {
-- if (!src) return -1;
-- if (src->used == 0) return 0;
-+ force_assert(NULL != b);
-+ force_assert(NULL != s || s_len == 0);
-
-- return buffer_append_string_len(b, src->ptr, src->used - 1);
--}
-+ target_buf = buffer_prepare_append(b, s_len);
-
--int buffer_append_memory(buffer *b, const char *s, size_t s_len) {
-- if (!s || !b) return -1;
-- if (s_len == 0) return 0;
-+ /* only append to 0-terminated string */
-+ force_assert('\0' == *target_buf);
-
-- buffer_prepare_append(b, s_len);
-- memcpy(b->ptr + b->used, s, s_len);
-- b->used += s_len;
-+ if (s_len > 0) memcpy(target_buf, s, s_len);
-
-- return 0;
-+ buffer_commit(b, s_len);
- }
-
--int buffer_copy_memory(buffer *b, const char *s, size_t s_len) {
-- if (!s || !b) return -1;
--
-- b->used = 0;
--
-- return buffer_append_memory(b, s, s_len);
-+void buffer_append_string_buffer(buffer *b, const buffer *src) {
-+ if (NULL == src) {
-+ buffer_append_string_len(b, NULL, 0);
-+ } else {
-+ buffer_append_string_len(b, src->ptr, buffer_string_length(src));
-+ }
- }
-
--int buffer_append_long_hex(buffer *b, unsigned long value) {
-+void buffer_append_long_hex(buffer *b, unsigned long value) {
- char *buf;
- int shift = 0;
-- unsigned long copy = value;
-
-- while (copy) {
-- copy >>= 4;
-- shift++;
-+ {
-+ unsigned long copy = value;
-+ do {
-+ copy >>= 8;
-+ shift += 2; /* counting nibbles (4 bits) */
-+ } while (0 != copy);
- }
-- if (shift == 0)
-- shift++;
-- if (shift & 0x01)
-- shift++;
--
-- buffer_prepare_append(b, shift + 1);
-- if (b->used == 0)
-- b->used++;
-- buf = b->ptr + (b->used - 1);
-- b->used += shift;
--
-- shift <<= 2;
-+
-+ buf = buffer_prepare_append(b, shift);
-+ buffer_commit(b, shift); /* will fill below */
-+
-+ shift <<= 2; /* count bits now */
- while (shift > 0) {
- shift -= 4;
- *(buf++) = hex_chars[(value >> shift) & 0x0F];
- }
-- *buf = '\0';
--
-- return 0;
- }
-
--int LI_ltostr(char *buf, long val) {
-- char swap;
-- char *end;
-- int len = 1;
--
-- if (val < 0) {
-- len++;
-- *(buf++) = '-';
-- val = -val;
-- }
--
-- end = buf;
-- while (val > 9) {
-- *(end++) = '0' + (val % 10);
-- val = val / 10;
-- }
-- *(end) = '0' + val;
-- *(end + 1) = '\0';
-- len += end - buf;
-+static char* utostr(char * const buf_end, uintmax_t val) {
-+ char *cur = buf_end;
-+ do {
-+ int mod = val % 10;
-+ val /= 10;
-+ /* prepend digit mod */
-+ *(--cur) = (char) ('0' + mod);
-+ } while (0 != val);
-+ return cur;
-+}
-
-- while (buf < end) {
-- swap = *end;
-- *end = *buf;
-- *buf = swap;
-+static char* itostr(char * const buf_end, intmax_t val) {
-+ char *cur = buf_end;
-+ if (val >= 0) return utostr(buf_end, (uintmax_t) val);
-
-- buf++;
-- end--;
-- }
-+ /* can't take absolute value, as it isn't defined for INTMAX_MIN */
-+ do {
-+ int mod = val % 10;
-+ val /= 10;
-+ /* val * 10 + mod == orig val, -10 < mod < 10 */
-+ /* we want a negative mod */
-+ if (mod > 0) {
-+ mod -= 10;
-+ val += 1;
-+ }
-+ /* prepend digit abs(mod) */
-+ *(--cur) = (char) ('0' + (-mod));
-+ } while (0 != val);
-+ *(--cur) = '-';
-
-- return len;
-+ return cur;
- }
-
--int buffer_append_long(buffer *b, long val) {
-- if (!b) return -1;
-+void buffer_append_int(buffer *b, intmax_t val) {
-+ char buf[LI_ITOSTRING_LENGTH];
-+ char* const buf_end = buf + sizeof(buf);
-+ char *str;
-
-- buffer_prepare_append(b, 32);
-- if (b->used == 0)
-- b->used++;
-+ force_assert(NULL != b);
-
-- b->used += LI_ltostr(b->ptr + (b->used - 1), val);
-- return 0;
-+ str = itostr(buf_end, val);
-+ force_assert(buf_end > str && str >= buf);
-+
-+ buffer_append_string_len(b, str, buf_end - str);
- }
-
--int buffer_copy_long(buffer *b, long val) {
-- if (!b) return -1;
-+void buffer_copy_int(buffer *b, intmax_t val) {
-+ force_assert(NULL != b);
-
- b->used = 0;
-- return buffer_append_long(b, val);
-+ buffer_append_int(b, val);
- }
-
--#if !defined(SIZEOF_LONG) || (SIZEOF_LONG != SIZEOF_OFF_T)
--int buffer_append_off_t(buffer *b, off_t val) {
-- char swap;
-- char *end;
-- char *start;
-- int len = 1;
--
-- if (!b) return -1;
-+void li_itostrn(char *buf, size_t buf_len, intmax_t val) {
-+ char p_buf[LI_ITOSTRING_LENGTH];
-+ char* const p_buf_end = p_buf + sizeof(p_buf);
-+ char* str = p_buf_end - 1;
-+ *str = '\0';
-
-- buffer_prepare_append(b, 32);
-- if (b->used == 0)
-- b->used++;
-+ str = itostr(str, val);
-+ force_assert(p_buf_end > str && str >= p_buf);
-
-- start = b->ptr + (b->used - 1);
-- if (val < 0) {
-- len++;
-- *(start++) = '-';
-- val = -val;
-- }
-+ force_assert(buf_len >= (size_t) (p_buf_end - str));
-+ memcpy(buf, str, p_buf_end - str);
-+}
-
-- end = start;
-- while (val > 9) {
-- *(end++) = '0' + (val % 10);
-- val = val / 10;
-- }
-- *(end) = '0' + val;
-- *(end + 1) = '\0';
-- len += end - start;
-+void li_itostr(char *buf, intmax_t val) {
-+ li_itostrn(buf, LI_ITOSTRING_LENGTH, val);
-+}
-
-- while (start < end) {
-- swap = *end;
-- *end = *start;
-- *start = swap;
-+void li_utostrn(char *buf, size_t buf_len, uintmax_t val) {
-+ char p_buf[LI_ITOSTRING_LENGTH];
-+ char* const p_buf_end = p_buf + sizeof(p_buf);
-+ char* str = p_buf_end - 1;
-+ *str = '\0';
-
-- start++;
-- end--;
-- }
-+ str = utostr(str, val);
-+ force_assert(p_buf_end > str && str >= p_buf);
-
-- b->used += len;
-- return 0;
-+ force_assert(buf_len >= (size_t) (p_buf_end - str));
-+ memcpy(buf, str, p_buf_end - str);
- }
-
--int buffer_copy_off_t(buffer *b, off_t val) {
-- if (!b) return -1;
--
-- b->used = 0;
-- return buffer_append_off_t(b, val);
-+void li_utostr(char *buf, uintmax_t val) {
-+ li_utostrn(buf, LI_ITOSTRING_LENGTH, val);
- }
--#endif /* !defined(SIZEOF_LONG) || (SIZEOF_LONG != SIZEOF_OFF_T) */
-
- char int2hex(char c) {
- return hex_chars[(c & 0x0F)];
-@@ -397,99 +336,21 @@ char int2hex(char c) {
- * returns 0xFF on invalid input.
- */
- char hex2int(unsigned char hex) {
-- hex = hex - '0';
-- if (hex > 9) {
-- hex = (hex + '0' - 1) | 0x20;
-- hex = hex - 'a' + 11;
-+ unsigned char value = hex - '0';
-+ if (value > 9) {
-+ hex |= 0x20; /* to lower case */
-+ value = hex - 'a' + 10;
-+ if (value < 10) value = 0xff;
- }
-- if (hex > 15)
-- hex = 0xFF;
-+ if (value > 15) value = 0xff;
-
-- return hex;
-+ return value;
- }
-
--
--/**
-- * init the buffer
-- *
-- */
--
--buffer_array* buffer_array_init(void) {
-- buffer_array *b;
--
-- b = malloc(sizeof(*b));
--
-- force_assert(b);
-- b->ptr = NULL;
-- b->size = 0;
-- b->used = 0;
--
-- return b;
--}
--
--void buffer_array_reset(buffer_array *b) {
-- size_t i;
--
-- if (!b) return;
--
-- /* if they are too large, reduce them */
-- for (i = 0; i < b->used; i++) {
-- buffer_reset(b->ptr[i]);
-- }
--
-- b->used = 0;
--}
--
--
--/**
-- * free the buffer_array
-- *
-- */
--
--void buffer_array_free(buffer_array *b) {
-- size_t i;
-- if (!b) return;
--
-- for (i = 0; i < b->size; i++) {
-- if (b->ptr[i]) buffer_free(b->ptr[i]);
-- }
-- free(b->ptr);
-- free(b);
--}
--
--buffer *buffer_array_append_get_buffer(buffer_array *b) {
-- size_t i;
--
-- if (b->size == 0) {
-- b->size = 16;
-- b->ptr = malloc(sizeof(*b->ptr) * b->size);
-- force_assert(b->ptr);
-- for (i = 0; i < b->size; i++) {
-- b->ptr[i] = NULL;
-- }
-- } else if (b->size == b->used) {
-- b->size += 16;
-- b->ptr = realloc(b->ptr, sizeof(*b->ptr) * b->size);
-- force_assert(b->ptr);
-- for (i = b->used; i < b->size; i++) {
-- b->ptr[i] = NULL;
-- }
-- }
--
-- if (b->ptr[b->used] == NULL) {
-- b->ptr[b->used] = buffer_init();
-- }
--
-- b->ptr[b->used]->used = 0;
--
-- return b->ptr[b->used++];
--}
--
--
- char * buffer_search_string_len(buffer *b, const char *needle, size_t len) {
- size_t i;
-- if (len == 0) return NULL;
-- if (needle == NULL) return NULL;
-+ force_assert(NULL != b);
-+ force_assert(0 != len && NULL != needle); /* empty needles not allowed */
-
- if (b->used < len) return NULL;
-
-@@ -502,17 +363,12 @@ char * buffer_search_string_len(buffer *b, const char *needle, size_t len) {
- return NULL;
- }
-
--buffer *buffer_init_string(const char *str) {
-- buffer *b = buffer_init();
--
-- buffer_copy_string(b, str);
--
-- return b;
-+int buffer_is_empty(buffer *b) {
-+ return NULL == b || 0 == b->used;
- }
-
--int buffer_is_empty(buffer *b) {
-- if (!b) return 1;
-- return (b->used == 0);
-+int buffer_string_is_empty(buffer *b) {
-+ return 0 == buffer_string_length(b);
- }
-
- /**
-@@ -523,24 +379,30 @@ int buffer_is_empty(buffer *b) {
- */
-
- int buffer_is_equal(buffer *a, buffer *b) {
-+ force_assert(NULL != a && NULL != b);
-+
- if (a->used != b->used) return 0;
- if (a->used == 0) return 1;
-
-- return (0 == strcmp(a->ptr, b->ptr));
-+ return (0 == memcmp(a->ptr, b->ptr, a->used));
- }
-
- int buffer_is_equal_string(buffer *a, const char *s, size_t b_len) {
-- buffer b;
-+ force_assert(NULL != a && NULL != s);
-+ force_assert(b_len + 1 > b_len);
-
-- b.ptr = (char *)s;
-- b.used = b_len + 1;
-+ if (a->used != b_len + 1) return 0;
-+ if (0 != memcmp(a->ptr, s, b_len)) return 0;
-+ if ('\0' != a->ptr[a->used-1]) return 0;
-
-- return buffer_is_equal(a, &b);
-+ return 1;
- }
-
- /* buffer_is_equal_caseless_string(b, CONST_STR_LEN("value")) */
- int buffer_is_equal_caseless_string(buffer *a, const char *s, size_t b_len) {
-+ force_assert(NULL != a);
- if (a->used != b_len + 1) return 0;
-+ force_assert('\0' == a->ptr[a->used - 1]);
-
- return (0 == strcasecmp(a->ptr, s));
- }
-@@ -554,30 +416,18 @@ int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b
- if (ca == cb) continue;
-
- /* always lowercase for transitive results */
--#if 1
- if (ca >= 'A' && ca <= 'Z') ca |= 32;
- if (cb >= 'A' && cb <= 'Z') cb |= 32;
--#else
-- /* try to produce code without branching (jumps) */
-- ca |= ((unsigned char)(ca - (unsigned char)'A') <= (unsigned char)('Z' - 'A')) ? 32 : 0;
-- cb |= ((unsigned char)(cb - (unsigned char)'A') <= (unsigned char)('Z' - 'A')) ? 32 : 0;
--#endif
-
- if (ca == cb) continue;
- return ca - cb;
- }
- if (a_len == b_len) return 0;
-- return a_len - b_len;
-+ return a_len < b_len ? -1 : 1;
- }
-
--/**
-- * check if the rightmost bytes of the string are equal.
-- *
-- *
-- */
--
- int buffer_is_equal_right_len(buffer *b1, buffer *b2, size_t len) {
-- /* no, len -> equal */
-+ /* no len -> equal */
- if (len == 0) return 1;
-
- /* len > 0, but empty buffers -> not equal */
-@@ -586,29 +436,23 @@ int buffer_is_equal_right_len(buffer *b1, buffer *b2, size_t len) {
- /* buffers too small -> not equal */
- if (b1->used - 1 < len || b2->used - 1 < len) return 0;
-
-- if (0 == strncmp(b1->ptr + b1->used - 1 - len,
-- b2->ptr + b2->used - 1 - len, len)) {
-- return 1;
-- }
--
-- return 0;
-+ return 0 == memcmp(b1->ptr + b1->used - 1 - len, b2->ptr + b2->used - 1 - len, len);
- }
-
--int buffer_copy_string_hex(buffer *b, const char *in, size_t in_len) {
-+void buffer_copy_string_hex(buffer *b, const char *in, size_t in_len) {
- size_t i;
-
-- /* BO protection */
-- if (in_len * 2 < in_len) return -1;
-+ /* overflow protection */
-+ force_assert(in_len * 2 + 1 > in_len);
-
-- buffer_prepare_copy(b, in_len * 2 + 1);
-+ buffer_prepare_copy(b, in_len * 2);
-
-+ b->used = 0;
- for (i = 0; i < in_len; i++) {
- b->ptr[b->used++] = hex_chars[(in[i] >> 4) & 0x0F];
- b->ptr[b->used++] = hex_chars[in[i] & 0x0F];
- }
- b->ptr[b->used++] = '\0';
--
-- return 0;
- }
-
- /* everything except: ! ( ) * - . 0-9 A-Z _ a-z */
-@@ -747,18 +591,15 @@ static const char encoded_chars_http_header[] = {
-
-
-
--int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding) {
-+void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding) {
- unsigned char *ds, *d;
- size_t d_len, ndx;
- const char *map = NULL;
-
-- if (!s || !b) return -1;
--
-- if (b->ptr[b->used - 1] != '\0') {
-- SEGFAULT();
-- }
-+ force_assert(NULL != b);
-+ force_assert(NULL != s || 0 == s_len);
-
-- if (s_len == 0) return 0;
-+ if (0 == s_len) return;
-
- switch(encoding) {
- case ENCODING_REL_URI:
-@@ -779,11 +620,9 @@ int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_
- case ENCODING_HTTP_HEADER:
- map = encoded_chars_http_header;
- break;
-- case ENCODING_UNSET:
-- break;
- }
-
-- force_assert(map != NULL);
-+ force_assert(NULL != map);
-
- /* count to-be-encoded-characters */
- for (ds = (unsigned char *)s, d_len = 0, ndx = 0; ndx < s_len; ds++, ndx++) {
-@@ -801,17 +640,17 @@ int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_
- case ENCODING_HEX:
- d_len += 2;
- break;
-- case ENCODING_UNSET:
-- break;
- }
- } else {
-- d_len ++;
-+ d_len++;
- }
- }
-
-- buffer_prepare_append(b, d_len);
-+ d = (unsigned char*) buffer_prepare_append(b, d_len);
-+ buffer_commit(b, d_len); /* fill below */
-+ force_assert('\0' == *d);
-
-- for (ds = (unsigned char *)s, d = (unsigned char *)b->ptr + b->used - 1, d_len = 0, ndx = 0; ndx < s_len; ds++, ndx++) {
-+ for (ds = (unsigned char *)s, d_len = 0, ndx = 0; ndx < s_len; ds++, ndx++) {
- if (map[*ds]) {
- switch(encoding) {
- case ENCODING_REL_URI:
-@@ -837,20 +676,11 @@ int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_
- d[d_len++] = *ds;
- d[d_len++] = '\t';
- break;
-- case ENCODING_UNSET:
-- break;
- }
- } else {
- d[d_len++] = *ds;
- }
- }
--
-- /* terminate buffer and calculate new length */
-- b->ptr[b->used + d_len - 1] = '\0';
--
-- b->used += d_len;
--
-- return 0;
- }
-
-
-@@ -858,26 +688,35 @@ int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_
- * replaces non-printable characters with '_'
- */
-
--static int buffer_urldecode_internal(buffer *url, int is_query) {
-+static void buffer_urldecode_internal(buffer *url, int is_query) {
- unsigned char high, low;
-- const char *src;
-+ char *src;
- char *dst;
-
-- if (!url || !url->ptr) return -1;
-+ force_assert(NULL != url);
-+ if (buffer_string_is_empty(url)) return;
-+
-+ force_assert('\0' == url->ptr[url->used-1]);
-
-- src = (const char*) url->ptr;
-- dst = (char*) url->ptr;
-+ src = (char*) url->ptr;
-
-- while ((*src) != '\0') {
-+ while ('\0' != *src) {
-+ if ('%' == *src) break;
-+ if (is_query && '+' == *src) *src = ' ';
-+ src++;
-+ }
-+ dst = src;
-+
-+ while ('\0' != *src) {
- if (is_query && *src == '+') {
- *dst = ' ';
- } else if (*src == '%') {
- *dst = '%';
-
- high = hex2int(*(src + 1));
-- if (high != 0xFF) {
-+ if (0xFF != high) {
- low = hex2int(*(src + 2));
-- if (low != 0xFF) {
-+ if (0xFF != low) {
- high = (high << 4) | low;
-
- /* map control-characters out */
-@@ -897,19 +736,19 @@ static int buffer_urldecode_internal(buffer *url, int is_query) {
-
- *dst = '\0';
- url->used = (dst - url->ptr) + 1;
--
-- return 0;
- }
-
--int buffer_urldecode_path(buffer *url) {
-- return buffer_urldecode_internal(url, 0);
-+void buffer_urldecode_path(buffer *url) {
-+ buffer_urldecode_internal(url, 0);
- }
-
--int buffer_urldecode_query(buffer *url) {
-- return buffer_urldecode_internal(url, 1);
-+void buffer_urldecode_query(buffer *url) {
-+ buffer_urldecode_internal(url, 1);
- }
-
--/* Remove "/../", "//", "/./" parts from path.
-+/* Remove "/../", "//", "/./" parts from path,
-+ * strips leading spaces,
-+ * prepends "/" if not present already
- *
- * /blah/.. gets /
- * /blah/../foo gets /foo
-@@ -920,20 +759,38 @@ int buffer_urldecode_query(buffer *url) {
- * the operation is performed in-place.
- */
-
--int buffer_path_simplify(buffer *dest, buffer *src)
-+void buffer_path_simplify(buffer *dest, buffer *src)
- {
- int toklen;
- char c, pre1;
- char *start, *slash, *walk, *out;
- unsigned short pre;
-
-- if (src == NULL || src->ptr == NULL || dest == NULL)
-- return -1;
-+ force_assert(NULL != dest && NULL != src);
-
-- if (src == dest)
-+ if (buffer_string_is_empty(src)) {
-+ buffer_copy_string_len(dest, NULL, 0);
-+ return;
-+ }
-+
-+ force_assert('\0' == src->ptr[src->used-1]);
-+
-+ /* might need one character more for the '/' prefix */
-+ if (src == dest) {
- buffer_prepare_append(dest, 1);
-- else
-- buffer_prepare_copy(dest, src->used + 1);
-+ } else {
-+ buffer_prepare_copy(dest, buffer_string_length(src) + 1);
-+ }
-+
-+#if defined(__WIN32) || defined(__CYGWIN__)
-+ /* cygwin is treating \ and / the same, so we have to that too */
-+ {
-+ char *p;
-+ for (p = src->ptr; *p; p++) {
-+ if (*p == '\\') *p = '/';
-+ }
-+ }
-+#endif
-
- walk = src->ptr;
- start = dest->ptr;
-@@ -941,16 +798,6 @@ int buffer_path_simplify(buffer *dest, buffer *src)
- slash = dest->ptr;
-
-
--#if defined(__WIN32) || defined(__CYGWIN__)
-- /* cygwin is treating \ and / the same, so we have to that too
-- */
--
-- for (walk = src->ptr; *walk; walk++) {
-- if (*walk == '\\') *walk = '/';
-- }
-- walk = src->ptr;
--#endif
--
- while (*walk == ' ') {
- walk++;
- }
-@@ -966,34 +813,29 @@ int buffer_path_simplify(buffer *dest, buffer *src)
-
- if (pre1 == '\0') {
- dest->used = (out - start) + 1;
-- return 0;
-+ return;
- }
-
-- while (1) {
-+ for (;;) {
- if (c == '/' || c == '\0') {
- toklen = out - slash;
- if (toklen == 3 && pre == (('.' << 8) | '.')) {
- out = slash;
- if (out > start) {
- out--;
-- while (out > start && *out != '/') {
-- out--;
-- }
-+ while (out > start && *out != '/') out--;
- }
-
-- if (c == '\0')
-- out++;
-+ if (c == '\0') out++;
- } else if (toklen == 1 || pre == (('/' << 8) | '.')) {
- out = slash;
-- if (c == '\0')
-- out++;
-+ if (c == '\0') out++;
- }
-
- slash = out;
- }
-
-- if (c == '\0')
-- break;
-+ if (c == '\0') break;
-
- pre1 = c;
- pre = (pre << 8) | pre1;
-@@ -1006,8 +848,6 @@ int buffer_path_simplify(buffer *dest, buffer *src)
-
- *out = '\0';
- dest->used = (out - start) + 1;
--
-- return 0;
- }
-
- int light_isdigit(int c) {
-@@ -1030,33 +870,23 @@ int light_isalnum(int c) {
- return light_isdigit(c) || light_isalpha(c);
- }
-
--int buffer_to_lower(buffer *b) {
-- char *c;
--
-- if (b->used == 0) return 0;
-+void buffer_to_lower(buffer *b) {
-+ size_t i;
-
-- for (c = b->ptr; *c; c++) {
-- if (*c >= 'A' && *c <= 'Z') {
-- *c |= 32;
-- }
-+ for (i = 0; i < b->used; ++i) {
-+ char c = b->ptr[i];
-+ if (c >= 'A' && c <= 'Z') b->ptr[i] |= 0x20;
- }
--
-- return 0;
- }
-
-
--int buffer_to_upper(buffer *b) {
-- char *c;
--
-- if (b->used == 0) return 0;
-+void buffer_to_upper(buffer *b) {
-+ size_t i;
-
-- for (c = b->ptr; *c; c++) {
-- if (*c >= 'a' && *c <= 'z') {
-- *c &= ~32;
-- }
-+ for (i = 0; i < b->used; ++i) {
-+ char c = b->ptr[i];
-+ if (c >= 'A' && c <= 'Z') b->ptr[i] &= ~0x20;
- }
--
-- return 0;
- }
-
- #ifdef HAVE_LIBUNWIND
-diff --git a/src/buffer.h b/src/buffer.h
-index d2f5985..ff57d68 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -11,74 +11,96 @@
- #include <sys/types.h>
- #include <stdio.h>
-
-+#if defined HAVE_STDINT_H
-+# include <stdint.h>
-+#elif defined HAVE_INTTYPES_H
-+# include <inttypes.h>
-+#endif
-+
-+/* generic string + binary data container; contains a terminating 0 in both
-+ * cases
-+ *
-+ * used == 0 indicates a special "empty" state (unset config values); ptr
-+ * might be NULL too then. otherwise an empty string has used == 1 (and ptr[0]
-+ * == 0);
-+ *
-+ * copy/append functions will ensure used >= 1 (i.e. never leave it in the
-+ * special empty state); only buffer_copy_buffer will copy the special empty
-+ * state.
-+ */
- typedef struct {
- char *ptr;
-
-+ /* "used" includes a terminating 0 */
- size_t used;
-+ /* size of allocated buffer at *ptr */
- size_t size;
- } buffer;
-
--typedef struct {
-- buffer **ptr;
--
-- size_t used;
-- size_t size;
--} buffer_array;
--
--typedef struct {
-- char *ptr;
--
-- size_t offset; /* input-pointer */
--
-- size_t used; /* output-pointer */
-- size_t size;
--} read_buffer;
--
--buffer_array* buffer_array_init(void);
--void buffer_array_free(buffer_array *b);
--void buffer_array_reset(buffer_array *b);
--buffer *buffer_array_append_get_buffer(buffer_array *b);
--
-+/* create new buffer; either empty or copy given data */
- buffer* buffer_init(void);
--buffer* buffer_init_buffer(buffer *b);
--buffer* buffer_init_string(const char *str);
--void buffer_free(buffer *b);
--void buffer_reset(buffer *b);
--
--int buffer_prepare_copy(buffer *b, size_t size);
--int buffer_prepare_append(buffer *b, size_t size);
--
--int buffer_copy_string(buffer *b, const char *s);
--int buffer_copy_string_len(buffer *b, const char *s, size_t s_len);
--int buffer_copy_string_buffer(buffer *b, const buffer *src);
--int buffer_copy_string_hex(buffer *b, const char *in, size_t in_len);
--
--int buffer_copy_long(buffer *b, long val);
--
--int buffer_copy_memory(buffer *b, const char *s, size_t s_len);
--
--int buffer_append_string(buffer *b, const char *s);
--int buffer_append_string_len(buffer *b, const char *s, size_t s_len);
--int buffer_append_string_buffer(buffer *b, const buffer *src);
--int buffer_append_string_lfill(buffer *b, const char *s, size_t maxlen);
--int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen);
--
--int buffer_append_long_hex(buffer *b, unsigned long len);
--int buffer_append_long(buffer *b, long val);
--
--#if defined(SIZEOF_LONG) && (SIZEOF_LONG == SIZEOF_OFF_T)
--#define buffer_copy_off_t(x, y) buffer_copy_long(x, y)
--#define buffer_append_off_t(x, y) buffer_append_long(x, y)
--#else
--int buffer_copy_off_t(buffer *b, off_t val);
--int buffer_append_off_t(buffer *b, off_t val);
--#endif
--
--int buffer_append_memory(buffer *b, const char *s, size_t s_len);
-+buffer* buffer_init_buffer(const buffer *src); /* src can be NULL */
-+buffer* buffer_init_string(const char *str); /* str can be NULL */
-+
-+void buffer_free(buffer *b); /* b can be NULL */
-+/* truncates to used == 0; frees large buffers, might keep smaller ones for reuse */
-+void buffer_reset(buffer *b); /* b can be NULL */
-+
-+/* reset b. if NULL != b && NULL != src, move src content to b. reset src. */
-+void buffer_move(buffer *b, buffer *src);
-+
-+/* prepare for size bytes in the buffer (b->size > size), destroys content
-+ * (sets used = 0 and ptr[0] = 0). allocates storage for terminating 0.
-+ * @return b->ptr
-+ */
-+char* buffer_prepare_copy(buffer *b, size_t size);
-+
-+/* prepare for appending size bytes to the buffer
-+ * allocates storage for terminating 0; if used > 0 assumes ptr[used-1] == 0,
-+ * i.e. doesn't allocate another byte for terminating 0.
-+ * @return (b->used > 0 ? b->ptr + b->used - 1 : b->ptr) - first new character
-+ */
-+char* buffer_prepare_append(buffer *b, size_t size);
-+
-+/* use after prepare_(copy,append) when you have written data to the buffer
-+ * to increase the buffer length by size. also sets the terminating zero.
-+ * requires enough space is present for the terminating zero (prepare with the
-+ * same size to be sure).
-+ */
-+void buffer_commit(buffer *b, size_t size);
-+
-+void buffer_copy_string(buffer *b, const char *s);
-+void buffer_copy_string_len(buffer *b, const char *s, size_t s_len);
-+void buffer_copy_buffer(buffer *b, const buffer *src);
-+/* convert input to hex and store in buffer */
-+void buffer_copy_string_hex(buffer *b, const char *in, size_t in_len);
-+
-+void buffer_append_string(buffer *b, const char *s);
-+void buffer_append_string_len(buffer *b, const char *s, size_t s_len);
-+void buffer_append_string_buffer(buffer *b, const buffer *src);
-+
-+void buffer_append_long_hex(buffer *b, unsigned long len);
-+void buffer_append_int(buffer *b, intmax_t val);
-+void buffer_copy_int(buffer *b, intmax_t val);
-+
-+/* '-', log_10 (2^bits) = bits * log 2 / log 10 < bits * 0.31, terminating 0 */
-+#define LI_ITOSTRING_LENGTH (2 + (8 * sizeof(intmax_t) * 31 + 99) / 100)
-+
-+void li_itostrn(char *buf, size_t buf_len, intmax_t val);
-+void li_itostr(char *buf, intmax_t val); /* buf must have at least LI_ITOSTRING_LENGTH bytes */
-+void li_utostrn(char *buf, size_t buf_len, uintmax_t val);
-+void li_utostr(char *buf, uintmax_t val); /* buf must have at least LI_ITOSTRING_LENGTH bytes */
-
- char * buffer_search_string_len(buffer *b, const char *needle, size_t len);
-
-+/* NULL buffer or empty buffer (used == 0);
-+ * unset "string" (buffer) config options are initialized to used == 0,
-+ * while setting an empty string leads to used == 1
-+ */
- int buffer_is_empty(buffer *b);
-+/* NULL buffer, empty buffer (used == 0) or empty string (used == 1) */
-+int buffer_string_is_empty(buffer *b);
-+
- int buffer_is_equal(buffer *a, buffer *b);
- int buffer_is_equal_right_len(buffer *a, buffer *b, size_t len);
- int buffer_is_equal_string(buffer *a, const char *s, size_t b_len);
-@@ -86,7 +108,6 @@ int buffer_is_equal_caseless_string(buffer *a, const char *s, size_t b_len);
- int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b_len);
-
- typedef enum {
-- ENCODING_UNSET,
- ENCODING_REL_URI, /* for coding a rel-uri (/with space/and%percent) nicely as part of a href */
- ENCODING_REL_URI_PART, /* same as ENC_REL_URL plus coding / too as %2F */
- ENCODING_HTML, /* & becomes &amp; and so on */
-@@ -95,17 +116,17 @@ typedef enum {
- ENCODING_HTTP_HEADER /* encode \n with \t\n */
- } buffer_encoding_t;
-
--int buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding);
-+void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding);
-+
-+void buffer_urldecode_path(buffer *url);
-+void buffer_urldecode_query(buffer *url);
-+void buffer_path_simplify(buffer *dest, buffer *src);
-
--int buffer_urldecode_path(buffer *url);
--int buffer_urldecode_query(buffer *url);
--int buffer_path_simplify(buffer *dest, buffer *src);
-+void buffer_to_lower(buffer *b);
-+void buffer_to_upper(buffer *b);
-
--int buffer_to_lower(buffer *b);
--int buffer_to_upper(buffer *b);
-
- /** deprecated */
--int LI_ltostr(char *buf, long val);
- char hex2int(unsigned char c);
- char int2hex(char i);
-
-@@ -114,17 +135,17 @@ int light_isxdigit(int c);
- int light_isalpha(int c);
- int light_isalnum(int c);
-
-+static inline size_t buffer_string_length(const buffer *b); /* buffer string length without terminating 0 */
-+static inline void buffer_append_slash(buffer *b); /* append '/' no non-empty strings not ending in '/' */
-+
- #define BUFFER_APPEND_STRING_CONST(x, y) \
- buffer_append_string_len(x, y, sizeof(y) - 1)
-
- #define BUFFER_COPY_STRING_CONST(x, y) \
- buffer_copy_string_len(x, y, sizeof(y) - 1)
-
--#define BUFFER_APPEND_SLASH(x) \
-- if (x->used > 1 && x->ptr[x->used - 2] != '/') { BUFFER_APPEND_STRING_CONST(x, "/"); }
--
--#define CONST_STR_LEN(x) x, x ? sizeof(x) - 1 : 0
--#define CONST_BUF_LEN(x) x->ptr, x->used ? x->used - 1 : 0
-+#define CONST_STR_LEN(x) x, (x) ? sizeof(x) - 1 : 0
-+#define CONST_BUF_LEN(x) (x)->ptr, buffer_string_length(x)
-
-
- #define UNUSED(x) ( (void)(x) )
-@@ -134,4 +155,15 @@ void log_failed_assert(const char *filename, unsigned int line, const char *msg)
- #define force_assert(x) do { if (!(x)) log_failed_assert(__FILE__, __LINE__, "assertion failed: " #x); } while(0)
- #define SEGFAULT() log_failed_assert(__FILE__, __LINE__, "aborted");
-
-+/* inline implementations */
-+
-+static inline size_t buffer_string_length(const buffer *b) {
-+ return NULL != b && 0 != b->used ? b->used - 1 : 0;
-+}
-+
-+static inline void buffer_append_slash(buffer *b) {
-+ size_t len = buffer_string_length(b);
-+ if (len > 0 && '/' != b->ptr[len-1]) BUFFER_APPEND_STRING_CONST(b, "/");
-+}
-+
- #endif
-diff --git a/src/chunk.c b/src/chunk.c
-index 7583db6..c991b82 100644
---- a/src/chunk.c
-+++ b/src/chunk.c
-@@ -36,30 +36,28 @@ static chunk *chunk_init(void) {
-
- c = calloc(1, sizeof(*c));
-
-+ c->type = MEM_CHUNK;
- c->mem = buffer_init();
- c->file.name = buffer_init();
-+ c->file.start = c->file.length = c->file.mmap.offset = 0;
- c->file.fd = -1;
- c->file.mmap.start = MAP_FAILED;
-+ c->file.mmap.length = 0;
-+ c->file.is_temp = 0;
-+ c->offset = 0;
- c->next = NULL;
-
- return c;
- }
-
--static void chunk_free(chunk *c) {
-- if (!c) return;
--
-- buffer_free(c->mem);
-- buffer_free(c->file.name);
--
-- free(c);
--}
--
- static void chunk_reset(chunk *c) {
-- if (!c) return;
-+ if (NULL == c) return;
-+
-+ c->type = MEM_CHUNK;
-
- buffer_reset(c->mem);
-
-- if (c->file.is_temp && !buffer_is_empty(c->file.name)) {
-+ if (c->file.is_temp && !buffer_string_is_empty(c->file.name)) {
- unlink(c->file.name->ptr);
- }
-
-@@ -73,13 +71,28 @@ static void chunk_reset(chunk *c) {
- munmap(c->file.mmap.start, c->file.mmap.length);
- c->file.mmap.start = MAP_FAILED;
- }
-+ c->file.start = c->file.length = c->file.mmap.offset = 0;
-+ c->file.mmap.length = 0;
-+ c->file.is_temp = 0;
-+ c->offset = 0;
-+ c->next = NULL;
- }
-
-+static void chunk_free(chunk *c) {
-+ if (NULL == c) return;
-+
-+ chunk_reset(c);
-+
-+ buffer_free(c->mem);
-+ buffer_free(c->file.name);
-+
-+ free(c);
-+}
-
- void chunkqueue_free(chunkqueue *cq) {
- chunk *c, *pc;
-
-- if (!cq) return;
-+ if (NULL == cq) return;
-
- for (c = cq->first; c; ) {
- pc = c;
-@@ -96,11 +109,27 @@ void chunkqueue_free(chunkqueue *cq) {
- free(cq);
- }
-
-+static void chunkqueue_push_unused_chunk(chunkqueue *cq, chunk *c) {
-+ force_assert(NULL != cq && NULL != c);
-+
-+ /* keep at max 4 chunks in the 'unused'-cache */
-+ if (cq->unused_chunks > 4) {
-+ chunk_free(c);
-+ } else {
-+ chunk_reset(c);
-+ c->next = cq->unused;
-+ cq->unused = c;
-+ cq->unused_chunks++;
-+ }
-+}
-+
- static chunk *chunkqueue_get_unused_chunk(chunkqueue *cq) {
- chunk *c;
-
-+ force_assert(NULL != cq);
-+
- /* check if we have a unused chunk */
-- if (!cq->unused) {
-+ if (0 == cq->unused) {
- c = chunk_init();
- } else {
- /* take the first element from the list (a stack) */
-@@ -113,130 +142,95 @@ static chunk *chunkqueue_get_unused_chunk(chunkqueue *cq) {
- return c;
- }
-
--static int chunkqueue_prepend_chunk(chunkqueue *cq, chunk *c) {
-+static void chunkqueue_prepend_chunk(chunkqueue *cq, chunk *c) {
- c->next = cq->first;
- cq->first = c;
-
-- if (cq->last == NULL) {
-+ if (NULL == cq->last) {
- cq->last = c;
- }
--
-- return 0;
- }
-
--static int chunkqueue_append_chunk(chunkqueue *cq, chunk *c) {
-+static void chunkqueue_append_chunk(chunkqueue *cq, chunk *c) {
- if (cq->last) {
- cq->last->next = c;
- }
- cq->last = c;
-
-- if (cq->first == NULL) {
-+ if (NULL == cq->first) {
- cq->first = c;
- }
--
-- return 0;
- }
-
- void chunkqueue_reset(chunkqueue *cq) {
-- chunk *c;
-- /* move everything to the unused queue */
-+ chunk *cur = cq->first;
-
-- /* mark all read written */
-- for (c = cq->first; c; c = c->next) {
-- switch(c->type) {
-- case MEM_CHUNK:
-- c->offset = c->mem->used - 1;
-- break;
-- case FILE_CHUNK:
-- c->offset = c->file.length;
-- break;
-- default:
-- break;
-- }
-+ cq->first = cq->last = NULL;
-+
-+ while (NULL != cur) {
-+ chunk *next = cur->next;
-+ chunkqueue_push_unused_chunk(cq, cur);
-+ cur = next;
- }
-
-- chunkqueue_remove_finished_chunks(cq);
- cq->bytes_in = 0;
- cq->bytes_out = 0;
- }
-
--int chunkqueue_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t len) {
-+void chunkqueue_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t len) {
- chunk *c;
-
-- if (len == 0) return 0;
-+ if (0 == len) return;
-
- c = chunkqueue_get_unused_chunk(cq);
-
- c->type = FILE_CHUNK;
-
-- buffer_copy_string_buffer(c->file.name, fn);
-+ buffer_copy_buffer(c->file.name, fn);
- c->file.start = offset;
- c->file.length = len;
- c->offset = 0;
-
- chunkqueue_append_chunk(cq, c);
--
-- return 0;
- }
-
--int chunkqueue_append_buffer(chunkqueue *cq, buffer *mem) {
-+void chunkqueue_append_buffer(chunkqueue *cq, buffer *mem) {
- chunk *c;
-
-- if (mem->used == 0) return 0;
--
-- c = chunkqueue_get_unused_chunk(cq);
-- c->type = MEM_CHUNK;
-- c->offset = 0;
-- buffer_copy_string_buffer(c->mem, mem);
--
-- chunkqueue_append_chunk(cq, c);
--
-- return 0;
--}
--
--int chunkqueue_append_buffer_weak(chunkqueue *cq, buffer *mem) {
-- chunk *c;
-+ if (buffer_string_is_empty(mem)) return;
-
- c = chunkqueue_get_unused_chunk(cq);
- c->type = MEM_CHUNK;
-- c->offset = 0;
-- if (c->mem) buffer_free(c->mem);
-- c->mem = mem;
-+ force_assert(NULL != c->mem);
-+ buffer_move(c->mem, mem);
-
- chunkqueue_append_chunk(cq, c);
--
-- return 0;
- }
-
--int chunkqueue_prepend_buffer(chunkqueue *cq, buffer *mem) {
-+void chunkqueue_prepend_buffer(chunkqueue *cq, buffer *mem) {
- chunk *c;
-
-- if (mem->used == 0) return 0;
-+ if (buffer_string_is_empty(mem)) return;
-
- c = chunkqueue_get_unused_chunk(cq);
- c->type = MEM_CHUNK;
-- c->offset = 0;
-- buffer_copy_string_buffer(c->mem, mem);
-+ force_assert(NULL != c->mem);
-+ buffer_move(c->mem, mem);
-
- chunkqueue_prepend_chunk(cq, c);
--
-- return 0;
- }
-
-
--int chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) {
-+void chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) {
- chunk *c;
-
-- if (len == 0) return 0;
-+ if (0 == len) return;
-
- c = chunkqueue_get_unused_chunk(cq);
- c->type = MEM_CHUNK;
-- c->offset = 0;
-- buffer_copy_string_len(c->mem, mem, len - 1);
-+ buffer_copy_string_len(c->mem, mem, len);
-
- chunkqueue_append_chunk(cq, c);
--
-- return 0;
- }
-
- buffer * chunkqueue_get_prepend_buffer(chunkqueue *cq) {
-@@ -245,8 +239,6 @@ buffer * chunkqueue_get_prepend_buffer(chunkqueue *cq) {
- c = chunkqueue_get_unused_chunk(cq);
-
- c->type = MEM_CHUNK;
-- c->offset = 0;
-- buffer_reset(c->mem);
-
- chunkqueue_prepend_chunk(cq, c);
-
-@@ -259,20 +251,15 @@ buffer *chunkqueue_get_append_buffer(chunkqueue *cq) {
- c = chunkqueue_get_unused_chunk(cq);
-
- c->type = MEM_CHUNK;
-- c->offset = 0;
-- buffer_reset(c->mem);
-
- chunkqueue_append_chunk(cq, c);
-
- return c->mem;
- }
-
--int chunkqueue_set_tempdirs(chunkqueue *cq, array *tempdirs) {
-- if (!cq) return -1;
--
-+void chunkqueue_set_tempdirs(chunkqueue *cq, array *tempdirs) {
-+ force_assert(NULL != cq);
- cq->tempdirs = tempdirs;
--
-- return 0;
- }
-
- chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
-@@ -282,7 +269,6 @@ chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
- c = chunkqueue_get_unused_chunk(cq);
-
- c->type = FILE_CHUNK;
-- c->offset = 0;
-
- if (cq->tempdirs && cq->tempdirs->used) {
- size_t i;
-@@ -292,8 +278,8 @@ chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
- for (i = 0; i < cq->tempdirs->used; i++) {
- data_string *ds = (data_string *)cq->tempdirs->data[i];
-
-- buffer_copy_string_buffer(template, ds->value);
-- BUFFER_APPEND_SLASH(template);
-+ buffer_copy_buffer(template, ds->value);
-+ buffer_append_slash(template);
- buffer_append_string_len(template, CONST_STR_LEN("lighttpd-upload-XXXXXX"));
-
- if (-1 != (c->file.fd = mkstemp(template->ptr))) {
-@@ -309,7 +295,7 @@ chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
- }
- }
-
-- buffer_copy_string_buffer(c->file.name, template);
-+ buffer_copy_buffer(c->file.name, template);
- c->file.length = 0;
-
- chunkqueue_append_chunk(cq, c);
-@@ -319,82 +305,102 @@ chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
- return c;
- }
-
-+void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len) {
-+ while (len > 0) {
-+ chunk *c = src->first;
-+ off_t clen = 0;
-
--off_t chunkqueue_length(chunkqueue *cq) {
-- off_t len = 0;
-- chunk *c;
-+ if (NULL == c) break;
-
-- for (c = cq->first; c; c = c->next) {
- switch (c->type) {
- case MEM_CHUNK:
-- len += c->mem->used ? c->mem->used - 1 : 0;
-+ clen = buffer_string_length(c->mem);
- break;
- case FILE_CHUNK:
-- len += c->file.length;
-+ clen = c->file.length;
- break;
-- default:
-+ }
-+ force_assert(clen >= c->offset);
-+ clen -= c->offset;
-+
-+ if (len >= clen) {
-+ /* move complete chunk */
-+ src->first = c->next;
-+ if (c == src->last) src->last = NULL;
-+
-+ chunkqueue_append_chunk(dest, c);
-+ src->bytes_out += clen;
-+ dest->bytes_in += clen;
-+ len -= clen;
-+ continue;
-+ }
-+
-+ /* partial chunk with length "len" */
-+
-+ switch (c->type) {
-+ case MEM_CHUNK:
-+ chunkqueue_append_mem(dest, c->mem->ptr + c->offset, len);
-+ break;
-+ case FILE_CHUNK:
-+ /* tempfile flag is in "last" chunk after the split */
-+ chunkqueue_append_file(dest, c->file.name, c->file.start + c->offset, len);
- break;
- }
-- }
-
-- return len;
-+ c->offset += len;
-+ src->bytes_out += len;
-+ dest->bytes_in += len;
-+ len = 0;
-+ }
- }
-
--off_t chunkqueue_written(chunkqueue *cq) {
-+off_t chunkqueue_length(chunkqueue *cq) {
- off_t len = 0;
- chunk *c;
-
- for (c = cq->first; c; c = c->next) {
-+ off_t c_len = 0;
-+
- switch (c->type) {
- case MEM_CHUNK:
-- case FILE_CHUNK:
-- len += c->offset;
-+ c_len = buffer_string_length(c->mem);
- break;
-- default:
-+ case FILE_CHUNK:
-+ c_len = c->file.length;
- break;
- }
-+ force_assert(c_len >= c->offset);
-+ len += c_len - c->offset;
- }
-
- return len;
- }
-
- int chunkqueue_is_empty(chunkqueue *cq) {
-- return cq->first ? 0 : 1;
-+ return NULL == cq->first;
- }
-
--int chunkqueue_remove_finished_chunks(chunkqueue *cq) {
-+void chunkqueue_remove_finished_chunks(chunkqueue *cq) {
- chunk *c;
-
- for (c = cq->first; c; c = cq->first) {
-- int is_finished = 0;
-+ off_t c_len = 0;
-
- switch (c->type) {
- case MEM_CHUNK:
-- if (c->mem->used == 0 || (c->offset == (off_t)c->mem->used - 1)) is_finished = 1;
-+ c_len = buffer_string_length(c->mem);
- break;
- case FILE_CHUNK:
-- if (c->offset == c->file.length) is_finished = 1;
-- break;
-- default:
-+ c_len = c->file.length;
- break;
- }
-+ force_assert(c_len >= c->offset);
-
-- if (!is_finished) break;
--
-- chunk_reset(c);
-+ if (c_len > c->offset) break; /* not finished yet */
-
- cq->first = c->next;
- if (c == cq->last) cq->last = NULL;
-
-- /* keep at max 4 chunks in the 'unused'-cache */
-- if (cq->unused_chunks > 4) {
-- chunk_free(c);
-- } else {
-- c->next = cq->unused;
-- cq->unused = c;
-- cq->unused_chunks++;
-- }
-+ chunkqueue_push_unused_chunk(cq, c);
- }
--
-- return 0;
- }
-diff --git a/src/chunk.h b/src/chunk.h
-index e43d3eb..6559000 100644
---- a/src/chunk.h
-+++ b/src/chunk.h
-@@ -6,7 +6,7 @@
- #include "sys-mmap.h"
-
- typedef struct chunk {
-- enum { UNUSED_CHUNK, MEM_CHUNK, FILE_CHUNK } type;
-+ enum { MEM_CHUNK, FILE_CHUNK } type;
-
- buffer *mem; /* either the storage of the mem-chunk or the read-ahead buffer */
-
-@@ -48,21 +48,21 @@ typedef struct {
- } chunkqueue;
-
- chunkqueue *chunkqueue_init(void);
--int chunkqueue_set_tempdirs(chunkqueue *c, array *tempdirs);
--int chunkqueue_append_file(chunkqueue *c, buffer *fn, off_t offset, off_t len);
--int chunkqueue_append_mem(chunkqueue *c, const char *mem, size_t len);
--int chunkqueue_append_buffer(chunkqueue *c, buffer *mem);
--int chunkqueue_append_buffer_weak(chunkqueue *c, buffer *mem);
--int chunkqueue_prepend_buffer(chunkqueue *c, buffer *mem);
-+void chunkqueue_set_tempdirs(chunkqueue *c, array *tempdirs);
-+void chunkqueue_append_file(chunkqueue *c, buffer *fn, off_t offset, off_t len); /* copies "fn" */
-+void chunkqueue_append_mem(chunkqueue *c, const char *mem, size_t len); /* copies memory */
-+void chunkqueue_append_buffer(chunkqueue *c, buffer *mem); /* may reset "mem" */
-+void chunkqueue_prepend_buffer(chunkqueue *c, buffer *mem); /* may reset "mem" */
-
- buffer * chunkqueue_get_append_buffer(chunkqueue *c);
- buffer * chunkqueue_get_prepend_buffer(chunkqueue *c);
- chunk * chunkqueue_get_append_tempfile(chunkqueue *cq);
-
--int chunkqueue_remove_finished_chunks(chunkqueue *cq);
-+void chunkqueue_remove_finished_chunks(chunkqueue *cq);
-+
-+void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len);
-
- off_t chunkqueue_length(chunkqueue *c);
--off_t chunkqueue_written(chunkqueue *c);
- void chunkqueue_free(chunkqueue *c);
- void chunkqueue_reset(chunkqueue *c);
-
-diff --git a/src/configfile-glue.c b/src/configfile-glue.c
-index 9f24dcb..2fb8c62 100644
---- a/src/configfile-glue.c
-+++ b/src/configfile-glue.c
-@@ -46,12 +46,12 @@ int config_insert_values_internal(server *srv, array *ca, const config_values_t
- if (da->value->data[j]->type == TYPE_STRING) {
- data_string *ds = data_string_init();
-
-- buffer_copy_string_buffer(ds->value, ((data_string *)(da->value->data[j]))->value);
-+ buffer_copy_buffer(ds->value, ((data_string *)(da->value->data[j]))->value);
- if (!da->is_index_key) {
- /* the id's were generated automaticly, as we copy now we might have to renumber them
- * this is used to prepend server.modules by mod_indexfile as it has to be loaded
- * before mod_fastcgi and friends */
-- buffer_copy_string_buffer(ds->key, ((data_string *)(da->value->data[j]))->key);
-+ buffer_copy_buffer(ds->key, ((data_string *)(da->value->data[j]))->key);
- }
-
- array_insert_unique(cv[i].destination, (data_unset *)ds);
-@@ -73,7 +73,7 @@ int config_insert_values_internal(server *srv, array *ca, const config_values_t
- if (du->type == TYPE_STRING) {
- data_string *ds = (data_string *)du;
-
-- buffer_copy_string_buffer(cv[i].destination, ds->value);
-+ buffer_copy_buffer(cv[i].destination, ds->value);
- } else {
- log_error_write(srv, __FILE__, __LINE__, "ssss", cv[i].key, "should have been a string like ... = \"...\"");
-
-@@ -202,7 +202,7 @@ int config_insert_values_global(server *srv, array *ca, const config_values_t cv
- touched = data_string_init();
-
- buffer_copy_string_len(touched->value, CONST_STR_LEN(""));
-- buffer_copy_string_buffer(touched->key, du->key);
-+ buffer_copy_buffer(touched->key, du->key);
-
- array_insert_unique(srv->config_touched, (data_unset *)touched);
- }
-@@ -285,7 +285,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
- case COMP_HTTP_HOST: {
- char *ck_colon = NULL, *val_colon = NULL;
-
-- if (!buffer_is_empty(con->uri.authority)) {
-+ if (!buffer_string_is_empty(con->uri.authority)) {
-
- /*
- * append server-port to the HTTP_POST if necessary
-@@ -301,9 +301,9 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
-
- if (NULL != ck_colon && NULL == val_colon) {
- /* condition "host:port" but client send "host" */
-- buffer_copy_string_buffer(srv->cond_check_buf, l);
-+ buffer_copy_buffer(srv->cond_check_buf, l);
- buffer_append_string_len(srv->cond_check_buf, CONST_STR_LEN(":"));
-- buffer_append_long(srv->cond_check_buf, sock_addr_get_port(&(srv_sock->addr)));
-+ buffer_append_int(srv->cond_check_buf, sock_addr_get_port(&(srv_sock->addr)));
- l = srv->cond_check_buf;
- } else if (NULL != val_colon && NULL == ck_colon) {
- /* condition "host" but client send "host:port" */
-@@ -315,7 +315,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
- break;
- }
- #if defined USE_OPENSSL && ! defined OPENSSL_NO_TLSEXT
-- } else if (!buffer_is_empty(con->tlsext_server_name)) {
-+ } else if (!buffer_string_is_empty(con->tlsext_server_name)) {
- l = con->tlsext_server_name;
- #endif
- } else {
-diff --git a/src/configfile.c b/src/configfile.c
-index bf9a34d..2b09d86 100644
---- a/src/configfile.c
-+++ b/src/configfile.c
-@@ -273,7 +273,7 @@ static int config_insert(server *srv) {
- }
- }
-
-- if (buffer_is_empty(stat_cache_string)) {
-+ if (buffer_string_is_empty(stat_cache_string)) {
- srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_SIMPLE;
- } else if (buffer_is_equal_string(stat_cache_string, CONST_STR_LEN("simple"))) {
- srv->srvconf.stat_cache_engine = STAT_CACHE_ENGINE_SIMPLE;
-@@ -323,7 +323,7 @@ int config_setup_connection(server *srv, connection *con) {
- PATCH(global_bytes_per_second_cnt);
-
- con->conf.global_bytes_per_second_cnt_ptr = &s->global_bytes_per_second_cnt;
-- buffer_copy_string_buffer(con->server_name, s->server_name);
-+ buffer_copy_buffer(con->server_name, s->server_name);
-
- PATCH(log_request_header);
- PATCH(log_response_header);
-@@ -442,7 +442,7 @@ int config_patch_connection(server *srv, connection *con, comp_key_t comp) {
- PATCH(follow_symlink);
- #endif
- } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.name"))) {
-- buffer_copy_string_buffer(con->server_name, s->server_name);
-+ buffer_copy_buffer(con->server_name, s->server_name);
- } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.tag"))) {
- PATCH(server_tag);
- } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("connection.kbytes-per-second"))) {
-@@ -512,7 +512,7 @@ typedef struct {
-
- #if 0
- static int tokenizer_open(server *srv, tokenizer_t *t, buffer *basedir, const char *fn) {
-- if (buffer_is_empty(basedir) ||
-+ if (buffer_string_is_empty(basedir) ||
- (fn[0] == '/' || fn[0] == '\\') ||
- (fn[0] == '.' && (fn[1] == '/' || fn[1] == '\\'))) {
- t->file = buffer_init_string(fn);
-@@ -934,7 +934,7 @@ static int config_parse(server *srv, config_t *context, tokenizer_t *t) {
- lasttoken = buffer_init();
- token = buffer_init();
- while((1 == (ret = config_tokenizer(srv, t, &token_id, token))) && context->ok) {
-- buffer_copy_string_buffer(lasttoken, token);
-+ buffer_copy_buffer(lasttoken, token);
- configparser(pParser, token_id, token, context);
-
- token = buffer_init();
-@@ -986,7 +986,7 @@ int config_parse_file(server *srv, config_t *context, const char *fn) {
- int ret;
- buffer *filename;
-
-- if (buffer_is_empty(context->basedir) ||
-+ if (buffer_string_is_empty(context->basedir) ||
- (fn[0] == '/' || fn[0] == '\\') ||
- (fn[0] == '.' && (fn[1] == '/' || fn[1] == '\\'))) {
- filename = buffer_init_string(fn);
-@@ -1057,7 +1057,7 @@ int config_parse_cmd(server *srv, config_t *context, const char *cmd) {
- source = buffer_init_string(cmd);
- out = buffer_init();
-
-- if (!buffer_is_empty(context->basedir)) {
-+ if (!buffer_string_is_empty(context->basedir)) {
- chdir(context->basedir->ptr);
- }
-
-@@ -1173,7 +1173,7 @@ int config_read(server *srv, const char *fn) {
-
- prepends = (data_array *)configparser_merge_data((data_unset *)prepends, (data_unset *)modules);
- force_assert(NULL != prepends);
-- buffer_copy_string_buffer(prepends->key, modules->key);
-+ buffer_copy_buffer(prepends->key, modules->key);
- array_replace(srv->config, (data_unset *)prepends);
- modules->free((data_unset *)modules);
- modules = prepends;
-@@ -1255,7 +1255,7 @@ int config_set_defaults(server *srv) {
- { FDEVENT_HANDLER_UNSET, NULL }
- };
-
-- if (!buffer_is_empty(srv->srvconf.changeroot)) {
-+ if (!buffer_string_is_empty(srv->srvconf.changeroot)) {
- if (-1 == stat(srv->srvconf.changeroot->ptr, &st1)) {
- log_error_write(srv, __FILE__, __LINE__, "sb",
- "server.chroot doesn't exist:", srv->srvconf.changeroot);
-@@ -1268,14 +1268,14 @@ int config_set_defaults(server *srv) {
- }
- }
-
-- if (buffer_is_empty(s->document_root)) {
-+ if (buffer_string_is_empty(s->document_root)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "a default document-root has to be set");
-
- return -1;
- }
-
-- buffer_copy_string_buffer(srv->tmp_buf, s->document_root);
-+ buffer_copy_buffer(srv->tmp_buf, s->document_root);
-
- buffer_to_lower(srv->tmp_buf);
-
-@@ -1288,7 +1288,7 @@ int config_set_defaults(server *srv) {
- is_lower = buffer_is_equal(srv->tmp_buf, s->document_root);
-
- /* lower-case existed, check upper-case */
-- buffer_copy_string_buffer(srv->tmp_buf, s->document_root);
-+ buffer_copy_buffer(srv->tmp_buf, s->document_root);
-
- buffer_to_upper(srv->tmp_buf);
-
-@@ -1356,7 +1356,7 @@ int config_set_defaults(server *srv) {
- }
-
- if (s->ssl_enabled) {
-- if (buffer_is_empty(s->ssl_pemfile)) {
-+ if (buffer_string_is_empty(s->ssl_pemfile)) {
- /* PEM file is require */
-
- log_error_write(srv, __FILE__, __LINE__, "s",
-diff --git a/src/configparser.y b/src/configparser.y
-index efa4afd..e4a4f51 100644
---- a/src/configparser.y
-+++ b/src/configparser.y
-@@ -61,11 +61,11 @@ data_unset *configparser_merge_data(data_unset *op1, const data_unset *op2) {
- if (op1->type != op2->type) {
- if (op1->type == TYPE_STRING && op2->type == TYPE_INTEGER) {
- data_string *ds = (data_string *)op1;
-- buffer_append_long(ds->value, ((data_integer*)op2)->value);
-+ buffer_append_int(ds->value, ((data_integer*)op2)->value);
- return op1;
- } else if (op1->type == TYPE_INTEGER && op2->type == TYPE_STRING) {
- data_string *ds = data_string_init();
-- buffer_append_long(ds->value, ((data_integer*)op1)->value);
-+ buffer_append_int(ds->value, ((data_integer*)op1)->value);
- buffer_append_string_buffer(ds->value, ((data_string*)op2)->value);
- op1->free(op1);
- return (data_unset *)ds;
-@@ -145,7 +145,7 @@ metaline ::= EOL.
-
- varline ::= key(A) ASSIGN expression(B). {
- if (ctx->ok) {
-- buffer_copy_string_buffer(B->key, A);
-+ buffer_copy_buffer(B->key, A);
- if (strncmp(A->ptr, "env.", sizeof("env.") - 1) == 0) {
- fprintf(stderr, "Setting env variable is not supported in conditional %d %s: %s\n",
- ctx->current->context_ndx,
-@@ -183,7 +183,7 @@ varline ::= key(A) APPEND expression(B). {
- ctx->ok = 0;
- }
- else {
-- buffer_copy_string_buffer(du->key, A);
-+ buffer_copy_buffer(du->key, A);
- array_replace(vars, du);
- }
- B->free(B);
-@@ -193,12 +193,12 @@ varline ::= key(A) APPEND expression(B). {
- ctx->ok = 0;
- }
- else {
-- buffer_copy_string_buffer(du->key, A);
-+ buffer_copy_buffer(du->key, A);
- array_insert_unique(ctx->current->value, du);
- }
- B->free(B);
- } else {
-- buffer_copy_string_buffer(B->key, A);
-+ buffer_copy_buffer(B->key, A);
- array_insert_unique(ctx->current->value, B);
- }
- buffer_free(A);
-@@ -262,7 +262,7 @@ value(A) ::= key(B). {
-
- value(A) ::= STRING(B). {
- A = (data_unset *)data_string_init();
-- buffer_copy_string_buffer(((data_string *)(A))->value, B);
-+ buffer_copy_buffer(((data_string *)(A))->value, B);
- buffer_free(B);
- B = NULL;
- }
-@@ -320,7 +320,7 @@ aelement(A) ::= expression(B). {
- B = NULL;
- }
- aelement(A) ::= stringop(B) ARRAY_ASSIGN expression(C). {
-- buffer_copy_string_buffer(C->key, B);
-+ buffer_copy_buffer(C->key, B);
- buffer_free(B);
- B = NULL;
-
-@@ -405,7 +405,7 @@ context ::= DOLLAR SRVVARNAME(B) LBRACKET stringop(C) RBRACKET cond(E) expressio
- }
-
- b = buffer_init();
-- buffer_copy_string_buffer(b, ctx->current->key);
-+ buffer_copy_buffer(b, ctx->current->key);
- buffer_append_string(b, "/");
- buffer_append_string_buffer(b, B);
- buffer_append_string_buffer(b, C);
-@@ -441,9 +441,9 @@ context ::= DOLLAR SRVVARNAME(B) LBRACKET stringop(C) RBRACKET cond(E) expressio
-
- dc = data_config_init();
-
-- buffer_copy_string_buffer(dc->key, b);
-- buffer_copy_string_buffer(dc->op, op);
-- buffer_copy_string_buffer(dc->comp_key, B);
-+ buffer_copy_buffer(dc->key, b);
-+ buffer_copy_buffer(dc->op, op);
-+ buffer_copy_buffer(dc->comp_key, B);
- buffer_append_string_len(dc->comp_key, CONST_STR_LEN("[\""));
- buffer_append_string_buffer(dc->comp_key, C);
- buffer_append_string_len(dc->comp_key, CONST_STR_LEN("\"]"));
-@@ -546,7 +546,7 @@ stringop(A) ::= expression(B). {
- A = buffer_init_buffer(((data_string*)B)->value);
- } else if (B->type == TYPE_INTEGER) {
- A = buffer_init();
-- buffer_copy_long(A, ((data_integer *)B)->value);
-+ buffer_copy_int(A, ((data_integer *)B)->value);
- } else {
- fprintf(stderr, "operand must be string");
- ctx->ok = 0;
-diff --git a/src/connections.c b/src/connections.c
-index fe683a2..bc770bf 100644
---- a/src/connections.c
-+++ b/src/connections.c
-@@ -212,7 +212,7 @@ static int connection_handle_read_ssl(server *srv, connection *con) {
- b = chunkqueue_get_append_buffer(con->read_queue);
- len = SSL_pending(con->ssl);
- if (len < 4*1024) len = 4*1024; /* always alloc >= 4k buffer */
-- buffer_prepare_copy(b, len + 1);
-+ buffer_prepare_copy(b, len);
-
- /* overwrite everything with 0 */
- memset(b->ptr, 0, b->size);
-@@ -362,7 +362,7 @@ static int connection_handle_read(server *srv, connection *con) {
- } else {
- if (toread > MAX_READ_LIMIT) toread = MAX_READ_LIMIT;
- b = chunkqueue_get_append_buffer(con->read_queue);
-- buffer_prepare_copy(b, toread + 1);
-+ buffer_prepare_copy(b, toread);
- }
-
- read_offset = (b->used == 0) ? 0 : b->used - 1;
-@@ -473,11 +473,11 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- buffer_reset(con->physical.path);
-
- /* try to send static errorfile */
-- if (!buffer_is_empty(con->conf.errorfile_prefix)) {
-+ if (!buffer_string_is_empty(con->conf.errorfile_prefix)) {
- stat_cache_entry *sce = NULL;
-
-- buffer_copy_string_buffer(con->physical.path, con->conf.errorfile_prefix);
-- buffer_append_long(con->physical.path, con->http_status);
-+ buffer_copy_buffer(con->physical.path, con->conf.errorfile_prefix);
-+ buffer_append_int(con->physical.path, con->http_status);
- buffer_append_string_len(con->physical.path, CONST_STR_LEN(".html"));
-
- if (HANDLER_ERROR != stat_cache_get_entry(srv, con, con->physical.path, &sce)) {
-@@ -504,7 +504,7 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"
- " <head>\n"
- " <title>"));
-- buffer_append_long(b, con->http_status);
-+ buffer_append_int(b, con->http_status);
- buffer_append_string_len(b, CONST_STR_LEN(" - "));
- buffer_append_string(b, get_http_status_name(con->http_status));
-
-@@ -513,7 +513,7 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- " </head>\n"
- " <body>\n"
- " <h1>"));
-- buffer_append_long(b, con->http_status);
-+ buffer_append_int(b, con->http_status);
- buffer_append_string_len(b, CONST_STR_LEN(" - "));
- buffer_append_string(b, get_http_status_name(con->http_status));
-
-@@ -554,7 +554,7 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- /* qlen = 0 is important for Redirects (301, ...) as they MAY have
- * a content. Browsers are waiting for a Content otherwise
- */
-- buffer_copy_off_t(srv->tmp_buf, qlen);
-+ buffer_copy_int(srv->tmp_buf, qlen);
-
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Length"), CONST_BUF_LEN(srv->tmp_buf));
- }
-@@ -1135,7 +1135,7 @@ found_header_end:
- } else {
- b = chunkqueue_get_append_buffer(dst_cq);
- /* prepare buffer size for remaining POST data; is < 64kb */
-- buffer_prepare_copy(b, con->request.content_length - dst_cq->bytes_in + 1);
-+ buffer_prepare_copy(b, con->request.content_length - dst_cq->bytes_in);
- }
- buffer_append_string_len(b, c->mem->ptr + c->offset, toRead);
- }
-@@ -1430,17 +1430,17 @@ int connection_state_machine(server *srv, connection *con) {
- /* 404 error-handler */
-
- if (con->in_error_handler == 0 &&
-- (!buffer_is_empty(con->conf.error_handler) ||
-- !buffer_is_empty(con->error_handler))) {
-+ (!buffer_string_is_empty(con->conf.error_handler) ||
-+ !buffer_string_is_empty(con->error_handler))) {
- /* call error-handler */
-
- con->error_handler_saved_status = con->http_status;
- con->http_status = 0;
-
-- if (buffer_is_empty(con->error_handler)) {
-- buffer_copy_string_buffer(con->request.uri, con->conf.error_handler);
-+ if (buffer_string_is_empty(con->error_handler)) {
-+ buffer_copy_buffer(con->request.uri, con->conf.error_handler);
- } else {
-- buffer_copy_string_buffer(con->request.uri, con->error_handler);
-+ buffer_copy_buffer(con->request.uri, con->error_handler);
- }
- buffer_reset(con->physical.path);
-
-diff --git a/src/data_array.c b/src/data_array.c
-index 094d8c0..ad96207 100644
---- a/src/data_array.c
-+++ b/src/data_array.c
-@@ -8,7 +8,7 @@ static data_unset *data_array_copy(const data_unset *s) {
- data_array *src = (data_array *)s;
- data_array *ds = data_array_init();
-
-- buffer_copy_string_buffer(ds->key, src->key);
-+ buffer_copy_buffer(ds->key, src->key);
- array_free(ds->value);
- ds->value = array_init_array(src->value);
- ds->is_index_key = src->is_index_key;
-diff --git a/src/data_config.c b/src/data_config.c
-index 80e38de..b05ba20 100644
---- a/src/data_config.c
-+++ b/src/data_config.c
-@@ -8,8 +8,8 @@ static data_unset *data_config_copy(const data_unset *s) {
- data_config *src = (data_config *)s;
- data_config *ds = data_config_init();
-
-- buffer_copy_string_buffer(ds->key, src->key);
-- buffer_copy_string_buffer(ds->comp_key, src->comp_key);
-+ buffer_copy_buffer(ds->key, src->key);
-+ buffer_copy_buffer(ds->comp_key, src->comp_key);
- array_free(ds->value);
- ds->value = array_init_array(src->value);
- return (data_unset *)ds;
-diff --git a/src/data_count.c b/src/data_count.c
-index 8d36c8b..0337224 100644
---- a/src/data_count.c
-+++ b/src/data_count.c
-@@ -8,7 +8,7 @@ static data_unset *data_count_copy(const data_unset *s) {
- data_count *src = (data_count *)s;
- data_count *ds = data_count_init();
-
-- buffer_copy_string_buffer(ds->key, src->key);
-+ buffer_copy_buffer(ds->key, src->key);
- ds->count = src->count;
- ds->is_index_key = src->is_index_key;
- return (data_unset *)ds;
-diff --git a/src/data_fastcgi.c b/src/data_fastcgi.c
-index e13a470..a312506 100644
---- a/src/data_fastcgi.c
-+++ b/src/data_fastcgi.c
-@@ -9,8 +9,8 @@ static data_unset *data_fastcgi_copy(const data_unset *s) {
- data_fastcgi *src = (data_fastcgi *)s;
- data_fastcgi *ds = data_fastcgi_init();
-
-- buffer_copy_string_buffer(ds->key, src->key);
-- buffer_copy_string_buffer(ds->host, src->host);
-+ buffer_copy_buffer(ds->key, src->key);
-+ buffer_copy_buffer(ds->host, src->host);
- ds->is_index_key = src->is_index_key;
- return (data_unset *)ds;
- }
-diff --git a/src/data_integer.c b/src/data_integer.c
-index 63cbb10..5cfe11b 100644
---- a/src/data_integer.c
-+++ b/src/data_integer.c
-@@ -8,7 +8,7 @@ static data_unset *data_integer_copy(const data_unset *s) {
- data_integer *src = (data_integer *)s;
- data_integer *ds = data_integer_init();
-
-- buffer_copy_string_buffer(ds->key, src->key);
-+ buffer_copy_buffer(ds->key, src->key);
- ds->is_index_key = src->is_index_key;
- ds->value = src->value;
- return (data_unset *)ds;
-diff --git a/src/data_string.c b/src/data_string.c
-index 41c9ec1..fc57de2 100644
---- a/src/data_string.c
-+++ b/src/data_string.c
-@@ -9,8 +9,8 @@ static data_unset *data_string_copy(const data_unset *s) {
- data_string *src = (data_string *)s;
- data_string *ds = data_string_init();
-
-- buffer_copy_string_buffer(ds->key, src->key);
-- buffer_copy_string_buffer(ds->value, src->value);
-+ buffer_copy_buffer(ds->key, src->key);
-+ buffer_copy_buffer(ds->value, src->value);
- ds->is_index_key = src->is_index_key;
- return (data_unset *)ds;
- }
-@@ -40,7 +40,7 @@ static int data_string_insert_dup(data_unset *dst, data_unset *src) {
- buffer_append_string_len(ds_dst->value, CONST_STR_LEN(", "));
- buffer_append_string_buffer(ds_dst->value, ds_src->value);
- } else {
-- buffer_copy_string_buffer(ds_dst->value, ds_src->value);
-+ buffer_copy_buffer(ds_dst->value, ds_src->value);
- }
-
- src->free(src);
-@@ -58,7 +58,7 @@ static int data_response_insert_dup(data_unset *dst, data_unset *src) {
- buffer_append_string_len(ds_dst->value, CONST_STR_LEN(": "));
- buffer_append_string_buffer(ds_dst->value, ds_src->value);
- } else {
-- buffer_copy_string_buffer(ds_dst->value, ds_src->value);
-+ buffer_copy_buffer(ds_dst->value, ds_src->value);
- }
-
- src->free(src);
-diff --git a/src/etag.c b/src/etag.c
-index e7e9e3f..bf63d94 100644
---- a/src/etag.c
-+++ b/src/etag.c
-@@ -10,7 +10,7 @@
- #include <string.h>
-
- int etag_is_equal(buffer *etag, const char *matches) {
-- if (etag && !buffer_is_empty(etag) && 0 == strcmp(etag->ptr, matches)) return 1;
-+ if (etag && !buffer_string_is_empty(etag) && 0 == strcmp(etag->ptr, matches)) return 1;
- return 0;
- }
-
-@@ -20,17 +20,17 @@ int etag_create(buffer *etag, struct stat *st,etag_flags_t flags) {
- buffer_reset(etag);
-
- if (flags & ETAG_USE_INODE) {
-- buffer_append_off_t(etag, st->st_ino);
-+ buffer_append_int(etag, st->st_ino);
- buffer_append_string_len(etag, CONST_STR_LEN("-"));
- }
-
- if (flags & ETAG_USE_SIZE) {
-- buffer_append_off_t(etag, st->st_size);
-+ buffer_append_int(etag, st->st_size);
- buffer_append_string_len(etag, CONST_STR_LEN("-"));
- }
-
- if (flags & ETAG_USE_MTIME) {
-- buffer_append_long(etag, st->st_mtime);
-+ buffer_append_int(etag, st->st_mtime);
- }
-
- return 0;
-@@ -44,7 +44,7 @@ int etag_mutate(buffer *mut, buffer *etag) {
-
- buffer_reset(mut);
- buffer_copy_string_len(mut, CONST_STR_LEN("\""));
-- buffer_append_off_t(mut, h);
-+ buffer_append_int(mut, h);
- buffer_append_string_len(mut, CONST_STR_LEN("\""));
-
- return 0;
-diff --git a/src/http-header-glue.c b/src/http-header-glue.c
-index fe2f4fb..abffb7d 100644
---- a/src/http-header-glue.c
-+++ b/src/http-header-glue.c
-@@ -123,7 +123,7 @@ int http_response_redirect_to_directory(server *srv, connection *con) {
-
- o = buffer_init();
-
-- buffer_copy_string_buffer(o, con->uri.scheme);
-+ buffer_copy_buffer(o, con->uri.scheme);
- buffer_append_string_len(o, CONST_STR_LEN("://"));
- if (con->uri.authority->used) {
- buffer_append_string_buffer(o, con->uri.authority);
-@@ -197,13 +197,13 @@ int http_response_redirect_to_directory(server *srv, connection *con) {
- }
- if (default_port != srv->srvconf.port) {
- buffer_append_string_len(o, CONST_STR_LEN(":"));
-- buffer_append_long(o, srv->srvconf.port);
-+ buffer_append_int(o, srv->srvconf.port);
- }
- }
- }
- buffer_append_string_buffer(o, con->uri.path);
- buffer_append_string_len(o, CONST_STR_LEN("/"));
-- if (!buffer_is_empty(con->uri.query)) {
-+ if (!buffer_string_is_empty(con->uri.query)) {
- buffer_append_string_len(o, CONST_STR_LEN("?"));
- buffer_append_string_buffer(o, con->uri.query);
- }
-diff --git a/src/http_auth.c b/src/http_auth.c
-index e1d15e0..91e388c 100644
---- a/src/http_auth.c
-+++ b/src/http_auth.c
-@@ -172,7 +172,7 @@ static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *
- stream f;
- char * f_line;
-
-- if (buffer_is_empty(p->conf.auth_htdigest_userfile)) return -1;
-+ if (buffer_string_is_empty(p->conf.auth_htdigest_userfile)) return -1;
-
- if (0 != stream_open(&f, p->conf.auth_htdigest_userfile)) {
- log_error_write(srv, __FILE__, __LINE__, "sbss", "opening digest-userfile", p->conf.auth_htdigest_userfile, "failed:", strerror(errno));
-@@ -253,7 +253,7 @@ static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *
-
- auth_fn = (p->conf.auth_backend == AUTH_BACKEND_HTPASSWD) ? p->conf.auth_htpasswd_userfile : p->conf.auth_plain_userfile;
-
-- if (buffer_is_empty(auth_fn)) return -1;
-+ if (buffer_string_is_empty(auth_fn)) return -1;
-
- if (0 != stream_open(&f, auth_fn)) {
- log_error_write(srv, __FILE__, __LINE__, "sbss",
-@@ -748,7 +748,7 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p
- return -1;
-
- /* build filter */
-- buffer_copy_string_buffer(p->ldap_filter, p->conf.ldap_filter_pre);
-+ buffer_copy_buffer(p->ldap_filter, p->conf.ldap_filter_pre);
- buffer_append_string_buffer(p->ldap_filter, username);
- buffer_append_string_buffer(p->ldap_filter, p->conf.ldap_filter_post);
-
-@@ -903,7 +903,7 @@ int http_auth_basic_check(server *srv, connection *con, mod_auth_plugin_data *p,
- }
-
- /* remember the username */
-- buffer_copy_string_buffer(p->auth_user, username);
-+ buffer_copy_buffer(p->auth_user, username);
-
- buffer_free(username);
- buffer_free(password);
-@@ -1192,7 +1192,7 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p
- int http_auth_digest_generate_nonce(server *srv, mod_auth_plugin_data *p, buffer *fn, char out[33]) {
- HASH h;
- li_MD5_CTX Md5Ctx;
-- char hh[32];
-+ char hh[LI_ITOSTRING_LENGTH];
-
- UNUSED(p);
-
-@@ -1202,10 +1202,10 @@ int http_auth_digest_generate_nonce(server *srv, mod_auth_plugin_data *p, buffer
- li_MD5_Update(&Md5Ctx, (unsigned char *)"+", 1);
-
- /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */
-- LI_ltostr(hh, srv->cur_ts);
-+ li_itostr(hh, srv->cur_ts);
- li_MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh));
- li_MD5_Update(&Md5Ctx, (unsigned char *)srv->entropy, sizeof(srv->entropy));
-- LI_ltostr(hh, rand());
-+ li_itostr(hh, rand());
- li_MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh));
-
- li_MD5_Final(h, &Md5Ctx);
-diff --git a/src/http_chunk.c b/src/http_chunk.c
-index 5557edc..e3647e6 100644
---- a/src/http_chunk.c
-+++ b/src/http_chunk.c
-@@ -20,21 +20,23 @@
- #include <errno.h>
- #include <string.h>
-
--static int http_chunk_append_len(server *srv, connection *con, size_t len) {
-+static void http_chunk_append_len(server *srv, connection *con, size_t len) {
- size_t i, olen = len, j;
- buffer *b;
-
-+ force_assert(NULL != srv);
-+
- b = srv->tmp_chunk_len;
-
- if (len == 0) {
-- buffer_copy_string_len(b, CONST_STR_LEN("0"));
-+ buffer_copy_string_len(b, CONST_STR_LEN("0\r\n"));
- } else {
- for (i = 0; i < 8 && len; i++) {
- len >>= 4;
- }
-
- /* i is the number of hex digits we have */
-- buffer_prepare_copy(b, i + 1);
-+ buffer_prepare_copy(b, i + 2);
-
- for (j = i-1, len = olen; j+1 > 0; j--) {
- b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10);
-@@ -42,39 +44,40 @@ static int http_chunk_append_len(server *srv, connection *con, size_t len) {
- }
- b->used = i;
- b->ptr[b->used++] = '\0';
-+
-+ buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
- }
-
-- buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
- chunkqueue_append_buffer(con->write_queue, b);
--
-- return 0;
- }
-
-
--int http_chunk_append_file(server *srv, connection *con, buffer *fn, off_t offset, off_t len) {
-+void http_chunk_append_file(server *srv, connection *con, buffer *fn, off_t offset, off_t len) {
- chunkqueue *cq;
-
-- if (!con) return -1;
-+ force_assert(NULL != con);
-+ if (0 == len) return;
-
- cq = con->write_queue;
-
-+
- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
- http_chunk_append_len(srv, con, len);
- }
-
- chunkqueue_append_file(cq, fn, offset, len);
-
-- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED && len > 0) {
-- chunkqueue_append_mem(cq, "\r\n", 2 + 1);
-+ if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-+ chunkqueue_append_mem(cq, CONST_STR_LEN("\r\n"));
- }
--
-- return 0;
- }
-
--int http_chunk_append_buffer(server *srv, connection *con, buffer *mem) {
-+void http_chunk_append_buffer(server *srv, connection *con, buffer *mem) {
- chunkqueue *cq;
-
-- if (!con) return -1;
-+ force_assert(NULL != con);
-+
-+ if (buffer_string_is_empty(mem)) return;
-
- cq = con->write_queue;
-
-@@ -84,49 +87,37 @@ int http_chunk_append_buffer(server *srv, connection *con, buffer *mem) {
-
- chunkqueue_append_buffer(cq, mem);
-
-- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED && mem->used > 0) {
-- chunkqueue_append_mem(cq, "\r\n", 2 + 1);
-+ if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-+ chunkqueue_append_mem(cq, CONST_STR_LEN("\r\n"));
- }
--
-- return 0;
- }
-
--int http_chunk_append_mem(server *srv, connection *con, const char * mem, size_t len) {
-+void http_chunk_append_mem(server *srv, connection *con, const char * mem, size_t len) {
- chunkqueue *cq;
-
-- if (!con) return -1;
-+ force_assert(NULL != con);
-+ force_assert(NULL != mem || 0 == len);
-
-- cq = con->write_queue;
-+ if (NULL == mem || 0 == len) return;
-
-- if (len == 0) {
-- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-- chunkqueue_append_mem(cq, "0\r\n\r\n", 5 + 1);
-- } else {
-- chunkqueue_append_mem(cq, "", 1);
-- }
-- return 0;
-- }
-+ cq = con->write_queue;
-
- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-- http_chunk_append_len(srv, con, len - 1);
-+ http_chunk_append_len(srv, con, len);
- }
-
- chunkqueue_append_mem(cq, mem, len);
-
- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-- chunkqueue_append_mem(cq, "\r\n", 2 + 1);
-+ chunkqueue_append_mem(cq, CONST_STR_LEN("\r\n"));
- }
--
-- return 0;
- }
-
-+void http_chunk_close(server *srv, connection *con) {
-+ UNUSED(srv);
-+ force_assert(NULL != con);
-
--off_t http_chunkqueue_length(server *srv, connection *con) {
-- if (!con) {
-- log_error_write(srv, __FILE__, __LINE__, "s", "connection is NULL!!");
--
-- return 0;
-+ if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-+ chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("0\r\n\r\n"));
- }
--
-- return chunkqueue_length(con->write_queue);
- }
-diff --git a/src/http_chunk.h b/src/http_chunk.h
-index 4ba24a2..127a116 100644
---- a/src/http_chunk.h
-+++ b/src/http_chunk.h
-@@ -4,9 +4,9 @@
- #include "server.h"
- #include <sys/types.h>
-
--int http_chunk_append_mem(server *srv, connection *con, const char * mem, size_t len);
--int http_chunk_append_buffer(server *srv, connection *con, buffer *mem);
--int http_chunk_append_file(server *srv, connection *con, buffer *fn, off_t offset, off_t len);
--off_t http_chunkqueue_length(server *srv, connection *con);
-+void http_chunk_append_mem(server *srv, connection *con, const char * mem, size_t len); /* copies memory */
-+void http_chunk_append_buffer(server *srv, connection *con, buffer *mem); /* may reset "mem" */
-+void http_chunk_append_file(server *srv, connection *con, buffer *fn, off_t offset, off_t len); /* copies "fn" */
-+void http_chunk_close(server *srv, connection *con);
-
- #endif
-diff --git a/src/log.c b/src/log.c
-index 8033d17..75decfe 100644
---- a/src/log.c
-+++ b/src/log.c
-@@ -152,7 +152,7 @@ int log_error_open(server *srv) {
-
- if (srv->srvconf.errorlog_use_syslog) {
- srv->errorlog_mode = ERRORLOG_SYSLOG;
-- } else if (!buffer_is_empty(srv->srvconf.errorlog_file)) {
-+ } else if (!buffer_string_is_empty(srv->srvconf.errorlog_file)) {
- const char *logfile = srv->srvconf.errorlog_file->ptr;
-
- if (-1 == (srv->errorlog_fd = open_logfile_or_pipe(srv, logfile))) {
-@@ -170,7 +170,7 @@ int log_error_open(server *srv) {
- srv->errorlog_fd = -1;
- }
-
-- if (!buffer_is_empty(srv->srvconf.breakagelog_file)) {
-+ if (!buffer_string_is_empty(srv->srvconf.breakagelog_file)) {
- int breakage_fd;
- const char *logfile = srv->srvconf.breakagelog_file->ptr;
-
-@@ -277,12 +277,12 @@ static void log_buffer_append_printf(buffer *out, const char *fmt, va_list ap) {
- break;
- case 'd': /* int */
- d = va_arg(ap, int);
-- buffer_append_long(out, d);
-+ buffer_append_int(out, d);
- buffer_append_string_len(out, CONST_STR_LEN(" "));
- break;
- case 'o': /* off_t */
- o = va_arg(ap, off_t);
-- buffer_append_off_t(out, o);
-+ buffer_append_int(out, o);
- buffer_append_string_len(out, CONST_STR_LEN(" "));
- break;
- case 'x': /* int (hex) */
-@@ -301,11 +301,11 @@ static void log_buffer_append_printf(buffer *out, const char *fmt, va_list ap) {
- break;
- case 'D': /* int */
- d = va_arg(ap, int);
-- buffer_append_long(out, d);
-+ buffer_append_int(out, d);
- break;
- case 'O': /* off_t */
- o = va_arg(ap, off_t);
-- buffer_append_off_t(out, o);
-+ buffer_append_int(out, o);
- break;
- case 'X': /* int (hex) */
- d = va_arg(ap, int);
-@@ -339,7 +339,7 @@ static int log_buffer_prepare(buffer *b, server *srv, const char *filename, unsi
- srv->last_generated_debug_ts = srv->cur_ts;
- }
-
-- buffer_copy_string_buffer(b, srv->ts_debug_str);
-+ buffer_copy_buffer(b, srv->ts_debug_str);
- buffer_append_string_len(b, CONST_STR_LEN(": ("));
- break;
- case ERRORLOG_SYSLOG:
-@@ -350,7 +350,7 @@ static int log_buffer_prepare(buffer *b, server *srv, const char *filename, unsi
-
- buffer_append_string(b, filename);
- buffer_append_string_len(b, CONST_STR_LEN("."));
-- buffer_append_long(b, line);
-+ buffer_append_int(b, line);
- buffer_append_string_len(b, CONST_STR_LEN(") "));
-
- return 0;
-diff --git a/src/mod_access.c b/src/mod_access.c
-index c4774b8..7b88e19 100644
---- a/src/mod_access.c
-+++ b/src/mod_access.c
-@@ -132,7 +132,7 @@ URIHANDLER_FUNC(mod_access_uri_handler) {
- s_len = con->uri.path->used - 1;
-
- if (con->conf.log_request_handling) {
-- log_error_write(srv, __FILE__, __LINE__, "s",
-+ log_error_write(srv, __FILE__, __LINE__, "s",
- "-- mod_access_uri_handler called");
- }
-
-diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c
-index 21a7764..89fd7f5 100644
---- a/src/mod_accesslog.c
-+++ b/src/mod_accesslog.c
-@@ -494,7 +494,7 @@ SETDEFAULTS_FUNC(log_access_open) {
- return HANDLER_ERROR;
- }
-
-- if (i == 0 && buffer_is_empty(s->format)) {
-+ if (i == 0 && buffer_string_is_empty(s->format)) {
- /* set a default logfile string */
-
- buffer_copy_string_len(s->format, CONST_STR_LEN("%h %V %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""));
-@@ -523,7 +523,7 @@ SETDEFAULTS_FUNC(log_access_open) {
- for (j = 0; j < s->parsed_format->used; j++) {
- if (FIELD_FORMAT == s->parsed_format->ptr[j]->type) {
- if (FORMAT_TIMESTAMP == s->parsed_format->ptr[j]->field) {
-- if (!buffer_is_empty(s->parsed_format->ptr[j]->string)) {
-+ if (!buffer_string_is_empty(s->parsed_format->ptr[j]->string)) {
- buffer_copy_string(s->ts_accesslog_fmt_str, s->parsed_format->ptr[j]->string->ptr);
- }
-
-@@ -558,7 +558,7 @@ SETDEFAULTS_FUNC(log_access_open) {
- }
-
- s->append_tz_offset = 0;
-- if (buffer_is_empty(s->ts_accesslog_fmt_str)) {
-+ if (buffer_string_is_empty(s->ts_accesslog_fmt_str)) {
- #if defined(HAVE_STRUCT_TM_GMTOFF)
- BUFFER_COPY_STRING_CONST(s->ts_accesslog_fmt_str, "[%d/%b/%Y:%H:%M:%S ");
- s->append_tz_offset = 1;
-@@ -730,10 +730,10 @@ REQUESTDONE_FUNC(log_access_write) {
-
- /* hours */
- if (hrs < 10) buffer_append_string_len(p->conf.ts_accesslog_str, CONST_STR_LEN("0"));
-- buffer_append_long(p->conf.ts_accesslog_str, hrs);
-+ buffer_append_int(p->conf.ts_accesslog_str, hrs);
-
- if (min < 10) buffer_append_string_len(p->conf.ts_accesslog_str, CONST_STR_LEN("0"));
-- buffer_append_long(p->conf.ts_accesslog_str, min);
-+ buffer_append_int(p->conf.ts_accesslog_str, min);
- buffer_append_string_len(p->conf.ts_accesslog_str, CONST_STR_LEN("]"));
- }
- #else /* HAVE_STRUCT_TM_GMTOFF */
-@@ -777,12 +777,12 @@ REQUESTDONE_FUNC(log_access_write) {
- }
- break;
- case FORMAT_STATUS:
-- buffer_append_long(b, con->http_status);
-+ buffer_append_int(b, con->http_status);
- break;
-
- case FORMAT_BYTES_OUT_NO_HEADER:
- if (con->bytes_written > 0) {
-- buffer_append_off_t(b,
-+ buffer_append_int(b,
- con->bytes_written - con->bytes_header <= 0 ? 0 : con->bytes_written - con->bytes_header);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
-@@ -818,20 +818,20 @@ REQUESTDONE_FUNC(log_access_write) {
- break;
- case FORMAT_BYTES_OUT:
- if (con->bytes_written > 0) {
-- buffer_append_off_t(b, con->bytes_written);
-+ buffer_append_int(b, con->bytes_written);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
- }
- break;
- case FORMAT_BYTES_IN:
- if (con->bytes_read > 0) {
-- buffer_append_off_t(b, con->bytes_read);
-+ buffer_append_int(b, con->bytes_read);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
- }
- break;
- case FORMAT_TIME_USED:
-- buffer_append_long(b, srv->cur_ts - con->request_start);
-+ buffer_append_int(b, srv->cur_ts - con->request_start);
- break;
- case FORMAT_SERVER_NAME:
- if (con->server_name->used > 1) {
-@@ -869,7 +869,7 @@ REQUESTDONE_FUNC(log_access_write) {
- if (colon) {
- buffer_append_string(b, colon+1);
- } else {
-- buffer_append_long(b, srv->srvconf.port);
-+ buffer_append_int(b, srv->srvconf.port);
- }
- }
- break;
-diff --git a/src/mod_alias.c b/src/mod_alias.c
-index 062c268..bf22b5f 100644
---- a/src/mod_alias.c
-+++ b/src/mod_alias.c
-@@ -173,10 +173,10 @@ PHYSICALPATH_FUNC(mod_alias_physical_handler) {
- strncmp(uri_ptr, ds->key->ptr, alias_len))) {
- /* matched */
-
-- buffer_copy_string_buffer(con->physical.basedir, ds->value);
-- buffer_copy_string_buffer(srv->tmp_buf, ds->value);
-+ buffer_copy_buffer(con->physical.basedir, ds->value);
-+ buffer_copy_buffer(srv->tmp_buf, ds->value);
- buffer_append_string(srv->tmp_buf, uri_ptr + alias_len);
-- buffer_copy_string_buffer(con->physical.path, srv->tmp_buf);
-+ buffer_copy_buffer(con->physical.path, srv->tmp_buf);
-
- return HANDLER_GO_ON;
- }
-diff --git a/src/mod_auth.c b/src/mod_auth.c
-index 31e1140..d5a3f1c 100644
---- a/src/mod_auth.c
-+++ b/src/mod_auth.c
-@@ -324,7 +324,7 @@ static handler_t mod_auth_uri_handler(server *srv, connection *con, void *p_d) {
- buffer_copy_string(ds->key, "REMOTE_USER");
- array_insert_unique(con->environment, (data_unset *)ds);
- }
-- buffer_copy_string_buffer(ds->value, p->auth_user);
-+ buffer_copy_buffer(ds->value, p->auth_user);
-
- /* AUTH_TYPE environment */
-
-@@ -535,7 +535,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) {
- data_array *a;
-
- a = data_array_init();
-- buffer_copy_string_buffer(a->key, da_file->key);
-+ buffer_copy_buffer(a->key, da_file->key);
-
- ds = data_string_init();
-
-@@ -608,7 +608,7 @@ handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s) {
- if (s->auth_ldap_starttls) {
- /* if no CA file is given, it is ok, as we will use encryption
- * if the server requires a CAfile it will tell us */
-- if (!buffer_is_empty(s->auth_ldap_cafile)) {
-+ if (!buffer_string_is_empty(s->auth_ldap_cafile)) {
- if (LDAP_OPT_SUCCESS != (ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTFILE,
- s->auth_ldap_cafile->ptr))) {
- log_error_write(srv, __FILE__, __LINE__, "ss",
-diff --git a/src/mod_cgi.c b/src/mod_cgi.c
-index 734ecee..76882e8 100644
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -235,7 +235,7 @@ static int cgi_response_parse(server *srv, connection *con, plugin_data *p, buff
-
- UNUSED(srv);
-
-- buffer_copy_string_buffer(p->parse_response, in);
-+ buffer_copy_buffer(p->parse_response, in);
-
- for (s = p->parse_response->ptr;
- NULL != (ns = strchr(s, '\n'));
-@@ -350,7 +350,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- buffer_prepare_copy(hctx->response, 4 * 1024);
- } else {
- if (toread > MAX_READ_LIMIT) toread = MAX_READ_LIMIT;
-- buffer_prepare_copy(hctx->response, toread + 1);
-+ buffer_prepare_copy(hctx->response, toread);
- }
- #endif
-
-@@ -370,7 +370,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- con->file_finished = 1;
-
- /* send final chunk */
-- http_chunk_append_mem(srv, con, NULL, 0);
-+ http_chunk_close(srv, con);
- joblist_append(srv, con);
-
- return FDEVENT_HANDLED_FINISHED;
-@@ -458,7 +458,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- con->response.transfer_encoding = HTTP_TRANSFER_ENCODING_CHUNKED;
- }
-
-- http_chunk_append_mem(srv, con, hctx->response_header->ptr, hctx->response_header->used);
-+ http_chunk_append_buffer(srv, con, hctx->response_header);
- joblist_append(srv, con);
- } else {
- const char *bstart;
-@@ -493,7 +493,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- }
-
- if (blen > 0) {
-- http_chunk_append_mem(srv, con, bstart, blen + 1);
-+ http_chunk_append_mem(srv, con, bstart, blen);
- joblist_append(srv, con);
- }
- }
-@@ -501,7 +501,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- con->file_started = 1;
- }
- } else {
-- http_chunk_append_mem(srv, con, hctx->response->ptr, hctx->response->used);
-+ http_chunk_append_buffer(srv, con, hctx->response);
- joblist_append(srv, con);
- }
-
-@@ -668,27 +668,17 @@ static handler_t cgi_handle_fdevent(server *srv, void *ctx, int revents) {
- /* perhaps this issue is already handled */
- if (revents & FDEVENT_HUP) {
- /* check if we still have a unfinished header package which is a body in reality */
-- if (con->file_started == 0 &&
-- hctx->response_header->used) {
-+ if (con->file_started == 0 && !buffer_string_is_empty(hctx->response_header)) {
- con->file_started = 1;
-- http_chunk_append_mem(srv, con, hctx->response_header->ptr, hctx->response_header->used);
-- joblist_append(srv, con);
-+ http_chunk_append_buffer(srv, con, hctx->response_header);
- }
-
- if (con->file_finished == 0) {
-- http_chunk_append_mem(srv, con, NULL, 0);
-- joblist_append(srv, con);
-+ http_chunk_close(srv, con);
- }
--
- con->file_finished = 1;
-
-- if (chunkqueue_is_empty(con->write_queue)) {
-- /* there is nothing left to write */
-- connection_set_state(srv, con, CON_STATE_RESPONSE_END);
-- } else {
-- /* used the write-handler to finish the request on demand */
--
-- }
-+ joblist_append(srv, con);
-
- # if 0
- log_error_write(srv, __FILE__, __LINE__, "sddd", "got HUP from cgi", con->fd, hctx->fd, revents);
-@@ -777,7 +767,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- char **args;
- int argc;
- int i = 0;
-- char buf[32];
-+ char buf[LI_ITOSTRING_LENGTH];
- size_t n;
- char_array env;
- char *c;
-@@ -809,7 +799,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- cgi_env_add(&env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_BUF_LEN(con->conf.server_tag));
- }
-
-- if (!buffer_is_empty(con->server_name)) {
-+ if (!buffer_string_is_empty(con->server_name)) {
- size_t len = con->server_name->used - 1;
-
- if (con->server_name->ptr[0] == '[') {
-@@ -839,7 +829,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
-
- cgi_env_add(&env, CONST_STR_LEN("SERVER_PROTOCOL"), s, strlen(s));
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(srv_sock->addr.plain.sa_family == AF_INET6 ? srv_sock->addr.ipv6.sin6_port : srv_sock->addr.ipv4.sin_port)
- #else
-@@ -874,14 +864,14 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- s = get_http_method_name(con->request.http_method);
- cgi_env_add(&env, CONST_STR_LEN("REQUEST_METHOD"), s, strlen(s));
-
-- if (!buffer_is_empty(con->request.pathinfo)) {
-+ if (!buffer_string_is_empty(con->request.pathinfo)) {
- cgi_env_add(&env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo));
- }
- cgi_env_add(&env, CONST_STR_LEN("REDIRECT_STATUS"), CONST_STR_LEN("200"));
-- if (!buffer_is_empty(con->uri.query)) {
-+ if (!buffer_string_is_empty(con->uri.query)) {
- cgi_env_add(&env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query));
- }
-- if (!buffer_is_empty(con->request.orig_uri)) {
-+ if (!buffer_string_is_empty(con->request.orig_uri)) {
- cgi_env_add(&env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri));
- }
-
-@@ -909,7 +899,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- }
- cgi_env_add(&env, CONST_STR_LEN("REMOTE_ADDR"), s, strlen(s));
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(con->dst_addr.plain.sa_family == AF_INET6 ? con->dst_addr.ipv6.sin6_port : con->dst_addr.ipv4.sin_port)
- #else
-@@ -922,8 +912,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- cgi_env_add(&env, CONST_STR_LEN("HTTPS"), CONST_STR_LEN("on"));
- }
-
-- /* request.content_length < SSIZE_MAX, see request.c */
-- LI_ltostr(buf, con->request.content_length);
-+ li_itostr(buf, con->request.content_length);
- cgi_env_add(&env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf));
- cgi_env_add(&env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(con->physical.path));
- cgi_env_add(&env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path));
-@@ -1134,8 +1123,6 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- }
- }
- break;
-- case UNUSED_CHUNK:
-- break;
- }
-
- if (r > 0) {
-diff --git a/src/mod_cml.c b/src/mod_cml.c
-index b5b5ac2..3033d42 100644
---- a/src/mod_cml.c
-+++ b/src/mod_cml.c
-@@ -184,7 +184,7 @@ static int cache_call_lua(server *srv, connection *con, plugin_data *p, buffer *
-
- /* cleanup basedir */
- b = p->baseurl;
-- buffer_copy_string_buffer(b, con->uri.path);
-+ buffer_copy_buffer(b, con->uri.path);
- for (c = b->ptr + b->used - 1; c > b->ptr && *c != '/'; c--);
-
- if (*c == '/') {
-@@ -193,7 +193,7 @@ static int cache_call_lua(server *srv, connection *con, plugin_data *p, buffer *
- }
-
- b = p->basedir;
-- buffer_copy_string_buffer(b, con->physical.path);
-+ buffer_copy_buffer(b, con->physical.path);
- for (c = b->ptr + b->used - 1; c > b->ptr && *c != '/'; c--);
-
- if (*c == '/') {
-@@ -218,7 +218,7 @@ URIHANDLER_FUNC(mod_cml_power_magnet) {
- buffer_reset(p->baseurl);
- buffer_reset(p->trigger_handler);
-
-- if (buffer_is_empty(p->conf.power_magnet)) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(p->conf.power_magnet)) return HANDLER_GO_ON;
-
- /*
- * power-magnet:
-@@ -264,7 +264,7 @@ URIHANDLER_FUNC(mod_cml_power_magnet) {
- URIHANDLER_FUNC(mod_cml_is_handled) {
- plugin_data *p = p_d;
-
-- if (buffer_is_empty(con->physical.path)) return HANDLER_ERROR;
-+ if (buffer_string_is_empty(con->physical.path)) return HANDLER_ERROR;
-
- mod_cml_patch_connection(srv, con, p);
-
-@@ -272,7 +272,7 @@ URIHANDLER_FUNC(mod_cml_is_handled) {
- buffer_reset(p->baseurl);
- buffer_reset(p->trigger_handler);
-
-- if (buffer_is_empty(p->conf.ext)) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(p->conf.ext)) return HANDLER_GO_ON;
-
- if (!buffer_is_equal_right_len(con->physical.path, p->conf.ext, p->conf.ext->used - 1)) {
- return HANDLER_GO_ON;
-diff --git a/src/mod_cml_lua.c b/src/mod_cml_lua.c
-index d05e854..63dd1e7 100644
---- a/src/mod_cml_lua.c
-+++ b/src/mod_cml_lua.c
-@@ -260,7 +260,7 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
- c_to_lua_push(L, header_tbl, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path));
- c_to_lua_push(L, header_tbl, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(con->physical.path));
- c_to_lua_push(L, header_tbl, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.doc_root));
-- if (!buffer_is_empty(con->request.pathinfo)) {
-+ if (!buffer_string_is_empty(con->request.pathinfo)) {
- c_to_lua_push(L, header_tbl, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo));
- }
-
-@@ -276,7 +276,7 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
- header_tbl = lua_gettop(L);
- lua_gettable(L, LUA_GLOBALSINDEX);
-
-- buffer_copy_string_buffer(b, con->uri.query);
-+ buffer_copy_buffer(b, con->uri.query);
- cache_export_get_params(L, header_tbl, b);
- buffer_reset(b);
-
-@@ -346,7 +346,7 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
-
- /* the file is relative, make it absolute */
- if (s[0] != '/') {
-- buffer_copy_string_buffer(b, p->basedir);
-+ buffer_copy_buffer(b, p->basedir);
- buffer_append_string(b, lua_tostring(L, -1));
- } else {
- buffer_copy_string(b, lua_tostring(L, -1));
-@@ -358,7 +358,7 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
- switch(errno) {
- case ENOENT:
- /* a file is missing, call the handler to generate it */
-- if (!buffer_is_empty(p->trigger_handler)) {
-+ if (!buffer_string_is_empty(p->trigger_handler)) {
- ret = 1; /* cache-miss */
-
- log_error_write(srv, __FILE__, __LINE__, "s",
-@@ -433,12 +433,12 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
- }
- }
-
-- if (ret == 1 && !buffer_is_empty(p->trigger_handler)) {
-+ if (ret == 1 && !buffer_string_is_empty(p->trigger_handler)) {
- /* cache-miss */
-- buffer_copy_string_buffer(con->uri.path, p->baseurl);
-+ buffer_copy_buffer(con->uri.path, p->baseurl);
- buffer_append_string_buffer(con->uri.path, p->trigger_handler);
-
-- buffer_copy_string_buffer(con->physical.path, p->basedir);
-+ buffer_copy_buffer(con->physical.path, p->basedir);
- buffer_append_string_buffer(con->physical.path, p->trigger_handler);
-
- chunkqueue_reset(con->write_queue);
-diff --git a/src/mod_compress.c b/src/mod_compress.c
-index c4183bb..ad6e9f2 100644
---- a/src/mod_compress.c
-+++ b/src/mod_compress.c
-@@ -222,7 +222,7 @@ SETDEFAULTS_FUNC(mod_compress_setdefaults) {
-
- array_free(encodings_arr);
-
-- if (!buffer_is_empty(s->compress_cache_dir)) {
-+ if (!buffer_string_is_empty(s->compress_cache_dir)) {
- struct stat st;
- mkdir_recursive(s->compress_cache_dir->ptr);
-
-@@ -351,7 +351,7 @@ static int deflate_file_to_buffer_deflate(server *srv, connection *con, plugin_d
- }
-
- /* trailer */
-- p->b->used += z.total_out;
-+ p->b->used = z.total_out;
-
- if (Z_OK != deflateEnd(&z)) {
- return -1;
-@@ -429,12 +429,12 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
- if (sce->st.st_size > 128 * 1024 * 1024) return -1;
-
- buffer_reset(p->ofn);
-- buffer_copy_string_buffer(p->ofn, p->conf.compress_cache_dir);
-- BUFFER_APPEND_SLASH(p->ofn);
-+ buffer_copy_buffer(p->ofn, p->conf.compress_cache_dir);
-+ buffer_append_slash(p->ofn);
-
- if (0 == strncmp(con->physical.path->ptr, con->physical.doc_root->ptr, con->physical.doc_root->used-1)) {
- buffer_append_string(p->ofn, con->physical.path->ptr + con->physical.doc_root->used - 1);
-- buffer_copy_string_buffer(p->b, p->ofn);
-+ buffer_copy_buffer(p->b, p->ofn);
- } else {
- buffer_append_string_buffer(p->ofn, con->uri.path);
- }
-@@ -469,7 +469,7 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
- #if 0
- log_error_write(srv, __FILE__, __LINE__, "bs", p->ofn, "compress-cache hit");
- #endif
-- buffer_copy_string_buffer(con->physical.path, p->ofn);
-+ buffer_copy_buffer(con->physical.path, p->ofn);
-
- return 0;
- }
-@@ -574,7 +574,7 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
- return -1;
- }
-
-- buffer_copy_string_buffer(con->physical.path, p->ofn);
-+ buffer_copy_buffer(con->physical.path, p->ofn);
-
- return 0;
- }
-@@ -652,7 +652,7 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p,
-
- chunkqueue_reset(con->write_queue);
- b = chunkqueue_get_append_buffer(con->write_queue);
-- buffer_copy_memory(b, p->b->ptr, p->b->used + 1);
-+ buffer_copy_string_len(b, p->b->ptr, p->b->used);
-
- buffer_reset(con->physical.path);
-
-@@ -732,7 +732,7 @@ PHYSICALPATH_FUNC(mod_compress_physical) {
- return HANDLER_GO_ON;
- }
-
-- if (buffer_is_empty(con->physical.path)) {
-+ if (buffer_string_is_empty(con->physical.path)) {
- return HANDLER_GO_ON;
- }
-
-@@ -867,7 +867,7 @@ PHYSICALPATH_FUNC(mod_compress_physical) {
-
- if (use_etag) {
- /* try matching etag of compressed version */
-- buffer_copy_string_buffer(srv->tmp_buf, sce->etag);
-+ buffer_copy_buffer(srv->tmp_buf, sce->etag);
- buffer_append_string_len(srv->tmp_buf, CONST_STR_LEN("-"));
- buffer_append_string(srv->tmp_buf, compression_name);
- etag_mutate(con->physical.etag, srv->tmp_buf);
-diff --git a/src/mod_dirlisting.c b/src/mod_dirlisting.c
-index 6a2b139..4b7106a 100644
---- a/src/mod_dirlisting.c
-+++ b/src/mod_dirlisting.c
-@@ -124,7 +124,7 @@ static int excludes_buffer_append(excludes_buffer *exb, buffer *string) {
- }
-
- exb->ptr[exb->used]->string = buffer_init();
-- buffer_copy_string_buffer(exb->ptr[exb->used]->string, string);
-+ buffer_copy_buffer(exb->ptr[exb->used]->string, string);
-
- exb->used++;
-
-@@ -469,7 +469,8 @@ static int http_list_directory_sizefmt(char *buf, off_t size) {
- u++;
- }
-
-- out += LI_ltostr(out, size);
-+ li_itostr(out, size);
-+ out += strlen(out);
- out[0] = '.';
- out[1] = remain + '0';
- out[2] = *u;
-@@ -539,8 +540,8 @@ static void http_list_directory_header(server *srv, connection *con, plugin_data
- stream s;
- /* if we have a HEADER file, display it in <pre class="header"></pre> */
-
-- buffer_copy_string_buffer(p->tmp_buf, con->physical.path);
-- BUFFER_APPEND_SLASH(p->tmp_buf);
-+ buffer_copy_buffer(p->tmp_buf, con->physical.path);
-+ buffer_append_slash(p->tmp_buf);
- buffer_append_string_len(p->tmp_buf, CONST_STR_LEN("HEADER.txt"));
-
- if (-1 != stream_open(&s, p->tmp_buf)) {
-@@ -592,8 +593,8 @@ static void http_list_directory_footer(server *srv, connection *con, plugin_data
- stream s;
- /* if we have a README file, display it in <pre class="readme"></pre> */
-
-- buffer_copy_string_buffer(p->tmp_buf, con->physical.path);
-- BUFFER_APPEND_SLASH(p->tmp_buf);
-+ buffer_copy_buffer(p->tmp_buf, con->physical.path);
-+ buffer_append_slash(p->tmp_buf);
- buffer_append_string_len(p->tmp_buf, CONST_STR_LEN("README.txt"));
-
- if (-1 != stream_open(&s, p->tmp_buf)) {
-@@ -785,7 +786,7 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
-
- out = chunkqueue_get_append_buffer(con->write_queue);
- buffer_copy_string_len(out, CONST_STR_LEN("<?xml version=\"1.0\" encoding=\""));
-- if (buffer_is_empty(p->conf.encoding)) {
-+ if (buffer_string_is_empty(p->conf.encoding)) {
- buffer_append_string_len(out, CONST_STR_LEN("iso-8859-1"));
- } else {
- buffer_append_string_buffer(out, p->conf.encoding);
-@@ -889,7 +890,7 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- http_list_directory_footer(srv, con, p, out);
-
- /* Insert possible charset to Content-Type */
-- if (buffer_is_empty(p->conf.encoding)) {
-+ if (buffer_string_is_empty(p->conf.encoding)) {
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html"));
- } else {
- buffer_copy_string_len(p->content_charset, CONST_STR_LEN("text/html; charset="));
-diff --git a/src/mod_evhost.c b/src/mod_evhost.c
-index a491baa..5281523 100644
---- a/src/mod_evhost.c
-+++ b/src/mod_evhost.c
-@@ -200,7 +200,7 @@ static int mod_evhost_parse_host(connection *con,array *host) {
- /* is something between the dots */
- ds = data_string_init();
- buffer_copy_string_len(ds->key,CONST_STR_LEN("%"));
-- buffer_append_long(ds->key, i++);
-+ buffer_append_int(ds->key, i++);
- buffer_copy_string_len(ds->value,ptr+1,colon-ptr-1);
-
- array_insert_unique(host,(data_unset *)ds);
-@@ -213,7 +213,7 @@ static int mod_evhost_parse_host(connection *con,array *host) {
- if (colon != ptr) {
- ds = data_string_init();
- buffer_copy_string_len(ds->key,CONST_STR_LEN("%"));
-- buffer_append_long(ds->key, i /* ++ */);
-+ buffer_append_int(ds->key, i /* ++ */);
- buffer_copy_string_len(ds->value,ptr,colon-ptr);
-
- array_insert_unique(host,(data_unset *)ds);
-@@ -311,7 +311,7 @@ static handler_t mod_evhost_uri_handler(server *srv, connection *con, void *p_d)
- }
- }
-
-- BUFFER_APPEND_SLASH(p->tmp_buf);
-+ buffer_append_slash(p->tmp_buf);
-
- array_free(parsed_host);
-
-@@ -324,7 +324,7 @@ static handler_t mod_evhost_uri_handler(server *srv, connection *con, void *p_d)
- }
-
- if (!not_good) {
-- buffer_copy_string_buffer(con->physical.doc_root, p->tmp_buf);
-+ buffer_copy_buffer(con->physical.doc_root, p->tmp_buf);
- }
-
- return HANDLER_GO_ON;
-diff --git a/src/mod_expire.c b/src/mod_expire.c
-index 476261f..41895f9 100644
---- a/src/mod_expire.c
-+++ b/src/mod_expire.c
-@@ -346,7 +346,7 @@ URIHANDLER_FUNC(mod_expire_path_handler) {
-
- /* HTTP/1.1 */
- buffer_copy_string_len(p->expire_tstmp, CONST_STR_LEN("max-age="));
-- buffer_append_long(p->expire_tstmp, expires - srv->cur_ts); /* as expires >= srv->cur_ts the difference is >= 0 */
-+ buffer_append_int(p->expire_tstmp, expires - srv->cur_ts); /* as expires >= srv->cur_ts the difference is >= 0 */
-
- response_header_append(srv, con, CONST_STR_LEN("Cache-Control"), CONST_BUF_LEN(p->expire_tstmp));
-
-diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c
-index ad1ec18..01e72e5 100644
---- a/src/mod_fastcgi.c
-+++ b/src/mod_fastcgi.c
-@@ -391,7 +391,7 @@ static void fastcgi_status_copy_procname(buffer *b, fcgi_extension_host *host, f
- buffer_append_string_buffer(b, host->id);
- if (proc) {
- buffer_append_string_len(b, CONST_STR_LEN("."));
-- buffer_append_long(b, proc->id);
-+ buffer_append_int(b, proc->id);
- }
- }
-
-@@ -637,7 +637,7 @@ static int fastcgi_extension_insert(fcgi_exts *ext, buffer *key, fcgi_extension_
- force_assert(fe);
- fe->key = buffer_init();
- fe->last_used_ndx = -1;
-- buffer_copy_string_buffer(fe->key, key);
-+ buffer_copy_buffer(fe->key, key);
-
- /* */
-
-@@ -724,7 +724,7 @@ FREE_FUNC(mod_fastcgi_free) {
- }
-
- if (proc->is_local &&
-- !buffer_is_empty(proc->unixsocket)) {
-+ !buffer_string_is_empty(proc->unixsocket)) {
- unlink(proc->unixsocket->ptr);
- }
- }
-@@ -734,7 +734,7 @@ FREE_FUNC(mod_fastcgi_free) {
- kill(proc->pid, host->kill_signal);
- }
- if (proc->is_local &&
-- !buffer_is_empty(proc->unixsocket)) {
-+ !buffer_string_is_empty(proc->unixsocket)) {
- unlink(proc->unixsocket->ptr);
- }
- }
-@@ -868,7 +868,7 @@ static int fcgi_spawn_connection(server *srv,
- "new proc, socket:", proc->port, proc->unixsocket);
- }
-
-- if (!buffer_is_empty(proc->unixsocket)) {
-+ if (!buffer_string_is_empty(proc->unixsocket)) {
- memset(&fcgi_addr, 0, sizeof(fcgi_addr));
-
- #ifdef HAVE_SYS_UN_H
-@@ -901,7 +901,7 @@ static int fcgi_spawn_connection(server *srv,
- } else {
- fcgi_addr_in.sin_family = AF_INET;
-
-- if (buffer_is_empty(host->host)) {
-+ if (buffer_string_is_empty(host->host)) {
- fcgi_addr_in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- } else {
- struct hostent *he;
-@@ -937,13 +937,13 @@ static int fcgi_spawn_connection(server *srv,
- fcgi_addr = (struct sockaddr *) &fcgi_addr_in;
-
- buffer_copy_string_len(proc->connection_name, CONST_STR_LEN("tcp:"));
-- if (!buffer_is_empty(host->host)) {
-+ if (!buffer_string_is_empty(host->host)) {
- buffer_append_string_buffer(proc->connection_name, host->host);
- } else {
- buffer_append_string_len(proc->connection_name, CONST_STR_LEN("localhost"));
- }
- buffer_append_string_len(proc->connection_name, CONST_STR_LEN(":"));
-- buffer_append_long(proc->connection_name, proc->port);
-+ buffer_append_int(proc->connection_name, proc->port);
- }
-
- if (-1 == (fcgi_fd = socket(socket_type, SOCK_STREAM, 0))) {
-@@ -958,7 +958,7 @@ static int fcgi_spawn_connection(server *srv,
- int val;
-
- if (errno != ENOENT &&
-- !buffer_is_empty(proc->unixsocket)) {
-+ !buffer_string_is_empty(proc->unixsocket)) {
- unlink(proc->unixsocket->ptr);
- }
-
-@@ -1285,7 +1285,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- host = fastcgi_host_init();
- buffer_reset(fcgi_mode);
-
-- buffer_copy_string_buffer(host->id, da_host->key);
-+ buffer_copy_buffer(host->id, da_host->key);
-
- host->check_local = 1;
- host->max_procs = 4;
-@@ -1319,8 +1319,8 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- goto error;
- }
-
-- if ((!buffer_is_empty(host->host) || host->port) &&
-- !buffer_is_empty(host->unixsocket)) {
-+ if ((!buffer_string_is_empty(host->host) || host->port) &&
-+ !buffer_string_is_empty(host->unixsocket)) {
- log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
- "either host/port or socket have to be set in:",
- da->key, "= (",
-@@ -1330,7 +1330,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- goto error;
- }
-
-- if (!buffer_is_empty(host->unixsocket)) {
-+ if (!buffer_string_is_empty(host->unixsocket)) {
- /* unix domain socket */
- struct sockaddr_un un;
-
-@@ -1346,8 +1346,8 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- } else {
- /* tcp/ip */
-
-- if (buffer_is_empty(host->host) &&
-- buffer_is_empty(host->bin_path)) {
-+ if (buffer_string_is_empty(host->host) &&
-+ buffer_string_is_empty(host->bin_path)) {
- log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
- "host or binpath have to be set in:",
- da->key, "= (",
-@@ -1366,7 +1366,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- }
- }
-
-- if (!buffer_is_empty(host->bin_path)) {
-+ if (!buffer_string_is_empty(host->bin_path)) {
- /* a local socket + self spawning */
- size_t pno;
-
-@@ -1386,12 +1386,12 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- proc->id = host->num_procs++;
- host->max_id++;
-
-- if (buffer_is_empty(host->unixsocket)) {
-+ if (buffer_string_is_empty(host->unixsocket)) {
- proc->port = host->port + pno;
- } else {
-- buffer_copy_string_buffer(proc->unixsocket, host->unixsocket);
-+ buffer_copy_buffer(proc->unixsocket, host->unixsocket);
- buffer_append_string_len(proc->unixsocket, CONST_STR_LEN("-"));
-- buffer_append_long(proc->unixsocket, pno);
-+ buffer_append_int(proc->unixsocket, pno);
- }
-
- if (s->debug) {
-@@ -1425,10 +1425,10 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- host->active_procs++;
- proc->state = PROC_STATE_RUNNING;
-
-- if (buffer_is_empty(host->unixsocket)) {
-+ if (buffer_string_is_empty(host->unixsocket)) {
- proc->port = host->port;
- } else {
-- buffer_copy_string_buffer(proc->unixsocket, host->unixsocket);
-+ buffer_copy_buffer(proc->unixsocket, host->unixsocket);
- }
-
- fastcgi_status_init(srv, p->statuskey, host, proc);
-@@ -1438,12 +1438,12 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- host->max_procs = 1;
- }
-
-- if (!buffer_is_empty(fcgi_mode)) {
-+ if (!buffer_string_is_empty(fcgi_mode)) {
- if (strcmp(fcgi_mode->ptr, "responder") == 0) {
- host->mode = FCGI_RESPONDER;
- } else if (strcmp(fcgi_mode->ptr, "authorizer") == 0) {
- host->mode = FCGI_AUTHORIZER;
-- if (buffer_is_empty(host->docroot)) {
-+ if (buffer_string_is_empty(host->docroot)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "ERROR: docroot is required for authorizer mode.");
- goto error;
-@@ -1672,7 +1672,7 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
-
- memset(&fcgi_addr, 0, sizeof(fcgi_addr));
-
-- if (!buffer_is_empty(proc->unixsocket)) {
-+ if (!buffer_string_is_empty(proc->unixsocket)) {
- #ifdef HAVE_SYS_UN_H
- /* use the unix domain socket */
- fcgi_addr_un.sun_family = AF_UNIX;
-@@ -1692,7 +1692,7 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
- #endif
- fcgi_addr = (struct sockaddr *) &fcgi_addr_un;
-
-- if (buffer_is_empty(proc->connection_name)) {
-+ if (buffer_string_is_empty(proc->connection_name)) {
- /* on remote spawing we have to set the connection-name now */
- buffer_copy_string_len(proc->connection_name, CONST_STR_LEN("unix:"));
- buffer_append_string_buffer(proc->connection_name, proc->unixsocket);
-@@ -1702,7 +1702,7 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
- #endif
- } else {
- fcgi_addr_in.sin_family = AF_INET;
-- if (!buffer_is_empty(host->host)) {
-+ if (!buffer_string_is_empty(host->host)) {
- if (0 == inet_aton(host->host->ptr, &(fcgi_addr_in.sin_addr))) {
- log_error_write(srv, __FILE__, __LINE__, "sbs",
- "converting IP address failed for", host->host,
-@@ -1718,16 +1718,16 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
-
- fcgi_addr = (struct sockaddr *) &fcgi_addr_in;
-
-- if (buffer_is_empty(proc->connection_name)) {
-+ if (buffer_string_is_empty(proc->connection_name)) {
- /* on remote spawing we have to set the connection-name now */
- buffer_copy_string_len(proc->connection_name, CONST_STR_LEN("tcp:"));
-- if (!buffer_is_empty(host->host)) {
-+ if (!buffer_string_is_empty(host->host)) {
- buffer_append_string_buffer(proc->connection_name, host->host);
- } else {
- buffer_append_string_len(proc->connection_name, CONST_STR_LEN("localhost"));
- }
- buffer_append_string_len(proc->connection_name, CONST_STR_LEN(":"));
-- buffer_append_long(proc->connection_name, proc->port);
-+ buffer_append_int(proc->connection_name, proc->port);
- }
- }
-
-@@ -1840,7 +1840,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- FCGI_Header header;
- buffer *b;
-
-- char buf[32];
-+ char buf[LI_ITOSTRING_LENGTH];
- const char *s;
- #ifdef HAVE_IPV6
- char b2[INET6_ADDRSTRLEN + 1];
-@@ -1865,7 +1865,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
-
- b = chunkqueue_get_append_buffer(hctx->wb);
-
-- buffer_copy_memory(b, (const char *)&beginRecord, sizeof(beginRecord));
-+ buffer_copy_string_len(b, (const char *)&beginRecord, sizeof(beginRecord));
-
- /* send FCGI_PARAMS */
- buffer_prepare_copy(p->fcgi_env, 1024);
-@@ -1904,7 +1904,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("GATEWAY_INTERFACE"), CONST_STR_LEN("CGI/1.1")),con)
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(srv_sock->addr.plain.sa_family ? srv_sock->addr.ipv6.sin6_port : srv_sock->addr.ipv4.sin_port)
- #else
-@@ -1924,7 +1924,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- }
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_ADDR"), s, strlen(s)),con)
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(con->dst_addr.plain.sa_family ? con->dst_addr.ipv6.sin6_port : con->dst_addr.ipv4.sin_port)
- #else
-@@ -1940,8 +1940,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- if (con->request.content_length > 0 && host->mode != FCGI_AUTHORIZER) {
- /* CGI-SPEC 6.1.2 and FastCGI spec 6.3 */
-
-- /* request.content_length < SSIZE_MAX, see request.c */
-- LI_ltostr(buf, con->request.content_length);
-+ li_itostr(buf, con->request.content_length);
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf)),con)
- }
-
-@@ -1955,15 +1954,15 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path)),con)
-
-- if (!buffer_is_empty(con->request.pathinfo)) {
-+ if (!buffer_string_is_empty(con->request.pathinfo)) {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo)),con)
-
- /* PATH_TRANSLATED is only defined if PATH_INFO is set */
-
-- if (!buffer_is_empty(host->docroot)) {
-- buffer_copy_string_buffer(p->path, host->docroot);
-+ if (!buffer_string_is_empty(host->docroot)) {
-+ buffer_copy_buffer(p->path, host->docroot);
- } else {
-- buffer_copy_string_buffer(p->path, con->physical.basedir);
-+ buffer_copy_buffer(p->path, con->physical.basedir);
- }
- buffer_append_string_buffer(p->path, con->request.pathinfo);
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_TRANSLATED"), CONST_BUF_LEN(p->path)),con)
-@@ -1980,19 +1979,19 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- * parameter.
- */
-
-- if (!buffer_is_empty(host->docroot)) {
-+ if (!buffer_string_is_empty(host->docroot)) {
- /*
- * rewrite SCRIPT_FILENAME
- *
- */
-
-- buffer_copy_string_buffer(p->path, host->docroot);
-+ buffer_copy_buffer(p->path, host->docroot);
- buffer_append_string_buffer(p->path, con->uri.path);
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)),con)
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(host->docroot)),con)
- } else {
-- buffer_copy_string_buffer(p->path, con->physical.path);
-+ buffer_copy_buffer(p->path, con->physical.path);
-
- /* cgi.fix_pathinfo need a broken SCRIPT_FILENAME to find out what PATH_INFO is itself
- *
-@@ -2037,7 +2036,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- if (!buffer_is_equal(con->request.uri, con->request.orig_uri)) {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri)),con)
- }
-- if (!buffer_is_empty(con->uri.query)) {
-+ if (!buffer_string_is_empty(con->uri.query)) {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query)),con)
- } else {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_STR_LEN("")),con)
-@@ -2056,135 +2055,43 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- FCGI_ENV_ADD_CHECK(fcgi_env_add_request_headers(srv, con, p), con);
-
- fcgi_header(&(header), FCGI_PARAMS, request_id, p->fcgi_env->used, 0);
-- buffer_append_memory(b, (const char *)&header, sizeof(header));
-- buffer_append_memory(b, (const char *)p->fcgi_env->ptr, p->fcgi_env->used);
-+ buffer_append_string_len(b, (const char *)&header, sizeof(header));
-+ buffer_append_string_len(b, (const char *)p->fcgi_env->ptr, p->fcgi_env->used);
-
- fcgi_header(&(header), FCGI_PARAMS, request_id, 0, 0);
-- buffer_append_memory(b, (const char *)&header, sizeof(header));
-+ buffer_append_string_len(b, (const char *)&header, sizeof(header));
-
-- b->used++; /* add virtual \0 */
- hctx->wb->bytes_in += b->used - 1;
-
- if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-- chunk *req_c;
- off_t offset;
-
- /* something to send ? */
-- for (offset = 0, req_c = req_cq->first; offset != req_cq->bytes_in; ) {
-+ for (offset = 0; offset != req_cq->bytes_in; ) {
- off_t weWant = req_cq->bytes_in - offset > FCGI_MAX_LENGTH ? FCGI_MAX_LENGTH : req_cq->bytes_in - offset;
-- off_t written = 0;
-- off_t weHave = 0;
-
- /* we announce toWrite octets
- * now take all the request_content chunks that we need to fill this request
- * */
-
-- b = chunkqueue_get_append_buffer(hctx->wb);
- fcgi_header(&(header), FCGI_STDIN, request_id, weWant, 0);
-- buffer_copy_memory(b, (const char *)&header, sizeof(header));
-+ chunkqueue_append_mem(hctx->wb, (const char *)&header, sizeof(header));
- hctx->wb->bytes_in += sizeof(header);
-
- if (p->conf.debug > 10) {
- log_error_write(srv, __FILE__, __LINE__, "soso", "tosend:", offset, "/", req_cq->bytes_in);
- }
-
-- for (written = 0; written != weWant; ) {
-- if (p->conf.debug > 10) {
-- log_error_write(srv, __FILE__, __LINE__, "soso", "chunk:", written, "/", weWant);
-- }
--
-- switch (req_c->type) {
-- case FILE_CHUNK:
-- weHave = req_c->file.length - req_c->offset;
--
-- if (weHave > weWant - written) weHave = weWant - written;
--
-- if (p->conf.debug > 10) {
-- log_error_write(srv, __FILE__, __LINE__, "soSosOsb",
-- "sending", weHave, "bytes from (",
-- req_c->offset, "/", req_c->file.length, ")",
-- req_c->file.name);
-- }
--
-- force_assert(weHave != 0);
--
-- chunkqueue_append_file(hctx->wb, req_c->file.name, req_c->offset, weHave);
--
-- req_c->offset += weHave;
-- req_cq->bytes_out += weHave;
-- written += weHave;
--
-- hctx->wb->bytes_in += weHave;
--
-- /* steal the tempfile
-- *
-- * This is tricky:
-- * - we reference the tempfile from the request-content-queue several times
-- * if the req_c is larger than FCGI_MAX_LENGTH
-- * - we can't simply cleanup the request-content-queue as soon as possible
-- * as it would remove the tempfiles
-- * - the idea is to 'steal' the tempfiles and attach the is_temp flag to the last
-- * referencing chunk of the fastcgi-write-queue
-- *
-- * */
--
-- if (req_c->offset == req_c->file.length) {
-- chunk *c;
--
-- if (p->conf.debug > 10) {
-- log_error_write(srv, __FILE__, __LINE__, "s", "next chunk");
-- }
-- c = hctx->wb->last;
--
-- force_assert(c->type == FILE_CHUNK);
-- force_assert(req_c->file.is_temp == 1);
--
-- c->file.is_temp = 1;
-- req_c->file.is_temp = 0;
--
-- chunkqueue_remove_finished_chunks(req_cq);
--
-- req_c = req_cq->first;
-- }
--
-- break;
-- case MEM_CHUNK:
-- /* append to the buffer */
-- weHave = req_c->mem->used - 1 - req_c->offset;
--
-- if (weHave > weWant - written) weHave = weWant - written;
--
-- buffer_append_memory(b, req_c->mem->ptr + req_c->offset, weHave);
-+ chunkqueue_steal(hctx->wb, req_cq, weWant);
-
-- req_c->offset += weHave;
-- req_cq->bytes_out += weHave;
-- written += weHave;
--
-- hctx->wb->bytes_in += weHave;
--
-- if (req_c->offset == (off_t) req_c->mem->used - 1) {
-- chunkqueue_remove_finished_chunks(req_cq);
--
-- req_c = req_cq->first;
-- }
--
-- break;
-- default:
-- break;
-- }
-- }
--
-- b->used++; /* add virtual \0 */
- offset += weWant;
- }
- }
-
-- b = chunkqueue_get_append_buffer(hctx->wb);
- /* terminate STDIN */
- fcgi_header(&(header), FCGI_STDIN, request_id, 0, 0);
-- buffer_copy_memory(b, (const char *)&header, sizeof(header));
-- b->used++; /* add virtual \0 */
-+ chunkqueue_append_mem(hctx->wb, (const char *)&header, sizeof(header));
-
- hctx->wb->bytes_in += sizeof(header);
-
-@@ -2201,7 +2108,7 @@ static int fcgi_response_parse(server *srv, connection *con, plugin_data *p, buf
-
- UNUSED(srv);
-
-- buffer_copy_string_buffer(p->parse_response, in);
-+ buffer_copy_buffer(p->parse_response, in);
-
- /* search for \n */
- for (s = p->parse_response->ptr; NULL != (ns = strchr(s, '\n')); s = ns + 1) {
-@@ -2381,7 +2288,7 @@ range_success: ;
- }
-
- buffer_copy_string_len(dcls->key, "Content-Length", sizeof("Content-Length")-1);
-- buffer_copy_off_t(dcls->value, sendfile2_content_length);
-+ buffer_copy_int(dcls->value, sendfile2_content_length);
- dcls = (data_string*) array_replace(con->response.headers, (data_unset *)dcls);
- if (dcls) dcls->free((data_unset*)dcls);
-
-@@ -2599,17 +2506,17 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- */
-
- if (hctx->response_header->used == 0) {
-- buffer_copy_string_buffer(hctx->response_header, packet.b);
-+ buffer_copy_buffer(hctx->response_header, packet.b);
- } else {
- buffer_append_string_buffer(hctx->response_header, packet.b);
- }
-
- if (NULL != (c = buffer_search_string_len(hctx->response_header, CONST_STR_LEN("\r\n\r\n")))) {
-- blen = hctx->response_header->used - (c - hctx->response_header->ptr) - 4;
-+ blen = hctx->response_header->used - (c - hctx->response_header->ptr) - 4 - 1;
- hctx->response_header->used = (c - hctx->response_header->ptr) + 3;
- c += 4; /* point the the start of the response */
- } else if (NULL != (c = buffer_search_string_len(hctx->response_header, CONST_STR_LEN("\n\n")))) {
-- blen = hctx->response_header->used - (c - hctx->response_header->ptr) - 2;
-+ blen = hctx->response_header->used - (c - hctx->response_header->ptr) - 2 - 1;
- hctx->response_header->used = c - hctx->response_header->ptr + 2;
- c += 2; /* point the the start of the response */
- } else {
-@@ -2650,7 +2557,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- joblist_append(srv, con);
-
- buffer_copy_string_len(dcls->key, "Content-Length", sizeof("Content-Length")-1);
-- buffer_copy_off_t(dcls->value, sce->st.st_size);
-+ buffer_copy_int(dcls->value, sce->st.st_size);
- dcls = (data_string*) array_replace(con->response.headers, (data_unset *)dcls);
- if (dcls) dcls->free((data_unset*)dcls);
-
-@@ -2668,7 +2575,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- }
-
-
-- if (hctx->send_content_body && blen > 1) {
-+ if (hctx->send_content_body && blen > 0) {
- /* enable chunked-transfer-encoding */
- if (con->request.http_version == HTTP_VERSION_1_1 &&
- !(con->parsed_response & HTTP_CONTENT_LENGTH)) {
-@@ -2685,7 +2592,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- con->response.transfer_encoding = HTTP_TRANSFER_ENCODING_CHUNKED;
- }
-
-- http_chunk_append_mem(srv, con, packet.b->ptr, packet.b->used);
-+ http_chunk_append_buffer(srv, con, packet.b);
- joblist_append(srv, con);
- }
- break;
-@@ -2703,7 +2610,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- !(con->http_status == 0 ||
- con->http_status == 200)) {
- /* send chunk-end if necessary */
-- http_chunk_append_mem(srv, con, NULL, 0);
-+ http_chunk_close(srv, con);
- joblist_append(srv, con);
- }
-
-@@ -2820,7 +2727,7 @@ static int fcgi_restart_dead_procs(server *srv, plugin_data *p, fcgi_extension_h
- /* local procs get restarted by us,
- * remote ones hopefully by the admin */
-
-- if (!buffer_is_empty(host->bin_path)) {
-+ if (!buffer_string_is_empty(host->bin_path)) {
- /* we still have connections bound to this proc,
- * let them terminate first */
- if (proc->load != 0) break;
-@@ -3264,10 +3171,10 @@ static handler_t fcgi_handle_fdevent(server *srv, void *ctx, int revents) {
- * now to handle authorized request.
- */
-
-- buffer_copy_string_buffer(con->physical.doc_root, host->docroot);
-- buffer_copy_string_buffer(con->physical.basedir, host->docroot);
-+ buffer_copy_buffer(con->physical.doc_root, host->docroot);
-+ buffer_copy_buffer(con->physical.basedir, host->docroot);
-
-- buffer_copy_string_buffer(con->physical.path, host->docroot);
-+ buffer_copy_buffer(con->physical.path, host->docroot);
- buffer_append_string_buffer(con->physical.path, con->uri.path);
- fcgi_connection_close(srv, hctx);
-
-@@ -3486,7 +3393,7 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i
-
- fn = uri_path_handler ? con->uri.path : con->physical.path;
-
-- if (buffer_is_empty(fn)) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(fn)) return HANDLER_GO_ON;
-
- s_len = fn->used - 1;
-
-diff --git a/src/mod_flv_streaming.c b/src/mod_flv_streaming.c
-index 8041507..501f8e8 100644
---- a/src/mod_flv_streaming.c
-+++ b/src/mod_flv_streaming.c
-@@ -191,7 +191,7 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(con->physical.path)) return HANDLER_GO_ON;
-
- mod_flv_streaming_patch_connection(srv, con, p);
-
-@@ -214,7 +214,7 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) {
- * otherwise send the full file */
-
- array_reset(p->get_params);
-- buffer_copy_string_buffer(p->query_str, con->uri.query);
-+ buffer_copy_buffer(p->query_str, con->uri.query);
- split_get_params(p->get_params, p->query_str);
-
- if (NULL == (get_param = (data_string *)array_get_element(p->get_params, "start"))) {
-diff --git a/src/mod_indexfile.c b/src/mod_indexfile.c
-index b46ead6..fe750c1 100644
---- a/src/mod_indexfile.c
-+++ b/src/mod_indexfile.c
-@@ -158,9 +158,9 @@ URIHANDLER_FUNC(mod_indexfile_subrequest) {
- if (ds->value && ds->value->ptr[0] == '/') {
- /* if the index-file starts with a prefix as use this file as
- * index-generator */
-- buffer_copy_string_buffer(p->tmp_buf, con->physical.doc_root);
-+ buffer_copy_buffer(p->tmp_buf, con->physical.doc_root);
- } else {
-- buffer_copy_string_buffer(p->tmp_buf, con->physical.path);
-+ buffer_copy_buffer(p->tmp_buf, con->physical.path);
- }
- buffer_append_string_buffer(p->tmp_buf, ds->value);
-
-@@ -192,7 +192,7 @@ URIHANDLER_FUNC(mod_indexfile_subrequest) {
-
- /* rewrite uri.path to the real path (/ -> /index.php) */
- buffer_append_string_buffer(con->uri.path, ds->value);
-- buffer_copy_string_buffer(con->physical.path, p->tmp_buf);
-+ buffer_copy_buffer(con->physical.path, p->tmp_buf);
-
- /* fce is already set up a few lines above */
-
-diff --git a/src/mod_magnet.c b/src/mod_magnet.c
-index cfdc976..80cb799 100644
---- a/src/mod_magnet.c
-+++ b/src/mod_magnet.c
-@@ -319,7 +319,7 @@ static int magnet_stat(lua_State *L) {
- lua_setfield(L, -2, "st_ino");
-
-
-- if (!buffer_is_empty(sce->etag)) {
-+ if (!buffer_string_is_empty(sce->etag)) {
- /* we have to mutate the etag */
- buffer *b = buffer_init();
- etag_mutate(b, sce->etag);
-@@ -331,7 +331,7 @@ static int magnet_stat(lua_State *L) {
- }
- lua_setfield(L, -2, "etag");
-
-- if (!buffer_is_empty(sce->content_type)) {
-+ if (!buffer_string_is_empty(sce->content_type)) {
- lua_pushlstring(L, sce->content_type->ptr, sce->content_type->used - 1);
- } else {
- lua_pushnil(L);
-@@ -759,7 +759,7 @@ static int magnet_attach_content(server *srv, connection *con, plugin_data *p, l
- size_t s_len = 0;
- const char *s = lua_tolstring(L, -1, &s_len);
-
-- chunkqueue_append_mem(con->write_queue, s, s_len + 1);
-+ chunkqueue_append_mem(con->write_queue, s, s_len);
- } else if (lua_istable(L, -1)) {
- lua_getfield(L, -1, "filename");
- lua_getfield(L, -2, "length");
-@@ -1066,7 +1066,7 @@ static handler_t magnet_attract_array(server *srv, connection *con, plugin_data
- data_string *ds = (data_string *)files->data[i];
- handler_t ret;
-
-- if (buffer_is_empty(ds->value)) continue;
-+ if (buffer_string_is_empty(ds->value)) continue;
-
- ret = magnet_attract(srv, con, p, ds->value);
-
-diff --git a/src/mod_magnet_cache.c b/src/mod_magnet_cache.c
-index 90c633e..0e9f72f 100644
---- a/src/mod_magnet_cache.c
-+++ b/src/mod_magnet_cache.c
-@@ -104,7 +104,7 @@ lua_State *script_cache_get_script(server *srv, connection *con, script_cache *c
-
- cache->ptr[cache->used++] = sc;
-
-- buffer_copy_string_buffer(sc->name, name);
-+ buffer_copy_buffer(sc->name, name);
-
- sc->L = luaL_newstate();
- luaL_openlibs(sc->L);
-@@ -119,7 +119,7 @@ lua_State *script_cache_get_script(server *srv, connection *con, script_cache *c
- }
-
- if (HANDLER_GO_ON == stat_cache_get_entry(srv, con, sc->name, &sce)) {
-- buffer_copy_string_buffer(sc->etag, sce->etag);
-+ buffer_copy_buffer(sc->etag, sce->etag);
- }
-
- /**
-diff --git a/src/mod_mysql_vhost.c b/src/mod_mysql_vhost.c
-index a02ed2c..8442f76 100644
---- a/src/mod_mysql_vhost.c
-+++ b/src/mod_mysql_vhost.c
-@@ -227,7 +227,7 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
- buffer_copy_string(s->mysql_pre, sel->ptr);
- buffer_copy_string(s->mysql_post, qmark+1);
- } else {
-- buffer_copy_string_buffer(s->mysql_pre, sel);
-+ buffer_copy_buffer(s->mysql_pre, sel);
- }
-
- /* required:
-@@ -242,8 +242,8 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
- */
-
- /* all have to be set */
-- if (!(buffer_is_empty(s->myuser) ||
-- buffer_is_empty(s->mydb))) {
-+ if (!(buffer_string_is_empty(s->myuser) ||
-+ buffer_string_is_empty(s->mydb))) {
- my_bool reconnect = 1;
-
- if (NULL == (s->mysql = mysql_init(NULL))) {
-@@ -349,7 +349,7 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
- buffer_is_equal(c->server_name, con->uri.authority)) goto GO_ON;
-
- /* build and run SQL query */
-- buffer_copy_string_buffer(p->tmp_buf, p->conf.mysql_pre);
-+ buffer_copy_buffer(p->tmp_buf, p->conf.mysql_pre);
- if (p->conf.mysql_post->used) {
- /* escape the uri.authority */
- unsigned long to_len;
-@@ -382,7 +382,7 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
-
- /* sanity check that really is a directory */
- buffer_copy_string(p->tmp_buf, row[0]);
-- BUFFER_APPEND_SLASH(p->tmp_buf);
-+ buffer_append_slash(p->tmp_buf);
-
- if (HANDLER_ERROR == stat_cache_get_entry(srv, con, p->tmp_buf, &sce)) {
- log_error_write(srv, __FILE__, __LINE__, "sb", strerror(errno), p->tmp_buf);
-@@ -394,8 +394,8 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
- }
-
- /* cache the data */
-- buffer_copy_string_buffer(c->server_name, con->uri.authority);
-- buffer_copy_string_buffer(c->document_root, p->tmp_buf);
-+ buffer_copy_buffer(c->server_name, con->uri.authority);
-+ buffer_copy_buffer(c->document_root, p->tmp_buf);
-
- /* fcgi_offset and fcgi_arg are optional */
- if (cols > 1 && row[1]) {
-@@ -416,8 +416,8 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
-
- /* fix virtual server and docroot */
- GO_ON:
-- buffer_copy_string_buffer(con->server_name, c->server_name);
-- buffer_copy_string_buffer(con->physical.doc_root, c->document_root);
-+ buffer_copy_buffer(con->server_name, c->server_name);
-+ buffer_copy_buffer(con->physical.doc_root, c->document_root);
-
- #ifdef DEBUG
- log_error_write(srv, __FILE__, __LINE__, "sbbdb",
-diff --git a/src/mod_proxy.c b/src/mod_proxy.c
-index 957a5a2..3bfc78f 100644
---- a/src/mod_proxy.c
-+++ b/src/mod_proxy.c
-@@ -217,7 +217,7 @@ SETDEFAULTS_FUNC(mod_proxy_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (buffer_is_empty(p->balance_buf)) {
-+ if (buffer_string_is_empty(p->balance_buf)) {
- s->balance = PROXY_BALANCE_FAIR;
- } else if (buffer_is_equal_string(p->balance_buf, CONST_STR_LEN("fair"))) {
- s->balance = PROXY_BALANCE_FAIR;
-@@ -292,7 +292,7 @@ SETDEFAULTS_FUNC(mod_proxy_set_defaults) {
-
- df->port = 80;
-
-- buffer_copy_string_buffer(df->key, da_host->key);
-+ buffer_copy_buffer(df->key, da_host->key);
-
- pcv[0].destination = df->host;
- pcv[1].destination = &(df->port);
-@@ -302,7 +302,7 @@ SETDEFAULTS_FUNC(mod_proxy_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (buffer_is_empty(df->host)) {
-+ if (buffer_string_is_empty(df->host)) {
- log_error_write(srv, __FILE__, __LINE__, "sbbbs",
- "missing key (string):",
- da->key,
-@@ -319,7 +319,7 @@ SETDEFAULTS_FUNC(mod_proxy_set_defaults) {
- if (NULL == (dfa = (data_array *)array_get_element(s->extensions, da_ext->key->ptr))) {
- dfa = data_array_init();
-
-- buffer_copy_string_buffer(dfa->key, da_ext->key);
-+ buffer_copy_buffer(dfa->key, da_ext->key);
-
- array_insert_unique(dfa->value, (data_unset *)df);
- array_insert_unique(s->extensions, (data_unset *)dfa);
-@@ -461,8 +461,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
- proxy_append_header(con, "X-Forwarded-For", (char *)inet_ntop_cache_get_ip(srv, &(con->dst_addr)));
- /* http_host is NOT is just a pointer to a buffer
- * which is NULL if it is not set */
-- if (con->request.http_host &&
-- !buffer_is_empty(con->request.http_host)) {
-+ if (!buffer_string_is_empty(con->request.http_host)) {
- proxy_set_header(con, "X-Host", con->request.http_host->ptr);
- }
- proxy_set_header(con, "X-Forwarded-Proto", con->uri.scheme->ptr);
-@@ -491,55 +490,8 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
-
- if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-- chunk *req_c;
-- off_t offset;
--
-- /* something to send ? */
-- for (offset = 0, req_c = req_cq->first; offset != req_cq->bytes_in; req_c = req_c->next) {
-- off_t weWant = req_cq->bytes_in - offset;
-- off_t weHave = 0;
--
-- /* we announce toWrite octects
-- * now take all the request_content chunk that we need to fill this request
-- * */
--
-- switch (req_c->type) {
-- case FILE_CHUNK:
-- weHave = req_c->file.length - req_c->offset;
--
-- if (weHave > weWant) weHave = weWant;
--
-- chunkqueue_append_file(hctx->wb, req_c->file.name, req_c->offset, weHave);
--
-- req_c->offset += weHave;
-- req_cq->bytes_out += weHave;
--
-- hctx->wb->bytes_in += weHave;
--
-- break;
-- case MEM_CHUNK:
-- /* append to the buffer */
-- weHave = req_c->mem->used - 1 - req_c->offset;
--
-- if (weHave > weWant) weHave = weWant;
--
-- b = chunkqueue_get_append_buffer(hctx->wb);
-- buffer_append_memory(b, req_c->mem->ptr + req_c->offset, weHave);
-- b->used++; /* add virtual \0 */
--
-- req_c->offset += weHave;
-- req_cq->bytes_out += weHave;
--
-- hctx->wb->bytes_in += weHave;
--
-- break;
-- default:
-- break;
-- }
--
-- offset += weHave;
-- }
-
-+ chunkqueue_steal(hctx->wb, req_cq, req_cq->bytes_in);
- }
-
- return 0;
-@@ -561,7 +513,7 @@ static int proxy_response_parse(server *srv, connection *con, plugin_data *p, bu
-
- /* \r\n -> \0\0 */
-
-- buffer_copy_string_buffer(p->parse_response, in);
-+ buffer_copy_buffer(p->parse_response, in);
-
- for (s = p->parse_response->ptr; NULL != (ns = strstr(s, "\r\n")); s = ns + 2) {
- char *key, *value;
-@@ -705,12 +657,12 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
- char *c;
-
- /* search for the \r\n\r\n in the string */
-- if (NULL != (c = buffer_search_string_len(hctx->response, "\r\n\r\n", 4))) {
-+ if (NULL != (c = buffer_search_string_len(hctx->response, CONST_STR_LEN("\r\n\r\n")))) {
- size_t hlen = c - hctx->response->ptr + 4;
- size_t blen = hctx->response->used - hlen - 1;
- /* found */
-
-- buffer_append_string_len(hctx->response_header, hctx->response->ptr, c - hctx->response->ptr + 4);
-+ buffer_append_string_len(hctx->response_header, hctx->response->ptr, hlen);
- #if 0
- log_error_write(srv, __FILE__, __LINE__, "sb", "Header:", hctx->response_header);
- #endif
-@@ -724,14 +676,12 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
- }
-
- con->file_started = 1;
-- if (blen) {
-- http_chunk_append_mem(srv, con, c + 4, blen + 1);
-- }
-+ if (blen > 0) http_chunk_append_mem(srv, con, c + 4, blen);
- hctx->response->used = 0;
- joblist_append(srv, con);
- }
- } else {
-- http_chunk_append_mem(srv, con, hctx->response->ptr, hctx->response->used);
-+ http_chunk_append_buffer(srv, con, hctx->response);
- joblist_append(srv, con);
- hctx->response->used = 0;
- }
-@@ -740,7 +690,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
- /* reading from upstream done */
- con->file_finished = 1;
-
-- http_chunk_append_mem(srv, con, NULL, 0);
-+ http_chunk_close(srv, con);
- joblist_append(srv, con);
-
- fin = 1;
-@@ -976,6 +926,7 @@ static handler_t proxy_handle_fdevent(server *srv, void *ctx, int revents) {
- case 1:
- /* we are done */
- proxy_connection_close(srv, hctx);
-+ log_error_write(srv, __FILE__, __LINE__, "s", "proxy request finished");
-
- joblist_append(srv, con);
- return HANDLER_FINISHED;
-@@ -1092,7 +1043,7 @@ static handler_t proxy_handle_fdevent(server *srv, void *ctx, int revents) {
- }
-
- if (!con->file_finished) {
-- http_chunk_append_mem(srv, con, NULL, 0);
-+ http_chunk_close(srv, con);
- }
-
- con->file_finished = 1;
-diff --git a/src/mod_redirect.c b/src/mod_redirect.c
-index bfc00d7..93cecb7 100644
---- a/src/mod_redirect.c
-+++ b/src/mod_redirect.c
-@@ -183,7 +183,7 @@ static handler_t mod_redirect_uri_handler(server *srv, connection *con, void *p_
-
- mod_redirect_patch_connection(srv, con, p);
-
-- buffer_copy_string_buffer(p->match_buf, con->request.uri);
-+ buffer_copy_buffer(p->match_buf, con->request.uri);
-
- for (i = 0; i < p->conf.redirect->used; i++) {
- pcre *match;
-diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c
-index 381f0ed..48c0987 100644
---- a/src/mod_rewrite.c
-+++ b/src/mod_rewrite.c
-@@ -101,7 +101,7 @@ static int rewrite_rule_buffer_append(rewrite_rule_buffer *kvb, buffer *key, buf
- }
-
- kvb->ptr[kvb->used]->value = buffer_init();
-- buffer_copy_string_buffer(kvb->ptr[kvb->used]->value, value);
-+ buffer_copy_buffer(kvb->ptr[kvb->used]->value, value);
- kvb->ptr[kvb->used]->once = once;
-
- kvb->used++;
-@@ -359,7 +359,7 @@ static int process_rewrite_rules(server *srv, connection *con, plugin_data *p, r
- if (hctx->state == REWRITE_STATE_FINISHED) return HANDLER_GO_ON;
- }
-
-- buffer_copy_string_buffer(p->match_buf, con->request.uri);
-+ buffer_copy_buffer(p->match_buf, con->request.uri);
-
- for (i = 0; i < kvb->used; i++) {
- pcre *match;
-diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c
-index df2a781..4986ea3 100644
---- a/src/mod_rrdtool.c
-+++ b/src/mod_rrdtool.c
-@@ -366,7 +366,7 @@ SETDEFAULTS_FUNC(mod_rrd_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (i > 0 && !buffer_is_empty(s->path_rrdtool_bin)) {
-+ if (i > 0 && !buffer_string_is_empty(s->path_rrdtool_bin)) {
- /* path_rrdtool_bin is a global option */
-
- log_error_write(srv, __FILE__, __LINE__, "s",
-@@ -382,7 +382,7 @@ SETDEFAULTS_FUNC(mod_rrd_set_defaults) {
-
- /* check for dir */
-
-- if (buffer_is_empty(p->conf.path_rrdtool_bin)) {
-+ if (buffer_string_is_empty(p->conf.path_rrdtool_bin)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "rrdtool.binary has to be set");
- return HANDLER_ERROR;
-@@ -409,7 +409,7 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- plugin_config *s = p->config_storage[i];
- int r;
-
-- if (buffer_is_empty(s->path_rrd)) continue;
-+ if (buffer_string_is_empty(s->path_rrd)) continue;
-
- /* write the data down every minute */
-
-@@ -418,11 +418,11 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- buffer_copy_string_len(p->cmd, CONST_STR_LEN("update "));
- buffer_append_string_buffer(p->cmd, s->path_rrd);
- buffer_append_string_len(p->cmd, CONST_STR_LEN(" N:"));
-- buffer_append_off_t(p->cmd, s->bytes_read);
-+ buffer_append_int(p->cmd, s->bytes_read);
- buffer_append_string_len(p->cmd, CONST_STR_LEN(":"));
-- buffer_append_off_t(p->cmd, s->bytes_written);
-+ buffer_append_int(p->cmd, s->bytes_written);
- buffer_append_string_len(p->cmd, CONST_STR_LEN(":"));
-- buffer_append_long(p->cmd, s->requests);
-+ buffer_append_int(p->cmd, s->requests);
- buffer_append_string_len(p->cmd, CONST_STR_LEN("\n"));
-
- if (-1 == (r = safe_write(p->write_fd, p->cmd->ptr, p->cmd->used - 1))) {
-diff --git a/src/mod_scgi.c b/src/mod_scgi.c
-index 1c16c2d..66dce5e 100644
---- a/src/mod_scgi.c
-+++ b/src/mod_scgi.c
-@@ -306,7 +306,6 @@ typedef struct {
-
- int reconnects; /* number of reconnect attempts */
-
-- read_buffer *rb;
- chunkqueue *wb;
-
- buffer *response_header;
-@@ -380,11 +379,6 @@ static void handler_ctx_free(handler_ctx *hctx) {
-
- chunkqueue_free(hctx->wb);
-
-- if (hctx->rb) {
-- if (hctx->rb->ptr) free(hctx->rb->ptr);
-- free(hctx->rb);
-- }
--
- free(hctx);
- }
-
-@@ -497,7 +491,7 @@ static int scgi_extension_insert(scgi_exts *ext, buffer *key, scgi_extension_hos
- fe = calloc(1, sizeof(*fe));
- force_assert(fe);
- fe->key = buffer_init();
-- buffer_copy_string_buffer(fe->key, key);
-+ buffer_copy_buffer(fe->key, key);
-
- /* */
-
-@@ -579,7 +573,7 @@ FREE_FUNC(mod_scgi_free) {
- if (proc->pid != 0) kill(proc->pid, SIGTERM);
-
- if (proc->is_local &&
-- !buffer_is_empty(proc->socket)) {
-+ !buffer_string_is_empty(proc->socket)) {
- unlink(proc->socket->ptr);
- }
- }
-@@ -588,7 +582,7 @@ FREE_FUNC(mod_scgi_free) {
- if (proc->pid != 0) kill(proc->pid, SIGTERM);
-
- if (proc->is_local &&
-- !buffer_is_empty(proc->socket)) {
-+ !buffer_string_is_empty(proc->socket)) {
- unlink(proc->socket->ptr);
- }
- }
-@@ -665,7 +659,7 @@ static int scgi_spawn_connection(server *srv,
- "new proc, socket:", proc->port, proc->socket);
- }
-
-- if (!buffer_is_empty(proc->socket)) {
-+ if (!buffer_string_is_empty(proc->socket)) {
- memset(&scgi_addr, 0, sizeof(scgi_addr));
-
- #ifdef HAVE_SYS_UN_H
-@@ -694,7 +688,7 @@ static int scgi_spawn_connection(server *srv,
- } else {
- scgi_addr_in.sin_family = AF_INET;
-
-- if (buffer_is_empty(host->host)) {
-+ if (buffer_string_is_empty(host->host)) {
- scgi_addr_in.sin_addr.s_addr = htonl(INADDR_ANY);
- } else {
- struct hostent *he;
-@@ -741,7 +735,7 @@ static int scgi_spawn_connection(server *srv,
- pid_t child;
- int val;
-
-- if (!buffer_is_empty(proc->socket)) {
-+ if (!buffer_string_is_empty(proc->socket)) {
- unlink(proc->socket->ptr);
- }
-
-@@ -1066,15 +1060,15 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) {
- goto error;
- }
-
-- if ((!buffer_is_empty(df->host) || df->port) &&
-- !buffer_is_empty(df->unixsocket)) {
-+ if ((!buffer_string_is_empty(df->host) || df->port) &&
-+ !buffer_string_is_empty(df->unixsocket)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "either host+port or socket");
-
- goto error;
- }
-
-- if (!buffer_is_empty(df->unixsocket)) {
-+ if (!buffer_string_is_empty(df->unixsocket)) {
- /* unix domain socket */
- struct sockaddr_un un;
-
-@@ -1086,8 +1080,8 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) {
- } else {
- /* tcp/ip */
-
-- if (buffer_is_empty(df->host) &&
-- buffer_is_empty(df->bin_path)) {
-+ if (buffer_string_is_empty(df->host) &&
-+ buffer_string_is_empty(df->bin_path)) {
- log_error_write(srv, __FILE__, __LINE__, "sbbbs",
- "missing key (string):",
- da->key,
-@@ -1107,7 +1101,7 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) {
- }
- }
-
-- if (!buffer_is_empty(df->bin_path)) {
-+ if (!buffer_string_is_empty(df->bin_path)) {
- /* a local socket + self spawning */
- size_t pno;
-
-@@ -1134,12 +1128,12 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) {
- proc->id = df->num_procs++;
- df->max_id++;
-
-- if (buffer_is_empty(df->unixsocket)) {
-+ if (buffer_string_is_empty(df->unixsocket)) {
- proc->port = df->port + pno;
- } else {
-- buffer_copy_string_buffer(proc->socket, df->unixsocket);
-+ buffer_copy_buffer(proc->socket, df->unixsocket);
- buffer_append_string_len(proc->socket, CONST_STR_LEN("-"));
-- buffer_append_long(proc->socket, pno);
-+ buffer_append_int(proc->socket, pno);
- }
-
- if (s->debug) {
-@@ -1171,10 +1165,10 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) {
- df->active_procs++;
- fp->state = PROC_STATE_RUNNING;
-
-- if (buffer_is_empty(df->unixsocket)) {
-+ if (buffer_string_is_empty(df->unixsocket)) {
- fp->port = df->port;
- } else {
-- buffer_copy_string_buffer(fp->socket, df->unixsocket);
-+ buffer_copy_buffer(fp->socket, df->unixsocket);
- }
-
- df->first = fp;
-@@ -1342,7 +1336,7 @@ static int scgi_establish_connection(server *srv, handler_ctx *hctx) {
-
- memset(&scgi_addr, 0, sizeof(scgi_addr));
-
-- if (!buffer_is_empty(proc->socket)) {
-+ if (!buffer_string_is_empty(proc->socket)) {
- #ifdef HAVE_SYS_UN_H
- /* use the unix domain socket */
- scgi_addr_un.sun_family = AF_UNIX;
-@@ -1471,7 +1465,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat
-
-
- static int scgi_create_env(server *srv, handler_ctx *hctx) {
-- char buf[32];
-+ char buf[LI_ITOSTRING_LENGTH];
- const char *s;
- #ifdef HAVE_IPV6
- char b2[INET6_ADDRSTRLEN + 1];
-@@ -1491,8 +1485,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- /* CGI-SPEC 6.1.2, FastCGI spec 6.3 and SCGI spec */
-
-- /* request.content_length < SSIZE_MAX, see request.c */
-- LI_ltostr(buf, con->request.content_length);
-+ li_itostr(buf, con->request.content_length);
- scgi_env_add(p->scgi_env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf));
- scgi_env_add(p->scgi_env, CONST_STR_LEN("SCGI"), CONST_STR_LEN("1"));
-
-@@ -1530,7 +1523,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- scgi_env_add(p->scgi_env, CONST_STR_LEN("GATEWAY_INTERFACE"), CONST_STR_LEN("CGI/1.1"));
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(srv_sock->addr.plain.sa_family ? srv_sock->addr.ipv6.sin6_port : srv_sock->addr.ipv4.sin_port)
- #else
-@@ -1550,7 +1543,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- }
- scgi_env_add(p->scgi_env, CONST_STR_LEN("SERVER_ADDR"), s, strlen(s));
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(con->dst_addr.plain.sa_family ? con->dst_addr.ipv6.sin6_port : con->dst_addr.ipv4.sin_port)
- #else
-@@ -1571,15 +1564,15 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- scgi_env_add(p->scgi_env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path));
-
-- if (!buffer_is_empty(con->request.pathinfo)) {
-+ if (!buffer_string_is_empty(con->request.pathinfo)) {
- scgi_env_add(p->scgi_env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo));
-
- /* PATH_TRANSLATED is only defined if PATH_INFO is set */
-
-- if (!buffer_is_empty(host->docroot)) {
-- buffer_copy_string_buffer(p->path, host->docroot);
-+ if (!buffer_string_is_empty(host->docroot)) {
-+ buffer_copy_buffer(p->path, host->docroot);
- } else {
-- buffer_copy_string_buffer(p->path, con->physical.basedir);
-+ buffer_copy_buffer(p->path, con->physical.basedir);
- }
- buffer_append_string_buffer(p->path, con->request.pathinfo);
- scgi_env_add(p->scgi_env, CONST_STR_LEN("PATH_TRANSLATED"), CONST_BUF_LEN(p->path));
-@@ -1595,19 +1588,19 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- * parameter.
- */
-
-- if (!buffer_is_empty(host->docroot)) {
-+ if (!buffer_string_is_empty(host->docroot)) {
- /*
- * rewrite SCRIPT_FILENAME
- *
- */
-
-- buffer_copy_string_buffer(p->path, host->docroot);
-+ buffer_copy_buffer(p->path, host->docroot);
- buffer_append_string_buffer(p->path, con->uri.path);
-
- scgi_env_add(p->scgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path));
- scgi_env_add(p->scgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(host->docroot));
- } else {
-- buffer_copy_string_buffer(p->path, con->physical.path);
-+ buffer_copy_buffer(p->path, con->physical.path);
-
- scgi_env_add(p->scgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path));
- scgi_env_add(p->scgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.basedir));
-@@ -1616,7 +1609,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- if (!buffer_is_equal(con->request.uri, con->request.orig_uri)) {
- scgi_env_add(p->scgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri));
- }
-- if (!buffer_is_empty(con->uri.query)) {
-+ if (!buffer_string_is_empty(con->uri.query)) {
- scgi_env_add(p->scgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query));
- } else {
- scgi_env_add(p->scgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_STR_LEN(""));
-@@ -1638,7 +1631,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- b = chunkqueue_get_append_buffer(hctx->wb);
-
-- buffer_append_long(b, p->scgi_env->used);
-+ buffer_append_int(b, p->scgi_env->used);
- buffer_append_string_len(b, CONST_STR_LEN(":"));
- buffer_append_string_len(b, (const char *)p->scgi_env->ptr, p->scgi_env->used);
- buffer_append_string_len(b, CONST_STR_LEN(","));
-@@ -1647,54 +1640,8 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-- chunk *req_c;
-- off_t offset;
--
-- /* something to send ? */
-- for (offset = 0, req_c = req_cq->first; offset != req_cq->bytes_in; req_c = req_c->next) {
-- off_t weWant = req_cq->bytes_in - offset;
-- off_t weHave = 0;
--
-- /* we announce toWrite octects
-- * now take all the request_content chunk that we need to fill this request
-- * */
--
-- switch (req_c->type) {
-- case FILE_CHUNK:
-- weHave = req_c->file.length - req_c->offset;
--
-- if (weHave > weWant) weHave = weWant;
--
-- chunkqueue_append_file(hctx->wb, req_c->file.name, req_c->offset, weHave);
--
-- req_c->offset += weHave;
-- req_cq->bytes_out += weHave;
--
-- hctx->wb->bytes_in += weHave;
--
-- break;
-- case MEM_CHUNK:
-- /* append to the buffer */
-- weHave = req_c->mem->used - 1 - req_c->offset;
-
-- if (weHave > weWant) weHave = weWant;
--
-- b = chunkqueue_get_append_buffer(hctx->wb);
-- buffer_append_memory(b, req_c->mem->ptr + req_c->offset, weHave);
-- b->used++; /* add virtual \0 */
--
-- req_c->offset += weHave;
-- req_cq->bytes_out += weHave;
--
-- hctx->wb->bytes_in += weHave;
--
-- break;
-- default:
-- break;
-- }
--
-- offset += weHave;
-- }
-+ chunkqueue_steal(hctx->wb, req_cq, req_cq->bytes_in);
- }
-
- return 0;
-@@ -1707,7 +1654,7 @@ static int scgi_response_parse(server *srv, connection *con, plugin_data *p, buf
-
- UNUSED(srv);
-
-- buffer_copy_string_buffer(p->parse_response, in);
-+ buffer_copy_buffer(p->parse_response, in);
-
- for (s = p->parse_response->ptr;
- NULL != (ns = (eol == EOL_RN ? strstr(s, "\r\n") : strchr(s, '\n')));
-@@ -1827,7 +1774,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- con->file_finished = 1;
-
- /* send final chunk */
-- http_chunk_append_mem(srv, con, NULL, 0);
-+ http_chunk_close(srv, con);
- joblist_append(srv, con);
-
- return 1;
-@@ -1905,7 +1852,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- con->response.transfer_encoding = HTTP_TRANSFER_ENCODING_CHUNKED;
- }
-
-- http_chunk_append_mem(srv, con, hctx->response_header->ptr, hctx->response_header->used);
-+ http_chunk_append_buffer(srv, con, hctx->response_header);
- joblist_append(srv, con);
- } else {
- size_t blen = hctx->response_header->used - hlen - 1;
-@@ -1924,7 +1871,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- }
-
- if ((hctx->response->used != hlen) && blen > 0) {
-- http_chunk_append_mem(srv, con, hctx->response_header->ptr + hlen, blen + 1);
-+ http_chunk_append_mem(srv, con, hctx->response_header->ptr + hlen, blen);
- joblist_append(srv, con);
- }
- }
-@@ -1932,7 +1879,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- con->file_started = 1;
- }
- } else {
-- http_chunk_append_mem(srv, con, hctx->response->ptr, hctx->response->used);
-+ http_chunk_append_buffer(srv, con, hctx->response);
- joblist_append(srv, con);
- }
-
-@@ -2727,7 +2674,7 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i
-
- fn = uri_path_handler ? con->uri.path : con->physical.path;
-
-- if (buffer_is_empty(fn)) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(fn)) return HANDLER_GO_ON;
-
- s_len = fn->used - 1;
-
-@@ -3007,12 +2954,12 @@ TRIGGER_FUNC(mod_scgi_handle_trigger) {
-
- host->num_procs++;
-
-- if (buffer_is_empty(host->unixsocket)) {
-+ if (buffer_string_is_empty(host->unixsocket)) {
- fp->port = host->port + fp->id;
- } else {
-- buffer_copy_string_buffer(fp->socket, host->unixsocket);
-+ buffer_copy_buffer(fp->socket, host->unixsocket);
- buffer_append_string_len(fp->socket, CONST_STR_LEN("-"));
-- buffer_append_long(fp->socket, fp->id);
-+ buffer_append_int(fp->socket, fp->id);
- }
-
- if (scgi_spawn_connection(srv, p, host, fp)) {
-diff --git a/src/mod_secure_download.c b/src/mod_secure_download.c
-index c32a3ac..d94482e 100644
---- a/src/mod_secure_download.c
-+++ b/src/mod_secure_download.c
-@@ -204,13 +204,13 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
-
- if (buffer_is_empty(p->conf.uri_prefix)) return HANDLER_GO_ON;
-
-- if (buffer_is_empty(p->conf.secret)) {
-+ if (buffer_string_is_empty(p->conf.secret)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "secdownload.secret has to be set");
- return HANDLER_ERROR;
- }
-
-- if (buffer_is_empty(p->conf.doc_root)) {
-+ if (buffer_string_is_empty(p->conf.doc_root)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "secdownload.document-root has to be set");
- return HANDLER_ERROR;
-@@ -233,7 +233,7 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
- if (*(ts_str + 8) != '/') return HANDLER_GO_ON;
-
- for (i = 0; i < 8; i++) {
-- ts = (ts << 4) + hex2int(*(ts_str + i));
-+ ts = (ts << 4) + hex2int(ts_str[i]);
- }
-
- /* timed-out */
-@@ -252,7 +252,7 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
- * <secret><rel-path><timestamp-hex>
- */
-
-- buffer_copy_string_buffer(p->md5, p->conf.secret);
-+ buffer_copy_buffer(p->md5, p->conf.secret);
- buffer_append_string(p->md5, rel_uri);
- buffer_append_string_len(p->md5, ts_str, 8);
- force_assert(p->md5->used > 0);
-@@ -276,10 +276,10 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
- /* starting with the last / we should have relative-path to the docroot
- */
-
-- buffer_copy_string_buffer(con->physical.doc_root, p->conf.doc_root);
-- buffer_copy_string_buffer(con->physical.basedir, p->conf.doc_root);
-+ buffer_copy_buffer(con->physical.doc_root, p->conf.doc_root);
-+ buffer_copy_buffer(con->physical.basedir, p->conf.doc_root);
- buffer_copy_string(con->physical.rel_path, rel_uri);
-- buffer_copy_string_buffer(con->physical.path, con->physical.doc_root);
-+ buffer_copy_buffer(con->physical.path, con->physical.doc_root);
- buffer_append_string_buffer(con->physical.path, con->physical.rel_path);
-
- return HANDLER_GO_ON;
-diff --git a/src/mod_setenv.c b/src/mod_setenv.c
-index ad91609..60e9b55 100644
---- a/src/mod_setenv.c
-+++ b/src/mod_setenv.c
-@@ -185,8 +185,8 @@ URIHANDLER_FUNC(mod_setenv_uri_handler) {
- ds_dst = data_string_init();
- }
-
-- buffer_copy_string_buffer(ds_dst->key, ds->key);
-- buffer_copy_string_buffer(ds_dst->value, ds->value);
-+ buffer_copy_buffer(ds_dst->key, ds->key);
-+ buffer_copy_buffer(ds_dst->value, ds->value);
-
- array_insert_unique(con->request.headers, (data_unset *)ds_dst);
- }
-@@ -199,8 +199,8 @@ URIHANDLER_FUNC(mod_setenv_uri_handler) {
- ds_dst = data_string_init();
- }
-
-- buffer_copy_string_buffer(ds_dst->key, ds->key);
-- buffer_copy_string_buffer(ds_dst->value, ds->value);
-+ buffer_copy_buffer(ds_dst->key, ds->key);
-+ buffer_copy_buffer(ds_dst->value, ds->value);
-
- array_insert_unique(con->environment, (data_unset *)ds_dst);
- }
-diff --git a/src/mod_simple_vhost.c b/src/mod_simple_vhost.c
-index 1240fda..7245fd5 100644
---- a/src/mod_simple_vhost.c
-+++ b/src/mod_simple_vhost.c
-@@ -127,7 +127,7 @@ static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *
- force_assert(p->conf.server_root->used > 1);
-
- buffer_prepare_copy(out, 128);
-- buffer_copy_string_buffer(out, p->conf.server_root);
-+ buffer_copy_buffer(out, p->conf.server_root);
-
- if (host->used) {
- /* a hostname has to start with a alpha-numerical character
-@@ -135,7 +135,7 @@ static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *
- */
- char *dp;
-
-- BUFFER_APPEND_SLASH(out);
-+ buffer_append_slash(out);
-
- if (NULL == (dp = strchr(host->ptr, ':'))) {
- buffer_append_string_buffer(out, host);
-@@ -143,13 +143,13 @@ static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *
- buffer_append_string_len(out, host->ptr, dp - host->ptr);
- }
- }
-- BUFFER_APPEND_SLASH(out);
-+ buffer_append_slash(out);
-
- if (p->conf.document_root->used > 2 && p->conf.document_root->ptr[0] == '/') {
- buffer_append_string_len(out, p->conf.document_root->ptr + 1, p->conf.document_root->used - 2);
- } else {
- buffer_append_string_buffer(out, p->conf.document_root);
-- BUFFER_APPEND_SLASH(out);
-+ buffer_append_slash(out);
- }
-
- if (HANDLER_ERROR == stat_cache_get_entry(srv, con, out, &sce)) {
-@@ -233,8 +233,8 @@ static handler_t mod_simple_vhost_docroot(server *srv, connection *con, void *p_
- con->uri.authority->used &&
- buffer_is_equal(p->conf.docroot_cache_key, con->uri.authority)) {
- /* cache hit */
-- buffer_copy_string_buffer(con->server_name, p->conf.docroot_cache_servername);
-- buffer_copy_string_buffer(con->physical.doc_root, p->conf.docroot_cache_value);
-+ buffer_copy_buffer(con->server_name, p->conf.docroot_cache_servername);
-+ buffer_copy_buffer(con->physical.doc_root, p->conf.docroot_cache_value);
- } else {
- /* build document-root */
- if ((con->uri.authority->used == 0) ||
-@@ -244,21 +244,21 @@ static handler_t mod_simple_vhost_docroot(server *srv, connection *con, void *p_
- p->doc_root,
- p->conf.default_host)) {
- /* default host worked */
-- buffer_copy_string_buffer(con->server_name, p->conf.default_host);
-- buffer_copy_string_buffer(con->physical.doc_root, p->doc_root);
-+ buffer_copy_buffer(con->server_name, p->conf.default_host);
-+ buffer_copy_buffer(con->physical.doc_root, p->doc_root);
- /* do not cache default host */
- }
- return HANDLER_GO_ON;
- }
-
- /* found host */
-- buffer_copy_string_buffer(con->server_name, con->uri.authority);
-- buffer_copy_string_buffer(con->physical.doc_root, p->doc_root);
-+ buffer_copy_buffer(con->server_name, con->uri.authority);
-+ buffer_copy_buffer(con->physical.doc_root, p->doc_root);
-
- /* copy to cache */
-- buffer_copy_string_buffer(p->conf.docroot_cache_key, con->uri.authority);
-- buffer_copy_string_buffer(p->conf.docroot_cache_value, p->doc_root);
-- buffer_copy_string_buffer(p->conf.docroot_cache_servername, con->server_name);
-+ buffer_copy_buffer(p->conf.docroot_cache_key, con->uri.authority);
-+ buffer_copy_buffer(p->conf.docroot_cache_value, p->doc_root);
-+ buffer_copy_buffer(p->conf.docroot_cache_servername, con->server_name);
- }
-
- return HANDLER_GO_ON;
-diff --git a/src/mod_ssi.c b/src/mod_ssi.c
-index 0c1cdba..38eeac5 100644
---- a/src/mod_ssi.c
-+++ b/src/mod_ssi.c
-@@ -236,7 +236,7 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data
- }
-
- static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
-- char buf[32];
-+ char buf[LI_ITOSTRING_LENGTH];
-
- server_socket *srv_sock = con->srv_socket;
-
-@@ -263,7 +263,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
- );
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("GATEWAY_INTERFACE"), "CGI/1.1");
-
-- LI_ltostr(buf,
-+ li_utostr(buf,
- #ifdef HAVE_IPV6
- ntohs(srv_sock->addr.plain.sa_family ? srv_sock->addr.ipv6.sin6_port : srv_sock->addr.ipv4.sin_port)
- #else
-@@ -279,8 +279,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
- if (con->request.content_length > 0) {
- /* CGI-SPEC 6.1.2 and FastCGI spec 6.3 */
-
-- /* request.content_length < SSIZE_MAX, see request.c */
-- LI_ltostr(buf, con->request.content_length);
-+ li_itostr(buf, con->request.content_length);
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("CONTENT_LENGTH"), buf);
- }
-
-@@ -434,12 +433,12 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- b = chunkqueue_get_append_buffer(con->write_queue);
- #ifdef HAVE_PWD_H
- if (NULL == (pw = getpwuid(sce->st.st_uid))) {
-- buffer_copy_long(b, sce->st.st_uid);
-+ buffer_copy_int(b, sce->st.st_uid);
- } else {
- buffer_copy_string(b, pw->pw_name);
- }
- #else
-- buffer_copy_long(b, sce->st.st_uid);
-+ buffer_copy_int(b, sce->st.st_uid);
- #endif
- break;
- }
-@@ -481,7 +480,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
-
- b = chunkqueue_get_append_buffer(con->write_queue);
- if (NULL == (sl = strrchr(con->physical.path->ptr, '/'))) {
-- buffer_copy_string_buffer(b, con->physical.path);
-+ buffer_copy_buffer(b, con->physical.path);
- } else {
- buffer_copy_string(b, sl + 1);
- }
-@@ -489,7 +488,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- }
- case SSI_ECHO_DOCUMENT_URI: {
- b = chunkqueue_get_append_buffer(con->write_queue);
-- buffer_copy_string_buffer(b, con->uri.path);
-+ buffer_copy_buffer(b, con->uri.path);
- break;
- }
- default: {
-@@ -499,7 +498,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- b = chunkqueue_get_append_buffer(con->write_queue);
-
- if (NULL != (ds = (data_string *)array_get_element(p->ssi_cgi_env, var_val))) {
-- buffer_copy_string_buffer(b, ds->value);
-+ buffer_copy_buffer(b, ds->value);
- } else {
- buffer_copy_string_len(b, CONST_STR_LEN("(none)"));
- }
-@@ -575,7 +574,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
-
- /* we have an uri */
-
-- buffer_copy_string_buffer(p->stat_fn, con->physical.doc_root);
-+ buffer_copy_buffer(p->stat_fn, con->physical.doc_root);
- buffer_append_string_buffer(p->stat_fn, srv->tmp_buf);
- }
-
-@@ -593,10 +592,10 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
-
- for (j = 0; s > 1024 && abr[j+1]; s /= 1024, j++);
-
-- buffer_copy_off_t(b, s);
-+ buffer_copy_int(b, s);
- buffer_append_string(b, abr[j]);
- } else {
-- buffer_copy_off_t(b, st.st_size);
-+ buffer_copy_int(b, st.st_size);
- }
- break;
- case SSI_FLASTMOD:
-@@ -783,19 +782,19 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- int toread;
- /* read everything from client and paste it into the output */
- was_interrupted = 0;
--
-+
- while(1) {
- if (ioctl(from_exec_fds[0], FIONREAD, &toread)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "unexpected end-of-file (perhaps the ssi-exec process died)");
- return -1;
- }
--
-+
- if (toread > 0) {
- b = chunkqueue_get_append_buffer(con->write_queue);
--
-- buffer_prepare_copy(b, toread + 1);
--
-+
-+ buffer_prepare_copy(b, toread);
-+
- if ((r = read(from_exec_fds[0], b->ptr, b->size - 1)) < 0) {
- /* read failed */
- break;
-diff --git a/src/mod_ssi_expr.c b/src/mod_ssi_expr.c
-index f839987..140d086 100644
---- a/src/mod_ssi_expr.c
-+++ b/src/mod_ssi_expr.c
-@@ -215,9 +215,9 @@ static int ssi_expr_tokenizer(server *srv, connection *con, plugin_data *p,
- tid = TK_VALUE;
-
- if (NULL != (ds = (data_string *)array_get_element(p->ssi_cgi_env, token->ptr))) {
-- buffer_copy_string_buffer(token, ds->value);
-+ buffer_copy_buffer(token, ds->value);
- } else if (NULL != (ds = (data_string *)array_get_element(p->ssi_vars, token->ptr))) {
-- buffer_copy_string_buffer(token, ds->value);
-+ buffer_copy_buffer(token, ds->value);
- } else {
- buffer_copy_string_len(token, CONST_STR_LEN(""));
- }
-diff --git a/src/mod_staticfile.c b/src/mod_staticfile.c
-index af0718e..931bc57 100644
---- a/src/mod_staticfile.c
-+++ b/src/mod_staticfile.c
-@@ -294,11 +294,11 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
-
- /* write Content-Range */
- buffer_append_string_len(b, CONST_STR_LEN("\r\nContent-Range: bytes "));
-- buffer_append_off_t(b, start);
-+ buffer_append_int(b, start);
- buffer_append_string_len(b, CONST_STR_LEN("-"));
-- buffer_append_off_t(b, end);
-+ buffer_append_int(b, end);
- buffer_append_string_len(b, CONST_STR_LEN("/"));
-- buffer_append_off_t(b, sce->st.st_size);
-+ buffer_append_int(b, sce->st.st_size);
-
- buffer_append_string_len(b, CONST_STR_LEN("\r\nContent-Type: "));
- buffer_append_string_buffer(b, content_type);
-@@ -341,11 +341,11 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
- /* add Content-Range-header */
-
- buffer_copy_string_len(p->range_buf, CONST_STR_LEN("bytes "));
-- buffer_append_off_t(p->range_buf, start);
-+ buffer_append_int(p->range_buf, start);
- buffer_append_string_len(p->range_buf, CONST_STR_LEN("-"));
-- buffer_append_off_t(p->range_buf, end);
-+ buffer_append_int(p->range_buf, end);
- buffer_append_string_len(p->range_buf, CONST_STR_LEN("/"));
-- buffer_append_off_t(p->range_buf, sce->st.st_size);
-+ buffer_append_int(p->range_buf, sce->st.st_size);
-
- response_header_insert(srv, con, CONST_STR_LEN("Content-Range"), CONST_BUF_LEN(p->range_buf));
- }
-@@ -449,7 +449,7 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) {
- /* set response content-type, if not set already */
-
- if (NULL == array_get_element(con->response.headers, "Content-Type")) {
-- if (buffer_is_empty(sce->content_type)) {
-+ if (buffer_string_is_empty(sce->content_type)) {
- /* we are setting application/octet-stream, but also announce that
- * this header field might change in the seconds few requests
- *
-@@ -469,7 +469,7 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) {
- }
-
- if (allow_caching) {
-- if (p->conf.etags_used && con->etag_flags != 0 && !buffer_is_empty(sce->etag)) {
-+ if (p->conf.etags_used && con->etag_flags != 0 && !buffer_string_is_empty(sce->etag)) {
- if (NULL == array_get_element(con->response.headers, "ETag")) {
- /* generate e-tag */
- etag_mutate(con->physical.etag, sce->etag);
-diff --git a/src/mod_status.c b/src/mod_status.c
-index f0d753b..e8da0a8 100644
---- a/src/mod_status.c
-+++ b/src/mod_status.c
-@@ -323,21 +323,21 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
- seconds = ts;
-
- if (days) {
-- buffer_append_long(b, days);
-+ buffer_append_int(b, days);
- buffer_append_string_len(b, CONST_STR_LEN(" days "));
- }
-
- if (hours) {
-- buffer_append_long(b, hours);
-+ buffer_append_int(b, hours);
- buffer_append_string_len(b, CONST_STR_LEN(" hours "));
- }
-
- if (mins) {
-- buffer_append_long(b, mins);
-+ buffer_append_int(b, mins);
- buffer_append_string_len(b, CONST_STR_LEN(" min "));
- }
-
-- buffer_append_long(b, seconds);
-+ buffer_append_int(b, seconds);
- buffer_append_string_len(b, CONST_STR_LEN(" s"));
-
- buffer_append_string_len(b, CONST_STR_LEN("</td></tr>\n"));
-@@ -357,7 +357,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- mod_status_get_multiplier(&avg, &multiplier, 1000);
-
-- buffer_append_long(b, avg);
-+ buffer_append_int(b, avg);
- buffer_append_string_len(b, CONST_STR_LEN(" "));
- if (multiplier) buffer_append_string_len(b, &multiplier, 1);
- buffer_append_string_len(b, CONST_STR_LEN("req</td></tr>\n"));
-@@ -382,7 +382,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- mod_status_get_multiplier(&avg, &multiplier, 1000);
-
-- buffer_append_long(b, avg);
-+ buffer_append_int(b, avg);
- buffer_append_string_len(b, CONST_STR_LEN(" "));
- if (multiplier) buffer_append_string_len(b, &multiplier, 1);
- buffer_append_string_len(b, CONST_STR_LEN("req/s</td></tr>\n"));
-@@ -411,7 +411,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- mod_status_get_multiplier(&avg, &multiplier, 1000);
-
-- buffer_append_long(b, avg);
-+ buffer_append_int(b, avg);
- buffer_append_string_len(b, CONST_STR_LEN(" "));
- if (multiplier) buffer_append_string_len(b, &multiplier, 1);
-
-@@ -444,7 +444,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
- "s = response-start, S = response-end\n"));
-
- buffer_append_string_len(b, CONST_STR_LEN("<b>"));
-- buffer_append_long(b, srv->conns->used);
-+ buffer_append_int(b, srv->conns->used);
- buffer_append_string_len(b, CONST_STR_LEN(" connections</b>\n"));
-
- for (j = 0; j < srv->conns->used; j++) {
-@@ -488,18 +488,18 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"int\">"));
-
- if (c->request.content_length) {
-- buffer_append_long(b, c->request_content_queue->bytes_in);
-+ buffer_append_int(b, c->request_content_queue->bytes_in);
- buffer_append_string_len(b, CONST_STR_LEN("/"));
-- buffer_append_long(b, c->request.content_length);
-+ buffer_append_int(b, c->request.content_length);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("0/0"));
- }
-
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"int\">"));
-
-- buffer_append_off_t(b, chunkqueue_written(c->write_queue));
-+ buffer_append_int(b, c->write_queue->bytes_out);
- buffer_append_string_len(b, CONST_STR_LEN("/"));
-- buffer_append_off_t(b, chunkqueue_length(c->write_queue));
-+ buffer_append_int(b, c->write_queue->bytes_out + chunkqueue_length(c->write_queue));
-
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"string\">"));
-
-@@ -511,11 +511,11 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"int\">"));
-
-- buffer_append_long(b, srv->cur_ts - c->request_start);
-+ buffer_append_int(b, srv->cur_ts - c->request_start);
-
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"string\">"));
-
-- if (buffer_is_empty(c->server_name)) {
-+ if (buffer_string_is_empty(c->server_name)) {
- buffer_append_string_buffer(b, c->uri.authority);
- }
- else {
-@@ -524,16 +524,16 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"string\">"));
-
-- if (!buffer_is_empty(c->uri.path)) {
-+ if (!buffer_string_is_empty(c->uri.path)) {
- buffer_append_string_encoded(b, CONST_BUF_LEN(c->uri.path), ENCODING_HTML);
- }
-
-- if (!buffer_is_empty(c->uri.query)) {
-+ if (!buffer_string_is_empty(c->uri.query)) {
- buffer_append_string_len(b, CONST_STR_LEN("?"));
- buffer_append_string_encoded(b, CONST_BUF_LEN(c->uri.query), ENCODING_HTML);
- }
-
-- if (!buffer_is_empty(c->request.orig_uri)) {
-+ if (!buffer_string_is_empty(c->request.orig_uri)) {
- buffer_append_string_len(b, CONST_STR_LEN(" ("));
- buffer_append_string_encoded(b, CONST_BUF_LEN(c->request.orig_uri), ENCODING_HTML);
- buffer_append_string_len(b, CONST_STR_LEN(")"));
-@@ -589,16 +589,16 @@ static handler_t mod_status_handle_server_status_text(server *srv, connection *c
- /* output uptime */
- buffer_append_string_len(b, CONST_STR_LEN("Uptime: "));
- ts = srv->cur_ts - srv->startup_ts;
-- buffer_append_long(b, ts);
-+ buffer_append_int(b, ts);
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
- /* output busy servers */
- buffer_append_string_len(b, CONST_STR_LEN("BusyServers: "));
-- buffer_append_long(b, srv->conns->used);
-+ buffer_append_int(b, srv->conns->used);
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
- buffer_append_string_len(b, CONST_STR_LEN("IdleServers: "));
-- buffer_append_long(b, srv->conns->size - srv->conns->used);
-+ buffer_append_int(b, srv->conns->size - srv->conns->used);
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
- /* output scoreboard */
-@@ -641,7 +641,7 @@ static handler_t mod_status_handle_server_statistics(server *srv, connection *co
-
- buffer_append_string_buffer(b, st->data[ndx]->key);
- buffer_append_string_len(b, CONST_STR_LEN(": "));
-- buffer_append_long(b, ((data_integer *)(st->data[ndx]))->value);
-+ buffer_append_int(b, ((data_integer *)(st->data[ndx]))->value);
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
- }
-
-@@ -740,7 +740,7 @@ static handler_t mod_status_handle_server_config(server *srv, connection *con, v
- plugin *pl = ps[i];
-
- if (i == 0) {
-- buffer_copy_string_buffer(m, pl->name);
-+ buffer_copy_buffer(m, pl->name);
- } else {
- buffer_append_string_len(m, CONST_STR_LEN("<br />"));
- buffer_append_string_buffer(m, pl->name);
-@@ -809,13 +809,13 @@ static handler_t mod_status_handler(server *srv, connection *con, void *p_d) {
-
- mod_status_patch_connection(srv, con, p);
-
-- if (!buffer_is_empty(p->conf.status_url) &&
-+ if (!buffer_string_is_empty(p->conf.status_url) &&
- buffer_is_equal(p->conf.status_url, con->uri.path)) {
- return mod_status_handle_server_status(srv, con, p_d);
-- } else if (!buffer_is_empty(p->conf.config_url) &&
-+ } else if (!buffer_string_is_empty(p->conf.config_url) &&
- buffer_is_equal(p->conf.config_url, con->uri.path)) {
- return mod_status_handle_server_config(srv, con, p_d);
-- } else if (!buffer_is_empty(p->conf.statistics_url) &&
-+ } else if (!buffer_string_is_empty(p->conf.statistics_url) &&
- buffer_is_equal(p->conf.statistics_url, con->uri.path)) {
- return mod_status_handle_server_statistics(srv, con, p_d);
- }
-diff --git a/src/mod_trigger_b4_dl.c b/src/mod_trigger_b4_dl.c
-index 6d9010d..cff125c 100644
---- a/src/mod_trigger_b4_dl.c
-+++ b/src/mod_trigger_b4_dl.c
-@@ -175,7 +175,7 @@ SETDEFAULTS_FUNC(mod_trigger_b4_dl_set_defaults) {
- return HANDLER_ERROR;
- }
- #if defined(HAVE_GDBM_H)
-- if (!buffer_is_empty(s->db_filename)) {
-+ if (!buffer_string_is_empty(s->db_filename)) {
- if (NULL == (s->db = gdbm_open(s->db_filename->ptr, 4096, GDBM_WRCREAT | GDBM_NOLOCK, S_IRUSR | S_IWUSR, 0))) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "gdbm-open failed");
-@@ -185,7 +185,7 @@ SETDEFAULTS_FUNC(mod_trigger_b4_dl_set_defaults) {
- }
- #endif
- #if defined(HAVE_PCRE_H)
-- if (!buffer_is_empty(s->download_url)) {
-+ if (!buffer_string_is_empty(s->download_url)) {
- if (NULL == (s->download_regex = pcre_compile(s->download_url->ptr,
- 0, &errptr, &erroff, NULL))) {
-
-@@ -196,7 +196,7 @@ SETDEFAULTS_FUNC(mod_trigger_b4_dl_set_defaults) {
- }
- }
-
-- if (!buffer_is_empty(s->trigger_url)) {
-+ if (!buffer_string_is_empty(s->trigger_url)) {
- if (NULL == (s->trigger_regex = pcre_compile(s->trigger_url->ptr,
- 0, &errptr, &erroff, NULL))) {
-
-@@ -384,7 +384,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
- # if defined(HAVE_MEMCACHE_H)
- if (p->conf.mc) {
- size_t i;
-- buffer_copy_string_buffer(p->tmp_buf, p->conf.mc_namespace);
-+ buffer_copy_buffer(p->tmp_buf, p->conf.mc_namespace);
- buffer_append_string(p->tmp_buf, remote_ip);
-
- for (i = 0; i < p->tmp_buf->used - 1; i++) {
-@@ -471,7 +471,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
- void *r;
- size_t i;
-
-- buffer_copy_string_buffer(p->tmp_buf, p->conf.mc_namespace);
-+ buffer_copy_buffer(p->tmp_buf, p->conf.mc_namespace);
- buffer_append_string(p->tmp_buf, remote_ip);
-
- for (i = 0; i < p->tmp_buf->used - 1; i++) {
-diff --git a/src/mod_userdir.c b/src/mod_userdir.c
-index 572b5e7..392f4b2 100644
---- a/src/mod_userdir.c
-+++ b/src/mod_userdir.c
-@@ -209,7 +209,7 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
-
- buffer_copy_string_len(p->username, con->uri.path->ptr + 2, rel_url - (con->uri.path->ptr + 2));
-
-- if (buffer_is_empty(p->conf.basepath)
-+ if (buffer_string_is_empty(p->conf.basepath)
- #ifdef HAVE_PWD_H
- && NULL == (pwd = getpwnam(p->username->ptr))
- #endif
-@@ -245,7 +245,7 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
-
- /* we build the physical path */
-
-- if (buffer_is_empty(p->conf.basepath)) {
-+ if (buffer_string_is_empty(p->conf.basepath)) {
- #ifdef HAVE_PWD_H
- buffer_copy_string(p->temp_path, pwd->pw_dir);
- #endif
-@@ -272,18 +272,18 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
- buffer_to_lower(p->username);
- }
-
-- buffer_copy_string_buffer(p->temp_path, p->conf.basepath);
-- BUFFER_APPEND_SLASH(p->temp_path);
-+ buffer_copy_buffer(p->temp_path, p->conf.basepath);
-+ buffer_append_slash(p->temp_path);
- if (p->conf.letterhomes) {
- buffer_append_string_len(p->temp_path, p->username->ptr, 1);
-- BUFFER_APPEND_SLASH(p->temp_path);
-+ buffer_append_slash(p->temp_path);
- }
- buffer_append_string_buffer(p->temp_path, p->username);
- }
-- BUFFER_APPEND_SLASH(p->temp_path);
-+ buffer_append_slash(p->temp_path);
- buffer_append_string_buffer(p->temp_path, p->conf.path);
-
-- if (buffer_is_empty(p->conf.basepath)) {
-+ if (buffer_string_is_empty(p->conf.basepath)) {
- struct stat st;
- int ret;
-
-@@ -293,7 +293,7 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
- }
- }
-
-- buffer_copy_string_buffer(con->physical.basedir, p->temp_path);
-+ buffer_copy_buffer(con->physical.basedir, p->temp_path);
-
- /* the physical rel_path is basically the same as uri.path;
- * but it is converted to lowercase in case of force_lowercase_filenames and some special handling
-@@ -302,7 +302,7 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
- * (docroot should only set the docroot/server name, phyiscal should only change the phyiscal.path;
- * the exception mod_secure_download doesn't work with userdir anyway)
- */
-- BUFFER_APPEND_SLASH(p->temp_path);
-+ buffer_append_slash(p->temp_path);
- /* if no second '/' is found, we assume that it was stripped from the uri.path for the special handling
- * on windows.
- * we do not care about the trailing slash here on windows, as we already ensured it is a directory
-@@ -313,7 +313,7 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
- if (NULL != (rel_url = strchr(con->physical.rel_path->ptr + 2, '/'))) {
- buffer_append_string(p->temp_path, rel_url + 1); /* skip the / */
- }
-- buffer_copy_string_buffer(con->physical.path, p->temp_path);
-+ buffer_copy_buffer(con->physical.path, p->temp_path);
-
- buffer_reset(p->temp_path);
-
-diff --git a/src/mod_usertrack.c b/src/mod_usertrack.c
-index 4f4f264..29e9fdf 100644
---- a/src/mod_usertrack.c
-+++ b/src/mod_usertrack.c
-@@ -98,7 +98,7 @@ SETDEFAULTS_FUNC(mod_usertrack_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (buffer_is_empty(s->cookie_name)) {
-+ if (buffer_string_is_empty(s->cookie_name)) {
- buffer_copy_string_len(s->cookie_name, CONST_STR_LEN("TRACKID"));
- } else {
- size_t j;
-@@ -114,7 +114,7 @@ SETDEFAULTS_FUNC(mod_usertrack_set_defaults) {
- }
- }
-
-- if (!buffer_is_empty(s->cookie_domain)) {
-+ if (!buffer_string_is_empty(s->cookie_domain)) {
- size_t j;
- for (j = 0; j < s->cookie_domain->used - 1; j++) {
- char c = s->cookie_domain->ptr[j];
-@@ -173,7 +173,7 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
- data_string *ds;
- unsigned char h[16];
- li_MD5_CTX Md5Ctx;
-- char hh[32];
-+ char hh[LI_ITOSTRING_LENGTH];
-
- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-
-@@ -211,7 +211,7 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
- ds = data_response_init();
- }
- buffer_copy_string_len(ds->key, CONST_STR_LEN("Set-Cookie"));
-- buffer_copy_string_buffer(ds->value, p->conf.cookie_name);
-+ buffer_copy_buffer(ds->value, p->conf.cookie_name);
- buffer_append_string_len(ds->value, CONST_STR_LEN("="));
-
-
-@@ -223,10 +223,10 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
- li_MD5_Update(&Md5Ctx, (unsigned char *)"+", 1);
-
- /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */
-- LI_ltostr(hh, srv->cur_ts);
-+ li_itostr(hh, srv->cur_ts);
- li_MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh));
- li_MD5_Update(&Md5Ctx, (unsigned char *)srv->entropy, sizeof(srv->entropy));
-- LI_ltostr(hh, rand());
-+ li_itostr(hh, rand());
- li_MD5_Update(&Md5Ctx, (unsigned char *)hh, strlen(hh));
-
- li_MD5_Final(h, &Md5Ctx);
-@@ -235,14 +235,14 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
- buffer_append_string_len(ds->value, CONST_STR_LEN("; Path=/"));
- buffer_append_string_len(ds->value, CONST_STR_LEN("; Version=1"));
-
-- if (!buffer_is_empty(p->conf.cookie_domain)) {
-+ if (!buffer_string_is_empty(p->conf.cookie_domain)) {
- buffer_append_string_len(ds->value, CONST_STR_LEN("; Domain="));
- buffer_append_string_encoded(ds->value, CONST_BUF_LEN(p->conf.cookie_domain), ENCODING_REL_URI);
- }
-
- if (p->conf.cookie_max_age) {
- buffer_append_string_len(ds->value, CONST_STR_LEN("; max-age="));
-- buffer_append_long(ds->value, p->conf.cookie_max_age);
-+ buffer_append_int(ds->value, p->conf.cookie_max_age);
- }
-
- array_insert_unique(con->response.headers, (data_unset *)ds);
-diff --git a/src/mod_webdav.c b/src/mod_webdav.c
-index 04b2161..a3807c0 100644
---- a/src/mod_webdav.c
-+++ b/src/mod_webdav.c
-@@ -198,7 +198,7 @@ SETDEFAULTS_FUNC(mod_webdav_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (!buffer_is_empty(s->sqlite_db_name)) {
-+ if (!buffer_string_is_empty(s->sqlite_db_name)) {
- #ifdef USE_PROPPATCH
- const char *next_stmt;
- char *err;
-@@ -519,7 +519,7 @@ static int webdav_gen_response_status_tag(server *srv, connection *con, physical
- } else {
- buffer_copy_string_len(b, CONST_STR_LEN("HTTP/1.0 "));
- }
-- buffer_append_long(b, status);
-+ buffer_append_int(b, status);
- buffer_append_string_len(b, CONST_STR_LEN(" "));
- buffer_append_string(b, get_http_status_name(status));
-
-@@ -595,12 +595,12 @@ static int webdav_delete_dir(server *srv, connection *con, plugin_data *p, physi
- /* ignore the parent dir */
- }
-
-- buffer_copy_string_buffer(d.path, dst->path);
-- BUFFER_APPEND_SLASH(d.path);
-+ buffer_copy_buffer(d.path, dst->path);
-+ buffer_append_slash(d.path);
- buffer_append_string(d.path, de->d_name);
-
-- buffer_copy_string_buffer(d.rel_path, dst->rel_path);
-- BUFFER_APPEND_SLASH(d.rel_path);
-+ buffer_copy_buffer(d.rel_path, dst->rel_path);
-+ buffer_append_slash(d.rel_path);
- buffer_append_string(d.rel_path, de->d_name);
-
- /* stat and unlink afterwards */
-@@ -756,20 +756,20 @@ static int webdav_copy_dir(server *srv, connection *con, plugin_data *p, physica
- continue;
- }
-
-- buffer_copy_string_buffer(s.path, src->path);
-- BUFFER_APPEND_SLASH(s.path);
-+ buffer_copy_buffer(s.path, src->path);
-+ buffer_append_slash(s.path);
- buffer_append_string(s.path, de->d_name);
-
-- buffer_copy_string_buffer(d.path, dst->path);
-- BUFFER_APPEND_SLASH(d.path);
-+ buffer_copy_buffer(d.path, dst->path);
-+ buffer_append_slash(d.path);
- buffer_append_string(d.path, de->d_name);
-
-- buffer_copy_string_buffer(s.rel_path, src->rel_path);
-- BUFFER_APPEND_SLASH(s.rel_path);
-+ buffer_copy_buffer(s.rel_path, src->rel_path);
-+ buffer_append_slash(s.rel_path);
- buffer_append_string(s.rel_path, de->d_name);
-
-- buffer_copy_string_buffer(d.rel_path, dst->rel_path);
-- BUFFER_APPEND_SLASH(d.rel_path);
-+ buffer_copy_buffer(d.rel_path, dst->rel_path);
-+ buffer_append_slash(d.rel_path);
- buffer_append_string(d.rel_path, de->d_name);
-
- if (-1 == stat(s.path->ptr, &st)) {
-@@ -877,7 +877,7 @@ static int webdav_get_live_property(server *srv, connection *con, plugin_data *p
- found = 1;
- } else if (0 == strcmp(prop_name, "getcontentlength")) {
- buffer_append_string_len(b,CONST_STR_LEN("<D:getcontentlength>"));
-- buffer_append_off_t(b, sce->st.st_size);
-+ buffer_append_int(b, sce->st.st_size);
- buffer_append_string_len(b, CONST_STR_LEN("</D:getcontentlength>"));
- found = 1;
- } else if (0 == strcmp(prop_name, "getcontentlanguage")) {
-@@ -1062,8 +1062,6 @@ static int webdav_parse_chunkqueue(server *srv, connection *con, plugin_data *p,
- cq->bytes_out += weHave;
-
- break;
-- case UNUSED_CHUNK:
-- break;
- }
- chunkqueue_remove_finished_chunks(cq);
- }
-@@ -1367,7 +1365,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- buffer_append_string_encoded(b, CONST_BUF_LEN(con->uri.path), ENCODING_REL_URI);
- buffer_append_string_len(b,CONST_STR_LEN("</D:href>\n"));
-
-- if (!buffer_is_empty(prop_200)) {
-+ if (!buffer_string_is_empty(prop_200)) {
- buffer_append_string_len(b,CONST_STR_LEN("<D:propstat>\n"));
- buffer_append_string_len(b,CONST_STR_LEN("<D:prop>\n"));
-
-@@ -1379,7 +1377,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- buffer_append_string_len(b,CONST_STR_LEN("</D:propstat>\n"));
- }
-- if (!buffer_is_empty(prop_404)) {
-+ if (!buffer_string_is_empty(prop_404)) {
- buffer_append_string_len(b,CONST_STR_LEN("<D:propstat>\n"));
- buffer_append_string_len(b,CONST_STR_LEN("<D:prop>\n"));
-
-@@ -1410,11 +1408,11 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- /* ignore the parent dir */
- }
-
-- buffer_copy_string_buffer(d.path, dst->path);
-- BUFFER_APPEND_SLASH(d.path);
-+ buffer_copy_buffer(d.path, dst->path);
-+ buffer_append_slash(d.path);
-
-- buffer_copy_string_buffer(d.rel_path, dst->rel_path);
-- BUFFER_APPEND_SLASH(d.rel_path);
-+ buffer_copy_buffer(d.rel_path, dst->rel_path);
-+ buffer_append_slash(d.rel_path);
-
- if (de->d_name[0] == '.' && de->d_name[1] == '\0') {
- /* don't append the . */
-@@ -1436,7 +1434,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- buffer_append_string_encoded(b, CONST_BUF_LEN(d.rel_path), ENCODING_REL_URI);
- buffer_append_string_len(b,CONST_STR_LEN("</D:href>\n"));
-
-- if (!buffer_is_empty(prop_200)) {
-+ if (!buffer_string_is_empty(prop_200)) {
- buffer_append_string_len(b,CONST_STR_LEN("<D:propstat>\n"));
- buffer_append_string_len(b,CONST_STR_LEN("<D:prop>\n"));
-
-@@ -1448,7 +1446,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- buffer_append_string_len(b,CONST_STR_LEN("</D:propstat>\n"));
- }
-- if (!buffer_is_empty(prop_404)) {
-+ if (!buffer_string_is_empty(prop_404)) {
- buffer_append_string_len(b,CONST_STR_LEN("<D:propstat>\n"));
- buffer_append_string_len(b,CONST_STR_LEN("<D:prop>\n"));
-
-@@ -1763,8 +1761,6 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- }
- }
- break;
-- case UNUSED_CHUNK:
-- break;
- }
-
- if (r > 0) {
-@@ -1862,21 +1858,21 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- return HANDLER_FINISHED;
- }
-
-- buffer_copy_string_buffer(p->tmp_buf, p->uri.path_raw);
-+ buffer_copy_buffer(p->tmp_buf, p->uri.path_raw);
- buffer_urldecode_path(p->tmp_buf);
- buffer_path_simplify(p->uri.path, p->tmp_buf);
-
- /* we now have a URI which is clean. transform it into a physical path */
-- buffer_copy_string_buffer(p->physical.doc_root, con->physical.doc_root);
-- buffer_copy_string_buffer(p->physical.rel_path, p->uri.path);
-+ buffer_copy_buffer(p->physical.doc_root, con->physical.doc_root);
-+ buffer_copy_buffer(p->physical.rel_path, p->uri.path);
-
- if (con->conf.force_lowercase_filenames) {
- buffer_to_lower(p->physical.rel_path);
- }
-
-- buffer_copy_string_buffer(p->physical.path, p->physical.doc_root);
-- BUFFER_APPEND_SLASH(p->physical.path);
-- buffer_copy_string_buffer(p->physical.basedir, p->physical.path);
-+ buffer_copy_buffer(p->physical.path, p->physical.doc_root);
-+ buffer_append_slash(p->physical.path);
-+ buffer_copy_buffer(p->physical.basedir, p->physical.path);
-
- /* don't add a second / */
- if (p->physical.rel_path->ptr[0] == '/') {
-diff --git a/src/network.c b/src/network.c
-index 776a86c..f1c9489 100644
---- a/src/network.c
-+++ b/src/network.c
-@@ -187,10 +187,10 @@ static int network_server_init(server *srv, buffer *host_token, specific_config
- srv_socket->fde_ndx = -1;
-
- srv_socket->srv_token = buffer_init();
-- buffer_copy_string_buffer(srv_socket->srv_token, host_token);
-+ buffer_copy_buffer(srv_socket->srv_token, host_token);
-
- b = buffer_init();
-- buffer_copy_string_buffer(b, host_token);
-+ buffer_copy_buffer(b, host_token);
-
- /* ipv4:port
- * [ipv6]:port
-@@ -701,7 +701,7 @@ int network_init(server *srv) {
- long ssloptions =
- SSL_OP_ALL | SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION | SSL_OP_NO_COMPRESSION;
-
-- if (buffer_is_empty(s->ssl_pemfile) && buffer_is_empty(s->ssl_ca_file)) continue;
-+ if (buffer_string_is_empty(s->ssl_pemfile) && buffer_string_is_empty(s->ssl_ca_file)) continue;
-
- if (srv->ssl_is_init == 0) {
- SSL_load_error_strings();
-@@ -716,7 +716,7 @@ int network_init(server *srv) {
- }
- }
-
-- if (!buffer_is_empty(s->ssl_pemfile)) {
-+ if (!buffer_string_is_empty(s->ssl_pemfile)) {
- #ifdef OPENSSL_NO_TLSEXT
- data_config *dc = (data_config *)srv->config_context->data[i];
- if (COMP_HTTP_HOST == dc->comp) {
-@@ -729,7 +729,7 @@ int network_init(server *srv) {
- }
-
-
-- if (!buffer_is_empty(s->ssl_ca_file)) {
-+ if (!buffer_string_is_empty(s->ssl_ca_file)) {
- s->ssl_ca_file_cert_names = SSL_load_client_CA_file(s->ssl_ca_file->ptr);
- if (NULL == s->ssl_ca_file_cert_names) {
- log_error_write(srv, __FILE__, __LINE__, "ssb", "SSL:",
-@@ -737,7 +737,7 @@ int network_init(server *srv) {
- }
- }
-
-- if (buffer_is_empty(s->ssl_pemfile) || !s->ssl_enabled) continue;
-+ if (buffer_string_is_empty(s->ssl_pemfile) || !s->ssl_enabled) continue;
-
- if (NULL == (s->ssl_ctx = SSL_CTX_new(SSLv23_server_method()))) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
-@@ -784,7 +784,7 @@ int network_init(server *srv) {
- }
- }
-
-- if (!buffer_is_empty(s->ssl_cipher_list)) {
-+ if (!buffer_string_is_empty(s->ssl_cipher_list)) {
- /* Disable support for low encryption ciphers */
- if (SSL_CTX_set_cipher_list(s->ssl_ctx, s->ssl_cipher_list->ptr) != 1) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "SSL:",
-@@ -799,7 +799,7 @@ int network_init(server *srv) {
-
- #ifndef OPENSSL_NO_DH
- /* Support for Diffie-Hellman key exchange */
-- if (!buffer_is_empty(s->ssl_dh_file)) {
-+ if (!buffer_string_is_empty(s->ssl_dh_file)) {
- /* DH parameters from file */
- bio = BIO_new_file((char *) s->ssl_dh_file->ptr, "r");
- if (bio == NULL) {
-@@ -832,7 +832,7 @@ int network_init(server *srv) {
- SSL_CTX_set_options(s->ssl_ctx,SSL_OP_SINGLE_DH_USE);
- DH_free(dh);
- #else
-- if (!buffer_is_empty(s->ssl_dh_file)) {
-+ if (!buffer_string_is_empty(s->ssl_dh_file)) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "SSL: openssl compiled without DH support, can't load parameters from", s->ssl_dh_file->ptr);
- }
- #endif
-@@ -840,7 +840,7 @@ int network_init(server *srv) {
- #if OPENSSL_VERSION_NUMBER >= 0x0090800fL
- #ifndef OPENSSL_NO_ECDH
- /* Support for Elliptic-Curve Diffie-Hellman key exchange */
-- if (!buffer_is_empty(s->ssl_ec_curve)) {
-+ if (!buffer_string_is_empty(s->ssl_ec_curve)) {
- /* OpenSSL only supports the "named curves" from RFC 4492, section 5.1.1. */
- nid = OBJ_sn2nid((char *) s->ssl_ec_curve->ptr);
- if (nid == 0) {
-@@ -866,7 +866,7 @@ int network_init(server *srv) {
- for (j = 0; j < srv->config_context->used; j++) {
- specific_config *s1 = srv->config_storage[j];
-
-- if (!buffer_is_empty(s1->ssl_ca_file)) {
-+ if (!buffer_string_is_empty(s1->ssl_ca_file)) {
- if (1 != SSL_CTX_load_verify_locations(s->ssl_ctx, s1->ssl_ca_file->ptr, NULL)) {
- log_error_write(srv, __FILE__, __LINE__, "ssb", "SSL:",
- ERR_error_string(ERR_get_error(), NULL), s1->ssl_ca_file);
-@@ -926,9 +926,9 @@ int network_init(server *srv) {
-
- b = buffer_init();
-
-- buffer_copy_string_buffer(b, srv->srvconf.bindhost);
-+ buffer_copy_buffer(b, srv->srvconf.bindhost);
- buffer_append_string_len(b, CONST_STR_LEN(":"));
-- buffer_append_long(b, srv->srvconf.port);
-+ buffer_append_int(b, srv->srvconf.port);
-
- if (0 != network_server_init(srv, b, srv->config_storage[0])) {
- buffer_free(b);
-@@ -944,7 +944,7 @@ int network_init(server *srv) {
- backend = network_backends[0].nb;
-
- /* match name against known types */
-- if (!buffer_is_empty(srv->srvconf.network_backend)) {
-+ if (!buffer_string_is_empty(srv->srvconf.network_backend)) {
- for (i = 0; network_backends[i].name; i++) {
- /**/
- if (buffer_is_equal_string(srv->srvconf.network_backend, network_backends[i].name, strlen(network_backends[i].name))) {
-diff --git a/src/plugin.c b/src/plugin.c
-index 55f8b03..d587308 100644
---- a/src/plugin.c
-+++ b/src/plugin.c
-@@ -133,7 +133,7 @@ int plugins_load(server *srv) {
- }
- }
-
-- buffer_copy_string_buffer(srv->tmp_buf, srv->srvconf.modules_dir);
-+ buffer_copy_buffer(srv->tmp_buf, srv->srvconf.modules_dir);
-
- buffer_append_string_len(srv->tmp_buf, CONST_STR_LEN("/"));
- buffer_append_string(srv->tmp_buf, modules);
-diff --git a/src/request.c b/src/request.c
-index 2eb0b0e..65d0a0e 100644
---- a/src/request.c
-+++ b/src/request.c
-@@ -322,7 +322,7 @@ int http_request_parse(server *srv, connection *con) {
- buffer_copy_string_len(con->parse_request, con->request.request->ptr + 2, con->request.request->used - 1 - 2);
- } else {
- /* fill the local request buffer */
-- buffer_copy_string_buffer(con->parse_request, con->request.request);
-+ buffer_copy_buffer(con->parse_request, con->request.request);
- }
-
- keep_alive_set = 0;
-@@ -508,7 +508,7 @@ int http_request_parse(server *srv, connection *con) {
- }
- }
-
-- buffer_copy_string_buffer(con->request.orig_uri, con->request.uri);
-+ buffer_copy_buffer(con->request.orig_uri, con->request.uri);
-
- con->http_status = 0;
-
-@@ -1061,7 +1061,7 @@ int http_request_parse(server *srv, connection *con) {
-
- /* RFC 2616, 14.23 */
- if (con->request.http_host == NULL ||
-- buffer_is_empty(con->request.http_host)) {
-+ buffer_string_is_empty(con->request.http_host)) {
- con->http_status = 400;
- con->response.keep_alive = 0;
- con->keep_alive = 0;
-diff --git a/src/response.c b/src/response.c
-index eb5c2f2..bde381f 100644
---- a/src/response.c
-+++ b/src/response.c
-@@ -40,7 +40,7 @@ int http_response_write_header(server *srv, connection *con) {
- } else {
- buffer_copy_string_len(b, CONST_STR_LEN("HTTP/1.0 "));
- }
-- buffer_append_long(b, con->http_status);
-+ buffer_append_int(b, con->http_status);
- buffer_append_string_len(b, CONST_STR_LEN(" "));
- buffer_append_string(b, get_http_status_name(con->http_status));
-
-@@ -181,7 +181,7 @@ static void https_add_ssl_entries(connection *con) {
- buffer_copy_string(ds->key, "REMOTE_USER");
- array_insert_unique(con->environment, (data_unset *)ds);
- }
-- buffer_copy_string_buffer(ds->value, envds->value);
-+ buffer_copy_buffer(ds->value, envds->value);
- }
- array_insert_unique(con->environment, (data_unset *)envds);
- }
-@@ -199,7 +199,7 @@ static void https_add_ssl_entries(connection *con) {
- }
-
- buffer_copy_string_len(envds->key, CONST_STR_LEN("SSL_CLIENT_CERT"));
-- buffer_prepare_copy(envds->value, n+1);
-+ buffer_prepare_copy(envds->value, n);
- BIO_read(bio, envds->value->ptr, n);
- BIO_free(bio);
- envds->value->ptr[n] = '\0';
-@@ -278,7 +278,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
- } else {
- buffer_copy_string_len(con->uri.scheme, CONST_STR_LEN("http"));
- }
-- buffer_copy_string_buffer(con->uri.authority, con->request.http_host);
-+ buffer_copy_buffer(con->uri.authority, con->request.http_host);
- buffer_to_lower(con->uri.authority);
-
- config_patch_connection(srv, con, COMP_HTTP_SCHEME); /* Scheme: */
-@@ -302,7 +302,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
- buffer_copy_string_len(con->uri.path_raw, con->request.uri->ptr, qstr - con->request.uri->ptr);
- } else {
- buffer_reset (con->uri.query);
-- buffer_copy_string_buffer(con->uri.path_raw, con->request.uri);
-+ buffer_copy_buffer(con->uri.path_raw, con->request.uri);
- }
-
- /* decode url to path
-@@ -314,9 +314,9 @@ handler_t http_response_prepare(server *srv, connection *con) {
- if (con->request.http_method == HTTP_METHOD_OPTIONS &&
- con->uri.path_raw->ptr[0] == '*' && con->uri.path_raw->ptr[1] == '\0') {
- /* OPTIONS * ... */
-- buffer_copy_string_buffer(con->uri.path, con->uri.path_raw);
-+ buffer_copy_buffer(con->uri.path, con->uri.path_raw);
- } else {
-- buffer_copy_string_buffer(srv->tmp_buf, con->uri.path_raw);
-+ buffer_copy_buffer(srv->tmp_buf, con->uri.path_raw);
- buffer_urldecode_path(srv->tmp_buf);
- buffer_path_simplify(con->uri.path, srv->tmp_buf);
- }
-@@ -430,8 +430,8 @@ handler_t http_response_prepare(server *srv, connection *con) {
-
- /* set a default */
-
-- buffer_copy_string_buffer(con->physical.doc_root, con->conf.document_root);
-- buffer_copy_string_buffer(con->physical.rel_path, con->uri.path);
-+ buffer_copy_buffer(con->physical.doc_root, con->conf.document_root);
-+ buffer_copy_buffer(con->physical.rel_path, con->uri.path);
-
- #if defined(__WIN32) || defined(__CYGWIN__)
- /* strip dots from the end and spaces
-@@ -500,8 +500,8 @@ handler_t http_response_prepare(server *srv, connection *con) {
- }
-
- /* the docroot plugins might set the servername, if they don't we take http-host */
-- if (buffer_is_empty(con->server_name)) {
-- buffer_copy_string_buffer(con->server_name, con->uri.authority);
-+ if (buffer_string_is_empty(con->server_name)) {
-+ buffer_copy_buffer(con->server_name, con->uri.authority);
- }
-
- /**
-@@ -510,9 +510,9 @@ handler_t http_response_prepare(server *srv, connection *con) {
- *
- */
-
-- buffer_copy_string_buffer(con->physical.basedir, con->physical.doc_root);
-- buffer_copy_string_buffer(con->physical.path, con->physical.doc_root);
-- BUFFER_APPEND_SLASH(con->physical.path);
-+ buffer_copy_buffer(con->physical.basedir, con->physical.doc_root);
-+ buffer_copy_buffer(con->physical.path, con->physical.doc_root);
-+ buffer_append_slash(con->physical.path);
- if (con->physical.rel_path->used &&
- con->physical.rel_path->ptr[0] == '/') {
- buffer_append_string_len(con->physical.path, con->physical.rel_path->ptr + 1, con->physical.rel_path->used - 2);
-@@ -645,13 +645,13 @@ handler_t http_response_prepare(server *srv, connection *con) {
-
- /* not found, perhaps PATHINFO */
-
-- buffer_copy_string_buffer(srv->tmp_buf, con->physical.path);
-+ buffer_copy_buffer(srv->tmp_buf, con->physical.path);
-
- do {
- if (slash) {
- buffer_copy_string_len(con->physical.path, srv->tmp_buf->ptr, slash - srv->tmp_buf->ptr);
- } else {
-- buffer_copy_string_buffer(con->physical.path, srv->tmp_buf);
-+ buffer_copy_buffer(con->physical.path, srv->tmp_buf);
- }
-
- if (HANDLER_ERROR != stat_cache_get_entry(srv, con, con->physical.path, &sce)) {
-diff --git a/src/server.c b/src/server.c
-index d47fd62..71d3538 100644
---- a/src/server.c
-+++ b/src/server.c
-@@ -999,7 +999,7 @@ int main (int argc, char **argv) {
-
- /* write pid file */
- if (pid_fd != -1) {
-- buffer_copy_long(srv->tmp_buf, getpid());
-+ buffer_copy_int(srv->tmp_buf, getpid());
- buffer_append_string_len(srv->tmp_buf, CONST_STR_LEN("\n"));
- force_assert(srv->tmp_buf->used > 0);
- write(pid_fd, srv->tmp_buf->ptr, srv->tmp_buf->used - 1);
-diff --git a/src/stat_cache.c b/src/stat_cache.c
-index 9007325..b5aa9ce 100644
---- a/src/stat_cache.c
-+++ b/src/stat_cache.c
-@@ -221,7 +221,7 @@ static int stat_cache_attr_get(buffer *buf, char *name) {
-
- attrlen = 1024;
- buffer_prepare_copy(buf, attrlen);
-- attrlen--;
-+ attrlen = buf->size - 1;
- if(0 == (ret = attr_get(name, "Content-Type", buf->ptr, &attrlen, 0))) {
- buf->used = attrlen + 1;
- buf->ptr[attrlen] = '\0';
-@@ -234,7 +234,7 @@ static int stat_cache_attr_get(buffer *buf, char *name) {
-
- buffer_prepare_copy(buf, attrlen);
-
-- if (-1 != (attrlen = extattr_get_file(name, EXTATTR_NAMESPACE_USER, "Content-Type", buf->ptr, attrlen-1))) {
-+ if (-1 != (attrlen = extattr_get_file(name, EXTATTR_NAMESPACE_USER, "Content-Type", buf->ptr, buf->size - 1))) {
- buf->used = attrlen + 1;
- buf->ptr[attrlen] = '\0';
- return 0;
-@@ -294,7 +294,7 @@ handler_t stat_cache_handle_fdevent(server *srv, void *_fce, int revent) {
-
- for (j = 0; j < 2; j++) {
- buffer_copy_string(sc->hash_key, fe.filename);
-- buffer_append_long(sc->hash_key, j);
-+ buffer_append_int(sc->hash_key, j);
-
- ndx = hashme(sc->hash_key);
-
-@@ -331,7 +331,7 @@ handler_t stat_cache_handle_fdevent(server *srv, void *_fce, int revent) {
- static int buffer_copy_dirname(buffer *dst, buffer *file) {
- size_t i;
-
-- if (buffer_is_empty(file)) return -1;
-+ if (buffer_string_is_empty(file)) return -1;
-
- for (i = file->used - 1; i+1 > 0; i--) {
- if (file->ptr[i] == '/') {
-@@ -394,8 +394,8 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
-
- sc = srv->stat_cache;
-
-- buffer_copy_string_buffer(sc->hash_key, name);
-- buffer_append_long(sc->hash_key, con->conf.follow_symlink);
-+ buffer_copy_buffer(sc->hash_key, name);
-+ buffer_append_int(sc->hash_key, con->conf.follow_symlink);
-
- file_ndx = hashme(sc->hash_key);
- sc->files = splaytree_splay(sc->files, file_ndx);
-@@ -460,8 +460,8 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- return HANDLER_ERROR;
- }
-
-- buffer_copy_string_buffer(sc->hash_key, sc->dir_name);
-- buffer_append_long(sc->hash_key, con->conf.follow_symlink);
-+ buffer_copy_buffer(sc->hash_key, sc->dir_name);
-+ buffer_append_int(sc->hash_key, con->conf.follow_symlink);
-
- dir_ndx = hashme(sc->hash_key);
-
-@@ -518,7 +518,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- #endif
-
- sce = stat_cache_entry_init();
-- buffer_copy_string_buffer(sce->name, name);
-+ buffer_copy_buffer(sce->name, name);
-
- sc->files = splaytree_insert(sc->files, file_ndx, sce);
- #ifdef DEBUG_STAT_CACHE
-@@ -577,7 +577,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- char *s_cur;
-
- dname = buffer_init();
-- buffer_copy_string_buffer(dname, name);
-+ buffer_copy_buffer(dname, name);
-
- while ((s_cur = strrchr(dname->ptr,'/'))) {
- *s_cur = '\0';
-@@ -615,7 +615,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- }
- #endif
- /* xattr did not set a content-type. ask the config */
-- if (buffer_is_empty(sce->content_type)) {
-+ if (buffer_string_is_empty(sce->content_type)) {
- for (k = 0; k < con->conf.mimetypes->used; k++) {
- data_string *ds = (data_string *)con->conf.mimetypes->data[k];
- buffer *type = ds->key;
-@@ -626,7 +626,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- if (type->used > name->used) continue;
-
- if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) {
-- buffer_copy_string_buffer(sce->content_type, ds->value);
-+ buffer_copy_buffer(sce->content_type, ds->value);
- break;
- }
- }
-@@ -642,7 +642,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- if (!dir_node) {
- fam_dir = fam_dir_entry_init();
-
-- buffer_copy_string_buffer(fam_dir->name, sc->dir_name);
-+ buffer_copy_buffer(fam_dir->name, sc->dir_name);
-
- fam_dir->version = 1;
-
---
-2.4.5
-
diff --git a/main/lighttpd/0016-Remove-chunkqueue_get_-append-prepend-API.patch b/main/lighttpd/0016-Remove-chunkqueue_get_-append-prepend-API.patch
deleted file mode 100644
index 6f265d155b..0000000000
--- a/main/lighttpd/0016-Remove-chunkqueue_get_-append-prepend-API.patch
+++ /dev/null
@@ -1,1537 +0,0 @@
-From 1be163b44a53eebb0a7b0ed562d12e3f252794e1 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:36 +0000
-Subject: [PATCH 16/29] Remove chunkqueue_get_{append,prepend}* API
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
- Although those were "easy" to use, they violated the abstraction:
- content of the chunkqueue should only be modified via the API.
- Replace with chunkqueue_get_memory() and chunkqueue_use_memory() for
- functions that read data from network (reusing large buffers),
- chunkqueue_steal_with_tempfiles() to store request bodies on disk
- temporarily.
- Modules that were generating content and need a buffer maintain the
- buffer manually (have to be careful to free the buffer on errors, as
- it isn't part of the chunkqueue yet).
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2976 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/buffer.c | 23 +++-
- src/buffer.h | 12 ++
- src/chunk.c | 295 +++++++++++++++++++++++++++++++++++++++--------
- src/chunk.h | 39 ++++---
- src/connections.c | 195 +++++--------------------------
- src/mod_compress.c | 4 +-
- src/mod_dirlisting.c | 4 +-
- src/mod_fastcgi.c | 76 +++++-------
- src/mod_flv_streaming.c | 6 +-
- src/mod_proxy.c | 5 +-
- src/mod_scgi.c | 4 +-
- src/mod_ssi.c | 63 +++++-----
- src/mod_staticfile.c | 13 +--
- src/mod_status.c | 42 ++++---
- src/mod_uploadprogress.c | 11 +-
- src/mod_webdav.c | 18 ++-
- src/response.c | 6 +-
- 17 files changed, 465 insertions(+), 351 deletions(-)
-
-diff --git a/src/buffer.c b/src/buffer.c
-index caaa5bb..019abb7 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -139,6 +139,27 @@ char* buffer_prepare_append(buffer *b, size_t size) {
- return b->ptr + b->used - 1;
- }
-
-+char* buffer_string_prepare_copy(buffer *b, size_t size) {
-+ force_assert(NULL != b);
-+
-+ buffer_prepare_copy(b, size);
-+ b->used = 1;
-+
-+ return b->ptr;
-+}
-+
-+char* buffer_string_prepare_append(buffer *b, size_t size) {
-+ force_assert(NULL != b);
-+
-+ if (0 == b->used) {
-+ return buffer_string_prepare_copy(b, size);
-+ } else {
-+ force_assert('\0' == b->ptr[b->used - 1]);
-+ return buffer_prepare_append(b, size);
-+ }
-+}
-+
-+
- void buffer_commit(buffer *b, size_t size)
- {
- force_assert(NULL != b);
-@@ -231,7 +252,7 @@ void buffer_append_long_hex(buffer *b, unsigned long value) {
- } while (0 != copy);
- }
-
-- buf = buffer_prepare_append(b, shift);
-+ buf = buffer_string_prepare_append(b, shift);
- buffer_commit(b, shift); /* will fill below */
-
- shift <<= 2; /* count bits now */
-diff --git a/src/buffer.h b/src/buffer.h
-index ff57d68..5d540a4 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -62,6 +62,11 @@ char* buffer_prepare_copy(buffer *b, size_t size);
- */
- char* buffer_prepare_append(buffer *b, size_t size);
-
-+/* similar to buffer_prepare_copy(b, size), but sets b->used = 1 */
-+char* buffer_string_prepare_copy(buffer *b, size_t size);
-+/* similar to buffer_prepare_append(b, size), but sets b->used = 1 if used was b->0 before */
-+char* buffer_string_prepare_append(buffer *b, size_t size);
-+
- /* use after prepare_(copy,append) when you have written data to the buffer
- * to increase the buffer length by size. also sets the terminating zero.
- * requires enough space is present for the terminating zero (prepare with the
-@@ -136,6 +141,7 @@ int light_isalpha(int c);
- int light_isalnum(int c);
-
- static inline size_t buffer_string_length(const buffer *b); /* buffer string length without terminating 0 */
-+static inline size_t buffer_string_space(const buffer *b); /* maximum length of string that can be stored without reallocating */
- static inline void buffer_append_slash(buffer *b); /* append '/' no non-empty strings not ending in '/' */
-
- #define BUFFER_APPEND_STRING_CONST(x, y) \
-@@ -161,6 +167,12 @@ static inline size_t buffer_string_length(const buffer *b) {
- return NULL != b && 0 != b->used ? b->used - 1 : 0;
- }
-
-+static inline size_t buffer_string_space(const buffer *b) {
-+ if (NULL == b || b->size == 0) return 0;
-+ if (0 == b->used) return b->size - 1;
-+ return b->size - b->used;
-+}
-+
- static inline void buffer_append_slash(buffer *b) {
- size_t len = buffer_string_length(b);
- if (len > 0 && '/' != b->ptr[len-1]) BUFFER_APPEND_STRING_CONST(b, "/");
-diff --git a/src/chunk.c b/src/chunk.c
-index c991b82..83adc15 100644
---- a/src/chunk.c
-+++ b/src/chunk.c
-@@ -5,6 +5,8 @@
- */
-
- #include "chunk.h"
-+#include "base.h"
-+#include "log.h"
-
- #include <sys/types.h>
- #include <sys/stat.h>
-@@ -233,28 +235,84 @@ void chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) {
- chunkqueue_append_chunk(cq, c);
- }
-
--buffer * chunkqueue_get_prepend_buffer(chunkqueue *cq) {
-+void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_size, size_t alloc_size) {
-+ static const size_t REALLOC_MAX_SIZE = 256;
- chunk *c;
-+ buffer *b;
-+ char *dummy_mem;
-+ size_t dummy_len;
-
-- c = chunkqueue_get_unused_chunk(cq);
-+ force_assert(NULL != cq);
-+ if (NULL == mem) mem = &dummy_mem;
-+ if (NULL == len) len = &dummy_len;
-
-- c->type = MEM_CHUNK;
-+ /* default values: */
-+ if (0 == min_size) min_size = 1024;
-+ if (0 == alloc_size) alloc_size = 4096;
-+ if (alloc_size < min_size) alloc_size = min_size;
-
-- chunkqueue_prepend_chunk(cq, c);
-+ if (NULL != cq->last && MEM_CHUNK == cq->last->type) {
-+ size_t have;
-
-- return c->mem;
--}
-+ b = cq->last->mem;
-+ have = buffer_string_space(b);
-
--buffer *chunkqueue_get_append_buffer(chunkqueue *cq) {
-- chunk *c;
-+ /* unused buffer: allocate space */
-+ if (buffer_string_is_empty(b)) {
-+ buffer_string_prepare_copy(b, alloc_size);
-+ have = buffer_string_space(b);
-+ }
-+ /* if buffer is really small just make it bigger */
-+ else if (have < min_size && b->size <= REALLOC_MAX_SIZE) {
-+ size_t new_size = b->used + min_size, append;
-+ if (new_size < alloc_size) new_size = alloc_size;
-+
-+ append = new_size - b->used;
-+ if (append >= min_size) {
-+ buffer_string_prepare_append(b, append);
-+ have = buffer_string_space(b);
-+ }
-+ }
-
-- c = chunkqueue_get_unused_chunk(cq);
-+ /* return pointer into existing buffer if large enough */
-+ if (have >= min_size) {
-+ *mem = b->ptr + buffer_string_length(b);
-+ *len = have;
-+ return;
-+ }
-+ }
-
-+ /* allocate new chunk */
-+ c = chunkqueue_get_unused_chunk(cq);
- c->type = MEM_CHUNK;
--
- chunkqueue_append_chunk(cq, c);
-
-- return c->mem;
-+ b = c->mem;
-+ buffer_string_prepare_append(b, alloc_size);
-+
-+ *mem = b->ptr + buffer_string_length(b);
-+ *len = buffer_string_space(b);
-+}
-+
-+void chunkqueue_use_memory(chunkqueue *cq, size_t len) {
-+ buffer *b;
-+
-+ force_assert(NULL != cq);
-+ force_assert(NULL != cq->last && MEM_CHUNK == cq->last->type);
-+ b = cq->last->mem;
-+
-+ force_assert(b->used > 0);
-+ force_assert(len <= buffer_string_space(b));
-+
-+ if (len > 0) {
-+ b->used += len;
-+ b->ptr[b->used - 1] = '\0';
-+ } else if (buffer_string_is_empty(b)) {
-+ /* unused buffer: can't remove chunk easily from
-+ * end of list, so just reset the buffer
-+ */
-+ buffer_reset(b);
-+ }
- }
-
- void chunkqueue_set_tempdirs(chunkqueue *cq, array *tempdirs) {
-@@ -262,13 +320,67 @@ void chunkqueue_set_tempdirs(chunkqueue *cq, array *tempdirs) {
- cq->tempdirs = tempdirs;
- }
-
--chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
-- chunk *c;
-- buffer *template = buffer_init_string("/var/tmp/lighttpd-upload-XXXXXX");
-+void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len) {
-+ while (len > 0) {
-+ chunk *c = src->first;
-+ off_t clen = 0, use;
-
-- c = chunkqueue_get_unused_chunk(cq);
-+ if (NULL == c) break;
-
-- c->type = FILE_CHUNK;
-+ switch (c->type) {
-+ case MEM_CHUNK:
-+ clen = buffer_string_length(c->mem);
-+ break;
-+ case FILE_CHUNK:
-+ clen = c->file.length;
-+ break;
-+ }
-+ force_assert(clen >= c->offset);
-+ clen -= c->offset;
-+ use = len >= clen ? clen : len;
-+
-+ src->bytes_out += use;
-+ dest->bytes_in += use;
-+ len -= use;
-+
-+ if (0 == clen) {
-+ /* drop empty chunk */
-+ src->first = c->next;
-+ if (c == src->last) src->last = NULL;
-+ chunkqueue_push_unused_chunk(src, c);
-+ continue;
-+ }
-+
-+ if (use == clen) {
-+ /* move complete chunk */
-+ src->first = c->next;
-+ if (c == src->last) src->last = NULL;
-+
-+ chunkqueue_append_chunk(dest, c);
-+ continue;
-+ }
-+
-+ /* partial chunk with length "use" */
-+
-+ switch (c->type) {
-+ case MEM_CHUNK:
-+ chunkqueue_append_mem(dest, c->mem->ptr + c->offset, use);
-+ break;
-+ case FILE_CHUNK:
-+ /* tempfile flag is in "last" chunk after the split */
-+ chunkqueue_append_file(dest, c->file.name, c->file.start + c->offset, use);
-+ break;
-+ }
-+
-+ c->offset += use;
-+ force_assert(0 == len);
-+ }
-+}
-+
-+static chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
-+ chunk *c;
-+ buffer *template = buffer_init_string("/var/tmp/lighttpd-upload-XXXXXX");
-+ int fd;
-
- if (cq->tempdirs && cq->tempdirs->used) {
- size_t i;
-@@ -282,19 +394,21 @@ chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
- buffer_append_slash(template);
- buffer_append_string_len(template, CONST_STR_LEN("lighttpd-upload-XXXXXX"));
-
-- if (-1 != (c->file.fd = mkstemp(template->ptr))) {
-- /* only trigger the unlink if we created the temp-file successfully */
-- c->file.is_temp = 1;
-- break;
-- }
-+ if (-1 != (fd = mkstemp(template->ptr))) break;
- }
- } else {
-- if (-1 != (c->file.fd = mkstemp(template->ptr))) {
-- /* only trigger the unlink if we created the temp-file successfully */
-- c->file.is_temp = 1;
-- }
-+ fd = mkstemp(template->ptr);
- }
-
-+ if (-1 == fd) {
-+ buffer_free(template);
-+ return NULL;
-+ }
-+
-+ c = chunkqueue_get_unused_chunk(cq);
-+ c->type = FILE_CHUNK;
-+ c->file.fd = fd;
-+ c->file.is_temp = 1;
- buffer_copy_buffer(c->file.name, template);
- c->file.length = 0;
-
-@@ -305,10 +419,76 @@ chunk *chunkqueue_get_append_tempfile(chunkqueue *cq) {
- return c;
- }
-
--void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len) {
-+static int chunkqueue_append_to_tempfile(server *srv, chunkqueue *dest, const char *mem, size_t len) {
-+ chunk *dst_c = NULL;
-+ ssize_t written;
-+ /* copy everything to max 1Mb sized tempfiles */
-+
-+ /*
-+ * if the last chunk is
-+ * - smaller than 1Mb (size < 1Mb)
-+ * - not read yet (offset == 0)
-+ * -> append to it
-+ * otherwise
-+ * -> create a new chunk
-+ *
-+ * */
-+
-+ if (NULL != dest->last
-+ && FILE_CHUNK != dest->last->type
-+ && dest->last->file.is_temp
-+ && -1 != dest->last->file.fd
-+ && 0 == dest->last->offset) {
-+ /* ok, take the last chunk for our job */
-+ dst_c = dest->last;
-+
-+ if (dest->last->file.length >= 1 * 1024 * 1024) {
-+ /* the chunk is too large now, close it */
-+ if (-1 != dst_c->file.fd) {
-+ close(dst_c->file.fd);
-+ dst_c->file.fd = -1;
-+ }
-+ dst_c = chunkqueue_get_append_tempfile(dest);
-+ }
-+ } else {
-+ dst_c = chunkqueue_get_append_tempfile(dest);
-+ }
-+
-+ if (NULL == dst_c) {
-+ /* we don't have file to write to,
-+ * EACCES might be one reason.
-+ *
-+ * Instead of sending 500 we send 413 and say the request is too large
-+ */
-+
-+ log_error_write(srv, __FILE__, __LINE__, "sbs",
-+ "denying upload as opening temp-file for upload failed:",
-+ dst_c->file.name, strerror(errno));
-+
-+ return -1;
-+ }
-+
-+ if (0 > (written = write(dst_c->file.fd, mem, len)) || (size_t) written != len) {
-+ /* write failed for some reason ... disk full ? */
-+ log_error_write(srv, __FILE__, __LINE__, "sbs",
-+ "denying upload as writing to file failed:",
-+ dst_c->file.name, strerror(errno));
-+
-+ close(dst_c->file.fd);
-+ dst_c->file.fd = -1;
-+
-+ return -1;
-+ }
-+
-+ dst_c->file.length += len;
-+
-+ return 0;
-+}
-+
-+int chunkqueue_steal_with_tempfiles(server *srv, chunkqueue *dest, chunkqueue *src, off_t len) {
- while (len > 0) {
- chunk *c = src->first;
-- off_t clen = 0;
-+ off_t clen = 0, use;
-
- if (NULL == c) break;
-
-@@ -322,36 +502,57 @@ void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len) {
- }
- force_assert(clen >= c->offset);
- clen -= c->offset;
-+ use = len >= clen ? clen : len;
-
-- if (len >= clen) {
-- /* move complete chunk */
-+ src->bytes_out += use;
-+ dest->bytes_in += use;
-+ len -= use;
-+
-+ if (0 == clen) {
-+ /* drop empty chunk */
- src->first = c->next;
- if (c == src->last) src->last = NULL;
--
-- chunkqueue_append_chunk(dest, c);
-- src->bytes_out += clen;
-- dest->bytes_in += clen;
-- len -= clen;
-+ chunkqueue_push_unused_chunk(src, c);
- continue;
- }
-
-- /* partial chunk with length "len" */
-+ if (FILE_CHUNK == c->type) {
-+ if (use == clen) {
-+ /* move complete chunk */
-+ src->first = c->next;
-+ if (c == src->last) src->last = NULL;
-
-- switch (c->type) {
-- case MEM_CHUNK:
-- chunkqueue_append_mem(dest, c->mem->ptr + c->offset, len);
-- break;
-- case FILE_CHUNK:
-- /* tempfile flag is in "last" chunk after the split */
-- chunkqueue_append_file(dest, c->file.name, c->file.start + c->offset, len);
-- break;
-+ chunkqueue_append_chunk(dest, c);
-+ } else {
-+ /* partial chunk with length "use" */
-+ /* tempfile flag is in "last" chunk after the split */
-+ chunkqueue_append_file(dest, c->file.name, c->file.start + c->offset, use);
-+
-+ c->offset += use;
-+ force_assert(0 == len);
-+ }
-+ continue;
- }
-
-- c->offset += len;
-- src->bytes_out += len;
-- dest->bytes_in += len;
-- len = 0;
-+ /* store "use" bytes from memory chunk in tempfile */
-+ if (0 != chunkqueue_append_to_tempfile(srv, dest, c->mem->ptr + c->offset, use)) {
-+ /* undo counters */
-+ src->bytes_out -= use;
-+ dest->bytes_in -= use;
-+ return -1;
-+ }
-+
-+
-+ c->offset += use;
-+ if (use == clen) {
-+ /* finished chunk */
-+ src->first = c->next;
-+ if (c == src->last) src->last = NULL;
-+ chunkqueue_push_unused_chunk(src, c);
-+ }
- }
-+
-+ return 0;
- }
-
- off_t chunkqueue_length(chunkqueue *cq) {
-diff --git a/src/chunk.h b/src/chunk.h
-index 6559000..33b7e27 100644
---- a/src/chunk.h
-+++ b/src/chunk.h
-@@ -48,24 +48,37 @@ typedef struct {
- } chunkqueue;
-
- chunkqueue *chunkqueue_init(void);
--void chunkqueue_set_tempdirs(chunkqueue *c, array *tempdirs);
--void chunkqueue_append_file(chunkqueue *c, buffer *fn, off_t offset, off_t len); /* copies "fn" */
--void chunkqueue_append_mem(chunkqueue *c, const char *mem, size_t len); /* copies memory */
--void chunkqueue_append_buffer(chunkqueue *c, buffer *mem); /* may reset "mem" */
--void chunkqueue_prepend_buffer(chunkqueue *c, buffer *mem); /* may reset "mem" */
--
--buffer * chunkqueue_get_append_buffer(chunkqueue *c);
--buffer * chunkqueue_get_prepend_buffer(chunkqueue *c);
--chunk * chunkqueue_get_append_tempfile(chunkqueue *cq);
-+void chunkqueue_set_tempdirs(chunkqueue *cq, array *tempdirs);
-+void chunkqueue_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t len); /* copies "fn" */
-+void chunkqueue_append_mem(chunkqueue *cq, const char *mem, size_t len); /* copies memory */
-+void chunkqueue_append_buffer(chunkqueue *cq, buffer *mem); /* may reset "mem" */
-+void chunkqueue_prepend_buffer(chunkqueue *cq, buffer *mem); /* may reset "mem" */
-+
-+/* functions to handle buffers to read into: */
-+/* return a pointer to a buffer in *mem with size *len;
-+ * it should be at least min_size big, and use alloc_size if
-+ * new memory is allocated.
-+ * modifying the chunkqueue invalidates the memory area.
-+ * should always be followed by chunkqueue_get_memory(),
-+ * even if nothing was read.
-+ * pass 0 for min_size/alloc_size for default values
-+ */
-+void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_size, size_t alloc_size);
-+/* append first len bytes of the memory queried with
-+ * chunkqueue_get_memory to the chunkqueue
-+ */
-+void chunkqueue_use_memory(chunkqueue *cq, size_t len);
-
- void chunkqueue_remove_finished_chunks(chunkqueue *cq);
-
- void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len);
-+struct server;
-+int chunkqueue_steal_with_tempfiles(struct server *srv, chunkqueue *dest, chunkqueue *src, off_t len);
-
--off_t chunkqueue_length(chunkqueue *c);
--void chunkqueue_free(chunkqueue *c);
--void chunkqueue_reset(chunkqueue *c);
-+off_t chunkqueue_length(chunkqueue *cq);
-+void chunkqueue_free(chunkqueue *cq);
-+void chunkqueue_reset(chunkqueue *cq);
-
--int chunkqueue_is_empty(chunkqueue *c);
-+int chunkqueue_is_empty(chunkqueue *cq);
-
- #endif
-diff --git a/src/connections.c b/src/connections.c
-index bc770bf..3fab768 100644
---- a/src/connections.c
-+++ b/src/connections.c
-@@ -197,31 +197,22 @@ static void dump_packet(const unsigned char *data, size_t len) {
-
- static int connection_handle_read_ssl(server *srv, connection *con) {
- #ifdef USE_OPENSSL
-- int r, ssl_err, len, count = 0, read_offset, toread;
-- buffer *b = NULL;
-+ int r, ssl_err, len, count = 0;
-+ char *mem = NULL;
-+ size_t mem_len = 0;
-
- if (!con->srv_socket->is_ssl) return -1;
-
- ERR_clear_error();
- do {
-- if (NULL != con->read_queue->last) {
-- b = con->read_queue->last->mem;
-- }
--
-- if (NULL == b || b->size - b->used < 1024) {
-- b = chunkqueue_get_append_buffer(con->read_queue);
-- len = SSL_pending(con->ssl);
-- if (len < 4*1024) len = 4*1024; /* always alloc >= 4k buffer */
-- buffer_prepare_copy(b, len);
--
-- /* overwrite everything with 0 */
-- memset(b->ptr, 0, b->size);
-- }
--
-- read_offset = (b->used > 0) ? b->used - 1 : 0;
-- toread = b->size - 1 - read_offset;
-+ chunkqueue_get_memory(con->read_queue, &mem, &mem_len, 0, SSL_pending(con->ssl));
-+#if 0
-+ /* overwrite everything with 0 */
-+ memset(mem, 0, mem_len);
-+#endif
-
-- len = SSL_read(con->ssl, b->ptr + read_offset, toread);
-+ len = SSL_read(con->ssl, mem, mem_len);
-+ chunkqueue_use_memory(con->read_queue, len > 0 ? len : 0);
-
- if (con->renegotiations > 1 && con->conf.ssl_disable_client_renegotiation) {
- log_error_write(srv, __FILE__, __LINE__, "s", "SSL: renegotiation initiated by client, killing connection");
-@@ -230,15 +221,10 @@ static int connection_handle_read_ssl(server *srv, connection *con) {
- }
-
- if (len > 0) {
-- if (b->used > 0) b->used--;
-- b->used += len;
-- b->ptr[b->used++] = '\0';
--
- con->bytes_read += len;
--
- count += len;
- }
-- } while (len == toread && count < MAX_READ_LIMIT);
-+ } while (len == (ssize_t) mem_len && count < MAX_READ_LIMIT);
-
-
- if (len < 0) {
-@@ -331,44 +317,36 @@ static int connection_handle_read_ssl(server *srv, connection *con) {
- /* 0: everything ok, -1: error, -2: con closed */
- static int connection_handle_read(server *srv, connection *con) {
- int len;
-- buffer *b;
-- int toread, read_offset;
-+ char *mem = NULL;
-+ size_t mem_len = 0;
-+ int toread;
-
- if (con->srv_socket->is_ssl) {
- return connection_handle_read_ssl(srv, con);
- }
-
-- b = (NULL != con->read_queue->last) ? con->read_queue->last->mem : NULL;
--
- /* default size for chunks is 4kb; only use bigger chunks if FIONREAD tells
- * us more than 4kb is available
- * if FIONREAD doesn't signal a big chunk we fill the previous buffer
- * if it has >= 1kb free
- */
- #if defined(__WIN32)
-- if (NULL == b || b->size - b->used < 1024) {
-- b = chunkqueue_get_append_buffer(con->read_queue);
-- buffer_prepare_copy(b, 4 * 1024);
-- }
-+ chunkqueue_get_memory(con->read_queue, &mem, &mem_len, 0, 4096);
-
-- read_offset = (b->used == 0) ? 0 : b->used - 1;
-- len = recv(con->fd, b->ptr + read_offset, b->size - 1 - read_offset, 0);
-+ len = recv(con->fd, mem, mem_len, 0);
- #else
- if (ioctl(con->fd, FIONREAD, &toread) || toread == 0 || toread <= 4*1024) {
-- if (NULL == b || b->size - b->used < 1024) {
-- b = chunkqueue_get_append_buffer(con->read_queue);
-- buffer_prepare_copy(b, 4 * 1024);
-- }
-- } else {
- if (toread > MAX_READ_LIMIT) toread = MAX_READ_LIMIT;
-- b = chunkqueue_get_append_buffer(con->read_queue);
-- buffer_prepare_copy(b, toread);
-+ } else {
-+ toread = 4096;
- }
-+ chunkqueue_get_memory(con->read_queue, &mem, &mem_len, 0, toread);
-
-- read_offset = (b->used == 0) ? 0 : b->used - 1;
-- len = read(con->fd, b->ptr + read_offset, b->size - 1 - read_offset);
-+ len = read(con->fd, mem, mem_len);
- #endif
-
-+ chunkqueue_use_memory(con->read_queue, len > 0 ? len : 0);
-+
- if (len < 0) {
- con->is_readable = 0;
-
-@@ -394,16 +372,12 @@ static int connection_handle_read(server *srv, connection *con) {
- /* pipelining */
-
- return -2;
-- } else if ((size_t)len < b->size - 1) {
-+ } else if (len != (ssize_t) mem_len) {
- /* we got less then expected, wait for the next fd-event */
-
- con->is_readable = 0;
- }
-
-- if (b->used > 0) b->used--;
-- b->used += len;
-- b->ptr[b->used++] = '\0';
--
- con->bytes_read += len;
- #if 0
- dump_packet(b->ptr, len);
-@@ -494,7 +468,7 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- buffer_reset(con->physical.path);
-
- con->file_finished = 1;
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ b = buffer_init();
-
- /* build default error-page */
- buffer_copy_string_len(b, CONST_STR_LEN(
-@@ -522,6 +496,10 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- "</html>\n"
- ));
-
-+ http_chunk_append_buffer(srv, con, b);
-+ buffer_free(b);
-+ http_chunk_close(srv, con);
-+
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html"));
- }
- break;
-@@ -1029,119 +1007,10 @@ found_header_end:
- }
- break;
- case CON_STATE_READ_POST:
-- for (c = cq->first; c && (dst_cq->bytes_in != (off_t)con->request.content_length); c = c->next) {
-- off_t weWant, weHave, toRead;
--
-- weWant = con->request.content_length - dst_cq->bytes_in;
--
-- force_assert(c->mem->used);
--
-- weHave = c->mem->used - c->offset - 1;
--
-- toRead = weHave > weWant ? weWant : weHave;
--
-- /* the new way, copy everything into a chunkqueue whcih might use tempfiles */
-- if (con->request.content_length > 64 * 1024) {
-- chunk *dst_c = NULL;
-- /* copy everything to max 1Mb sized tempfiles */
--
-- /*
-- * if the last chunk is
-- * - smaller than 1Mb (size < 1Mb)
-- * - not read yet (offset == 0)
-- * -> append to it
-- * otherwise
-- * -> create a new chunk
-- *
-- * */
--
-- if (dst_cq->last &&
-- dst_cq->last->type == FILE_CHUNK &&
-- dst_cq->last->file.is_temp &&
-- dst_cq->last->offset == 0) {
-- /* ok, take the last chunk for our job */
--
-- if (dst_cq->last->file.length < 1 * 1024 * 1024) {
-- dst_c = dst_cq->last;
--
-- if (dst_c->file.fd == -1) {
-- /* this should not happen as we cache the fd, but you never know */
-- dst_c->file.fd = open(dst_c->file.name->ptr, O_WRONLY | O_APPEND);
-- fd_close_on_exec(dst_c->file.fd);
-- }
-- } else {
-- /* the chunk is too large now, close it */
-- dst_c = dst_cq->last;
--
-- if (dst_c->file.fd != -1) {
-- close(dst_c->file.fd);
-- dst_c->file.fd = -1;
-- }
-- dst_c = chunkqueue_get_append_tempfile(dst_cq);
-- }
-- } else {
-- dst_c = chunkqueue_get_append_tempfile(dst_cq);
-- }
--
-- /* we have a chunk, let's write to it */
--
-- if (dst_c->file.fd == -1) {
-- /* we don't have file to write to,
-- * EACCES might be one reason.
-- *
-- * Instead of sending 500 we send 413 and say the request is too large
-- * */
--
-- log_error_write(srv, __FILE__, __LINE__, "sbs",
-- "denying upload as opening to temp-file for upload failed:",
-- dst_c->file.name, strerror(errno));
--
-- con->http_status = 413; /* Request-Entity too large */
-- con->keep_alive = 0;
-- connection_set_state(srv, con, CON_STATE_HANDLE_REQUEST);
--
-- break;
-- }
--
-- if (toRead != write(dst_c->file.fd, c->mem->ptr + c->offset, toRead)) {
-- /* write failed for some reason ... disk full ? */
-- log_error_write(srv, __FILE__, __LINE__, "sbs",
-- "denying upload as writing to file failed:",
-- dst_c->file.name, strerror(errno));
--
-- con->http_status = 413; /* Request-Entity too large */
-- con->keep_alive = 0;
-- connection_set_state(srv, con, CON_STATE_HANDLE_REQUEST);
--
-- close(dst_c->file.fd);
-- dst_c->file.fd = -1;
--
-- break;
-- }
--
-- dst_c->file.length += toRead;
--
-- if (dst_cq->bytes_in + toRead == (off_t)con->request.content_length) {
-- /* we read everything, close the chunk */
-- close(dst_c->file.fd);
-- dst_c->file.fd = -1;
-- }
-- } else {
-- buffer *b;
--
-- if (dst_cq->last &&
-- dst_cq->last->type == MEM_CHUNK) {
-- b = dst_cq->last->mem;
-- } else {
-- b = chunkqueue_get_append_buffer(dst_cq);
-- /* prepare buffer size for remaining POST data; is < 64kb */
-- buffer_prepare_copy(b, con->request.content_length - dst_cq->bytes_in);
-- }
-- buffer_append_string_len(b, c->mem->ptr + c->offset, toRead);
-- }
--
-- c->offset += toRead;
-- dst_cq->bytes_in += toRead;
-+ if (0 != chunkqueue_steal_with_tempfiles(srv, dst_cq, cq, con->request.content_length - dst_cq->bytes_in )) {
-+ con->http_status = 413; /* Request-Entity too large */
-+ con->keep_alive = 0;
-+ connection_set_state(srv, con, CON_STATE_HANDLE_REQUEST);
- }
-
- /* Content is ready */
-diff --git a/src/mod_compress.c b/src/mod_compress.c
-index ad6e9f2..b428cd0 100644
---- a/src/mod_compress.c
-+++ b/src/mod_compress.c
-@@ -583,7 +583,6 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p,
- int ifd;
- int ret = -1;
- void *start;
-- buffer *b;
-
- /* overflow */
- if ((off_t)(sce->st.st_size * 1.1) < sce->st.st_size) return -1;
-@@ -651,8 +650,7 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p,
- if (ret != 0) return -1;
-
- chunkqueue_reset(con->write_queue);
-- b = chunkqueue_get_append_buffer(con->write_queue);
-- buffer_copy_string_len(b, p->b->ptr, p->b->used);
-+ chunkqueue_append_mem(con->write_queue, p->b->ptr, p->b->used);
-
- buffer_reset(con->physical.path);
-
-diff --git a/src/mod_dirlisting.c b/src/mod_dirlisting.c
-index 4b7106a..e2e0bfa 100644
---- a/src/mod_dirlisting.c
-+++ b/src/mod_dirlisting.c
-@@ -784,7 +784,7 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
-
- if (files.used) http_dirls_sort(files.ent, files.used);
-
-- out = chunkqueue_get_append_buffer(con->write_queue);
-+ out = buffer_init();
- buffer_copy_string_len(out, CONST_STR_LEN("<?xml version=\"1.0\" encoding=\""));
- if (buffer_string_is_empty(p->conf.encoding)) {
- buffer_append_string_len(out, CONST_STR_LEN("iso-8859-1"));
-@@ -899,6 +899,8 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- }
-
- con->file_finished = 1;
-+ chunkqueue_append_buffer(con->write_queue, out);
-+ buffer_free(out);
-
- return 0;
- }
-diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c
-index 01e72e5..e7b62f6 100644
---- a/src/mod_fastcgi.c
-+++ b/src/mod_fastcgi.c
-@@ -52,13 +52,6 @@
-
- #include "version.h"
-
--#define FCGI_ENV_ADD_CHECK(ret, con) \
-- if (ret == -1) { \
-- con->http_status = 400; \
-- con->file_finished = 1; \
-- return -1; \
-- };
--
- /*
- *
- * TODO:
-@@ -1769,6 +1762,12 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
- return CONNECTION_OK;
- }
-
-+#define FCGI_ENV_ADD_CHECK(ret, con) \
-+ if (ret == -1) { \
-+ con->http_status = 400; \
-+ con->file_finished = 1; \
-+ return -1; \
-+ };
- static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_data *p) {
- size_t i;
-
-@@ -1834,11 +1833,9 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat
- return 0;
- }
-
--
- static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- FCGI_BeginRequestRecord beginRecord;
- FCGI_Header header;
-- buffer *b;
-
- char buf[LI_ITOSTRING_LENGTH];
- const char *s;
-@@ -1863,10 +1860,6 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- beginRecord.body.flags = 0;
- memset(beginRecord.body.reserved, 0, sizeof(beginRecord.body.reserved));
-
-- b = chunkqueue_get_append_buffer(hctx->wb);
--
-- buffer_copy_string_len(b, (const char *)&beginRecord, sizeof(beginRecord));
--
- /* send FCGI_PARAMS */
- buffer_prepare_copy(p->fcgi_env, 1024);
-
-@@ -2054,14 +2047,22 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add_request_headers(srv, con, p), con);
-
-- fcgi_header(&(header), FCGI_PARAMS, request_id, p->fcgi_env->used, 0);
-- buffer_append_string_len(b, (const char *)&header, sizeof(header));
-- buffer_append_string_len(b, (const char *)p->fcgi_env->ptr, p->fcgi_env->used);
-+ {
-+ buffer *b = buffer_init();
-
-- fcgi_header(&(header), FCGI_PARAMS, request_id, 0, 0);
-- buffer_append_string_len(b, (const char *)&header, sizeof(header));
-+ buffer_copy_string_len(b, (const char *)&beginRecord, sizeof(beginRecord));
-
-- hctx->wb->bytes_in += b->used - 1;
-+ fcgi_header(&(header), FCGI_PARAMS, request_id, p->fcgi_env->used, 0);
-+ buffer_append_string_len(b, (const char *)&header, sizeof(header));
-+ buffer_append_string_len(b, (const char *)p->fcgi_env->ptr, p->fcgi_env->used);
-+
-+ fcgi_header(&(header), FCGI_PARAMS, request_id, 0, 0);
-+ buffer_append_string_len(b, (const char *)&header, sizeof(header));
-+
-+ hctx->wb->bytes_in += b->used - 1;
-+ chunkqueue_append_buffer(hctx->wb, b);
-+ buffer_free(b);
-+ }
-
- if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-@@ -2433,38 +2434,21 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- return -1;
- }
-
-- /* init read-buffer */
--
- if (toread > 0) {
-- buffer *b;
-- chunk *cq_first = hctx->rb->first;
-- chunk *cq_last = hctx->rb->last;
--
-- b = chunkqueue_get_append_buffer(hctx->rb);
-- buffer_prepare_copy(b, toread + 1);
--
-- /* append to read-buffer */
-- if (-1 == (r = read(hctx->fd, b->ptr, toread))) {
-- if (errno == EAGAIN) {
-- /* roll back the last chunk allocation,
-- and continue on next iteration */
-- buffer_free(hctx->rb->last->mem);
-- free(hctx->rb->last);
-- hctx->rb->first = cq_first;
-- hctx->rb->last = cq_last;
-- return 0;
-- }
-+ char *mem;
-+ size_t mem_len;
-+
-+ chunkqueue_get_memory(hctx->rb, &mem, &mem_len, 0, toread);
-+ r = read(hctx->fd, mem, mem_len);
-+ chunkqueue_use_memory(hctx->rb, r > 0 ? r : 0);
-+
-+ if (-1 == r) {
-+ if (errno == EAGAIN) return 0;
- log_error_write(srv, __FILE__, __LINE__, "sds",
- "unexpected end-of-file (perhaps the fastcgi process died):",
- fcgi_fd, strerror(errno));
- return -1;
- }
--
-- /* this should be catched by the b > 0 above */
-- force_assert(r);
--
-- b->used = r + 1; /* one extra for the fake \0 */
-- b->ptr[b->used - 1] = '\0';
- } else {
- log_error_write(srv, __FILE__, __LINE__, "ssdsb",
- "unexpected end-of-file (perhaps the fastcgi process died):",
-@@ -2973,8 +2957,8 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
- "fcgi-request is already in use:", hctx->request_id);
- }
-
-- /* fall through */
- if (-1 == fcgi_create_env(srv, hctx, hctx->request_id)) return HANDLER_ERROR;
-+
- fcgi_set_state(srv, hctx, FCGI_STATE_WRITE);
- /* fall through */
- case FCGI_STATE_WRITE:
-diff --git a/src/mod_flv_streaming.c b/src/mod_flv_streaming.c
-index 501f8e8..1c1a356 100644
---- a/src/mod_flv_streaming.c
-+++ b/src/mod_flv_streaming.c
-@@ -207,7 +207,6 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) {
- if (0 == strncmp(con->physical.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) {
- data_string *get_param;
- stat_cache_entry *sce = NULL;
-- buffer *b;
- int start;
- char *err = NULL;
- /* if there is a start=[0-9]+ in the header use it as start,
-@@ -242,10 +241,9 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) {
- }
-
- /* we are safe now, let's build a flv header */
-- b = chunkqueue_get_append_buffer(con->write_queue);
-- buffer_copy_string_len(b, CONST_STR_LEN("FLV\x1\x1\0\0\0\x9\0\0\0\x9"));
--
-+ http_chunk_append_mem(srv, con, CONST_STR_LEN("FLV\x1\x1\0\0\0\x9\0\0\0\x9"));
- http_chunk_append_file(srv, con, con->physical.path, start, sce->st.st_size - start);
-+ http_chunk_close(srv, con);
-
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("video/x-flv"));
-
-diff --git a/src/mod_proxy.c b/src/mod_proxy.c
-index 3bfc78f..2b5a740 100644
---- a/src/mod_proxy.c
-+++ b/src/mod_proxy.c
-@@ -449,7 +449,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
-
- /* build header */
-
-- b = chunkqueue_get_append_buffer(hctx->wb);
-+ b = buffer_init();
-
- /* request line */
- buffer_copy_string(b, get_http_method_name(con->request.http_method));
-@@ -486,6 +486,9 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
- buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
-
- hctx->wb->bytes_in += b->used - 1;
-+ chunkqueue_append_buffer(hctx->wb, b);
-+ buffer_free(b);
-+
- /* body */
-
- if (con->request.content_length) {
-diff --git a/src/mod_scgi.c b/src/mod_scgi.c
-index 66dce5e..2fa265d 100644
---- a/src/mod_scgi.c
-+++ b/src/mod_scgi.c
-@@ -1629,7 +1629,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- scgi_env_add_request_headers(srv, con, p);
-
-- b = chunkqueue_get_append_buffer(hctx->wb);
-+ b = buffer_init();
-
- buffer_append_int(b, p->scgi_env->used);
- buffer_append_string_len(b, CONST_STR_LEN(":"));
-@@ -1637,6 +1637,8 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- buffer_append_string_len(b, CONST_STR_LEN(","));
-
- hctx->wb->bytes_in += b->used - 1;
-+ chunkqueue_append_buffer(hctx->wb, b);
-+ buffer_free(b);
-
- if (con->request.content_length) {
- chunkqueue *req_cq = con->request_content_queue;
-diff --git a/src/mod_ssi.c b/src/mod_ssi.c
-index 38eeac5..ecdfb99 100644
---- a/src/mod_ssi.c
-+++ b/src/mod_ssi.c
-@@ -430,7 +430,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- case SSI_ECHO_USER_NAME: {
- struct passwd *pw;
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ b = buffer_init();
- #ifdef HAVE_PWD_H
- if (NULL == (pw = getpwuid(sce->st.st_uid))) {
- buffer_copy_int(b, sce->st.st_uid);
-@@ -440,67 +440,62 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- #else
- buffer_copy_int(b, sce->st.st_uid);
- #endif
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
- break;
- }
- case SSI_ECHO_LAST_MODIFIED: {
- time_t t = sce->st.st_mtime;
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
- if (0 == strftime(buf, sizeof(buf), p->timefmt->ptr, localtime(&t))) {
-- buffer_copy_string_len(b, CONST_STR_LEN("(none)"));
-+ chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("(none)"));
- } else {
-- buffer_copy_string(b, buf);
-+ chunkqueue_append_mem(con->write_queue, buf, strlen(buf));
- }
- break;
- }
- case SSI_ECHO_DATE_LOCAL: {
- time_t t = time(NULL);
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
- if (0 == strftime(buf, sizeof(buf), p->timefmt->ptr, localtime(&t))) {
-- buffer_copy_string_len(b, CONST_STR_LEN("(none)"));
-+ chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("(none)"));
- } else {
-- buffer_copy_string(b, buf);
-+ chunkqueue_append_mem(con->write_queue, buf, strlen(buf));
- }
- break;
- }
- case SSI_ECHO_DATE_GMT: {
- time_t t = time(NULL);
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
- if (0 == strftime(buf, sizeof(buf), p->timefmt->ptr, gmtime(&t))) {
-- buffer_copy_string_len(b, CONST_STR_LEN("(none)"));
-+ chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("(none)"));
- } else {
-- buffer_copy_string(b, buf);
-+ chunkqueue_append_mem(con->write_queue, buf, strlen(buf));
- }
- break;
- }
- case SSI_ECHO_DOCUMENT_NAME: {
- char *sl;
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
- if (NULL == (sl = strrchr(con->physical.path->ptr, '/'))) {
-- buffer_copy_buffer(b, con->physical.path);
-+ chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->physical.path));
- } else {
-- buffer_copy_string(b, sl + 1);
-+ chunkqueue_append_mem(con->write_queue, sl + 1, strlen(sl + 1));
- }
- break;
- }
- case SSI_ECHO_DOCUMENT_URI: {
-- b = chunkqueue_get_append_buffer(con->write_queue);
-- buffer_copy_buffer(b, con->uri.path);
-+ chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(con->uri.path));
- break;
- }
- default: {
- data_string *ds;
- /* check if it is a cgi-var */
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
--
- if (NULL != (ds = (data_string *)array_get_element(p->ssi_cgi_env, var_val))) {
-- buffer_copy_buffer(b, ds->value);
-+ chunkqueue_append_mem(con->write_queue, CONST_BUF_LEN(ds->value));
- } else {
-- buffer_copy_string_len(b, CONST_STR_LEN("(none)"));
-+ chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("(none)"));
- }
-
- break;
-@@ -583,7 +578,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
-
- switch (ssicmd) {
- case SSI_FSIZE:
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ b = buffer_init();
- if (p->sizefmt) {
- int j = 0;
- const char *abr[] = { " B", " kB", " MB", " GB", " TB", NULL };
-@@ -597,13 +592,14 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- } else {
- buffer_copy_int(b, st.st_size);
- }
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
- break;
- case SSI_FLASTMOD:
-- b = chunkqueue_get_append_buffer(con->write_queue);
- if (0 == strftime(buf, sizeof(buf), p->timefmt->ptr, localtime(&t))) {
-- buffer_copy_string_len(b, CONST_STR_LEN("(none)"));
-+ chunkqueue_append_mem(con->write_queue, CONST_STR_LEN("(none)"));
- } else {
-- buffer_copy_string(b, buf);
-+ chunkqueue_append_mem(con->write_queue, buf, strlen(buf));
- }
- break;
- case SSI_INCLUDE:
-@@ -611,7 +607,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
-
- /* Keep the newest mtime of included files */
- if (st.st_mtime > include_file_last_mtime)
-- include_file_last_mtime = st.st_mtime;
-+ include_file_last_mtime = st.st_mtime;
-
- break;
- }
-@@ -683,7 +679,7 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- case SSI_PRINTENV:
- if (p->if_is_false) break;
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ b = buffer_init();
- for (i = 0; i < p->ssi_vars->used; i++) {
- data_string *ds = (data_string *)p->ssi_vars->data[p->ssi_vars->sorted[i]];
-
-@@ -700,6 +696,8 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- buffer_append_string_encoded(b, CONST_BUF_LEN(ds->value), ENCODING_MINIMAL_XML);
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
- }
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-
- break;
- case SSI_EXEC: {
-@@ -791,17 +789,14 @@ static int process_ssi_stmt(server *srv, connection *con, plugin_data *p, const
- }
-
- if (toread > 0) {
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ char *mem;
-+ size_t mem_len;
-
-- buffer_prepare_copy(b, toread);
-+ chunkqueue_get_memory(con->write_queue, &mem, &mem_len, 0, toread);
-+ r = read(from_exec_fds[0], mem, mem_len);
-+ chunkqueue_use_memory(con->write_queue, r > 0 ? r : 0);
-
-- if ((r = read(from_exec_fds[0], b->ptr, b->size - 1)) < 0) {
-- /* read failed */
-- break;
-- } else {
-- b->used = r;
-- b->ptr[b->used++] = '\0';
-- }
-+ if (r < 0) break; /* read failed */
- } else {
- break;
- }
-diff --git a/src/mod_staticfile.c b/src/mod_staticfile.c
-index 931bc57..e36c697 100644
---- a/src/mod_staticfile.c
-+++ b/src/mod_staticfile.c
-@@ -285,9 +285,7 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
- if (!error) {
- if (multipart) {
- /* write boundary-header */
-- buffer *b;
--
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ buffer *b = buffer_init();
-
- buffer_copy_string_len(b, CONST_STR_LEN("\r\n--"));
- buffer_append_string(b, boundary);
-@@ -307,7 +305,8 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
- buffer_append_string_len(b, CONST_STR_LEN("\r\n\r\n"));
-
- con->response.content_length += b->used - 1;
--
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
- }
-
- chunkqueue_append_file(con->write_queue, con->physical.path, start, end - start + 1);
-@@ -320,15 +319,15 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
-
- if (multipart) {
- /* add boundary end */
-- buffer *b;
--
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ buffer *b = buffer_init();
-
- buffer_copy_string_len(b, "\r\n--", 4);
- buffer_append_string(b, boundary);
- buffer_append_string_len(b, "--\r\n", 4);
-
- con->response.content_length += b->used - 1;
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-
- /* set header-fields */
-
-diff --git a/src/mod_status.c b/src/mod_status.c
-index e8da0a8..99b332a 100644
---- a/src/mod_status.c
-+++ b/src/mod_status.c
-@@ -199,7 +199,7 @@ static int mod_status_get_multiplier(double *avg, char *multiplier, int size) {
-
- static handler_t mod_status_handle_server_status_html(server *srv, connection *con, void *p_d) {
- plugin_data *p = p_d;
-- buffer *b;
-+ buffer *b = buffer_init();
- size_t j;
- double avg;
- char multiplier = '\0';
-@@ -208,8 +208,6 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- int days, hours, mins, seconds;
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
--
- buffer_copy_string_len(b, CONST_STR_LEN(
- "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"
- "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n"
-@@ -555,6 +553,9 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
- "</html>\n"
- ));
-
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html"));
-
- return 0;
-@@ -563,15 +564,13 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- static handler_t mod_status_handle_server_status_text(server *srv, connection *con, void *p_d) {
- plugin_data *p = p_d;
-- buffer *b;
-+ buffer *b = buffer_init();
- double avg;
- time_t ts;
- char buf[32];
- unsigned int k;
- unsigned int l;
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
--
- /* output total number of requests */
- buffer_append_string_len(b, CONST_STR_LEN("Total Accesses: "));
- avg = p->abs_requests;
-@@ -598,13 +597,13 @@ static handler_t mod_status_handle_server_status_text(server *srv, connection *c
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
- buffer_append_string_len(b, CONST_STR_LEN("IdleServers: "));
-- buffer_append_int(b, srv->conns->size - srv->conns->used);
-- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-+ buffer_append_int(b, srv->conns->size - srv->conns->used);
-+ buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
-- /* output scoreboard */
-- buffer_append_string_len(b, CONST_STR_LEN("Scoreboard: "));
-- for (k = 0; k < srv->conns->used; k++) {
-- connection *c = srv->conns->ptr[k];
-+ /* output scoreboard */
-+ buffer_append_string_len(b, CONST_STR_LEN("Scoreboard: "));
-+ for (k = 0; k < srv->conns->used; k++) {
-+ connection *c = srv->conns->ptr[k];
- const char *state = connection_get_short_state(c->state);
- buffer_append_string_len(b, state, 1);
- }
-@@ -613,15 +612,17 @@ static handler_t mod_status_handle_server_status_text(server *srv, connection *c
- }
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
-- /* set text/plain output */
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-
-+ /* set text/plain output */
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/plain"));
-
- return 0;
- }
-
- static handler_t mod_status_handle_server_statistics(server *srv, connection *con, void *p_d) {
-- buffer *b;
-+ buffer *b = buffer_init();
- size_t i;
- array *st = srv->status;
- UNUSED(p_d);
-@@ -634,8 +635,6 @@ static handler_t mod_status_handle_server_statistics(server *srv, connection *co
- return HANDLER_FINISHED;
- }
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
--
- for (i = 0; i < st->used; i++) {
- size_t ndx = st->sorted[i];
-
-@@ -645,6 +644,9 @@ static handler_t mod_status_handle_server_statistics(server *srv, connection *co
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
- }
-
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/plain"));
-
- con->http_status = 200;
-@@ -671,7 +673,8 @@ static handler_t mod_status_handle_server_status(server *srv, connection *con, v
-
- static handler_t mod_status_handle_server_config(server *srv, connection *con, void *p_d) {
- plugin_data *p = p_d;
-- buffer *b, *m = p->module_list;
-+ buffer *b = buffer_init();
-+ buffer *m = p->module_list;
- size_t i;
-
- struct ev_map { fdevent_handler_t et; const char *name; } event_handlers[] =
-@@ -703,8 +706,6 @@ static handler_t mod_status_handle_server_config(server *srv, connection *con, v
- { FDEVENT_HANDLER_UNSET, NULL }
- };
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
--
- buffer_copy_string_len(b, CONST_STR_LEN(
- "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"
- "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n"
-@@ -756,6 +757,9 @@ static handler_t mod_status_handle_server_config(server *srv, connection *con, v
- "</html>\n"
- ));
-
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html"));
-
- con->http_status = 200;
-diff --git a/src/mod_webdav.c b/src/mod_webdav.c
-index a3807c0..433b904 100644
---- a/src/mod_webdav.c
-+++ b/src/mod_webdav.c
-@@ -1094,7 +1094,7 @@ static int webdav_parse_chunkqueue(server *srv, connection *con, plugin_data *p,
- static int webdav_lockdiscovery(server *srv, connection *con,
- buffer *locktoken, const char *lockscope, const char *locktype, int depth) {
-
-- buffer *b;
-+ buffer *b = buffer_init();
-
- response_header_overwrite(srv, con, CONST_STR_LEN("Lock-Token"), CONST_BUF_LEN(locktoken));
-
-@@ -1102,8 +1102,6 @@ static int webdav_lockdiscovery(server *srv, connection *con,
- CONST_STR_LEN("Content-Type"),
- CONST_STR_LEN("text/xml; charset=\"utf-8\""));
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
--
- buffer_copy_string_len(b, CONST_STR_LEN("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
-
- buffer_append_string_len(b,CONST_STR_LEN("<D:prop xmlns:D=\"DAV:\" xmlns:ns0=\"urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/\">\n"));
-@@ -1143,6 +1141,9 @@ static int webdav_lockdiscovery(server *srv, connection *con,
- buffer_append_string_len(b,CONST_STR_LEN("</D:lockdiscovery>\n"));
- buffer_append_string_len(b,CONST_STR_LEN("</D:prop>\n"));
-
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- return 0;
- }
- #endif
-@@ -1341,7 +1342,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/xml; charset=\"utf-8\""));
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ b = buffer_init();
-
- buffer_copy_string_len(b, CONST_STR_LEN("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
-
-@@ -1487,6 +1488,10 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- if (p->conf.log_xml) {
- log_error_write(srv, __FILE__, __LINE__, "sb", "XML-response-body:", b);
- }
-+
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- con->file_finished = 1;
-
- return HANDLER_FINISHED;
-@@ -1555,7 +1560,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- /* we got an error somewhere in between, build a 207 */
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/xml; charset=\"utf-8\""));
-
-- b = chunkqueue_get_append_buffer(con->write_queue);
-+ b = buffer_init();
-
- buffer_copy_string_len(b, CONST_STR_LEN("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
-
-@@ -1569,6 +1574,9 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- log_error_write(srv, __FILE__, __LINE__, "sb", "XML-response-body:", b);
- }
-
-+ chunkqueue_append_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- con->http_status = 207;
- con->file_finished = 1;
- } else {
-diff --git a/src/response.c b/src/response.c
-index bde381f..31bcd69 100644
---- a/src/response.c
-+++ b/src/response.c
-@@ -33,7 +33,7 @@ int http_response_write_header(server *srv, connection *con) {
- int have_date = 0;
- int have_server = 0;
-
-- b = chunkqueue_get_prepend_buffer(con->write_queue);
-+ b = buffer_init();
-
- if (con->request.http_version == HTTP_VERSION_1_1) {
- buffer_copy_string_len(b, CONST_STR_LEN("HTTP/1.1 "));
-@@ -121,13 +121,15 @@ int http_response_write_header(server *srv, connection *con) {
-
- buffer_append_string_len(b, CONST_STR_LEN("\r\n\r\n"));
-
--
- con->bytes_header = b->used - 1;
-
- if (con->conf.log_response_header) {
- log_error_write(srv, __FILE__, __LINE__, "sSb", "Response-Header:", "\n", b);
- }
-
-+ chunkqueue_prepend_buffer(con->write_queue, b);
-+ buffer_free(b);
-+
- return 0;
- }
-
---
-2.4.5
-
diff --git a/main/lighttpd/0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch b/main/lighttpd/0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
deleted file mode 100644
index 97e6d3015b..0000000000
--- a/main/lighttpd/0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
+++ /dev/null
@@ -1,1182 +0,0 @@
-From 4365bdbebe4542efc28ce6a79e1341870abc24d3 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:39 +0000
-Subject: [PATCH 17/29] Remove buffer_prepare_copy() and
- buffer_prepare_append()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-* removed almost all usages of buffer as "memory" (without terminating
- zero)
-* refactored cgi variable name encoding
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2977 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/buffer.c | 99 ++++++++++++++++++++++----------------
- src/buffer.h | 24 +++++-----
- src/configfile.c | 4 +-
- src/http-header-glue.c | 2 +-
- src/http_auth.c | 2 +-
- src/http_chunk.c | 4 +-
- src/log.c | 2 +-
- src/mod_accesslog.c | 8 ++--
- src/mod_cgi.c | 49 ++-----------------
- src/mod_compress.c | 27 ++++++-----
- src/mod_expire.c | 2 +-
- src/mod_fastcgi.c | 128 ++++++++++++++++---------------------------------
- src/mod_mysql_vhost.c | 2 +-
- src/mod_proxy.c | 12 ++---
- src/mod_rrdtool.c | 11 +++--
- src/mod_scgi.c | 47 +++++-------------
- src/mod_simple_vhost.c | 2 +-
- src/mod_ssi.c | 40 +---------------
- src/network_write.c | 2 +-
- src/proc_open.c | 6 +--
- src/response.c | 4 +-
- src/stat_cache.c | 7 ++-
- 22 files changed, 175 insertions(+), 309 deletions(-)
-
-diff --git a/src/buffer.c b/src/buffer.c
-index 019abb7..979d954 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -83,7 +83,7 @@ static size_t buffer_align_size(size_t size) {
- return size + align;
- }
-
--char* buffer_prepare_copy(buffer *b, size_t size) {
-+static char* buffer_prepare_copy(buffer *b, size_t size) {
- force_assert(NULL != b);
-
- /* also allocate space for terminating 0 */
-@@ -109,36 +109,6 @@ char* buffer_prepare_copy(buffer *b, size_t size) {
- return b->ptr;
- }
-
--char* buffer_prepare_append(buffer *b, size_t size) {
-- size_t req_size;
-- force_assert(NULL != b);
--
-- if (buffer_string_is_empty(b)) {
-- size_t old_used = b->used; /* either 0 or 1 */
-- /* just prepare copy (free+malloc instead of realloc) */
-- buffer_prepare_copy(b, size);
-- b->used = old_used; /* buffer_prepare_append mustn't modify b->used */
-- return b->ptr;
-- }
--
-- /* not empty, b->used already includes a terminating 0 */
-- req_size = b->used + size;
--
-- /* check for overflow: unsigned overflow is defined to wrap around */
-- force_assert(req_size >= b->used);
--
-- if (req_size > b->size) {
-- char *ptr;
-- b->size = buffer_align_size(req_size);
--
-- ptr = realloc(b->ptr, b->size);
-- force_assert(NULL != ptr);
-- b->ptr = ptr;
-- }
--
-- return b->ptr + b->used - 1;
--}
--
- char* buffer_string_prepare_copy(buffer *b, size_t size) {
- force_assert(NULL != b);
-
-@@ -151,11 +121,28 @@ char* buffer_string_prepare_copy(buffer *b, size_t size) {
- char* buffer_string_prepare_append(buffer *b, size_t size) {
- force_assert(NULL != b);
-
-- if (0 == b->used) {
-+ if (buffer_string_is_empty(b)) {
- return buffer_string_prepare_copy(b, size);
- } else {
-+ /* not empty, b->used already includes a terminating 0 */
-+ size_t req_size = b->used + size;
-+
-+ /* check for overflow: unsigned overflow is defined to wrap around */
-+ force_assert(req_size >= b->used);
-+
-+ /* only append to 0-terminated string */
- force_assert('\0' == b->ptr[b->used - 1]);
-- return buffer_prepare_append(b, size);
-+
-+ if (req_size > b->size) {
-+ char *ptr;
-+ b->size = buffer_align_size(req_size);
-+
-+ ptr = realloc(b->ptr, b->size);
-+ force_assert(NULL != ptr);
-+ b->ptr = ptr;
-+ }
-+
-+ return b->ptr + b->used - 1;
- }
- }
-
-@@ -186,7 +173,7 @@ void buffer_copy_string_len(buffer *b, const char *s, size_t s_len) {
- force_assert(NULL != b);
- force_assert(NULL != s || s_len == 0);
-
-- buffer_prepare_copy(b, s_len);
-+ buffer_string_prepare_copy(b, s_len);
-
- if (0 != s_len) memcpy(b->ptr, s, s_len);
-
-@@ -222,12 +209,11 @@ void buffer_append_string_len(buffer *b, const char *s, size_t s_len) {
- force_assert(NULL != b);
- force_assert(NULL != s || s_len == 0);
-
-- target_buf = buffer_prepare_append(b, s_len);
-+ target_buf = buffer_string_prepare_append(b, s_len);
-
-- /* only append to 0-terminated string */
-- force_assert('\0' == *target_buf);
-+ if (0 == s_len) return; /* nothing to append */
-
-- if (s_len > 0) memcpy(target_buf, s, s_len);
-+ memcpy(target_buf, s, s_len);
-
- buffer_commit(b, s_len);
- }
-@@ -667,7 +653,7 @@ void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer
- }
- }
-
-- d = (unsigned char*) buffer_prepare_append(b, d_len);
-+ d = (unsigned char*) buffer_string_prepare_append(b, d_len);
- buffer_commit(b, d_len); /* fill below */
- force_assert('\0' == *d);
-
-@@ -704,6 +690,35 @@ void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer
- }
- }
-
-+void buffer_copy_string_encoded_cgi_varnames(buffer *b, const char *s, size_t s_len, int is_http_header) {
-+ size_t i, j;
-+
-+ force_assert(NULL != b);
-+ force_assert(NULL != s || 0 == s_len);
-+
-+ buffer_reset(b);
-+
-+ if (is_http_header && NULL != s && 0 != strcasecmp(s, "CONTENT-TYPE")) {
-+ buffer_string_prepare_append(b, s_len + 5);
-+ buffer_copy_string_len(b, CONST_STR_LEN("HTTP_"));
-+ } else {
-+ buffer_string_prepare_append(b, s_len);
-+ }
-+
-+ j = buffer_string_length(b);
-+ for (i = 0; i < s_len; ++i) {
-+ unsigned char cr = s[i];
-+ if (light_isalpha(cr)) {
-+ /* upper-case */
-+ cr &= ~32;
-+ } else if (!light_isdigit(cr)) {
-+ cr = '_';
-+ }
-+ b->ptr[j++] = cr;
-+ }
-+ b->used = j;
-+ b->ptr[b->used++] = '\0';
-+}
-
- /* decodes url-special-chars inplace.
- * replaces non-printable characters with '_'
-@@ -790,7 +805,7 @@ void buffer_path_simplify(buffer *dest, buffer *src)
- force_assert(NULL != dest && NULL != src);
-
- if (buffer_string_is_empty(src)) {
-- buffer_copy_string_len(dest, NULL, 0);
-+ buffer_string_prepare_copy(dest, 0);
- return;
- }
-
-@@ -798,9 +813,9 @@ void buffer_path_simplify(buffer *dest, buffer *src)
-
- /* might need one character more for the '/' prefix */
- if (src == dest) {
-- buffer_prepare_append(dest, 1);
-+ buffer_string_prepare_append(dest, 1);
- } else {
-- buffer_prepare_copy(dest, buffer_string_length(src) + 1);
-+ buffer_string_prepare_copy(dest, buffer_string_length(src) + 1);
- }
-
- #if defined(__WIN32) || defined(__CYGWIN__)
-diff --git a/src/buffer.h b/src/buffer.h
-index 5d540a4..7ea27f1 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -49,22 +49,19 @@ void buffer_reset(buffer *b); /* b can be NULL */
- /* reset b. if NULL != b && NULL != src, move src content to b. reset src. */
- void buffer_move(buffer *b, buffer *src);
-
--/* prepare for size bytes in the buffer (b->size > size), destroys content
-- * (sets used = 0 and ptr[0] = 0). allocates storage for terminating 0.
-+/* make sure buffer is large enough to store a string of given size
-+ * and a terminating zero.
-+ * sets b to an empty string, and may drop old content.
- * @return b->ptr
- */
--char* buffer_prepare_copy(buffer *b, size_t size);
-+char* buffer_string_prepare_copy(buffer *b, size_t size);
-
--/* prepare for appending size bytes to the buffer
-- * allocates storage for terminating 0; if used > 0 assumes ptr[used-1] == 0,
-- * i.e. doesn't allocate another byte for terminating 0.
-- * @return (b->used > 0 ? b->ptr + b->used - 1 : b->ptr) - first new character
-+/* allocate buffer large enough to be able to append a string of given size
-+ * if b was empty (used == 0) it will contain an empty string (used == 1)
-+ * afterwards
-+ * "used" data is preserved; if not empty buffer must contain a
-+ * zero terminated string.
- */
--char* buffer_prepare_append(buffer *b, size_t size);
--
--/* similar to buffer_prepare_copy(b, size), but sets b->used = 1 */
--char* buffer_string_prepare_copy(buffer *b, size_t size);
--/* similar to buffer_prepare_append(b, size), but sets b->used = 1 if used was b->0 before */
- char* buffer_string_prepare_append(buffer *b, size_t size);
-
- /* use after prepare_(copy,append) when you have written data to the buffer
-@@ -123,6 +120,9 @@ typedef enum {
-
- void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding);
-
-+/* to upper case, replace non alpha-numerics with '_'; if is_http_header prefix with "HTTP_" unless s is "content-type" */
-+void buffer_copy_string_encoded_cgi_varnames(buffer *b, const char *s, size_t s_len, int is_http_header);
-+
- void buffer_urldecode_path(buffer *url);
- void buffer_urldecode_query(buffer *url);
- void buffer_path_simplify(buffer *dest, buffer *src);
-diff --git a/src/configfile.c b/src/configfile.c
-index 2b09d86..1c36c3e 100644
---- a/src/configfile.c
-+++ b/src/configfile.c
-@@ -1066,7 +1066,7 @@ int config_parse_cmd(server *srv, config_t *context, const char *cmd) {
- "opening", source, "failed:", strerror(errno));
- ret = -1;
- } else {
-- tokenizer_init(&t, source, out->ptr, out->used);
-+ tokenizer_init(&t, source, CONST_BUF_LEN(out));
- ret = config_parse(srv, context, &t);
- }
-
-@@ -1128,7 +1128,7 @@ int config_read(server *srv, const char *fn) {
- array_insert_unique(srv->config, (data_unset *)dpid);
-
- dcwd = data_string_init();
-- buffer_prepare_copy(dcwd->value, 1024);
-+ buffer_string_prepare_copy(dcwd->value, 1023);
- if (NULL != getcwd(dcwd->value->ptr, dcwd->value->size - 1)) {
- dcwd->value->used = strlen(dcwd->value->ptr) + 1;
- buffer_copy_string_len(dcwd->key, CONST_STR_LEN("var.CWD"));
-diff --git a/src/http-header-glue.c b/src/http-header-glue.c
-index abffb7d..f910f3f 100644
---- a/src/http-header-glue.c
-+++ b/src/http-header-glue.c
-@@ -235,7 +235,7 @@ buffer * strftime_cache_get(server *srv, time_t last_mod) {
- }
-
- srv->mtime_cache[i].mtime = last_mod;
-- buffer_prepare_copy(srv->mtime_cache[i].str, 1024);
-+ buffer_string_prepare_copy(srv->mtime_cache[i].str, 1023);
- tm = gmtime(&(srv->mtime_cache[i].mtime));
- srv->mtime_cache[i].str->used = strftime(srv->mtime_cache[i].str->ptr,
- srv->mtime_cache[i].str->size - 1,
-diff --git a/src/http_auth.c b/src/http_auth.c
-index 91e388c..c693645 100644
---- a/src/http_auth.c
-+++ b/src/http_auth.c
-@@ -97,7 +97,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) {
-
- size_t in_len = strlen(in);
-
-- buffer_prepare_copy(out, in_len);
-+ buffer_string_prepare_copy(out, in_len);
-
- result = (unsigned char *)out->ptr;
-
-diff --git a/src/http_chunk.c b/src/http_chunk.c
-index e3647e6..dd6a043 100644
---- a/src/http_chunk.c
-+++ b/src/http_chunk.c
-@@ -35,8 +35,8 @@ static void http_chunk_append_len(server *srv, connection *con, size_t len) {
- len >>= 4;
- }
-
-- /* i is the number of hex digits we have */
-- buffer_prepare_copy(b, i + 2);
-+ /* i is the number of hex digits we have, + \r\n */
-+ buffer_string_prepare_copy(b, i + 2);
-
- for (j = i-1, len = olen; j+1 > 0; j--) {
- b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10);
-diff --git a/src/log.c b/src/log.c
-index 75decfe..097e59e 100644
---- a/src/log.c
-+++ b/src/log.c
-@@ -332,7 +332,7 @@ static int log_buffer_prepare(buffer *b, server *srv, const char *filename, unsi
- if (-1 == srv->errorlog_fd) return -1;
- /* cache the generated timestamp */
- if (srv->cur_ts != srv->last_generated_debug_ts) {
-- buffer_prepare_copy(srv->ts_debug_str, 255);
-+ buffer_string_prepare_copy(srv->ts_debug_str, 255);
- strftime(srv->ts_debug_str->ptr, srv->ts_debug_str->size - 1, "%Y-%m-%d %H:%M:%S", localtime(&(srv->cur_ts)));
- srv->ts_debug_str->used = strlen(srv->ts_debug_str->ptr) + 1;
-
-diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c
-index 89fd7f5..20d52b9 100644
---- a/src/mod_accesslog.c
-+++ b/src/mod_accesslog.c
-@@ -165,10 +165,10 @@ static void accesslog_append_escaped(buffer *dest, buffer *str) {
-
- /* replaces non-printable chars with \xHH where HH is the hex representation of the byte */
- /* exceptions: " => \", \ => \\, whitespace chars => \n \t etc. */
-- if (str->used == 0) return;
-- buffer_prepare_append(dest, str->used - 1);
-+ if (buffer_string_is_empty(str)) return;
-+ buffer_string_prepare_append(dest, buffer_string_length(str));
-
-- for (ptr = start = str->ptr, end = str->ptr + str->used - 1; ptr < end; ptr++) {
-+ for (ptr = start = str->ptr, end = str->ptr + buffer_string_length(str); ptr < end; ptr++) {
- char const c = *ptr;
- if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
- /* nothing to change, add later as one block */
-@@ -711,7 +711,7 @@ REQUESTDONE_FUNC(log_access_write) {
- long scd, hrs, min;
- #endif
-
-- buffer_prepare_copy(p->conf.ts_accesslog_str, 255);
-+ buffer_string_prepare_copy(p->conf.ts_accesslog_str, 255);
- #if defined(HAVE_STRUCT_TM_GMTOFF)
- # ifdef HAVE_LOCALTIME_R
- localtime_r(&(srv->cur_ts), &tm);
-diff --git a/src/mod_cgi.c b/src/mod_cgi.c
-index 76882e8..f132b8a 100644
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -344,13 +344,13 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- int toread;
-
- #if defined(__WIN32)
-- buffer_prepare_copy(hctx->response, 4 * 1024);
-+ buffer_string_prepare_copy(hctx->response, 4 * 1024);
- #else
- if (ioctl(con->fd, FIONREAD, &toread) || toread == 0 || toread <= 4*1024) {
-- buffer_prepare_copy(hctx->response, 4 * 1024);
-+ buffer_string_prepare_copy(hctx->response, 4 * 1024);
- } else {
- if (toread > MAX_READ_LIMIT) toread = MAX_READ_LIMIT;
-- buffer_prepare_copy(hctx->response, toread);
-+ buffer_string_prepare_copy(hctx->response, toread);
- }
- #endif
-
-@@ -939,29 +939,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- ds = (data_string *)con->request.headers->data[n];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
--
-- buffer_reset(p->tmp_buf);
--
-- if (0 != strcasecmp(ds->key->ptr, "CONTENT-TYPE")) {
-- buffer_copy_string_len(p->tmp_buf, CONST_STR_LEN("HTTP_"));
-- p->tmp_buf->used--; /* strip \0 after HTTP_ */
-- }
--
-- buffer_prepare_append(p->tmp_buf, ds->key->used + 2);
--
-- for (j = 0; j < ds->key->used - 1; j++) {
-- char cr = '_';
-- if (light_isalpha(ds->key->ptr[j])) {
-- /* upper-case */
-- cr = ds->key->ptr[j] & ~32;
-- } else if (light_isdigit(ds->key->ptr[j])) {
-- /* copy */
-- cr = ds->key->ptr[j];
-- }
-- p->tmp_buf->ptr[p->tmp_buf->used++] = cr;
-- }
-- p->tmp_buf->ptr[p->tmp_buf->used++] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(p->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- cgi_env_add(&env, CONST_BUF_LEN(p->tmp_buf), CONST_BUF_LEN(ds->value));
- }
-@@ -973,24 +951,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- ds = (data_string *)con->environment->data[n];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
--
-- buffer_reset(p->tmp_buf);
--
-- buffer_prepare_append(p->tmp_buf, ds->key->used + 2);
--
-- for (j = 0; j < ds->key->used - 1; j++) {
-- char cr = '_';
-- if (light_isalpha(ds->key->ptr[j])) {
-- /* upper-case */
-- cr = ds->key->ptr[j] & ~32;
-- } else if (light_isdigit(ds->key->ptr[j])) {
-- /* copy */
-- cr = ds->key->ptr[j];
-- }
-- p->tmp_buf->ptr[p->tmp_buf->used++] = cr;
-- }
-- p->tmp_buf->ptr[p->tmp_buf->used++] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(p->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- cgi_env_add(&env, CONST_BUF_LEN(p->tmp_buf), CONST_BUF_LEN(ds->value));
- }
-diff --git a/src/mod_compress.c b/src/mod_compress.c
-index b428cd0..120b379 100644
---- a/src/mod_compress.c
-+++ b/src/mod_compress.c
-@@ -266,7 +266,7 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
- z.total_in = 0;
-
-
-- buffer_prepare_copy(p->b, (z.avail_in * 1.1) + 12 + 18);
-+ buffer_string_prepare_copy(p->b, (z.avail_in * 1.1) + 12 + 18);
-
- /* write gzip header */
-
-@@ -284,7 +284,7 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
-
- p->b->used = 10;
- z.next_out = (unsigned char *)p->b->ptr + p->b->used;
-- z.avail_out = p->b->size - p->b->used - 8;
-+ z.avail_out = p->b->size - p->b->used - 9;
- z.total_out = 0;
-
- if (Z_STREAM_END != deflate(&z, Z_FINISH)) {
-@@ -308,6 +308,7 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
- c[6] = (z.total_in >> 16) & 0xff;
- c[7] = (z.total_in >> 24) & 0xff;
- p->b->used += 8;
-+ p->b->ptr[p->b->used++] = '\0';
-
- if (Z_OK != deflateEnd(&z)) {
- return -1;
-@@ -339,10 +340,10 @@ static int deflate_file_to_buffer_deflate(server *srv, connection *con, plugin_d
- z.avail_in = st_size;
- z.total_in = 0;
-
-- buffer_prepare_copy(p->b, (z.avail_in * 1.1) + 12);
-+ buffer_string_prepare_copy(p->b, (z.avail_in * 1.1) + 12);
-
- z.next_out = (unsigned char *)p->b->ptr;
-- z.avail_out = p->b->size;
-+ z.avail_out = p->b->size - 1;
- z.total_out = 0;
-
- if (Z_STREAM_END != deflate(&z, Z_FINISH)) {
-@@ -350,13 +351,13 @@ static int deflate_file_to_buffer_deflate(server *srv, connection *con, plugin_d
- return -1;
- }
-
-- /* trailer */
-- p->b->used = z.total_out;
--
- if (Z_OK != deflateEnd(&z)) {
- return -1;
- }
-
-+ /* trailer */
-+ buffer_commit(p->b, z.total_out);
-+
- return 0;
- }
-
-@@ -385,10 +386,10 @@ static int deflate_file_to_buffer_bzip2(server *srv, connection *con, plugin_dat
- bz.total_in_lo32 = 0;
- bz.total_in_hi32 = 0;
-
-- buffer_prepare_copy(p->b, (bz.avail_in * 1.1) + 12);
-+ buffer_string_prepare_copy(p->b, (bz.avail_in * 1.1) + 12);
-
- bz.next_out = p->b->ptr;
-- bz.avail_out = p->b->size;
-+ bz.avail_out = p->b->size - 1;
- bz.total_out_lo32 = 0;
- bz.total_out_hi32 = 0;
-
-@@ -402,6 +403,7 @@ static int deflate_file_to_buffer_bzip2(server *srv, connection *con, plugin_dat
-
- /* trailer */
- p->b->used = bz.total_out_lo32;
-+ p->b->ptr[p->b->used++] = '\0';
-
- if (BZ_OK != BZ2_bzCompressEnd(&bz)) {
- return -1;
-@@ -434,7 +436,6 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
-
- if (0 == strncmp(con->physical.path->ptr, con->physical.doc_root->ptr, con->physical.doc_root->used-1)) {
- buffer_append_string(p->ofn, con->physical.path->ptr + con->physical.doc_root->used - 1);
-- buffer_copy_buffer(p->b, p->ofn);
- } else {
- buffer_append_string_buffer(p->ofn, con->uri.path);
- }
-@@ -546,11 +547,11 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
- }
-
- if (ret == 0) {
-- r = write(ofd, p->b->ptr, p->b->used);
-+ r = write(ofd, CONST_BUF_LEN(p->b));
- if (-1 == r) {
- log_error_write(srv, __FILE__, __LINE__, "sbss", "writing cachefile", p->ofn, "failed:", strerror(errno));
- ret = -1;
-- } else if ((size_t)r != p->b->used) {
-+ } else if ((size_t)r != buffer_string_length(p->b)) {
- log_error_write(srv, __FILE__, __LINE__, "sbs", "writing cachefile", p->ofn, "failed: not enough bytes written");
- ret = -1;
- }
-@@ -650,7 +651,7 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p,
- if (ret != 0) return -1;
-
- chunkqueue_reset(con->write_queue);
-- chunkqueue_append_mem(con->write_queue, p->b->ptr, p->b->used);
-+ chunkqueue_append_buffer(con->write_queue, p->b);
-
- buffer_reset(con->physical.path);
-
-diff --git a/src/mod_expire.c b/src/mod_expire.c
-index 41895f9..31a81b7 100644
---- a/src/mod_expire.c
-+++ b/src/mod_expire.c
-@@ -43,7 +43,7 @@ INIT_FUNC(mod_expire_init) {
-
- p->expire_tstmp = buffer_init();
-
-- buffer_prepare_copy(p->expire_tstmp, 255);
-+ buffer_string_prepare_copy(p->expire_tstmp, 255);
-
- return p;
- }
-diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c
-index e7b62f6..a935961 100644
---- a/src/mod_fastcgi.c
-+++ b/src/mod_fastcgi.c
-@@ -311,7 +311,6 @@ typedef struct {
- buffer *fcgi_env;
-
- buffer *path;
-- buffer *parse_response;
-
- buffer *statuskey;
-
-@@ -672,7 +671,6 @@ INIT_FUNC(mod_fastcgi_init) {
- p->fcgi_env = buffer_init();
-
- p->path = buffer_init();
-- p->parse_response = buffer_init();
-
- p->statuskey = buffer_init();
-
-@@ -687,7 +685,6 @@ FREE_FUNC(mod_fastcgi_free) {
-
- buffer_free(p->fcgi_env);
- buffer_free(p->path);
-- buffer_free(p->parse_response);
- buffer_free(p->statuskey);
-
- if (p->config_storage) {
-@@ -1578,6 +1575,8 @@ static handler_t fcgi_connection_reset(server *srv, connection *con, void *p_d)
-
- static int fcgi_env_add(buffer *env, const char *key, size_t key_len, const char *val, size_t val_len) {
- size_t len;
-+ char len_enc[8];
-+ size_t len_enc_len = 0;
-
- if (!key || !val) return -1;
-
-@@ -1586,7 +1585,7 @@ static int fcgi_env_add(buffer *env, const char *key, size_t key_len, const char
- len += key_len > 127 ? 4 : 1;
- len += val_len > 127 ? 4 : 1;
-
-- if (env->used + len >= FCGI_MAX_LENGTH) {
-+ if (buffer_string_length(env) + len >= FCGI_MAX_LENGTH) {
- /**
- * we can't append more headers, ignore it
- */
-@@ -1598,33 +1597,32 @@ static int fcgi_env_add(buffer *env, const char *key, size_t key_len, const char
- *
- * HINT: this can't happen as FCGI_MAX_LENGTH is only 16bit
- */
-- if (key_len > 0x7fffffff) key_len = 0x7fffffff;
-- if (val_len > 0x7fffffff) val_len = 0x7fffffff;
-+ force_assert(key_len < 0x7fffffffu);
-+ force_assert(val_len < 0x7fffffffu);
-
-- buffer_prepare_append(env, len);
-+ buffer_string_prepare_append(env, len);
-
- if (key_len > 127) {
-- env->ptr[env->used++] = ((key_len >> 24) & 0xff) | 0x80;
-- env->ptr[env->used++] = (key_len >> 16) & 0xff;
-- env->ptr[env->used++] = (key_len >> 8) & 0xff;
-- env->ptr[env->used++] = (key_len >> 0) & 0xff;
-+ len_enc[len_enc_len++] = ((key_len >> 24) & 0xff) | 0x80;
-+ len_enc[len_enc_len++] = (key_len >> 16) & 0xff;
-+ len_enc[len_enc_len++] = (key_len >> 8) & 0xff;
-+ len_enc[len_enc_len++] = (key_len >> 0) & 0xff;
- } else {
-- env->ptr[env->used++] = (key_len >> 0) & 0xff;
-+ len_enc[len_enc_len++] = (key_len >> 0) & 0xff;
- }
-
- if (val_len > 127) {
-- env->ptr[env->used++] = ((val_len >> 24) & 0xff) | 0x80;
-- env->ptr[env->used++] = (val_len >> 16) & 0xff;
-- env->ptr[env->used++] = (val_len >> 8) & 0xff;
-- env->ptr[env->used++] = (val_len >> 0) & 0xff;
-+ len_enc[len_enc_len++] = ((val_len >> 24) & 0xff) | 0x80;
-+ len_enc[len_enc_len++] = (val_len >> 16) & 0xff;
-+ len_enc[len_enc_len++] = (val_len >> 8) & 0xff;
-+ len_enc[len_enc_len++] = (val_len >> 0) & 0xff;
- } else {
-- env->ptr[env->used++] = (val_len >> 0) & 0xff;
-+ len_enc[len_enc_len++] = (val_len >> 0) & 0xff;
- }
-
-- memcpy(env->ptr + env->used, key, key_len);
-- env->used += key_len;
-- memcpy(env->ptr + env->used, val, val_len);
-- env->used += val_len;
-+ buffer_append_string_len(env, len_enc, len_enc_len);
-+ buffer_append_string_len(env, key, key_len);
-+ buffer_append_string_len(env, val, val_len);
-
- return 0;
- }
-@@ -1777,27 +1775,7 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat
- ds = (data_string *)con->request.headers->data[i];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
-- buffer_reset(srv->tmp_buf);
--
-- if (0 != strcasecmp(ds->key->ptr, "CONTENT-TYPE")) {
-- buffer_copy_string_len(srv->tmp_buf, CONST_STR_LEN("HTTP_"));
-- srv->tmp_buf->used--;
-- }
--
-- buffer_prepare_append(srv->tmp_buf, ds->key->used + 2);
-- for (j = 0; j < ds->key->used - 1; j++) {
-- char c = '_';
-- if (light_isalpha(ds->key->ptr[j])) {
-- /* upper-case */
-- c = ds->key->ptr[j] & ~32;
-- } else if (light_isdigit(ds->key->ptr[j])) {
-- /* copy */
-- c = ds->key->ptr[j];
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = c;
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)),con);
- }
-@@ -1809,22 +1787,7 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat
- ds = (data_string *)con->environment->data[i];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
-- buffer_reset(srv->tmp_buf);
--
-- buffer_prepare_append(srv->tmp_buf, ds->key->used + 2);
-- for (j = 0; j < ds->key->used - 1; j++) {
-- char c = '_';
-- if (light_isalpha(ds->key->ptr[j])) {
-- /* upper-case */
-- c = ds->key->ptr[j] & ~32;
-- } else if (light_isdigit(ds->key->ptr[j])) {
-- /* copy */
-- c = ds->key->ptr[j];
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = c;
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)), con);
- }
-@@ -1861,7 +1824,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- memset(beginRecord.body.reserved, 0, sizeof(beginRecord.body.reserved));
-
- /* send FCGI_PARAMS */
-- buffer_prepare_copy(p->fcgi_env, 1024);
-+ buffer_string_prepare_copy(p->fcgi_env, 1023);
-
-
- if (buffer_is_empty(con->conf.server_tag)) {
-@@ -2052,9 +2015,9 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
-
- buffer_copy_string_len(b, (const char *)&beginRecord, sizeof(beginRecord));
-
-- fcgi_header(&(header), FCGI_PARAMS, request_id, p->fcgi_env->used, 0);
-+ fcgi_header(&(header), FCGI_PARAMS, request_id, buffer_string_length(p->fcgi_env), 0);
- buffer_append_string_len(b, (const char *)&header, sizeof(header));
-- buffer_append_string_len(b, (const char *)p->fcgi_env->ptr, p->fcgi_env->used);
-+ buffer_append_string_buffer(b, p->fcgi_env);
-
- fcgi_header(&(header), FCGI_PARAMS, request_id, 0, 0);
- buffer_append_string_len(b, (const char *)&header, sizeof(header));
-@@ -2109,17 +2072,15 @@ static int fcgi_response_parse(server *srv, connection *con, plugin_data *p, buf
-
- UNUSED(srv);
-
-- buffer_copy_buffer(p->parse_response, in);
--
- /* search for \n */
-- for (s = p->parse_response->ptr; NULL != (ns = strchr(s, '\n')); s = ns + 1) {
-+ for (s = in->ptr; NULL != (ns = strchr(s, '\n')); s = ns + 1) {
- char *key, *value;
- int key_len;
- data_string *ds = NULL;
-
- /* a good day. Someone has read the specs and is sending a \r\n to us */
-
-- if (ns > p->parse_response->ptr &&
-+ if (ns > in->ptr &&
- *(ns-1) == '\r') {
- *(ns-1) = '\0';
- }
-@@ -2315,7 +2276,7 @@ typedef struct {
- } fastcgi_response_packet;
-
- static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_packet *packet) {
-- chunk * c;
-+ chunk *c;
- size_t offset;
- size_t toread;
- FCGI_Header *header;
-@@ -2331,15 +2292,11 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p
- offset = 0; toread = 8;
- /* get at least the FastCGI header */
- for (c = hctx->rb->first; c; c = c->next) {
-- size_t weHave = c->mem->used - c->offset - 1;
-+ size_t weHave = buffer_string_length(c->mem) - c->offset;
-
- if (weHave > toread) weHave = toread;
-
-- if (packet->b->used == 0) {
-- buffer_copy_string_len(packet->b, c->mem->ptr + c->offset, weHave);
-- } else {
-- buffer_append_string_len(packet->b, c->mem->ptr + c->offset, weHave);
-- }
-+ buffer_append_string_len(packet->b, c->mem->ptr + c->offset, weHave);
- toread -= weHave;
- offset = weHave; /* skip offset bytes in chunk for "real" data */
-
-@@ -2478,7 +2435,6 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- /* is the header already finished */
- if (0 == con->file_started) {
- char *c;
-- size_t blen;
- data_string *ds;
-
- /* search for header terminator
-@@ -2489,20 +2445,20 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- * search for \n\n
- */
-
-- if (hctx->response_header->used == 0) {
-- buffer_copy_buffer(hctx->response_header, packet.b);
-- } else {
-- buffer_append_string_buffer(hctx->response_header, packet.b);
-- }
-+ buffer_append_string_buffer(hctx->response_header, packet.b);
-
- if (NULL != (c = buffer_search_string_len(hctx->response_header, CONST_STR_LEN("\r\n\r\n")))) {
-- blen = hctx->response_header->used - (c - hctx->response_header->ptr) - 4 - 1;
-- hctx->response_header->used = (c - hctx->response_header->ptr) + 3;
-- c += 4; /* point the the start of the response */
-+ char *hend = c + 4; /* header end == body start */
-+ size_t hlen = hend - hctx->response_header->ptr;
-+ buffer_copy_string_len(packet.b, hend, buffer_string_length(hctx->response_header) - hlen);
-+ hctx->response_header->used = hlen;
-+ hctx->response_header->ptr[hctx->response_header->used++] = '\0';
- } else if (NULL != (c = buffer_search_string_len(hctx->response_header, CONST_STR_LEN("\n\n")))) {
-- blen = hctx->response_header->used - (c - hctx->response_header->ptr) - 2 - 1;
-- hctx->response_header->used = c - hctx->response_header->ptr + 2;
-- c += 2; /* point the the start of the response */
-+ char *hend = c + 2; /* header end == body start */
-+ size_t hlen = hend - hctx->response_header->ptr;
-+ buffer_copy_string_len(packet.b, hend, buffer_string_length(hctx->response_header) - hlen);
-+ hctx->response_header->used = hlen;
-+ hctx->response_header->ptr[hctx->response_header->used++] = '\0';
- } else {
- /* no luck, no header found */
- break;
-@@ -2559,14 +2515,14 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- }
-
-
-- if (hctx->send_content_body && blen > 0) {
-+ if (hctx->send_content_body && buffer_string_length(packet.b) > 0) {
- /* enable chunked-transfer-encoding */
- if (con->request.http_version == HTTP_VERSION_1_1 &&
- !(con->parsed_response & HTTP_CONTENT_LENGTH)) {
- con->response.transfer_encoding = HTTP_TRANSFER_ENCODING_CHUNKED;
- }
-
-- http_chunk_append_mem(srv, con, c, blen);
-+ http_chunk_append_buffer(srv, con, packet.b);
- joblist_append(srv, con);
- }
- } else if (hctx->send_content_body && packet.b->used > 1) {
-diff --git a/src/mod_mysql_vhost.c b/src/mod_mysql_vhost.c
-index 8442f76..7d679fb 100644
---- a/src/mod_mysql_vhost.c
-+++ b/src/mod_mysql_vhost.c
-@@ -355,7 +355,7 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
- unsigned long to_len;
-
- /* 'to' has to be 'from_len * 2 + 1' */
-- buffer_prepare_append(p->tmp_buf, (con->uri.authority->used - 1) * 2 + 1);
-+ buffer_string_prepare_append(p->tmp_buf, (con->uri.authority->used - 1) * 2 + 1);
-
- to_len = mysql_real_escape_string(p->conf.mysql,
- p->tmp_buf->ptr + p->tmp_buf->used - 1,
-diff --git a/src/mod_proxy.c b/src/mod_proxy.c
-index 2b5a740..fc2ca1a 100644
---- a/src/mod_proxy.c
-+++ b/src/mod_proxy.c
-@@ -624,15 +624,9 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
- }
-
- if (b > 0) {
-- if (hctx->response->used == 0) {
-- /* avoid too small buffer */
-- buffer_prepare_append(hctx->response, b + 1);
-- hctx->response->used = 1;
-- } else {
-- buffer_prepare_append(hctx->response, b);
-- }
-+ buffer_string_prepare_append(hctx->response, b);
-
-- if (-1 == (r = read(hctx->fd, hctx->response->ptr + hctx->response->used - 1, b))) {
-+ if (-1 == (r = read(hctx->fd, hctx->response->ptr + buffer_string_length(hctx->response), buffer_string_space(hctx->response)))) {
- if (errno == EAGAIN) return 0;
- log_error_write(srv, __FILE__, __LINE__, "sds",
- "unexpected end-of-file (perhaps the proxy process died):",
-@@ -653,7 +647,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
-
- if (0 == con->got_response) {
- con->got_response = 1;
-- buffer_prepare_copy(hctx->response_header, 128);
-+ buffer_string_prepare_copy(hctx->response_header, 1023);
- }
-
- if (0 == con->file_started) {
-diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c
-index 4986ea3..5eb0d9d 100644
---- a/src/mod_rrdtool.c
-+++ b/src/mod_rrdtool.c
-@@ -271,8 +271,8 @@ static int mod_rrdtool_create_rrd(server *srv, plugin_data *p, plugin_config *s)
- return HANDLER_ERROR;
- }
-
-- buffer_prepare_copy(p->resp, 4096);
-- if (-1 == (r = safe_read(p->read_fd, p->resp->ptr, p->resp->size))) {
-+ buffer_string_prepare_copy(p->resp, 4095);
-+ if (-1 == (r = safe_read(p->read_fd, p->resp->ptr, p->resp->size - 1))) {
- log_error_write(srv, __FILE__, __LINE__, "ss",
- "rrdtool-read: failed", strerror(errno));
-
-@@ -280,6 +280,7 @@ static int mod_rrdtool_create_rrd(server *srv, plugin_data *p, plugin_config *s)
- }
-
- p->resp->used = r;
-+ p->resp->ptr[p->resp->used++] = '\0';
-
- if (p->resp->ptr[0] != 'O' ||
- p->resp->ptr[1] != 'K') {
-@@ -434,7 +435,7 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- return HANDLER_ERROR;
- }
-
-- buffer_prepare_copy(p->resp, 4096);
-+ buffer_string_prepare_copy(p->resp, 4096);
- if (-1 == (r = safe_read(p->read_fd, p->resp->ptr, p->resp->size - 1))) {
- p->rrdtool_running = 0;
-
-@@ -444,8 +445,8 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- return HANDLER_ERROR;
- }
-
-- p->resp->used = r + 1;
-- p->resp->ptr[r] = '\0';
-+ p->resp->used = r;
-+ p->resp->ptr[p->resp->used++] = '\0';
-
- if (p->resp->ptr[0] != 'O' ||
- p->resp->ptr[1] != 'K') {
-diff --git a/src/mod_scgi.c b/src/mod_scgi.c
-index 2fa265d..9ea16a4 100644
---- a/src/mod_scgi.c
-+++ b/src/mod_scgi.c
-@@ -1301,14 +1301,12 @@ static int scgi_env_add(buffer *env, const char *key, size_t key_len, const char
-
- len = key_len + val_len + 2;
-
-- buffer_prepare_append(env, len);
-+ buffer_string_prepare_append(env, len);
-
-- memcpy(env->ptr + env->used, key, key_len);
-- env->ptr[env->used + key_len] = '\0';
-- env->used += key_len + 1;
-- memcpy(env->ptr + env->used, val, val_len);
-- env->ptr[env->used + val_len] = '\0';
-- env->used += val_len + 1;
-+ buffer_append_string_len(env, key, key_len);
-+ buffer_append_string_len(env, "", 1);
-+ buffer_append_string_len(env, val, val_len);
-+ buffer_append_string_len(env, "", 1);
-
- return 0;
- }
-@@ -1419,21 +1417,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat
- ds = (data_string *)con->request.headers->data[i];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
-- buffer_reset(srv->tmp_buf);
--
-- if (0 != strcasecmp(ds->key->ptr, "CONTENT-TYPE")) {
-- buffer_copy_string_len(srv->tmp_buf, CONST_STR_LEN("HTTP_"));
-- srv->tmp_buf->used--;
-- }
--
-- buffer_prepare_append(srv->tmp_buf, ds->key->used + 2);
-- for (j = 0; j < ds->key->used - 1; j++) {
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] =
-- light_isalpha(ds->key->ptr[j]) ?
-- ds->key->ptr[j] & ~32 : '_';
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- scgi_env_add(p->scgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value));
- }
-@@ -1445,16 +1429,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat
- ds = (data_string *)con->environment->data[i];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
-- buffer_reset(srv->tmp_buf);
--
-- buffer_prepare_append(srv->tmp_buf, ds->key->used + 2);
-- for (j = 0; j < ds->key->used - 1; j++) {
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] =
-- light_isalnum((unsigned char)ds->key->ptr[j]) ?
-- toupper((unsigned char)ds->key->ptr[j]) : '_';
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- scgi_env_add(p->scgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value));
- }
-@@ -1481,7 +1456,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- sock_addr our_addr;
- socklen_t our_addr_len;
-
-- buffer_prepare_copy(p->scgi_env, 1024);
-+ buffer_string_prepare_copy(p->scgi_env, 1023);
-
- /* CGI-SPEC 6.1.2, FastCGI spec 6.3 and SCGI spec */
-
-@@ -1631,9 +1606,9 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
-
- b = buffer_init();
-
-- buffer_append_int(b, p->scgi_env->used);
-+ buffer_append_int(b, buffer_string_length(p->scgi_env));
- buffer_append_string_len(b, CONST_STR_LEN(":"));
-- buffer_append_string_len(b, (const char *)p->scgi_env->ptr, p->scgi_env->used);
-+ buffer_append_string_buffer(b, p->scgi_env);
- buffer_append_string_len(b, CONST_STR_LEN(","));
-
- hctx->wb->bytes_in += b->used - 1;
-@@ -1759,7 +1734,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- while(1) {
- int n;
-
-- buffer_prepare_copy(hctx->response, 1024);
-+ buffer_string_prepare_copy(hctx->response, 1023);
- if (-1 == (n = read(hctx->fd, hctx->response->ptr, hctx->response->size - 1))) {
- if (errno == EAGAIN || errno == EINTR) {
- /* would block, wait for signal */
-diff --git a/src/mod_simple_vhost.c b/src/mod_simple_vhost.c
-index 7245fd5..6bb850f 100644
---- a/src/mod_simple_vhost.c
-+++ b/src/mod_simple_vhost.c
-@@ -126,7 +126,7 @@ static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *
- stat_cache_entry *sce = NULL;
- force_assert(p->conf.server_root->used > 1);
-
-- buffer_prepare_copy(out, 128);
-+ buffer_string_prepare_copy(out, 127);
- buffer_copy_buffer(out, p->conf.server_root);
-
- if (host->used) {
-diff --git a/src/mod_ssi.c b/src/mod_ssi.c
-index ecdfb99..981fd76 100644
---- a/src/mod_ssi.c
-+++ b/src/mod_ssi.c
-@@ -173,32 +173,12 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data
- ds = (data_string *)con->request.headers->data[i];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
-- buffer_reset(srv->tmp_buf);
--
- /* don't forward the Authorization: Header */
- if (0 == strcasecmp(ds->key->ptr, "AUTHORIZATION")) {
- continue;
- }
-
-- if (0 != strcasecmp(ds->key->ptr, "CONTENT-TYPE")) {
-- buffer_copy_string_len(srv->tmp_buf, CONST_STR_LEN("HTTP_"));
-- srv->tmp_buf->used--;
-- }
--
-- buffer_prepare_append(srv->tmp_buf, ds->key->used + 2);
-- for (j = 0; j < ds->key->used - 1; j++) {
-- char c = '_';
-- if (light_isalpha(ds->key->ptr[j])) {
-- /* upper-case */
-- c = ds->key->ptr[j] & ~32;
-- } else if (light_isdigit(ds->key->ptr[j])) {
-- /* copy */
-- c = ds->key->ptr[j];
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = c;
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- ssi_env_add(p->ssi_cgi_env, srv->tmp_buf->ptr, ds->value->ptr);
- }
-@@ -210,23 +190,7 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data
- ds = (data_string *)con->environment->data[i];
-
- if (ds->value->used && ds->key->used) {
-- size_t j;
--
-- buffer_reset(srv->tmp_buf);
-- buffer_prepare_append(srv->tmp_buf, ds->key->used + 2);
--
-- for (j = 0; j < ds->key->used - 1; j++) {
-- char c = '_';
-- if (light_isalpha(ds->key->ptr[j])) {
-- /* upper-case */
-- c = ds->key->ptr[j] & ~32;
-- } else if (light_isdigit(ds->key->ptr[j])) {
-- /* copy */
-- c = ds->key->ptr[j];
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used++] = c;
-- }
-- srv->tmp_buf->ptr[srv->tmp_buf->used] = '\0';
-+ buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- ssi_env_add(p->ssi_cgi_env, srv->tmp_buf->ptr, ds->value->ptr);
- }
-diff --git a/src/network_write.c b/src/network_write.c
-index 930644e..d46649b 100644
---- a/src/network_write.c
-+++ b/src/network_write.c
-@@ -145,7 +145,7 @@ int network_write_chunkqueue_write(server *srv, connection *con, int fd, chunkqu
-
- munmap(p, sce->st.st_size);
- #else /* USE_MMAP */
-- buffer_prepare_copy(srv->tmp_buf, toSend);
-+ buffer_string_prepare_copy(srv->tmp_buf, toSend);
-
- if (-1 == lseek(ifd, offset, SEEK_SET)) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "lseek: ", strerror(errno));
-diff --git a/src/proc_open.c b/src/proc_open.c
-index e28b479..c29b9c6 100644
---- a/src/proc_open.c
-+++ b/src/proc_open.c
-@@ -280,13 +280,13 @@ static void proc_read_fd_to_buffer(int fd, buffer *b) {
- ssize_t s;
-
- for (;;) {
-- buffer_prepare_append(b, 512);
-- if ((s = read(fd, (void *)(b->ptr + b->used), 512 - 1)) <= 0) {
-+ buffer_string_prepare_append(b, 1024);
-+ if ((s = read(fd, (void *)(b->ptr + buffer_string_length(b)), buffer_string_space(b))) <= 0) {
- break;
- }
- b->used += s;
-+ b->ptr[b->used-1] = '\0';
- }
-- b->ptr[b->used] = '\0';
- }
- /* }}} */
- /* {{{ proc_open_buffer */
-diff --git a/src/response.c b/src/response.c
-index 31bcd69..5072d05 100644
---- a/src/response.c
-+++ b/src/response.c
-@@ -97,7 +97,7 @@ int http_response_write_header(server *srv, connection *con) {
-
- /* cache the generated timestamp */
- if (srv->cur_ts != srv->last_generated_date_ts) {
-- buffer_prepare_copy(srv->ts_date_str, 255);
-+ buffer_string_prepare_copy(srv->ts_date_str, 255);
-
- strftime(srv->ts_date_str->ptr, srv->ts_date_str->size - 1,
- "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(srv->cur_ts)));
-@@ -201,7 +201,7 @@ static void https_add_ssl_entries(connection *con) {
- }
-
- buffer_copy_string_len(envds->key, CONST_STR_LEN("SSL_CLIENT_CERT"));
-- buffer_prepare_copy(envds->value, n);
-+ buffer_string_prepare_copy(envds->value, n);
- BIO_read(bio, envds->value->ptr, n);
- BIO_free(bio);
- envds->value->ptr[n] = '\0';
-diff --git a/src/stat_cache.c b/src/stat_cache.c
-index b5aa9ce..b63140e 100644
---- a/src/stat_cache.c
-+++ b/src/stat_cache.c
-@@ -219,8 +219,7 @@ static int stat_cache_attr_get(buffer *buf, char *name) {
- int attrlen;
- int ret;
-
-- attrlen = 1024;
-- buffer_prepare_copy(buf, attrlen);
-+ buffer_string_prepare_copy(buf, 1023);
- attrlen = buf->size - 1;
- if(0 == (ret = attr_get(name, "Content-Type", buf->ptr, &attrlen, 0))) {
- buf->used = attrlen + 1;
-@@ -230,9 +229,9 @@ static int stat_cache_attr_get(buffer *buf, char *name) {
- }
- #elif defined(HAVE_EXTATTR)
- static int stat_cache_attr_get(buffer *buf, char *name) {
-- ssize_t attrlen = 1024;
-+ ssize_t attrlen;
-
-- buffer_prepare_copy(buf, attrlen);
-+ buffer_prepare_copy(buf, 1023);
-
- if (-1 != (attrlen = extattr_get_file(name, EXTATTR_NAMESPACE_USER, "Content-Type", buf->ptr, buf->size - 1))) {
- buf->used = attrlen + 1;
---
-2.4.5
-
diff --git a/main/lighttpd/0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch b/main/lighttpd/0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
deleted file mode 100644
index e56fa44244..0000000000
--- a/main/lighttpd/0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From adfa06de996944b495b878540464dd6e74563052 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:41 +0000
-Subject: [PATCH 18/29] [tests] improve valgrind and strace TRACEME, disable
- condition logging in normal configs
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-- condition logging is way too noisy and rarely useful
-- increate timeout to wait for port bind; if the process dies we fail
- early anyway
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2978 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- tests/LightyTest.pm | 6 +++---
- tests/lighttpd.conf | 2 +-
- tests/var-include.conf | 2 +-
- 3 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/tests/LightyTest.pm b/tests/LightyTest.pm
-index b92af87..36029dc 100755
---- a/tests/LightyTest.pm
-+++ b/tests/LightyTest.pm
-@@ -87,7 +87,7 @@ sub wait_for_port_with_proc {
- my $self = shift;
- my $port = shift;
- my $child = shift;
-- my $timeout = 5*10; # 5 secs, select waits 0.1 s
-+ my $timeout = 10*10; # 10 secs (valgrind might take a while), select waits 0.1 s
-
- while (0 == $self->listening_on($port)) {
- select(undef, undef, undef, 0.1);
-@@ -125,13 +125,13 @@ sub start_proc {
-
- my @cmdline = ($self->{LIGHTTPD_PATH}, "-D", "-f", $self->{SRCDIR}."/".$self->{CONFIGFILE}, "-m", $self->{MODULES_PATH});
- if (defined $ENV{"TRACEME"} && $ENV{"TRACEME"} eq 'strace') {
-- @cmdline = (qw(strace -tt -s 512 -o strace), @cmdline);
-+ @cmdline = (qw(strace -tt -s 4096 -o strace -f -v), @cmdline);
- } elsif (defined $ENV{"TRACEME"} && $ENV{"TRACEME"} eq 'truss') {
- @cmdline = (qw(truss -a -l -w all -v all -o strace), @cmdline);
- } elsif (defined $ENV{"TRACEME"} && $ENV{"TRACEME"} eq 'gdb') {
- @cmdline = ('gdb', '--batch', '--ex', 'run', '--ex', 'bt full', '--args', @cmdline);
- } elsif (defined $ENV{"TRACEME"} && $ENV{"TRACEME"} eq 'valgrind') {
-- @cmdline = (qw(valgrind --tool=memcheck --show-reachable=yes --leak-check=yes --log-file=valgrind), @cmdline);
-+ @cmdline = (qw(valgrind --tool=memcheck --track-origins=yes --show-reachable=yes --leak-check=yes --log-file=valgrind.%p), @cmdline);
- }
- # diag("\nstarting lighttpd at :".$self->{PORT}.", cmdline: ".@cmdline );
- my $child = fork();
-diff --git a/tests/lighttpd.conf b/tests/lighttpd.conf
-index a4b5cd8..a140002 100644
---- a/tests/lighttpd.conf
-+++ b/tests/lighttpd.conf
-@@ -1,7 +1,7 @@
- debug.log-request-handling = "enable"
- debug.log-request-header = "enable"
- debug.log-response-header = "enable"
--debug.log-condition-handling = "enable"
-+#debug.log-condition-handling = "enable"
- server.document-root = env.SRCDIR + "/tmp/lighttpd/servers/www.example.org/pages/"
-
- ## 64 Mbyte ... nice limit
-diff --git a/tests/var-include.conf b/tests/var-include.conf
-index 04b8271..6a107c5 100644
---- a/tests/var-include.conf
-+++ b/tests/var-include.conf
-@@ -1,6 +1,6 @@
-
- debug.log-request-handling = "enable"
--debug.log-condition-handling = "enable"
-+#debug.log-condition-handling = "enable"
-
- server.document-root = env.SRCDIR + "/tmp/lighttpd/servers/www.example.org/pages/"
-
---
-2.4.5
-
diff --git a/main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch b/main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch
deleted file mode 100644
index d455ff9a67..0000000000
--- a/main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch
+++ /dev/null
@@ -1,4346 +0,0 @@
-From ad3e93ea96d1cbaab00d07245dbd02f790060f85 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:44 +0000
-Subject: [PATCH 19/29] Use buffer API to read and modify "used" member
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-- a lot of code tried to handle manually adding terminating zeroes and
- keeping track of the correct "used" count.
- Replaced all "external" usages with simple wrapper functions:
- * buffer_string_is_empty (used <= 1), buffer_is_empty (used == 0);
- prefer buffer_string_is_empty
- * buffer_string_set_length
- * buffer_string_length
- * CONST_BUF_LEN() macro
-- removed "static" buffer hacks (buffers pointing to constant/stack
- memory instead of malloc()ed data)
-- buffer_append_strftime(): refactor buffer+strftime uses
-- li_tohex(): no need for a buffer for binary-to-hex conversion:
- the output data length is easy to predict
-- remove "-Winline" from extra warnings: the "inline" keyword just
- supresses the warning about unused but defined (static) functions;
- don't care whether it actually gets inlined or not.
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2979 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- configure.ac | 2 +-
- src/CMakeLists.txt | 2 +-
- src/array.c | 12 +--
- src/buffer.c | 128 ++++++++++++++++++++-----------
- src/buffer.h | 13 ++++
- src/chunk.c | 11 +--
- src/configfile-glue.c | 2 +-
- src/configfile.c | 4 +-
- src/connections.c | 79 ++++---------------
- src/data_string.c | 11 +--
- src/etag.c | 5 +-
- src/http-header-glue.c | 7 +-
- src/http_auth.c | 71 ++++++++---------
- src/http_chunk.c | 5 +-
- src/log.c | 19 ++---
- src/mod_access.c | 8 +-
- src/mod_accesslog.c | 64 ++++++++--------
- src/mod_alias.c | 14 ++--
- src/mod_auth.c | 20 ++---
- src/mod_cgi.c | 47 ++++++------
- src/mod_cml.c | 12 ++-
- src/mod_cml_funcs.c | 9 +--
- src/mod_cml_lua.c | 22 ++----
- src/mod_compress.c | 34 ++++-----
- src/mod_dirlisting.c | 22 +++---
- src/mod_evasive.c | 2 +-
- src/mod_evhost.c | 11 +--
- src/mod_expire.c | 21 ++---
- src/mod_extforward.c | 2 +-
- src/mod_fastcgi.c | 99 ++++++++++++------------
- src/mod_flv_streaming.c | 13 ++--
- src/mod_indexfile.c | 4 +-
- src/mod_magnet.c | 43 +++++------
- src/mod_mysql_vhost.c | 51 ++++---------
- src/mod_proxy.c | 47 +++++-------
- src/mod_redirect.c | 4 +-
- src/mod_rewrite.c | 4 +-
- src/mod_rrdtool.c | 12 ++-
- src/mod_scgi.c | 61 +++++++--------
- src/mod_secure_download.c | 9 +--
- src/mod_simple_vhost.c | 16 ++--
- src/mod_ssi.c | 16 ++--
- src/mod_ssi_expr.c | 2 +-
- src/mod_staticfile.c | 14 ++--
- src/mod_status.c | 4 +-
- src/mod_trigger_b4_dl.c | 16 ++--
- src/mod_userdir.c | 4 +-
- src/mod_usertrack.c | 16 ++--
- src/mod_webdav.c | 177 ++++++++++++++++++++-----------------------
- src/network_linux_sendfile.c | 4 +-
- src/network_openssl.c | 6 +-
- src/network_write.c | 6 +-
- src/network_writev.c | 4 +-
- src/proc_open.c | 7 +-
- src/request.c | 49 ++++++------
- src/response.c | 53 +++++--------
- src/server.c | 23 +++---
- src/stat_cache.c | 23 +++---
- 58 files changed, 668 insertions(+), 778 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 63261ca..c846d1a 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -666,7 +666,7 @@ AC_ARG_ENABLE(extra-warnings,
- esac],[extrawarnings=false])
-
- if test x$extrawarnings = xtrue; then
-- TRY_CFLAGS([-g -O2 -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wcast-align -Winline -Wsign-compare -Wnested-externs -Wpointer-arith -Wl,--as-needed -D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security])
-+ TRY_CFLAGS([-g -O2 -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wcast-align -Wsign-compare -Wnested-externs -Wpointer-arith -Wl,--as-needed -D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security])
- fi
-
- dnl build version-id
-diff --git a/src/array.c b/src/array.c
-index 9a15abd..50f5e03 100644
---- a/src/array.c
-+++ b/src/array.c
-@@ -98,7 +98,7 @@ static int array_get_index(array *a, const char *key, size_t keylen, int *rndx)
- } else if (pos >= (int)a->used) {
- pos -= i;
- } else {
-- cmp = buffer_caseless_compare(key, keylen, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used);
-+ cmp = buffer_caseless_compare(key, keylen, CONST_BUF_LEN(a->data[a->sorted[pos]]->key));
-
- if (cmp == 0) {
- /* found */
-@@ -121,7 +121,7 @@ static int array_get_index(array *a, const char *key, size_t keylen, int *rndx)
- data_unset *array_get_element(array *a, const char *key) {
- int ndx;
-
-- if (-1 != (ndx = array_get_index(a, key, strlen(key) + 1, NULL))) {
-+ if (-1 != (ndx = array_get_index(a, key, strlen(key), NULL))) {
- /* found, leave here */
-
- return a->data[ndx];
-@@ -171,7 +171,7 @@ data_unset *array_replace(array *a, data_unset *du) {
- int ndx;
-
- force_assert(NULL != du);
-- if (-1 == (ndx = array_get_index(a, du->key->ptr, du->key->used, NULL))) {
-+ if (-1 == (ndx = array_get_index(a, CONST_BUF_LEN(du->key), NULL))) {
- array_insert_unique(a, du);
- return NULL;
- } else {
-@@ -187,13 +187,13 @@ int array_insert_unique(array *a, data_unset *str) {
- size_t j;
-
- /* generate unique index if neccesary */
-- if (str->key->used == 0 || str->is_index_key) {
-+ if (buffer_is_empty(str->key) || str->is_index_key) {
- buffer_copy_int(str->key, a->unique_ndx++);
- str->is_index_key = 1;
- }
-
- /* try to find the string */
-- if (-1 != (ndx = array_get_index(a, str->key->ptr, str->key->used, &pos))) {
-+ if (-1 != (ndx = array_get_index(a, CONST_BUF_LEN(str->key), &pos))) {
- /* found, leave here */
- if (a->data[ndx]->type == str->type) {
- str->insert_dup(a->data[ndx], str);
-@@ -235,7 +235,7 @@ int array_insert_unique(array *a, data_unset *str) {
-
- if (pos != ndx &&
- ((pos < 0) ||
-- buffer_caseless_compare(str->key->ptr, str->key->used, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used) > 0)) {
-+ buffer_caseless_compare(CONST_BUF_LEN(str->key), CONST_BUF_LEN(a->data[a->sorted[pos]]->key)) > 0)) {
- pos++;
- }
-
-diff --git a/src/buffer.c b/src/buffer.c
-index 979d954..d343731 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -9,7 +9,6 @@
-
- static const char hex_chars[] = "0123456789abcdef";
-
--
- /**
- * init the buffer
- *
-@@ -83,37 +82,44 @@ static size_t buffer_align_size(size_t size) {
- return size + align;
- }
-
--static char* buffer_prepare_copy(buffer *b, size_t size) {
-+/* make sure buffer is at least "size" big. discard old data */
-+static void buffer_alloc(buffer *b, size_t size) {
- force_assert(NULL != b);
-+ if (0 == size) size = 1;
-
-- /* also allocate space for terminating 0 */
-- /* check for overflow: unsigned overflow is defined to wrap around */
-- force_assert(1 + size > size);
-- ++size;
-+ if (size <= b->size) return;
-
-- if (0 == b->size || size > b->size) {
-- if (NULL != b->ptr) free(b->ptr);
-- b->ptr = NULL;
-+ if (NULL != b->ptr) free(b->ptr);
-
-- b->size = buffer_align_size(size);
-- force_assert(b->size > 0);
-+ b->used = 0;
-+ b->size = buffer_align_size(size);
-+ b->ptr = malloc(b->size);
-
-- b->ptr = malloc(b->size);
-- force_assert(NULL != b->ptr);
-- }
-+ force_assert(NULL != b->ptr);
-+}
-
-- /* reset */
-- b->used = 0;
-- b->ptr[0] = '\0';
-+/* make sure buffer is at least "size" big. keep old data */
-+static void buffer_realloc(buffer *b, size_t size) {
-+ force_assert(NULL != b);
-+ if (0 == size) size = 1;
-
-- return b->ptr;
-+ if (size <= b->size) return;
-+
-+ b->size = buffer_align_size(size);
-+ b->ptr = realloc(b->ptr, b->size);
-+
-+ force_assert(NULL != b->ptr);
- }
-
-+
- char* buffer_string_prepare_copy(buffer *b, size_t size) {
- force_assert(NULL != b);
-+ force_assert(size + 1 > size);
-+
-+ buffer_alloc(b, size + 1);
-
-- buffer_prepare_copy(b, size);
- b->used = 1;
-+ b->ptr[0] = '\0';
-
- return b->ptr;
- }
-@@ -124,28 +130,29 @@ char* buffer_string_prepare_append(buffer *b, size_t size) {
- if (buffer_string_is_empty(b)) {
- return buffer_string_prepare_copy(b, size);
- } else {
-- /* not empty, b->used already includes a terminating 0 */
- size_t req_size = b->used + size;
-
-- /* check for overflow: unsigned overflow is defined to wrap around */
-+ /* not empty, b->used already includes a terminating 0 */
- force_assert(req_size >= b->used);
-
-- /* only append to 0-terminated string */
-- force_assert('\0' == b->ptr[b->used - 1]);
--
-- if (req_size > b->size) {
-- char *ptr;
-- b->size = buffer_align_size(req_size);
-+ /* check for overflow: unsigned overflow is defined to wrap around */
-+ force_assert(req_size >= b->used);
-
-- ptr = realloc(b->ptr, b->size);
-- force_assert(NULL != ptr);
-- b->ptr = ptr;
-- }
-+ buffer_realloc(b, req_size);
-
- return b->ptr + b->used - 1;
- }
- }
-
-+void buffer_string_set_length(buffer *b, size_t len) {
-+ force_assert(NULL != b);
-+ force_assert(len + 1 > len);
-+
-+ buffer_realloc(b, len + 1);
-+
-+ b->used = len + 1;
-+ b->ptr[len] = '\0';
-+}
-
- void buffer_commit(buffer *b, size_t size)
- {
-@@ -182,7 +189,8 @@ void buffer_copy_string_len(buffer *b, const char *s, size_t s_len) {
-
- void buffer_copy_buffer(buffer *b, const buffer *src) {
- if (NULL == src || 0 == src->used) {
-- buffer_prepare_copy(b, 0);
-+ buffer_string_prepare_copy(b, 0);
-+ b->used = 0; /* keep special empty state for now */
- } else {
- buffer_copy_string_len(b, src->ptr, buffer_string_length(src));
- }
-@@ -301,6 +309,37 @@ void buffer_copy_int(buffer *b, intmax_t val) {
- buffer_append_int(b, val);
- }
-
-+void buffer_append_strftime(buffer *b, const char *format, const struct tm *tm) {
-+ size_t r;
-+ char* buf;
-+ force_assert(NULL != b);
-+ force_assert(NULL != tm);
-+
-+ if (NULL == format || '\0' == format[0]) {
-+ /* empty format */
-+ buffer_string_prepare_append(b, 0);
-+ return;
-+ }
-+
-+ buf = buffer_string_prepare_append(b, 255);
-+ r = strftime(buf, buffer_string_space(b), format, tm);
-+
-+ /* 0 (in some apis buffer_string_space(b)) signals the string may have
-+ * been too small; but the format could also just have lead to an empty
-+ * string
-+ */
-+ if (0 == r || r >= buffer_string_space(b)) {
-+ /* give it a second try with a larger string */
-+ buf = buffer_string_prepare_append(b, 4095);
-+ r = strftime(buf, buffer_string_space(b), format, tm);
-+ }
-+
-+ if (r >= buffer_string_space(b)) r = 0;
-+
-+ buffer_commit(b, r);
-+}
-+
-+
- void li_itostrn(char *buf, size_t buf_len, intmax_t val) {
- char p_buf[LI_ITOSTRING_LENGTH];
- char* const p_buf_end = p_buf + sizeof(p_buf);
-@@ -446,20 +485,22 @@ int buffer_is_equal_right_len(buffer *b1, buffer *b2, size_t len) {
- return 0 == memcmp(b1->ptr + b1->used - 1 - len, b2->ptr + b2->used - 1 - len, len);
- }
-
--void buffer_copy_string_hex(buffer *b, const char *in, size_t in_len) {
-+void li_tohex(char *buf, const char *s, size_t s_len) {
- size_t i;
-
-- /* overflow protection */
-- force_assert(in_len * 2 + 1 > in_len);
-+ for (i = 0; i < s_len; i++) {
-+ buf[2*i] = hex_chars[(s[i] >> 4) & 0x0F];
-+ buf[2*i+1] = hex_chars[s[i] & 0x0F];
-+ }
-+ buf[2*s_len] = '\0';
-+}
-
-- buffer_prepare_copy(b, in_len * 2);
-+void buffer_copy_string_hex(buffer *b, const char *in, size_t in_len) {
-+ /* overflow protection */
-+ force_assert(in_len * 2 > in_len);
-
-- b->used = 0;
-- for (i = 0; i < in_len; i++) {
-- b->ptr[b->used++] = hex_chars[(in[i] >> 4) & 0x0F];
-- b->ptr[b->used++] = hex_chars[in[i] & 0x0F];
-- }
-- b->ptr[b->used++] = '\0';
-+ buffer_string_set_length(b, 2 * in_len);
-+ li_tohex(b->ptr, in, in_len);
- }
-
- /* everything except: ! ( ) * - . 0-9 A-Z _ a-z */
-@@ -882,8 +923,7 @@ void buffer_path_simplify(buffer *dest, buffer *src)
- walk++;
- }
-
-- *out = '\0';
-- dest->used = (out - start) + 1;
-+ buffer_string_set_length(dest, out - start);
- }
-
- int light_isdigit(int c) {
-diff --git a/src/buffer.h b/src/buffer.h
-index 7ea27f1..e2ac778 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -10,6 +10,7 @@
- #include <stdlib.h>
- #include <sys/types.h>
- #include <stdio.h>
-+#include <time.h>
-
- #if defined HAVE_STDINT_H
- # include <stdint.h>
-@@ -71,6 +72,13 @@ char* buffer_string_prepare_append(buffer *b, size_t size);
- */
- void buffer_commit(buffer *b, size_t size);
-
-+/* sets string length:
-+ * - always stores a terminating zero to terminate the "new" string
-+ * - does not modify the string data apart from terminating zero
-+ * - reallocates the buffer iff needed
-+ */
-+void buffer_string_set_length(buffer *b, size_t len);
-+
- void buffer_copy_string(buffer *b, const char *s);
- void buffer_copy_string_len(buffer *b, const char *s, size_t s_len);
- void buffer_copy_buffer(buffer *b, const buffer *src);
-@@ -85,6 +93,8 @@ void buffer_append_long_hex(buffer *b, unsigned long len);
- void buffer_append_int(buffer *b, intmax_t val);
- void buffer_copy_int(buffer *b, intmax_t val);
-
-+void buffer_append_strftime(buffer *b, const char *format, const struct tm *tm);
-+
- /* '-', log_10 (2^bits) = bits * log 2 / log 10 < bits * 0.31, terminating 0 */
- #define LI_ITOSTRING_LENGTH (2 + (8 * sizeof(intmax_t) * 31 + 99) / 100)
-
-@@ -93,6 +103,9 @@ void li_itostr(char *buf, intmax_t val); /* buf must have at least LI_ITOSTRING_
- void li_utostrn(char *buf, size_t buf_len, uintmax_t val);
- void li_utostr(char *buf, uintmax_t val); /* buf must have at least LI_ITOSTRING_LENGTH bytes */
-
-+/* buf must be (at least) 2*s_len + 1 big. uses lower-case hex letters. */
-+void li_tohex(char *buf, const char *s, size_t s_len);
-+
- char * buffer_search_string_len(buffer *b, const char *needle, size_t len);
-
- /* NULL buffer or empty buffer (used == 0);
-diff --git a/src/chunk.c b/src/chunk.c
-index 83adc15..ccdae9a 100644
---- a/src/chunk.c
-+++ b/src/chunk.c
-@@ -264,10 +264,11 @@ void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_s
- }
- /* if buffer is really small just make it bigger */
- else if (have < min_size && b->size <= REALLOC_MAX_SIZE) {
-- size_t new_size = b->used + min_size, append;
-+ size_t cur_len = buffer_string_length(b);
-+ size_t new_size = cur_len + min_size, append;
- if (new_size < alloc_size) new_size = alloc_size;
-
-- append = new_size - b->used;
-+ append = new_size - cur_len;
- if (append >= min_size) {
- buffer_string_prepare_append(b, append);
- have = buffer_string_space(b);
-@@ -301,12 +302,8 @@ void chunkqueue_use_memory(chunkqueue *cq, size_t len) {
- force_assert(NULL != cq->last && MEM_CHUNK == cq->last->type);
- b = cq->last->mem;
-
-- force_assert(b->used > 0);
-- force_assert(len <= buffer_string_space(b));
--
- if (len > 0) {
-- b->used += len;
-- b->ptr[b->used - 1] = '\0';
-+ buffer_commit(b, len);
- } else if (buffer_string_is_empty(b)) {
- /* unused buffer: can't remove chunk easily from
- * end of list, so just reset the buffer
-diff --git a/src/configfile-glue.c b/src/configfile-glue.c
-index 2fb8c62..f411d72 100644
---- a/src/configfile-glue.c
-+++ b/src/configfile-glue.c
-@@ -491,7 +491,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat
- #ifndef elementsof
- #define elementsof(x) (sizeof(x) / sizeof(x[0]))
- #endif
-- n = pcre_exec(dc->regex, dc->regex_study, l->ptr, l->used - 1, 0, 0,
-+ n = pcre_exec(dc->regex, dc->regex_study, CONST_BUF_LEN(l), 0, 0,
- cache->matches, elementsof(cache->matches));
-
- cache->patterncount = n;
-diff --git a/src/configfile.c b/src/configfile.c
-index 1c36c3e..929d292 100644
---- a/src/configfile.c
-+++ b/src/configfile.c
-@@ -1130,7 +1130,7 @@ int config_read(server *srv, const char *fn) {
- dcwd = data_string_init();
- buffer_string_prepare_copy(dcwd->value, 1023);
- if (NULL != getcwd(dcwd->value->ptr, dcwd->value->size - 1)) {
-- dcwd->value->used = strlen(dcwd->value->ptr) + 1;
-+ buffer_commit(dcwd->value, strlen(dcwd->value->ptr));
- buffer_copy_string_len(dcwd->key, CONST_STR_LEN("var.CWD"));
- array_insert_unique(srv->config, (data_unset *)dcwd);
- } else {
-@@ -1320,7 +1320,7 @@ int config_set_defaults(server *srv) {
- srv->srvconf.port = s->ssl_enabled ? 443 : 80;
- }
-
-- if (srv->srvconf.event_handler->used == 0) {
-+ if (buffer_string_is_empty(srv->srvconf.event_handler)) {
- /* choose a good default
- *
- * the event_handler list is sorted by 'goodness'
-diff --git a/src/connections.c b/src/connections.c
-index 3fab768..8f26a30 100644
---- a/src/connections.c
-+++ b/src/connections.c
-@@ -400,7 +400,7 @@ static int connection_handle_write_prepare(server *srv, connection *con) {
- * 403 is from the response handler when noone else catched it
- *
- * */
-- if ((!con->http_status || con->http_status == 200) && con->uri.path->used &&
-+ if ((!con->http_status || con->http_status == 200) && !buffer_string_is_empty(con->uri.path) &&
- con->uri.path->ptr[0] != '*') {
- response_header_insert(srv, con, CONST_STR_LEN("Allow"), CONST_STR_LEN("OPTIONS, GET, HEAD, POST"));
-
-@@ -873,42 +873,7 @@ static int connection_handle_read_state(server *srv, connection *con) {
- }
- }
-
-- /* the last chunk might be empty */
-- for (c = cq->first; c;) {
-- if (cq->first == c && c->mem->used == 0) {
-- /* the first node is empty */
-- /* ... and it is empty, move it to unused */
--
-- cq->first = c->next;
-- if (cq->first == NULL) cq->last = NULL;
--
-- c->next = cq->unused;
-- cq->unused = c;
-- cq->unused_chunks++;
--
-- c = cq->first;
-- } else if (c->next && c->next->mem->used == 0) {
-- chunk *fc;
-- /* next node is the last one */
-- /* ... and it is empty, move it to unused */
--
-- fc = c->next;
-- c->next = fc->next;
--
-- fc->next = cq->unused;
-- cq->unused = fc;
-- cq->unused_chunks++;
--
-- /* the last node was empty */
-- if (c->next == NULL) {
-- cq->last = c;
-- }
--
-- c = c->next;
-- } else {
-- c = c->next;
-- }
-- }
-+ chunkqueue_remove_finished_chunks(cq);
-
- /* we might have got several packets at once
- */
-@@ -927,15 +892,12 @@ static int connection_handle_read_state(server *srv, connection *con) {
- last_offset = 0;
-
- for (c = cq->first; c; c = c->next) {
-- buffer b;
- size_t i;
-+ size_t len = buffer_string_length(c->mem) - c->offset;
-+ const char *b = c->mem->ptr + c->offset;
-
-- b.ptr = c->mem->ptr + c->offset;
-- b.used = c->mem->used - c->offset;
-- if (b.used > 0) b.used--; /* buffer "used" includes terminating zero */
--
-- for (i = 0; i < b.used; i++) {
-- char ch = b.ptr[i];
-+ for (i = 0; i < len; ++i) {
-+ char ch = b[i];
-
- if ('\r' == ch) {
- /* chec if \n\r\n follows */
-@@ -945,13 +907,11 @@ static int connection_handle_read_state(server *srv, connection *con) {
- int header_end_match_pos = 1;
-
- for ( ; cc; cc = cc->next, j = 0 ) {
-- buffer bb;
-- bb.ptr = cc->mem->ptr + cc->offset;
-- bb.used = cc->mem->used - cc->offset;
-- if (bb.used > 0) bb.used--; /* buffer "used" includes terminating zero */
-+ size_t bblen = buffer_string_length(cc->mem) - cc->offset;
-+ const char *bb = c->mem->ptr + cc->offset;
-
-- for ( ; j < bb.used; j++) {
-- ch = bb.ptr[j];
-+ for ( ; j < bblen; j++) {
-+ ch = bb[j];
-
- if (ch == header_end[header_end_match_pos]) {
- header_end_match_pos++;
-@@ -976,25 +936,16 @@ found_header_end:
- buffer_reset(con->request.request);
-
- for (c = cq->first; c; c = c->next) {
-- buffer b;
--
-- b.ptr = c->mem->ptr + c->offset;
-- b.used = c->mem->used - c->offset;
-+ size_t len = buffer_string_length(c->mem) - c->offset;
-
- if (c == last_chunk) {
-- b.used = last_offset + 1;
-+ len = last_offset;
- }
-
-- buffer_append_string_buffer(con->request.request, &b);
-+ buffer_append_string_len(con->request.request, c->mem->ptr + c->offset, len);
-+ c->offset += len;
-
-- if (c == last_chunk) {
-- c->offset += last_offset;
--
-- break;
-- } else {
-- /* the whole packet was copied */
-- c->offset = c->mem->used - 1;
-- }
-+ if (c == last_chunk) break;
- }
-
- connection_set_state(srv, con, CON_STATE_REQUEST_END);
-diff --git a/src/data_string.c b/src/data_string.c
-index fc57de2..d65b3be 100644
---- a/src/data_string.c
-+++ b/src/data_string.c
-@@ -36,7 +36,7 @@ static int data_string_insert_dup(data_unset *dst, data_unset *src) {
- data_string *ds_dst = (data_string *)dst;
- data_string *ds_src = (data_string *)src;
-
-- if (ds_dst->value->used) {
-+ if (!buffer_is_empty(ds_dst->value)) {
- buffer_append_string_len(ds_dst->value, CONST_STR_LEN(", "));
- buffer_append_string_buffer(ds_dst->value, ds_src->value);
- } else {
-@@ -52,7 +52,7 @@ static int data_response_insert_dup(data_unset *dst, data_unset *src) {
- data_string *ds_dst = (data_string *)dst;
- data_string *ds_src = (data_string *)src;
-
-- if (ds_dst->value->used) {
-+ if (!buffer_is_empty(ds_dst->value)) {
- buffer_append_string_len(ds_dst->value, CONST_STR_LEN("\r\n"));
- buffer_append_string_buffer(ds_dst->value, ds_dst->key);
- buffer_append_string_len(ds_dst->value, CONST_STR_LEN(": "));
-@@ -69,18 +69,19 @@ static int data_response_insert_dup(data_unset *dst, data_unset *src) {
-
- static void data_string_print(const data_unset *d, int depth) {
- data_string *ds = (data_string *)d;
-- unsigned int i;
-+ size_t i, len;
- UNUSED(depth);
-
- /* empty and uninitialized strings */
-- if (ds->value->used < 1) {
-+ if (buffer_string_is_empty(ds->value)) {
- fputs("\"\"", stdout);
- return;
- }
-
- /* print out the string as is, except prepend " with backslash */
- putc('"', stdout);
-- for (i = 0; i < ds->value->used - 1; i++) {
-+ len = buffer_string_length(ds->value);
-+ for (i = 0; i < len; i++) {
- unsigned char c = ds->value->ptr[i];
- if (c == '"') {
- fputs("\\\"", stdout);
-diff --git a/src/etag.c b/src/etag.c
-index bf63d94..f8fb609 100644
---- a/src/etag.c
-+++ b/src/etag.c
-@@ -37,10 +37,11 @@ int etag_create(buffer *etag, struct stat *st,etag_flags_t flags) {
- }
-
- int etag_mutate(buffer *mut, buffer *etag) {
-- size_t i;
-+ size_t i, len;
- uint32_t h;
-
-- for (h=0, i=0; i < etag->used-1; ++i) h = (h<<5)^(h>>27)^(etag->ptr[i]);
-+ len = buffer_string_length(etag);
-+ for (h=0, i=0; i < len; ++i) h = (h<<5)^(h>>27)^(etag->ptr[i]);
-
- buffer_reset(mut);
- buffer_copy_string_len(mut, CONST_STR_LEN("\""));
-diff --git a/src/http-header-glue.c b/src/http-header-glue.c
-index f910f3f..752d91e 100644
---- a/src/http-header-glue.c
-+++ b/src/http-header-glue.c
-@@ -125,7 +125,7 @@ int http_response_redirect_to_directory(server *srv, connection *con) {
-
- buffer_copy_buffer(o, con->uri.scheme);
- buffer_append_string_len(o, CONST_STR_LEN("://"));
-- if (con->uri.authority->used) {
-+ if (!buffer_is_empty(con->uri.authority)) {
- buffer_append_string_buffer(o, con->uri.authority);
- } else {
- /* get the name of the currently connected socket */
-@@ -237,10 +237,7 @@ buffer * strftime_cache_get(server *srv, time_t last_mod) {
- srv->mtime_cache[i].mtime = last_mod;
- buffer_string_prepare_copy(srv->mtime_cache[i].str, 1023);
- tm = gmtime(&(srv->mtime_cache[i].mtime));
-- srv->mtime_cache[i].str->used = strftime(srv->mtime_cache[i].str->ptr,
-- srv->mtime_cache[i].str->size - 1,
-- "%a, %d %b %Y %H:%M:%S GMT", tm);
-- srv->mtime_cache[i].str->used++;
-+ buffer_append_strftime(srv->mtime_cache[i].str, "%a, %d %b %Y %H:%M:%S GMT", tm);
-
- return srv->mtime_cache[i].str;
- }
-diff --git a/src/http_auth.c b/src/http_auth.c
-index c693645..a98ea62 100644
---- a/src/http_auth.c
-+++ b/src/http_auth.c
-@@ -39,13 +39,7 @@ typedef unsigned char HASH[HASHLEN];
- typedef char HASHHEX[HASHHEXLEN+1];
-
- static void CvtHex(const HASH Bin, char Hex[33]) {
-- unsigned short i;
--
-- for (i = 0; i < 16; i++) {
-- Hex[i*2] = int2hex((Bin[i] >> 4) & 0xf);
-- Hex[i*2+1] = int2hex(Bin[i] & 0xf);
-- }
-- Hex[32] = '\0';
-+ li_tohex(Hex, (const char*) Bin, 16);
- }
-
- /**
-@@ -97,9 +91,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) {
-
- size_t in_len = strlen(in);
-
-- buffer_string_prepare_copy(out, in_len);
--
-- result = (unsigned char *)out->ptr;
-+ result = (unsigned char *) buffer_string_prepare_copy(out, in_len);
-
- /* run through the whole string, converting as we go */
- for (i = 0; i < in_len; i++) {
-@@ -157,8 +149,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) {
- break;
- }
-
-- result[j] = '\0';
-- out->used = j;
-+ buffer_commit(out, j);
-
- return result;
- }
-@@ -166,7 +157,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) {
- static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *username, buffer *realm, buffer *password) {
- int ret = -1;
-
-- if (!username->used|| !realm->used) return -1;
-+ if (buffer_is_empty(username) || buffer_is_empty(realm)) return -1;
-
- if (p->conf.auth_backend == AUTH_BACKEND_HTDIGEST) {
- stream f;
-@@ -226,8 +217,8 @@ static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *
- pwd_len = f.size - (f_pwd - f.start);
- }
-
-- if (username->used - 1 == u_len &&
-- (realm->used - 1 == r_len) &&
-+ if (buffer_string_length(username) == u_len &&
-+ (buffer_string_length(realm) == r_len) &&
- (0 == strncmp(username->ptr, f_user, u_len)) &&
- (0 == strncmp(realm->ptr, f_realm, r_len))) {
- /* found */
-@@ -296,7 +287,7 @@ static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *
- pwd_len = f.size - (f_pwd - f.start);
- }
-
-- if (username->used - 1 == u_len &&
-+ if (buffer_string_length(username) == u_len &&
- (0 == strncmp(username->ptr, f_user, u_len))) {
- /* found */
-
-@@ -652,10 +643,10 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p
- char a1[256];
-
- li_MD5_Init(&Md5Ctx);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)username->ptr, username->used - 1);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)realm->ptr, realm->used - 1);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(username));
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
-+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(realm));
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)pw, strlen(pw));
- li_MD5_Final(HA1, &Md5Ctx);
-
-@@ -682,7 +673,7 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p
- char *crypted;
-
- /* a simple DES password is 2 + 11 characters. everything else should be longer. */
-- if (password->used < 13 + 1) {
-+ if (buffer_string_length(password) < 13) {
- return -1;
- }
-
-@@ -707,7 +698,7 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p
- char *dn;
- int ret;
- char *attrs[] = { LDAP_NO_ATTRS, NULL };
-- size_t i;
-+ size_t i, len;
-
- /* for now we stay synchronous */
-
-@@ -726,7 +717,8 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p
- * a unpleasant way
- */
-
-- for (i = 0; i < username->used - 1; i++) {
-+ len = buffer_string_length(username);
-+ for (i = 0; i < len; i++) {
- char c = username->ptr[i];
-
- if (!isalpha(c) &&
-@@ -863,9 +855,8 @@ int http_auth_basic_check(server *srv, connection *con, mod_auth_plugin_data *p,
- return 0;
- }
-
-- *pw++ = '\0';
--
-- username->used = pw - username->ptr;
-+ buffer_string_set_length(username, pw - username->ptr);
-+ pw++;
-
- password = buffer_init();
- /* copy password to r1 */
-@@ -1084,10 +1075,10 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p
- /* generate password from plain-text */
- li_MD5_Init(&Md5Ctx);
- li_MD5_Update(&Md5Ctx, (unsigned char *)username, strlen(username));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)realm, strlen(realm));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)password->ptr, password->used - 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
-+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(password));
- li_MD5_Final(HA1, &Md5Ctx);
- } else if (p->conf.auth_backend == AUTH_BACKEND_HTDIGEST) {
- /* HA1 */
-@@ -1109,9 +1100,9 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p
- /* Errata ID 1649: http://www.rfc-editor.org/errata_search.php?rfc=2617 */
- CvtHex(HA1, a1);
- li_MD5_Update(&Md5Ctx, (unsigned char *)a1, 32);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)nonce, strlen(nonce));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)cnonce, strlen(cnonce));
- li_MD5_Final(HA1, &Md5Ctx);
- }
-@@ -1121,12 +1112,12 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p
- /* calculate H(A2) */
- li_MD5_Init(&Md5Ctx);
- li_MD5_Update(&Md5Ctx, (unsigned char *)m, strlen(m));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)uri, strlen(uri));
- /* qop=auth-int not supported, already checked above */
- /*
- if (qop && strcasecmp(qop, "auth-int") == 0) {
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *) [body checksum], HASHHEXLEN);
- }
- */
-@@ -1136,16 +1127,16 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p
- /* calculate response */
- li_MD5_Init(&Md5Ctx);
- li_MD5_Update(&Md5Ctx, (unsigned char *)a1, HASHHEXLEN);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)nonce, strlen(nonce));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- if (qop && *qop) {
- li_MD5_Update(&Md5Ctx, (unsigned char *)nc, strlen(nc));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)cnonce, strlen(cnonce));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- li_MD5_Update(&Md5Ctx, (unsigned char *)qop, strlen(qop));
-- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":"));
- };
- li_MD5_Update(&Md5Ctx, (unsigned char *)HA2Hex, HASHHEXLEN);
- li_MD5_Final(RespHash, &Md5Ctx);
-@@ -1198,8 +1189,8 @@ int http_auth_digest_generate_nonce(server *srv, mod_auth_plugin_data *p, buffer
-
- /* generate shared-secret */
- li_MD5_Init(&Md5Ctx);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)fn->ptr, fn->used - 1);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)"+", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(fn));
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN("+"));
-
- /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */
- li_itostr(hh, srv->cur_ts);
-diff --git a/src/http_chunk.c b/src/http_chunk.c
-index dd6a043..79e4586 100644
---- a/src/http_chunk.c
-+++ b/src/http_chunk.c
-@@ -42,8 +42,7 @@ static void http_chunk_append_len(server *srv, connection *con, size_t len) {
- b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10);
- len >>= 4;
- }
-- b->used = i;
-- b->ptr[b->used++] = '\0';
-+ buffer_commit(b, i);
-
- buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
- }
-@@ -82,7 +81,7 @@ void http_chunk_append_buffer(server *srv, connection *con, buffer *mem) {
- cq = con->write_queue;
-
- if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) {
-- http_chunk_append_len(srv, con, mem->used - 1);
-+ http_chunk_append_len(srv, con, buffer_string_length(mem));
- }
-
- chunkqueue_append_buffer(cq, mem);
-diff --git a/src/log.c b/src/log.c
-index 097e59e..6c9c38d 100644
---- a/src/log.c
-+++ b/src/log.c
-@@ -333,8 +333,7 @@ static int log_buffer_prepare(buffer *b, server *srv, const char *filename, unsi
- /* cache the generated timestamp */
- if (srv->cur_ts != srv->last_generated_debug_ts) {
- buffer_string_prepare_copy(srv->ts_debug_str, 255);
-- strftime(srv->ts_debug_str->ptr, srv->ts_debug_str->size - 1, "%Y-%m-%d %H:%M:%S", localtime(&(srv->cur_ts)));
-- srv->ts_debug_str->used = strlen(srv->ts_debug_str->ptr) + 1;
-+ buffer_append_strftime(srv->ts_debug_str, "%Y-%m-%d %H:%M:%S", localtime(&(srv->cur_ts)));
-
- srv->last_generated_debug_ts = srv->cur_ts;
- }
-@@ -362,8 +361,7 @@ static void log_write(server *srv, buffer *b) {
- case ERRORLOG_FILE:
- case ERRORLOG_FD:
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-- force_assert(b->used > 0);
-- write(srv->errorlog_fd, b->ptr, b->used - 1);
-+ write(srv->errorlog_fd, CONST_BUF_LEN(b));
- break;
- case ERRORLOG_SYSLOG:
- syslog(LOG_ERR, "%s", b->ptr);
-@@ -387,11 +385,11 @@ int log_error_write(server *srv, const char *filename, unsigned int line, const
-
- int log_error_write_multiline_buffer(server *srv, const char *filename, unsigned int line, buffer *multiline, const char *fmt, ...) {
- va_list ap;
-- size_t prefix_used;
-+ size_t prefix_len;
- buffer *b = srv->errorlog_buf;
- char *pos, *end, *current_line;
-
-- if (multiline->used < 2) return 0;
-+ if (buffer_string_is_empty(multiline)) return 0;
-
- if (-1 == log_buffer_prepare(b, srv, filename, line)) return 0;
-
-@@ -399,20 +397,19 @@ int log_error_write_multiline_buffer(server *srv, const char *filename, unsigned
- log_buffer_append_printf(b, fmt, ap);
- va_end(ap);
-
-- prefix_used = b->used;
-+ prefix_len = buffer_string_length(b);
-
- current_line = pos = multiline->ptr;
-- end = multiline->ptr + multiline->used;
-+ end = multiline->ptr + buffer_string_length(multiline);
-
-- for ( ; pos < end ; ++pos) {
-+ for ( ; pos <= end ; ++pos) {
- switch (*pos) {
- case '\n':
- case '\r':
- case '\0': /* handles end of string */
- if (current_line < pos) {
- /* truncate to prefix */
-- b->used = prefix_used;
-- b->ptr[b->used - 1] = '\0';
-+ buffer_string_set_length(b, prefix_len);
-
- buffer_append_string_len(b, current_line, pos - current_line);
- log_write(srv, b);
-diff --git a/src/mod_access.c b/src/mod_access.c
-index 7b88e19..a6c25a4 100644
---- a/src/mod_access.c
-+++ b/src/mod_access.c
-@@ -125,11 +125,11 @@ URIHANDLER_FUNC(mod_access_uri_handler) {
- int s_len;
- size_t k;
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_access_patch_connection(srv, con, p);
-
-- s_len = con->uri.path->used - 1;
-+ s_len = buffer_string_length(con->uri.path);
-
- if (con->conf.log_request_handling) {
- log_error_write(srv, __FILE__, __LINE__, "s",
-@@ -138,12 +138,12 @@ URIHANDLER_FUNC(mod_access_uri_handler) {
-
- for (k = 0; k < p->conf.access_deny->used; k++) {
- data_string *ds = (data_string *)p->conf.access_deny->data[k];
-- int ct_len = ds->value->used - 1;
-+ int ct_len = buffer_string_length(ds->value);
- int denied = 0;
-
-
- if (ct_len > s_len) continue;
-- if (ds->value->used == 0) continue;
-+ if (buffer_is_empty(ds->value)) continue;
-
- /* if we have a case-insensitive FS we have to lower-case the URI here too */
-
-diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c
-index 20d52b9..9bb3fe2 100644
---- a/src/mod_accesslog.c
-+++ b/src/mod_accesslog.c
-@@ -223,9 +223,9 @@ static void accesslog_append_escaped(buffer *dest, buffer *str) {
- static int accesslog_parse_format(server *srv, format_fields *fields, buffer *format) {
- size_t i, j, k = 0, start = 0;
-
-- if (format->used == 0) return -1;
-+ if (buffer_is_empty(format)) return -1;
-
-- for (i = 0; i < format->used - 1; i++) {
-+ for (i = 0; i < buffer_string_length(format); i++) {
- switch(format->ptr[i]) {
- case '%':
- if (i > 0 && start != i) {
-@@ -297,11 +297,11 @@ static int accesslog_parse_format(server *srv, format_fields *fields, buffer *fo
- case '{':
- /* go forward to } */
-
-- for (k = i+2; k < format->used - 1; k++) {
-+ for (k = i+2; k < buffer_string_length(format); k++) {
- if (format->ptr[k] == '}') break;
- }
-
-- if (k == format->used - 1) {
-+ if (k == buffer_string_length(format)) {
- log_error_write(srv, __FILE__, __LINE__, "s", "%{ has to be terminated by a }");
- return -1;
- }
-@@ -416,9 +416,9 @@ FREE_FUNC(mod_accesslog_free) {
-
- if (!s) continue;
-
-- if (s->access_logbuffer->used) {
-+ if (!buffer_string_is_empty(s->access_logbuffer)) {
- if (s->log_access_fd != -1) {
-- write(s->log_access_fd, s->access_logbuffer->ptr, s->access_logbuffer->used - 1);
-+ write(s->log_access_fd, CONST_BUF_LEN(s->access_logbuffer));
- }
- }
-
-@@ -502,7 +502,7 @@ SETDEFAULTS_FUNC(log_access_open) {
-
- /* parse */
-
-- if (s->format->used) {
-+ if (!buffer_is_empty(s->format)) {
- size_t j, count;
-
- s->parsed_format = calloc(1, sizeof(*(s->parsed_format)));
-@@ -572,7 +572,7 @@ SETDEFAULTS_FUNC(log_access_open) {
- continue;
- }
-
-- if (s->access_logfile->used < 2) continue;
-+ if (buffer_string_is_empty(s->access_logfile)) continue;
-
- if (-1 == (s->log_access_fd = open_logfile_or_pipe(srv, s->access_logfile->ptr)))
- return HANDLER_ERROR;
-@@ -591,17 +591,17 @@ SIGHUP_FUNC(log_access_cycle) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (s->access_logbuffer->used) {
-+ if (!buffer_string_is_empty(s->access_logbuffer)) {
- if (s->log_access_fd != -1) {
-- write(s->log_access_fd, s->access_logbuffer->ptr, s->access_logbuffer->used - 1);
-+ write(s->log_access_fd, CONST_BUF_LEN(s->access_logbuffer));
- }
-
- buffer_reset(s->access_logbuffer);
- }
-
-- if (s->use_syslog == 0 &&
-- s->access_logfile->used > 1 &&
-- s->access_logfile->ptr[0] != '|') {
-+ if (s->use_syslog == 0
-+ && !buffer_string_is_empty(s->access_logfile)
-+ && s->access_logfile->ptr[0] != '|') {
-
- if (-1 != s->log_access_fd) close(s->log_access_fd);
-
-@@ -691,8 +691,8 @@ REQUESTDONE_FUNC(log_access_write) {
- b = p->conf.access_logbuffer;
- }
-
-- if (b->used == 0) {
-- buffer_copy_string_len(b, CONST_STR_LEN(""));
-+ if (buffer_is_empty(b)) {
-+ buffer_string_set_length(b, 0);
- }
-
- for (j = 0; j < p->conf.parsed_format->used; j++) {
-@@ -715,11 +715,10 @@ REQUESTDONE_FUNC(log_access_write) {
- #if defined(HAVE_STRUCT_TM_GMTOFF)
- # ifdef HAVE_LOCALTIME_R
- localtime_r(&(srv->cur_ts), &tm);
-- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, &tm);
-+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, &tm);
- # else /* HAVE_LOCALTIME_R */
-- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, localtime_r(&(srv->cur_ts)));
-+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, localtime(&(srv->cur_ts)));
- # endif /* HAVE_LOCALTIME_R */
-- p->conf.ts_accesslog_str->used = strlen(p->conf.ts_accesslog_str->ptr) + 1;
-
- if (p->conf.append_tz_offset) {
- buffer_append_string_len(p->conf.ts_accesslog_str, tm.tm_gmtoff >= 0 ? "+" : "-", 1);
-@@ -739,11 +738,10 @@ REQUESTDONE_FUNC(log_access_write) {
- #else /* HAVE_STRUCT_TM_GMTOFF */
- # ifdef HAVE_GMTIME_R
- gmtime_r(&(srv->cur_ts), &tm);
-- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, &tm);
-+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, &tm);
- # else /* HAVE_GMTIME_R */
-- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, gmtime(&(srv->cur_ts)));
-+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, gmtime(&(srv->cur_ts)));
- # endif /* HAVE_GMTIME_R */
-- p->conf.ts_accesslog_str->used = strlen(p->conf.ts_accesslog_str->ptr) + 1;
- #endif /* HAVE_STRUCT_TM_GMTOFF */
-
- *(p->conf.last_generated_accesslog_ts_ptr) = srv->cur_ts;
-@@ -765,14 +763,14 @@ REQUESTDONE_FUNC(log_access_write) {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
- break;
- case FORMAT_REMOTE_USER:
-- if (NULL != (ds = (data_string *)array_get_element(con->environment, "REMOTE_USER")) && ds->value->used > 1) {
-+ if (NULL != (ds = (data_string *)array_get_element(con->environment, "REMOTE_USER")) && !buffer_string_is_empty(ds->value)) {
- accesslog_append_escaped(b, ds->value);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
- }
- break;
- case FORMAT_REQUEST_LINE:
-- if (con->request.request_line->used) {
-+ if (!buffer_string_is_empty(con->request.request_line)) {
- accesslog_append_escaped(b, con->request.request_line);
- }
- break;
-@@ -810,7 +808,7 @@ REQUESTDONE_FUNC(log_access_write) {
- }
- break;
- case FORMAT_FILENAME:
-- if (con->physical.path->used > 1) {
-+ if (!buffer_string_is_empty(con->physical.path)) {
- buffer_append_string_buffer(b, con->physical.path);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
-@@ -834,14 +832,14 @@ REQUESTDONE_FUNC(log_access_write) {
- buffer_append_int(b, srv->cur_ts - con->request_start);
- break;
- case FORMAT_SERVER_NAME:
-- if (con->server_name->used > 1) {
-+ if (!buffer_string_is_empty(con->server_name)) {
- buffer_append_string_buffer(b, con->server_name);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
- }
- break;
- case FORMAT_HTTP_HOST:
-- if (con->uri.authority->used > 1) {
-+ if (!buffer_string_is_empty(con->uri.authority)) {
- accesslog_append_escaped(b, con->uri.authority);
- } else {
- buffer_append_string_len(b, CONST_STR_LEN("-"));
-@@ -849,7 +847,7 @@ REQUESTDONE_FUNC(log_access_write) {
- break;
- case FORMAT_REQUEST_PROTOCOL:
- buffer_append_string_len(b,
-- con->request.http_version == HTTP_VERSION_1_1 ? "HTTP/1.1" : "HTTP/1.0", 8);
-+ con->request.http_version == HTTP_VERSION_1_1 ? "HTTP/1.1" : "HTTP/1.0", 8);
- break;
- case FORMAT_REQUEST_METHOD:
- buffer_append_string(b, get_http_method_name(con->request.http_method));
-@@ -904,19 +902,19 @@ REQUESTDONE_FUNC(log_access_write) {
- buffer_append_string_len(b, CONST_STR_LEN("\n"));
-
- if (p->conf.use_syslog || /* syslog doesn't cache */
-- (p->conf.access_logfile->used && p->conf.access_logfile->ptr[0] == '|') || /* pipes don't cache */
-+ (!buffer_string_is_empty(p->conf.access_logfile) && p->conf.access_logfile->ptr[0] == '|') || /* pipes don't cache */
- newts ||
-- b->used > BUFFER_MAX_REUSE_SIZE) {
-+ buffer_string_length(b) >= BUFFER_MAX_REUSE_SIZE) {
- if (p->conf.use_syslog) {
- #ifdef HAVE_SYSLOG_H
-- if (b->used > 2) {
-+ if (!buffer_string_is_empty(b)) {
- /* syslog appends a \n on its own */
-- syslog(p->conf.syslog_level, "%*s", (int) b->used - 2, b->ptr);
-+ buffer_string_set_length(b, buffer_string_length(b) - 1);
-+ syslog(p->conf.syslog_level, "%s", b->ptr);
- }
- #endif
- } else if (p->conf.log_access_fd != -1) {
-- force_assert(b->used > 0);
-- write(p->conf.log_access_fd, b->ptr, b->used - 1);
-+ write(p->conf.log_access_fd, CONST_BUF_LEN(b));
- }
- buffer_reset(b);
- }
-diff --git a/src/mod_alias.c b/src/mod_alias.c
-index bf22b5f..4625973 100644
---- a/src/mod_alias.c
-+++ b/src/mod_alias.c
-@@ -95,10 +95,10 @@ SETDEFAULTS_FUNC(mod_alias_set_defaults) {
- for (k = j + 1; k < a->used; k ++) {
- const buffer *key = a->data[a->sorted[k]]->key;
-
-- if (key->used < prefix->used) {
-+ if (buffer_string_length(key) < buffer_string_length(prefix)) {
- break;
- }
-- if (memcmp(key->ptr, prefix->ptr, prefix->used - 1) != 0) {
-+ if (memcmp(key->ptr, prefix->ptr, buffer_string_length(prefix)) != 0) {
- break;
- }
- /* ok, they have same prefix. check position */
-@@ -151,22 +151,22 @@ PHYSICALPATH_FUNC(mod_alias_physical_handler) {
- char *uri_ptr;
- size_t k;
-
-- if (con->physical.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON;
-
- mod_alias_patch_connection(srv, con, p);
-
- /* not to include the tailing slash */
-- basedir_len = (con->physical.basedir->used - 1);
-+ basedir_len = buffer_string_length(con->physical.basedir);
- if ('/' == con->physical.basedir->ptr[basedir_len-1]) --basedir_len;
-- uri_len = con->physical.path->used - 1 - basedir_len;
-+ uri_len = buffer_string_length(con->physical.path) - basedir_len;
- uri_ptr = con->physical.path->ptr + basedir_len;
-
- for (k = 0; k < p->conf.alias->used; k++) {
- data_string *ds = (data_string *)p->conf.alias->data[k];
-- int alias_len = ds->key->used - 1;
-+ int alias_len = buffer_string_length(ds->key);
-
- if (alias_len > uri_len) continue;
-- if (ds->key->used == 0) continue;
-+ if (buffer_is_empty(ds->key)) continue;
-
- if (0 == (con->conf.force_lowercase_filenames ?
- strncasecmp(uri_ptr, ds->key->ptr, alias_len) :
-diff --git a/src/mod_auth.c b/src/mod_auth.c
-index d5a3f1c..1870893 100644
---- a/src/mod_auth.c
-+++ b/src/mod_auth.c
-@@ -206,18 +206,18 @@ static handler_t mod_auth_uri_handler(server *srv, connection *con, void *p_d) {
- for (k = 0; k < p->conf.auth_require->used; k++) {
- buffer *require = p->conf.auth_require->data[k]->key;
-
-- if (require->used == 0) continue;
-- if (con->uri.path->used < require->used) continue;
-+ if (buffer_is_empty(require)) continue;
-+ if (buffer_string_length(con->uri.path) < buffer_string_length(require)) continue;
-
- /* if we have a case-insensitive FS we have to lower-case the URI here too */
-
- if (con->conf.force_lowercase_filenames) {
-- if (0 == strncasecmp(con->uri.path->ptr, require->ptr, require->used - 1)) {
-+ if (0 == strncasecmp(con->uri.path->ptr, require->ptr, buffer_string_length(require))) {
- auth_required = 1;
- break;
- }
- } else {
-- if (0 == strncmp(con->uri.path->ptr, require->ptr, require->used - 1)) {
-+ if (0 == strncmp(con->uri.path->ptr, require->ptr, buffer_string_length(require))) {
- auth_required = 1;
- break;
- }
-@@ -248,7 +248,7 @@ static handler_t mod_auth_uri_handler(server *srv, connection *con, void *p_d) {
-
- /* try to get Authorization-header */
-
-- if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Authorization")) && ds->value->used) {
-+ if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Authorization")) && !buffer_is_empty(ds->value)) {
- char *auth_realm;
-
- http_authorization = ds->value->ptr;
-@@ -419,7 +419,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (s->auth_backend_conf->used) {
-+ if (!buffer_string_is_empty(s->auth_backend_conf)) {
- if (0 == strcmp(s->auth_backend_conf->ptr, "htpasswd")) {
- s->auth_backend = AUTH_BACKEND_HTPASSWD;
- } else if (0 == strcmp(s->auth_backend_conf->ptr, "htdigest")) {
-@@ -436,7 +436,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) {
- }
-
- #ifdef USE_LDAP
-- if (s->auth_ldap_filter->used) {
-+ if (!buffer_string_is_empty(s->auth_ldap_filter)) {
- char *dollar;
-
- /* parse filter */
-@@ -562,7 +562,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) {
- }
- }
-
-- switch(s->auth_ldap_hostname->used) {
-+ switch(s->auth_backend) {
- case AUTH_BACKEND_LDAP: {
- handler_t ret = auth_ldap_init(srv, s);
- if (ret == HANDLER_ERROR)
-@@ -588,7 +588,7 @@ handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s) {
- }
- #endif
-
-- if (s->auth_ldap_hostname->used) {
-+ if (!buffer_string_is_empty(s->auth_ldap_hostname)) {
- /* free old context */
- if (NULL != s->ldap) ldap_unbind_s(s->ldap);
-
-@@ -627,7 +627,7 @@ handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s) {
-
-
- /* 1. */
-- if (s->auth_ldap_binddn->used) {
-+ if (!buffer_string_is_empty(s->auth_ldap_binddn)) {
- if (LDAP_SUCCESS != (ret = ldap_simple_bind_s(s->ldap, s->auth_ldap_binddn->ptr, s->auth_ldap_bindpw->ptr))) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret));
-
-diff --git a/src/mod_cgi.c b/src/mod_cgi.c
-index f132b8a..8a7cc2b 100644
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -376,8 +376,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- return FDEVENT_HANDLED_FINISHED;
- }
-
-- hctx->response->ptr[n] = '\0';
-- hctx->response->used = n+1;
-+ buffer_commit(hctx->response, n);
-
- /* split header from body */
-
-@@ -385,7 +384,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- int is_header = 0;
- int is_header_end = 0;
- size_t last_eol = 0;
-- size_t i;
-+ size_t i, header_len;
-
- buffer_append_string_buffer(hctx->response_header, hctx->response);
-
-@@ -412,8 +411,9 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
-
- /* nph (non-parsed headers) */
- if (0 == strncmp(hctx->response_header->ptr, "HTTP/1.", 7)) is_header = 1;
--
-- for (i = 0; !is_header_end && i < hctx->response_header->used - 1; i++) {
-+
-+ header_len = buffer_string_length(hctx->response_header);
-+ for (i = 0; !is_header_end && i < header_len; i++) {
- char c = hctx->response_header->ptr[i];
-
- switch (c) {
-@@ -463,26 +463,25 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) {
- } else {
- const char *bstart;
- size_t blen;
--
-+
-+ /* the body starts after the EOL */
-+ bstart = hctx->response_header->ptr + i;
-+ blen = header_len - i;
-+
- /**
- * i still points to the char after the terminating EOL EOL
- *
- * put it on the last \n again
- */
- i--;
--
-- /* the body starts after the EOL */
-- bstart = hctx->response_header->ptr + (i + 1);
-- blen = (hctx->response_header->used - 1) - (i + 1);
--
-+
- /* string the last \r?\n */
- if (i > 0 && (hctx->response_header->ptr[i - 1] == '\r')) {
- i--;
- }
-
-- hctx->response_header->ptr[i] = '\0';
-- hctx->response_header->used = i + 1; /* the string + \0 */
--
-+ buffer_string_set_length(hctx->response_header, i);
-+
- /* parse the response header */
- cgi_response_parse(srv, con, p, hctx->response_header);
-
-@@ -738,7 +737,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
-
- #ifndef __WIN32
-
-- if (cgi_handler->used > 1) {
-+ if (!buffer_string_is_empty(cgi_handler)) {
- /* stat the exec file */
- if (-1 == (stat(cgi_handler->ptr, &st))) {
- log_error_write(srv, __FILE__, __LINE__, "sbss",
-@@ -800,7 +799,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- }
-
- if (!buffer_string_is_empty(con->server_name)) {
-- size_t len = con->server_name->used - 1;
-+ size_t len = buffer_string_length(con->server_name);
-
- if (con->server_name->ptr[0] == '[') {
- const char *colon = strstr(con->server_name->ptr, "]:");
-@@ -938,7 +937,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
-
- ds = (data_string *)con->request.headers->data[n];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(p->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- cgi_env_add(&env, CONST_BUF_LEN(p->tmp_buf), CONST_BUF_LEN(ds->value));
-@@ -950,7 +949,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
-
- ds = (data_string *)con->environment->data[n];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(p->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- cgi_env_add(&env, CONST_BUF_LEN(p->tmp_buf), CONST_BUF_LEN(ds->value));
-@@ -969,7 +968,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- args = malloc(sizeof(*args) * argc);
- i = 0;
-
-- if (cgi_handler->used > 1) {
-+ if (!buffer_string_is_empty(cgi_handler)) {
- args[i++] = cgi_handler->ptr;
- }
- args[i++] = con->physical.path->ptr;
-@@ -1071,7 +1070,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer *
- }
- break;
- case MEM_CHUNK:
-- if ((r = write(to_cgi_fds[1], c->mem->ptr + c->offset, c->mem->used - c->offset - 1)) < 0) {
-+ if ((r = write(to_cgi_fds[1], c->mem->ptr + c->offset, buffer_string_length(c->mem) - c->offset)) < 0) {
- switch(errno) {
- case ENOSPC:
- con->http_status = 507;
-@@ -1185,7 +1184,7 @@ URIHANDLER_FUNC(cgi_is_handled) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (fn->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(fn)) return HANDLER_GO_ON;
-
- mod_cgi_patch_connection(srv, con, p);
-
-@@ -1193,13 +1192,13 @@ URIHANDLER_FUNC(cgi_is_handled) {
- if (!S_ISREG(sce->st.st_mode)) return HANDLER_GO_ON;
- if (p->conf.execute_x_only == 1 && (sce->st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0) return HANDLER_GO_ON;
-
-- s_len = fn->used - 1;
-+ s_len = buffer_string_length(fn);
-
- for (k = 0; k < p->conf.cgi->used; k++) {
- data_string *ds = (data_string *)p->conf.cgi->data[k];
-- size_t ct_len = ds->key->used - 1;
-+ size_t ct_len = buffer_string_length(ds->key);
-
-- if (ds->key->used == 0) continue;
-+ if (buffer_is_empty(ds->key)) continue;
- if (s_len < ct_len) continue;
-
- if (0 == strncmp(fn->ptr + s_len - ct_len, ds->key->ptr, ct_len)) {
-diff --git a/src/mod_cml.c b/src/mod_cml.c
-index 3033d42..baa23b3 100644
---- a/src/mod_cml.c
-+++ b/src/mod_cml.c
-@@ -185,20 +185,18 @@ static int cache_call_lua(server *srv, connection *con, plugin_data *p, buffer *
- /* cleanup basedir */
- b = p->baseurl;
- buffer_copy_buffer(b, con->uri.path);
-- for (c = b->ptr + b->used - 1; c > b->ptr && *c != '/'; c--);
-+ for (c = b->ptr + buffer_string_length(b); c > b->ptr && *c != '/'; c--);
-
- if (*c == '/') {
-- b->used = c - b->ptr + 2;
-- *(c+1) = '\0';
-+ buffer_string_set_length(b, c - b->ptr + 1);
- }
-
- b = p->basedir;
- buffer_copy_buffer(b, con->physical.path);
-- for (c = b->ptr + b->used - 1; c > b->ptr && *c != '/'; c--);
-+ for (c = b->ptr + buffer_string_length(b); c > b->ptr && *c != '/'; c--);
-
- if (*c == '/') {
-- b->used = c - b->ptr + 2;
-- *(c+1) = '\0';
-+ buffer_string_set_length(b, c - b->ptr + 1);
- }
-
-
-@@ -274,7 +272,7 @@ URIHANDLER_FUNC(mod_cml_is_handled) {
-
- if (buffer_string_is_empty(p->conf.ext)) return HANDLER_GO_ON;
-
-- if (!buffer_is_equal_right_len(con->physical.path, p->conf.ext, p->conf.ext->used - 1)) {
-+ if (!buffer_is_equal_right_len(con->physical.path, p->conf.ext, buffer_string_length(p->conf.ext))) {
- return HANDLER_GO_ON;
- }
-
-diff --git a/src/mod_cml_funcs.c b/src/mod_cml_funcs.c
-index 9d859c7..a377edd 100644
---- a/src/mod_cml_funcs.c
-+++ b/src/mod_cml_funcs.c
-@@ -35,14 +35,9 @@ typedef char HASHHEX[HASHHEXLEN+1];
- int f_crypto_md5(lua_State *L) {
- li_MD5_CTX Md5Ctx;
- HASH HA1;
-- buffer b;
- char hex[33];
- int n = lua_gettop(L);
-
-- b.ptr = hex;
-- b.used = 0;
-- b.size = sizeof(hex);
--
- if (n != 1) {
- lua_pushstring(L, "md5: expected one argument");
- lua_error(L);
-@@ -57,9 +52,9 @@ int f_crypto_md5(lua_State *L) {
- li_MD5_Update(&Md5Ctx, (unsigned char *)lua_tostring(L, 1), lua_strlen(L, 1));
- li_MD5_Final(HA1, &Md5Ctx);
-
-- buffer_copy_string_hex(&b, (char *)HA1, 16);
-+ li_tohex(hex, (const char*) HA1, 16);
-
-- lua_pushstring(L, b.ptr);
-+ lua_pushstring(L, hex);
-
- return 1;
- }
-diff --git a/src/mod_cml_lua.c b/src/mod_cml_lua.c
-index 63dd1e7..895a709 100644
---- a/src/mod_cml_lua.c
-+++ b/src/mod_cml_lua.c
-@@ -102,13 +102,14 @@ static int c_to_lua_push(lua_State *L, int tbl, const char *key, size_t key_len,
-
- static int cache_export_get_params(lua_State *L, int tbl, buffer *qrystr) {
- size_t is_key = 1;
-- size_t i;
-+ size_t i, len;
- char *key = NULL, *val = NULL;
-
- key = qrystr->ptr;
-
- /* we need the \0 */
-- for (i = 0; i < qrystr->used; i++) {
-+ len = buffer_string_length(qrystr);
-+ for (i = 0; i <= len; i++) {
- switch(qrystr->ptr[i]) {
- case '=':
- if (is_key) {
-@@ -129,8 +130,8 @@ static int cache_export_get_params(lua_State *L, int tbl, buffer *qrystr) {
- qrystr->ptr[i] = '\0';
-
- c_to_lua_push(L, tbl,
-- key, strlen(key),
-- val, strlen(val));
-+ key, strlen(key),
-+ val, strlen(val));
- }
-
- key = qrystr->ptr + i + 1;
-@@ -398,7 +399,6 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
- if (ret == 0) {
- data_string *ds;
- char timebuf[sizeof("Sat, 23 Jul 2005 21:20:01 GMT")];
-- buffer tbuf;
-
- con->file_finished = 1;
-
-@@ -411,17 +411,11 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) {
- strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&mtime));
-
- response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"), timebuf, sizeof(timebuf) - 1);
--
-- tbuf.ptr = timebuf;
-- tbuf.used = sizeof(timebuf);
-- tbuf.size = sizeof(timebuf);
-- } else {
-- tbuf.ptr = ds->value->ptr;
-- tbuf.used = ds->value->used;
-- tbuf.size = ds->value->size;
-+ ds = (data_string *)array_get_element(con->response.headers, "Last-Modified");
-+ force_assert(NULL != ds);
- }
-
-- if (HANDLER_FINISHED == http_response_handle_cachable(srv, con, &tbuf)) {
-+ if (HANDLER_FINISHED == http_response_handle_cachable(srv, con, ds->value)) {
- /* ok, the client already has our content,
- * no need to send it again */
-
-diff --git a/src/mod_compress.c b/src/mod_compress.c
-index 120b379..f0ffa1c 100644
---- a/src/mod_compress.c
-+++ b/src/mod_compress.c
-@@ -244,6 +244,7 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
- unsigned char *c;
- unsigned long crc;
- z_stream z;
-+ size_t outlen;
-
- UNUSED(srv);
- UNUSED(con);
-@@ -282,9 +283,9 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
- c[8] = 0x00; /* extra flags */
- c[9] = 0x03; /* UNIX */
-
-- p->b->used = 10;
-- z.next_out = (unsigned char *)p->b->ptr + p->b->used;
-- z.avail_out = p->b->size - p->b->used - 9;
-+ outlen = 10;
-+ z.next_out = (unsigned char *)p->b->ptr + outlen;
-+ z.avail_out = p->b->size - outlen - 9;
- z.total_out = 0;
-
- if (Z_STREAM_END != deflate(&z, Z_FINISH)) {
-@@ -293,11 +294,11 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
- }
-
- /* trailer */
-- p->b->used += z.total_out;
-+ outlen += z.total_out;
-
- crc = generate_crc32c(start, st_size);
-
-- c = (unsigned char *)p->b->ptr + p->b->used;
-+ c = (unsigned char *)p->b->ptr + outlen;
-
- c[0] = (crc >> 0) & 0xff;
- c[1] = (crc >> 8) & 0xff;
-@@ -307,8 +308,8 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data
- c[5] = (z.total_in >> 8) & 0xff;
- c[6] = (z.total_in >> 16) & 0xff;
- c[7] = (z.total_in >> 24) & 0xff;
-- p->b->used += 8;
-- p->b->ptr[p->b->used++] = '\0';
-+ outlen += 8;
-+ buffer_commit(p->b, outlen);
-
- if (Z_OK != deflateEnd(&z)) {
- return -1;
-@@ -398,16 +399,15 @@ static int deflate_file_to_buffer_bzip2(server *srv, connection *con, plugin_dat
- return -1;
- }
-
-+ if (BZ_OK != BZ2_bzCompressEnd(&bz)) {
-+ return -1;
-+ }
-+
- /* file is too large for now */
- if (bz.total_out_hi32) return -1;
-
- /* trailer */
-- p->b->used = bz.total_out_lo32;
-- p->b->ptr[p->b->used++] = '\0';
--
-- if (BZ_OK != BZ2_bzCompressEnd(&bz)) {
-- return -1;
-- }
-+ buffer_commit(p->b, bz.total_out_lo32);
-
- return 0;
- }
-@@ -434,8 +434,8 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu
- buffer_copy_buffer(p->ofn, p->conf.compress_cache_dir);
- buffer_append_slash(p->ofn);
-
-- if (0 == strncmp(con->physical.path->ptr, con->physical.doc_root->ptr, con->physical.doc_root->used-1)) {
-- buffer_append_string(p->ofn, con->physical.path->ptr + con->physical.doc_root->used - 1);
-+ if (0 == strncmp(con->physical.path->ptr, con->physical.doc_root->ptr, buffer_string_length(con->physical.doc_root))) {
-+ buffer_append_string(p->ofn, con->physical.path->ptr + buffer_string_length(con->physical.doc_root));
- } else {
- buffer_append_string_buffer(p->ofn, con->uri.path);
- }
-@@ -883,7 +883,7 @@ PHYSICALPATH_FUNC(mod_compress_physical) {
- }
-
- /* deflate it */
-- if (use_etag && p->conf.compress_cache_dir->used) {
-+ if (use_etag && !buffer_string_is_empty(p->conf.compress_cache_dir)) {
- if (0 != deflate_file_to_file(srv, con, p, con->physical.path, sce, compression_type))
- return HANDLER_GO_ON;
- } else {
-@@ -897,7 +897,7 @@ PHYSICALPATH_FUNC(mod_compress_physical) {
- }
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(sce->content_type));
- /* let mod_staticfile handle the cached compressed files, physical path was modified */
-- return (use_etag && p->conf.compress_cache_dir->used) ? HANDLER_GO_ON : HANDLER_FINISHED;
-+ return (use_etag && !buffer_string_is_empty(p->conf.compress_cache_dir)) ? HANDLER_GO_ON : HANDLER_FINISHED;
- }
- }
- }
-diff --git a/src/mod_dirlisting.c b/src/mod_dirlisting.c
-index e2e0bfa..d8bf3a3 100644
---- a/src/mod_dirlisting.c
-+++ b/src/mod_dirlisting.c
-@@ -492,7 +492,7 @@ static void http_list_directory_header(server *srv, connection *con, plugin_data
- buffer_append_string_encoded(out, CONST_BUF_LEN(con->uri.path), ENCODING_MINIMAL_XML);
- buffer_append_string_len(out, CONST_STR_LEN("</title>\n"));
-
-- if (p->conf.external_css->used > 1) {
-+ if (!buffer_string_is_empty(p->conf.external_css)) {
- buffer_append_string_len(out, CONST_STR_LEN("<link rel=\"stylesheet\" type=\"text/css\" href=\""));
- buffer_append_string_buffer(out, p->conf.external_css);
- buffer_append_string_len(out, CONST_STR_LEN("\" />\n"));
-@@ -614,7 +614,7 @@ static void http_list_directory_footer(server *srv, connection *con, plugin_data
- "<div class=\"foot\">"
- ));
-
-- if (p->conf.set_footer->used > 1) {
-+ if (buffer_string_is_empty(p->conf.set_footer)) {
- buffer_append_string_buffer(out, p->conf.set_footer);
- } else if (buffer_is_empty(con->conf.server_tag)) {
- buffer_append_string_len(out, CONST_STR_LEN(PACKAGE_DESC));
-@@ -653,9 +653,9 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- struct tm tm;
- #endif
-
-- if (dir->used == 0) return -1;
-+ if (buffer_string_is_empty(dir)) return -1;
-
-- i = dir->used - 1;
-+ i = buffer_string_length(dir);
-
- #ifdef HAVE_PATHCONF
- if (0 >= (name_max = pathconf(dir->ptr, _PC_NAME_MAX))) {
-@@ -672,8 +672,8 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- name_max = NAME_MAX;
- #endif
-
-- path = malloc(dir->used + name_max);
-- force_assert(path);
-+ path = malloc(buffer_string_length(dir) + name_max + 1);
-+ force_assert(NULL != path);
- strcpy(path, dir->ptr);
- path_file = path + i;
-
-@@ -846,10 +846,10 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf
- data_string *ds = (data_string *)con->conf.mimetypes->data[k];
- size_t ct_len;
-
-- if (ds->key->used == 0)
-+ if (buffer_is_empty(ds->key))
- continue;
-
-- ct_len = ds->key->used - 1;
-+ ct_len = buffer_string_length(ds->key);
- if (tmp->namelen < ct_len)
- continue;
-
-@@ -925,9 +925,9 @@ URIHANDLER_FUNC(mod_dirlisting_subrequest) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (con->physical.path->used == 0) return HANDLER_GO_ON;
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-- if (con->uri.path->ptr[con->uri.path->used - 2] != '/') return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-+ if (con->uri.path->ptr[buffer_string_length(con->uri.path) - 1] != '/') return HANDLER_GO_ON;
-
- mod_dirlisting_patch_connection(srv, con, p);
-
-diff --git a/src/mod_evasive.c b/src/mod_evasive.c
-index a20aff5..d9b8732 100644
---- a/src/mod_evasive.c
-+++ b/src/mod_evasive.c
-@@ -138,7 +138,7 @@ URIHANDLER_FUNC(mod_evasive_uri_handler) {
- size_t conns_by_ip = 0;
- size_t j;
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_evasive_patch_connection(srv, con, p);
-
-diff --git a/src/mod_evhost.c b/src/mod_evhost.c
-index 5281523..e728551 100644
---- a/src/mod_evhost.c
-+++ b/src/mod_evhost.c
-@@ -146,7 +146,7 @@ SETDEFAULTS_FUNC(mod_evhost_set_defaults) {
- return HANDLER_ERROR;
- }
-
-- if (s->path_pieces_raw->used != 0) {
-+ if (!buffer_string_is_empty(s->path_pieces_raw)) {
- mod_evhost_parse_pattern(s);
- }
- }
-@@ -164,8 +164,7 @@ SETDEFAULTS_FUNC(mod_evhost_set_defaults) {
- */
-
- static int mod_evhost_parse_host(connection *con,array *host) {
-- /* con->uri.authority->used is always > 0 if we come here */
-- register char *ptr = con->uri.authority->ptr + con->uri.authority->used - 1;
-+ register char *ptr = con->uri.authority->ptr + buffer_string_length(con->uri.authority);
- char *colon = ptr; /* needed to filter out the colon (if exists) */
- int first = 1;
- data_string *ds;
-@@ -265,7 +264,7 @@ static handler_t mod_evhost_uri_handler(server *srv, connection *con, void *p_d)
- stat_cache_entry *sce = NULL;
-
- /* not authority set */
-- if (con->uri.authority->used == 0) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(con->uri.authority)) return HANDLER_GO_ON;
-
- mod_evhost_patch_connection(srv, con, p);
-
-@@ -300,9 +299,7 @@ static handler_t mod_evhost_uri_handler(server *srv, connection *con, void *p_d)
- buffer_append_string_len(p->tmp_buf, con->uri.authority->ptr, colon - con->uri.authority->ptr); /* adds fqdn */
- }
- } else if (NULL != (ds = (data_string *)array_get_element(parsed_host,p->conf.path_pieces[i]->ptr))) {
-- if (ds->value->used) {
-- buffer_append_string_buffer(p->tmp_buf,ds->value);
-- }
-+ buffer_append_string_buffer(p->tmp_buf,ds->value);
- } else {
- /* unhandled %-sequence */
- }
-diff --git a/src/mod_expire.c b/src/mod_expire.c
-index 31a81b7..e26c3c6 100644
---- a/src/mod_expire.c
-+++ b/src/mod_expire.c
-@@ -90,7 +90,7 @@ static int mod_expire_get_offset(server *srv, plugin_data *p, buffer *expire, ti
- * e.g. 'access 1 years'
- */
-
-- if (expire->used == 0) {
-+ if (buffer_string_is_empty(expire)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "empty:");
- return -1;
-@@ -288,22 +288,21 @@ URIHANDLER_FUNC(mod_expire_path_handler) {
- int s_len;
- size_t k;
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_expire_patch_connection(srv, con, p);
-
-- s_len = con->uri.path->used - 1;
-+ s_len = buffer_string_length(con->uri.path);
-
- for (k = 0; k < p->conf.expire_url->used; k++) {
- data_string *ds = (data_string *)p->conf.expire_url->data[k];
-- int ct_len = ds->key->used - 1;
-+ int ct_len = buffer_string_length(ds->key);
-
- if (ct_len > s_len) continue;
-- if (ds->key->used == 0) continue;
-+ if (buffer_is_empty(ds->key)) continue;
-
- if (0 == strncmp(con->uri.path->ptr, ds->key->ptr, ct_len)) {
- time_t ts, expires;
-- size_t len;
- stat_cache_entry *sce = NULL;
-
- /* if stat fails => sce == NULL, ignore return value */
-@@ -332,14 +331,8 @@ URIHANDLER_FUNC(mod_expire_path_handler) {
- /* expires should be at least srv->cur_ts */
- if (expires < srv->cur_ts) expires = srv->cur_ts;
-
-- if (0 == (len = strftime(p->expire_tstmp->ptr, p->expire_tstmp->size - 1,
-- "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(expires))))) {
-- /* could not set expire header, out of mem */
--
-- return HANDLER_GO_ON;
-- }
--
-- p->expire_tstmp->used = len + 1;
-+ buffer_string_prepare_copy(p->expire_tstmp, 255);
-+ buffer_append_strftime(p->expire_tstmp, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(expires)));
-
- /* HTTP/1.0 */
- response_header_overwrite(srv, con, CONST_STR_LEN("Expires"), CONST_BUF_LEN(p->expire_tstmp));
-diff --git a/src/mod_extforward.c b/src/mod_extforward.c
-index 99c4af5..7f77982 100644
---- a/src/mod_extforward.c
-+++ b/src/mod_extforward.c
-@@ -236,7 +236,7 @@ static void put_string_into_array_len(array *ary, const char *str, int len)
- static array *extract_forward_array(buffer *pbuffer)
- {
- array *result = array_init();
-- if (pbuffer->used > 0) {
-+ if (!buffer_string_is_empty(pbuffer)) {
- char *base, *curr;
- /* state variable, 0 means not in string, 1 means in string */
- int in_str = 0;
-diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c
-index a935961..d16306c 100644
---- a/src/mod_fastcgi.c
-+++ b/src/mod_fastcgi.c
-@@ -784,7 +784,7 @@ static int parse_binpath(char_array *env, buffer *b) {
- /* search for spaces */
-
- start = b->ptr;
-- for (i = 0; i < b->used - 1; i++) {
-+ for (i = 0; i < buffer_string_length(b); i++) {
- switch(b->ptr[i]) {
- case ' ':
- case '\t':
-@@ -863,19 +863,19 @@ static int fcgi_spawn_connection(server *srv,
-
- #ifdef HAVE_SYS_UN_H
- fcgi_addr_un.sun_family = AF_UNIX;
-- if (proc->unixsocket->used > sizeof(fcgi_addr_un.sun_path)) {
-+ if (buffer_string_length(proc->unixsocket) + 1 > sizeof(fcgi_addr_un.sun_path)) {
- log_error_write(srv, __FILE__, __LINE__, "sB",
- "ERROR: Unix Domain socket filename too long:",
- proc->unixsocket);
- return -1;
- }
-- memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, proc->unixsocket->used);
-+ memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, buffer_string_length(proc->unixsocket) + 1);
-
- #ifdef SUN_LEN
- servlen = SUN_LEN(&fcgi_addr_un);
- #else
- /* stevens says: */
-- servlen = proc->unixsocket->used + sizeof(fcgi_addr_un.sun_family);
-+ servlen = buffer_string_length(proc->unixsocket) + 1 + sizeof(fcgi_addr_un.sun_family);
- #endif
- socket_type = AF_UNIX;
- fcgi_addr = (struct sockaddr *) &fcgi_addr_un;
-@@ -1324,7 +1324,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) {
- /* unix domain socket */
- struct sockaddr_un un;
-
-- if (host->unixsocket->used > sizeof(un.sun_path) - 2) {
-+ if (buffer_string_length(host->unixsocket) + 1 > sizeof(un.sun_path) - 2) {
- log_error_write(srv, __FILE__, __LINE__, "sbsbsbs",
- "unixsocket is too long in:",
- da->key, "= (",
-@@ -1667,19 +1667,19 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h
- #ifdef HAVE_SYS_UN_H
- /* use the unix domain socket */
- fcgi_addr_un.sun_family = AF_UNIX;
-- if (proc->unixsocket->used > sizeof(fcgi_addr_un.sun_path)) {
-+ if (buffer_string_length(proc->unixsocket) + 1 > sizeof(fcgi_addr_un.sun_path)) {
- log_error_write(srv, __FILE__, __LINE__, "sB",
- "ERROR: Unix Domain socket filename too long:",
- proc->unixsocket);
- return -1;
- }
-- memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, proc->unixsocket->used);
-+ memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, buffer_string_length(proc->unixsocket) + 1);
-
- #ifdef SUN_LEN
- servlen = SUN_LEN(&fcgi_addr_un);
- #else
- /* stevens says: */
-- servlen = proc->unixsocket->used + sizeof(fcgi_addr_un.sun_family);
-+ servlen = buffer_string_length(proc->unixsocket) + 1 + sizeof(fcgi_addr_un.sun_family);
- #endif
- fcgi_addr = (struct sockaddr *) &fcgi_addr_un;
-
-@@ -1774,7 +1774,7 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat
-
- ds = (data_string *)con->request.headers->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)),con);
-@@ -1786,7 +1786,7 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat
-
- ds = (data_string *)con->environment->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)), con);
-@@ -1833,8 +1833,8 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_BUF_LEN(con->conf.server_tag)),con)
- }
-
-- if (con->server_name->used) {
-- size_t len = con->server_name->used - 1;
-+ if (!buffer_is_empty(con->server_name)) {
-+ size_t len = buffer_string_length(con->server_name);
-
- if (con->server_name->ptr[0] == '[') {
- const char *colon = strstr(con->server_name->ptr, "]:");
-@@ -1961,7 +1961,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.basedir)),con)
- }
-
-- if (host->strip_request_uri->used > 1) {
-+ if (!buffer_string_is_empty(host->strip_request_uri)) {
- /* we need at least one char to strip off */
- /**
- * /app1/index/list
-@@ -1971,18 +1971,18 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- * /index/list
- *
- */
-- if ('/' != host->strip_request_uri->ptr[host->strip_request_uri->used - 2]) {
-+ if ('/' != host->strip_request_uri->ptr[buffer_string_length(host->strip_request_uri) - 1]) {
- /* fix the user-input to have / as last char */
- buffer_append_string_len(host->strip_request_uri, CONST_STR_LEN("/"));
- }
-
-- if (con->request.orig_uri->used >= host->strip_request_uri->used &&
-- 0 == strncmp(con->request.orig_uri->ptr, host->strip_request_uri->ptr, host->strip_request_uri->used - 1)) {
-+ if (buffer_string_length(con->request.orig_uri) >= buffer_string_length(host->strip_request_uri) &&
-+ 0 == strncmp(con->request.orig_uri->ptr, host->strip_request_uri->ptr, buffer_string_length(host->strip_request_uri))) {
- /* the left is the same */
-
- fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"),
-- con->request.orig_uri->ptr + (host->strip_request_uri->used - 2),
-- con->request.orig_uri->used - (host->strip_request_uri->used - 2) - 1);
-+ con->request.orig_uri->ptr + (buffer_string_length(host->strip_request_uri) - 1),
-+ buffer_string_length(con->request.orig_uri) - (buffer_string_length(host->strip_request_uri) - 1));
- } else {
- FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)),con)
- }
-@@ -2022,7 +2022,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) {
- fcgi_header(&(header), FCGI_PARAMS, request_id, 0, 0);
- buffer_append_string_len(b, (const char *)&header, sizeof(header));
-
-- hctx->wb->bytes_in += b->used - 1;
-+ hctx->wb->bytes_in += buffer_string_length(b);
- chunkqueue_append_buffer(hctx->wb, b);
- buffer_free(b);
- }
-@@ -2303,11 +2303,10 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p
- if (0 == toread) break;
- }
-
-- if ((packet->b->used == 0) ||
-- (packet->b->used - 1 < sizeof(FCGI_Header))) {
-+ if (buffer_string_length(packet->b) < sizeof(FCGI_Header)) {
- /* no header */
- if (hctx->plugin_data->conf.debug) {
-- log_error_write(srv, __FILE__, __LINE__, "sdsds", "FastCGI: header too small:", packet->b->used, "bytes <", sizeof(FCGI_Header), "bytes, waiting for more data");
-+ log_error_write(srv, __FILE__, __LINE__, "sdsds", "FastCGI: header too small:", buffer_string_length(packet->b), "bytes <", sizeof(FCGI_Header), "bytes, waiting for more data");
- }
-
- buffer_free(packet->b);
-@@ -2324,13 +2323,13 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p
- packet->padding = header->paddingLength;
-
- /* ->b should only be the content */
-- buffer_copy_string_len(packet->b, CONST_STR_LEN("")); /* used == 1 */
-+ buffer_string_set_length(packet->b, 0);
-
- if (packet->len) {
- /* copy the content */
-- for (; c && (packet->b->used < packet->len + 1); c = c->next) {
-- size_t weWant = packet->len - (packet->b->used - 1);
-- size_t weHave = c->mem->used - c->offset - offset - 1;
-+ for (; c && (buffer_string_length(packet->b) < packet->len); c = c->next) {
-+ size_t weWant = packet->len - buffer_string_length(packet->b);
-+ size_t weHave = buffer_string_length(c->mem) - c->offset - offset;
-
- if (weHave > weWant) weHave = weWant;
-
-@@ -2340,24 +2339,23 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p
- offset = 0;
- }
-
-- if (packet->b->used < packet->len + 1) {
-+ if (buffer_string_length(packet->b) < packet->len) {
- /* we didn't get the full packet */
-
- buffer_free(packet->b);
- return -1;
- }
-
-- packet->b->used -= packet->padding;
-- packet->b->ptr[packet->b->used - 1] = '\0';
-+ buffer_string_set_length(packet->b, buffer_string_length(packet->b) - packet->padding);
- }
-
- /* tag the chunks as read */
- toread = packet->len + sizeof(FCGI_Header);
- for (c = hctx->rb->first; c && toread; c = c->next) {
-- if (c->mem->used - c->offset - 1 <= toread) {
-+ if (buffer_string_length(c->mem) - c->offset <= toread) {
- /* we read this whole buffer, move it to unused */
-- toread -= c->mem->used - c->offset - 1;
-- c->offset = c->mem->used - 1; /* everthing has been written */
-+ toread -= buffer_string_length(c->mem) - c->offset;
-+ c->offset = buffer_string_length(c->mem); /* everthing has been written */
- } else {
- c->offset += toread;
- toread = 0;
-@@ -2451,14 +2449,12 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- char *hend = c + 4; /* header end == body start */
- size_t hlen = hend - hctx->response_header->ptr;
- buffer_copy_string_len(packet.b, hend, buffer_string_length(hctx->response_header) - hlen);
-- hctx->response_header->used = hlen;
-- hctx->response_header->ptr[hctx->response_header->used++] = '\0';
-+ buffer_string_set_length(hctx->response_header, hlen);
- } else if (NULL != (c = buffer_search_string_len(hctx->response_header, CONST_STR_LEN("\n\n")))) {
- char *hend = c + 2; /* header end == body start */
- size_t hlen = hend - hctx->response_header->ptr;
- buffer_copy_string_len(packet.b, hend, buffer_string_length(hctx->response_header) - hlen);
-- hctx->response_header->used = hlen;
-- hctx->response_header->ptr[hctx->response_header->used++] = '\0';
-+ buffer_string_set_length(hctx->response_header, hlen);
- } else {
- /* no luck, no header found */
- break;
-@@ -2525,7 +2521,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) {
- http_chunk_append_buffer(srv, con, packet.b);
- joblist_append(srv, con);
- }
-- } else if (hctx->send_content_body && packet.b->used > 1) {
-+ } else if (hctx->send_content_body && !buffer_string_is_empty(packet.b)) {
- if (con->request.http_version == HTTP_VERSION_1_1 &&
- !(con->parsed_response & HTTP_CONTENT_LENGTH)) {
- /* enable chunked-transfer-encoding */
-@@ -2721,7 +2717,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
- log_error_write(srv, __FILE__, __LINE__, "s", "fatal error: host = NULL");
- return HANDLER_ERROR;
- }
-- if ((!host->port && !host->unixsocket->used)) {
-+ if ((!host->port && buffer_string_is_empty(host->unixsocket))) {
- log_error_write(srv, __FILE__, __LINE__, "s", "fatal error: neither host->port nor host->unixsocket is set");
- return HANDLER_ERROR;
- }
-@@ -2794,7 +2790,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) {
- if (proc->load < hctx->proc->load) hctx->proc = proc;
- }
-
-- ret = host->unixsocket->used ? AF_UNIX : AF_INET;
-+ ret = buffer_string_is_empty(host->unixsocket) ? AF_INET : AF_UNIX;
-
- if (-1 == (hctx->fd = socket(ret, SOCK_STREAM, 0))) {
- if (errno == EMFILE ||
-@@ -3335,7 +3331,7 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i
-
- if (buffer_string_is_empty(fn)) return HANDLER_GO_ON;
-
-- s_len = fn->used - 1;
-+ s_len = buffer_string_length(fn);
-
- fcgi_patch_connection(srv, con, p);
-
-@@ -3352,9 +3348,9 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i
- data_string *ds = (data_string *)p->conf.ext_mapping->data[k];
- size_t ct_len; /* length of the config entry */
-
-- if (ds->key->used == 0) continue;
-+ if (buffer_is_empty(ds->key)) continue;
-
-- ct_len = ds->key->used - 1;
-+ ct_len = buffer_string_length(ds->key);
-
- if (s_len < ct_len) continue;
-
-@@ -3380,18 +3376,20 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i
- }
-
- if (extension == NULL) {
-+ size_t uri_path_len = buffer_string_length(con->uri.path);
-+
- /* check if extension matches */
- for (k = 0; k < p->conf.exts->used; k++) {
- size_t ct_len; /* length of the config entry */
- fcgi_extension *ext = p->conf.exts->exts[k];
-
-- if (ext->key->used == 0) continue;
-+ if (buffer_is_empty(ext->key)) continue;
-
-- ct_len = ext->key->used - 1;
-+ ct_len = buffer_string_length(ext->key);
-
- /* check _url_ in the form "/fcgi_pattern" */
- if (ext->key->ptr[0] == '/') {
-- if ((ct_len <= con->uri.path->used -1) &&
-+ if ((ct_len <= uri_path_len) &&
- (strncmp(con->uri.path->ptr, ext->key->ptr, ct_len) == 0)) {
- extension = ext;
- break;
-@@ -3506,17 +3504,14 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i
- /* the rewrite is only done for /prefix/? matches */
- if (host->fix_root_path_name && extension->key->ptr[0] == '/' && extension->key->ptr[1] == '\0') {
- buffer_copy_string(con->request.pathinfo, con->uri.path->ptr);
-- con->uri.path->used = 1;
-- con->uri.path->ptr[con->uri.path->used - 1] = '\0';
-+ buffer_string_set_length(con->uri.path, 0);
- } else if (extension->key->ptr[0] == '/' &&
-- con->uri.path->used > extension->key->used &&
-- NULL != (pathinfo = strchr(con->uri.path->ptr + extension->key->used - 1, '/'))) {
-+ buffer_string_length(con->uri.path) > buffer_string_length(extension->key) &&
-+ NULL != (pathinfo = strchr(con->uri.path->ptr + buffer_string_length(extension->key), '/'))) {
- /* rewrite uri.path and pathinfo */
-
- buffer_copy_string(con->request.pathinfo, pathinfo);
--
-- con->uri.path->used -= con->request.pathinfo->used - 1;
-- con->uri.path->ptr[con->uri.path->used - 1] = '\0';
-+ buffer_string_set_length(con->uri.path, buffer_string_length(con->uri.path) - buffer_string_length(con->request.pathinfo));
- }
- }
- }
-diff --git a/src/mod_flv_streaming.c b/src/mod_flv_streaming.c
-index 1c1a356..db041e2 100644
---- a/src/mod_flv_streaming.c
-+++ b/src/mod_flv_streaming.c
-@@ -136,13 +136,14 @@ static int mod_flv_streaming_patch_connection(server *srv, connection *con, plug
-
- static int split_get_params(array *get_params, buffer *qrystr) {
- size_t is_key = 1;
-- size_t i;
-+ size_t i, len;
- char *key = NULL, *val = NULL;
-
- key = qrystr->ptr;
-
- /* we need the \0 */
-- for (i = 0; i < qrystr->used; i++) {
-+ len = buffer_string_length(qrystr);
-+ for (i = 0; i <= len; i++) {
- switch(qrystr->ptr[i]) {
- case '=':
- if (is_key) {
-@@ -195,14 +196,14 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) {
-
- mod_flv_streaming_patch_connection(srv, con, p);
-
-- s_len = con->physical.path->used - 1;
-+ s_len = buffer_string_length(con->physical.path);
-
- for (k = 0; k < p->conf.extensions->used; k++) {
- data_string *ds = (data_string *)p->conf.extensions->data[k];
-- int ct_len = ds->value->used - 1;
-+ int ct_len = buffer_string_length(ds->value);
-
- if (ct_len > s_len) continue;
-- if (ds->value->used == 0) continue;
-+ if (buffer_is_empty(ds->value)) continue;
-
- if (0 == strncmp(con->physical.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) {
- data_string *get_param;
-@@ -221,7 +222,7 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) {
- }
-
- /* too short */
-- if (get_param->value->used < 2) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(get_param->value)) return HANDLER_GO_ON;
-
- /* check if it is a number */
- start = strtol(get_param->value->ptr, &err, 10);
-diff --git a/src/mod_indexfile.c b/src/mod_indexfile.c
-index fe750c1..13d18e2 100644
---- a/src/mod_indexfile.c
-+++ b/src/mod_indexfile.c
-@@ -141,8 +141,8 @@ URIHANDLER_FUNC(mod_indexfile_subrequest) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-- if (con->uri.path->ptr[con->uri.path->used - 2] != '/') return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-+ if (con->uri.path->ptr[buffer_string_length(con->uri.path) - 1] != '/') return HANDLER_GO_ON;
-
- mod_indexfile_patch_connection(srv, con, p);
-
-diff --git a/src/mod_magnet.c b/src/mod_magnet.c
-index 80cb799..8f89d4e 100644
---- a/src/mod_magnet.c
-+++ b/src/mod_magnet.c
-@@ -189,17 +189,12 @@ static int magnet_array_next(lua_State *L) {
-
- if (pos >= a->used) return 0;
- if (NULL != (du = a->data[pos])) {
-- if (du->key->used) {
-- lua_pushlstring(L, du->key->ptr, du->key->used - 1);
-- }
-- else {
-- lua_pushlstring(L, "", 0);
-- }
-+ lua_pushlstring(L, CONST_BUF_LEN(du->key));
- switch (du->type) {
- case TYPE_STRING:
- ds = (data_string *)du;
-- if (ds->value && ds->value->used) {
-- lua_pushlstring(L, ds->value->ptr, ds->value->used - 1);
-+ if (!buffer_is_empty(ds->value)) {
-+ lua_pushlstring(L, CONST_BUF_LEN(ds->value));
- } else {
- lua_pushnil(L);
- }
-@@ -252,8 +247,9 @@ static int magnet_stat(lua_State *L) {
- const char *s = luaL_checkstring(L, 1);
- server *srv;
- connection *con;
-- buffer sb;
-+ buffer *sb;
- stat_cache_entry *sce = NULL;
-+ handler_t res;
-
- lua_pushstring(L, "lighty.srv");
- lua_gettable(L, LUA_REGISTRYINDEX);
-@@ -265,12 +261,12 @@ static int magnet_stat(lua_State *L) {
- con = lua_touserdata(L, -1);
- lua_pop(L, 1);
-
-- sb.ptr = (char *)s;
-- sb.used = sb.size = strlen(s) + 1;
--
-- if (HANDLER_GO_ON != stat_cache_get_entry(srv, con, &sb, &sce)) {
-- lua_pushnil(L);
-+ sb = buffer_init_string(s);
-+ res = stat_cache_get_entry(srv, con, sb, &sce);
-+ buffer_free(sb);
-
-+ if (HANDLER_GO_ON != res) {
-+ lua_pushnil(L);
- return 1;
- }
-
-@@ -324,7 +320,7 @@ static int magnet_stat(lua_State *L) {
- buffer *b = buffer_init();
- etag_mutate(b, sce->etag);
-
-- lua_pushlstring(L, b->ptr, b->used - 1);
-+ lua_pushlstring(L, CONST_BUF_LEN(b));
- buffer_free(b);
- } else {
- lua_pushnil(L);
-@@ -332,7 +328,7 @@ static int magnet_stat(lua_State *L) {
- lua_setfield(L, -2, "etag");
-
- if (!buffer_string_is_empty(sce->content_type)) {
-- lua_pushlstring(L, sce->content_type->ptr, sce->content_type->used - 1);
-+ lua_pushlstring(L, CONST_BUF_LEN(sce->content_type));
- } else {
- lua_pushnil(L);
- }
-@@ -369,8 +365,8 @@ static int magnet_reqhdr_get(lua_State *L) {
- lua_pop(L, 1);
-
- if (NULL != (ds = (data_string *)array_get_element(con->request.headers, key))) {
-- if (ds->value->used) {
-- lua_pushlstring(L, ds->value->ptr, ds->value->used - 1);
-+ if (!buffer_is_empty(ds->value)) {
-+ lua_pushlstring(L, CONST_BUF_LEN(ds->value));
- } else {
- lua_pushnil(L);
- }
-@@ -555,8 +551,8 @@ static int magnet_env_get(lua_State *L) {
-
- dest = magnet_env_get_buffer(srv, con, key);
-
-- if (dest && dest->used) {
-- lua_pushlstring(L, dest->ptr, dest->used - 1);
-+ if (!buffer_is_empty(dest)) {
-+ lua_pushlstring(L, CONST_BUF_LEN(dest));
- } else {
- lua_pushnil(L);
- }
-@@ -617,8 +613,8 @@ static int magnet_env_next(lua_State *L) {
- lua_pushstring(L, magnet_env[pos].name);
-
- dest = magnet_env_get_buffer_by_id(srv, con, magnet_env[pos].type);
-- if (dest && dest->used) {
-- lua_pushlstring(L, dest->ptr, dest->used - 1);
-+ if (!buffer_is_empty(dest)) {
-+ lua_pushlstring(L, CONST_BUF_LEN(dest));
- } else {
- lua_pushnil(L);
- }
-@@ -649,7 +645,8 @@ static int magnet_cgi_get(lua_State *L) {
- con = lua_touserdata(L, -1);
- lua_pop(L, 1);
-
-- if (NULL != (ds = (data_string *)array_get_element(con->environment, key)) && ds->value->used)
-+ ds = (data_string *)array_get_element(con->environment, key);
-+ if (!buffer_is_empty(ds->value))
- lua_pushlstring(L, CONST_BUF_LEN(ds->value));
- else
- lua_pushnil(L);
-diff --git a/src/mod_mysql_vhost.c b/src/mod_mysql_vhost.c
-index 7d679fb..21260d5 100644
---- a/src/mod_mysql_vhost.c
-+++ b/src/mod_mysql_vhost.c
-@@ -25,10 +25,6 @@
- * for domain to directory lookups,
- * i.e virtual hosts (vhosts).
- *
-- * Optionally sets fcgi_offset and fcgi_arg
-- * in preparation for fcgi.c to handle
-- * per-user fcgi chroot jails.
-- *
- * /ada@riksnet.se 2004-12-06
- */
-
-@@ -63,8 +59,6 @@ typedef struct {
- typedef struct {
- buffer *server_name;
- buffer *document_root;
-- buffer *fcgi_arg;
-- unsigned fcgi_offset;
- } plugin_connection_data;
-
- /* init the plugin data */
-@@ -136,8 +130,6 @@ static void* mod_mysql_vhost_connection_data(server *srv, connection *con, void
-
- c->server_name = buffer_init();
- c->document_root = buffer_init();
-- c->fcgi_arg = buffer_init();
-- c->fcgi_offset = 0;
-
- return con->plugin_ctx[p->id] = c;
- }
-@@ -158,8 +150,6 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_connection_close) {
-
- buffer_free(c->server_name);
- buffer_free(c->document_root);
-- buffer_free(c->fcgi_arg);
-- c->fcgi_offset = 0;
-
- free(c);
-
-@@ -222,7 +212,7 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
- s->mysql_pre = buffer_init();
- s->mysql_post = buffer_init();
-
-- if (sel->used && (qmark = strchr(sel->ptr, '?'))) {
-+ if (!buffer_string_is_empty(sel) && (qmark = strchr(sel->ptr, '?'))) {
- *qmark = '\0';
- buffer_copy_string(s->mysql_pre, sel->ptr);
- buffer_copy_string(s->mysql_post, qmark+1);
-@@ -258,7 +248,7 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
- mysql_options(s->mysql, MYSQL_OPT_RECONNECT, &reconnect);
- #endif
-
--#define FOO(x) (s->x->used ? s->x->ptr : NULL)
-+#define FOO(x) (buffer_string_is_empty(s->x) ? NULL : s->x->ptr)
-
- #if MYSQL_VERSION_ID >= 40100
- /* CLIENT_MULTI_STATEMENTS first appeared in 4.1 */
-@@ -334,37 +324,35 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
- MYSQL_RES *result = NULL;
-
- /* no host specified? */
-- if (!con->uri.authority->used) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(con->uri.authority)) return HANDLER_GO_ON;
-
- mod_mysql_vhost_patch_connection(srv, con, p);
-
- if (!p->conf.mysql) return HANDLER_GO_ON;
-- if (0 == p->conf.mysql_pre->used) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(p->conf.mysql_pre)) return HANDLER_GO_ON;
-
- /* sets up connection data if not done yet */
- c = mod_mysql_vhost_connection_data(srv, con, p_d);
-
- /* check if cached this connection */
-- if (c->server_name->used && /* con->uri.authority->used && */
-- buffer_is_equal(c->server_name, con->uri.authority)) goto GO_ON;
-+ if (buffer_is_equal(c->server_name, con->uri.authority)) goto GO_ON;
-
- /* build and run SQL query */
- buffer_copy_buffer(p->tmp_buf, p->conf.mysql_pre);
-- if (p->conf.mysql_post->used) {
-+ if (!buffer_is_empty(p->conf.mysql_post)) {
- /* escape the uri.authority */
- unsigned long to_len;
-
-- /* 'to' has to be 'from_len * 2 + 1' */
-- buffer_string_prepare_append(p->tmp_buf, (con->uri.authority->used - 1) * 2 + 1);
-+ buffer_string_prepare_append(p->tmp_buf, buffer_string_length(con->uri.authority) * 2);
-
- to_len = mysql_real_escape_string(p->conf.mysql,
-- p->tmp_buf->ptr + p->tmp_buf->used - 1,
-- con->uri.authority->ptr, con->uri.authority->used - 1);
-- p->tmp_buf->used += to_len;
-+ p->tmp_buf->ptr + buffer_string_length(p->tmp_buf),
-+ CONST_BUF_LEN(con->uri.authority));
-+ buffer_commit(p->tmp_buf, to_len);
-
- buffer_append_string_buffer(p->tmp_buf, p->conf.mysql_post);
- }
-- if (mysql_real_query(p->conf.mysql, p->tmp_buf->ptr, p->tmp_buf->used - 1)) {
-+ if (mysql_real_query(p->conf.mysql, CONST_BUF_LEN(p->tmp_buf))) {
- log_error_write(srv, __FILE__, __LINE__, "s", mysql_error(p->conf.mysql));
- goto ERR500;
- }
-@@ -397,18 +385,6 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) {
- buffer_copy_buffer(c->server_name, con->uri.authority);
- buffer_copy_buffer(c->document_root, p->tmp_buf);
-
-- /* fcgi_offset and fcgi_arg are optional */
-- if (cols > 1 && row[1]) {
-- c->fcgi_offset = atoi(row[1]);
--
-- if (cols > 2 && row[2]) {
-- buffer_copy_string(c->fcgi_arg, row[2]);
-- } else {
-- c->fcgi_arg->used = 0;
-- }
-- } else {
-- c->fcgi_offset = c->fcgi_arg->used = 0;
-- }
- mysql_free_result(result);
- #if MYSQL_VERSION_ID >= 40100
- while (mysql_next_result(p->conf.mysql) == 0);
-@@ -420,10 +396,9 @@ GO_ON:
- buffer_copy_buffer(con->physical.doc_root, c->document_root);
-
- #ifdef DEBUG
-- log_error_write(srv, __FILE__, __LINE__, "sbbdb",
-+ log_error_write(srv, __FILE__, __LINE__, "sbb",
- result ? "NOT CACHED" : "cached",
-- con->server_name, con->physical.doc_root,
-- c->fcgi_offset, c->fcgi_arg);
-+ con->server_name, con->physical.doc_root);
- #endif
- return HANDLER_GO_ON;
-
-diff --git a/src/mod_proxy.c b/src/mod_proxy.c
-index fc2ca1a..dfdc636 100644
---- a/src/mod_proxy.c
-+++ b/src/mod_proxy.c
-@@ -472,7 +472,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
-
- ds = (data_string *)con->request.headers->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- if (buffer_is_equal_string(ds->key, CONST_STR_LEN("Connection"))) continue;
- if (buffer_is_equal_string(ds->key, CONST_STR_LEN("Proxy-Connection"))) continue;
-
-@@ -485,7 +485,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) {
-
- buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
-
-- hctx->wb->bytes_in += b->used - 1;
-+ hctx->wb->bytes_in += buffer_string_length(b);
- chunkqueue_append_buffer(hctx->wb, b);
- buffer_free(b);
-
-@@ -620,7 +620,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
-
- if (p->conf.debug) {
- log_error_write(srv, __FILE__, __LINE__, "sd",
-- "proxy - have to read:", b);
-+ "proxy - have to read:", b);
- }
-
- if (b > 0) {
-@@ -637,8 +637,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
- /* this should be catched by the b > 0 above */
- force_assert(r);
-
-- hctx->response->used += r;
-- hctx->response->ptr[hctx->response->used - 1] = '\0';
-+ buffer_commit(hctx->response, r);
-
- #if 0
- log_error_write(srv, __FILE__, __LINE__, "sdsbs",
-@@ -656,7 +655,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
- /* search for the \r\n\r\n in the string */
- if (NULL != (c = buffer_search_string_len(hctx->response, CONST_STR_LEN("\r\n\r\n")))) {
- size_t hlen = c - hctx->response->ptr + 4;
-- size_t blen = hctx->response->used - hlen - 1;
-+ size_t blen = buffer_string_length(hctx->response) - hlen;
- /* found */
-
- buffer_append_string_len(hctx->response_header, hctx->response->ptr, hlen);
-@@ -674,13 +673,13 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) {
-
- con->file_started = 1;
- if (blen > 0) http_chunk_append_mem(srv, con, c + 4, blen);
-- hctx->response->used = 0;
-+ buffer_reset(hctx->response);
- joblist_append(srv, con);
- }
- } else {
- http_chunk_append_buffer(srv, con, hctx->response);
- joblist_append(srv, con);
-- hctx->response->used = 0;
-+ buffer_reset(hctx->response);
- }
-
- } else {
-@@ -703,8 +702,7 @@ static handler_t proxy_write_request(server *srv, handler_ctx *hctx) {
-
- int ret;
-
-- if (!host ||
-- (!host->host->used || !host->port)) return -1;
-+ if (!host || buffer_string_is_empty(host->host) || !host->port) return -1;
-
- switch(hctx->state) {
- case PROXY_STATE_CONNECT:
-@@ -721,17 +719,17 @@ static handler_t proxy_write_request(server *srv, handler_ctx *hctx) {
- case PROXY_STATE_INIT:
- #if defined(HAVE_IPV6) && defined(HAVE_INET_PTON)
- if (strstr(host->host->ptr,":")) {
-- if (-1 == (hctx->fd = socket(AF_INET6, SOCK_STREAM, 0))) {
-- log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno));
-- return HANDLER_ERROR;
-- }
-+ if (-1 == (hctx->fd = socket(AF_INET6, SOCK_STREAM, 0))) {
-+ log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno));
-+ return HANDLER_ERROR;
-+ }
- } else
- #endif
- {
-- if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) {
-- log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno));
-- return HANDLER_ERROR;
-- }
-+ if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) {
-+ log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno));
-+ return HANDLER_ERROR;
-+ }
- }
- hctx->fde_ndx = -1;
-
-@@ -1078,13 +1076,8 @@ static handler_t mod_proxy_check_extension(server *srv, connection *con, void *p
- mod_proxy_patch_connection(srv, con, p);
-
- fn = con->uri.path;
--
-- if (fn->used == 0) {
-- return HANDLER_ERROR;
-- }
--
-- s_len = fn->used - 1;
--
-+ if (buffer_string_is_empty(fn)) return HANDLER_ERROR;
-+ s_len = buffer_string_length(fn);
-
- path_info_offset = 0;
-
-@@ -1099,9 +1092,9 @@ static handler_t mod_proxy_check_extension(server *srv, connection *con, void *p
-
- ext = (data_array *)p->conf.extensions->data[k];
-
-- if (ext->key->used == 0) continue;
-+ if (buffer_is_empty(ext->key)) continue;
-
-- ct_len = ext->key->used - 1;
-+ ct_len = buffer_string_length(ext->key);
-
- if (s_len < ct_len) continue;
-
-diff --git a/src/mod_redirect.c b/src/mod_redirect.c
-index 93cecb7..615c7db 100644
---- a/src/mod_redirect.c
-+++ b/src/mod_redirect.c
-@@ -198,9 +198,9 @@ static handler_t mod_redirect_uri_handler(server *srv, connection *con, void *p_
- match = kv->key;
- extra = kv->key_extra;
- pattern = kv->value->ptr;
-- pattern_len = kv->value->used - 1;
-+ pattern_len = buffer_string_length(kv->value);
-
-- if ((n = pcre_exec(match, extra, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) {
-+ if ((n = pcre_exec(match, extra, CONST_BUF_LEN(p->match_buf), 0, 0, ovec, 3 * N)) < 0) {
- if (n != PCRE_ERROR_NOMATCH) {
- log_error_write(srv, __FILE__, __LINE__, "sd",
- "execution error while matching: ", n);
-diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c
-index 48c0987..5191a64 100644
---- a/src/mod_rewrite.c
-+++ b/src/mod_rewrite.c
-@@ -372,9 +372,9 @@ static int process_rewrite_rules(server *srv, connection *con, plugin_data *p, r
-
- match = rule->key;
- pattern = rule->value->ptr;
-- pattern_len = rule->value->used - 1;
-+ pattern_len = buffer_string_length(rule->value);
-
-- if ((n = pcre_exec(match, NULL, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) {
-+ if ((n = pcre_exec(match, NULL, CONST_BUF_LEN(p->match_buf), 0, 0, ovec, 3 * N)) < 0) {
- if (n != PCRE_ERROR_NOMATCH) {
- log_error_write(srv, __FILE__, __LINE__, "sd",
- "execution error while matching: ", n);
-diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c
-index 5eb0d9d..0532e4d 100644
---- a/src/mod_rrdtool.c
-+++ b/src/mod_rrdtool.c
-@@ -264,7 +264,7 @@ static int mod_rrdtool_create_rrd(server *srv, plugin_data *p, plugin_config *s)
- "RRA:MIN:0.5:24:775 "
- "RRA:MIN:0.5:288:797\n"));
-
-- if (-1 == (safe_write(p->write_fd, p->cmd->ptr, p->cmd->used - 1))) {
-+ if (-1 == (safe_write(p->write_fd, CONST_BUF_LEN(p->cmd)))) {
- log_error_write(srv, __FILE__, __LINE__, "ss",
- "rrdtool-write: failed", strerror(errno));
-
-@@ -279,8 +279,7 @@ static int mod_rrdtool_create_rrd(server *srv, plugin_data *p, plugin_config *s)
- return HANDLER_ERROR;
- }
-
-- p->resp->used = r;
-- p->resp->ptr[p->resp->used++] = '\0';
-+ buffer_commit(p->resp, r);
-
- if (p->resp->ptr[0] != 'O' ||
- p->resp->ptr[1] != 'K') {
-@@ -426,7 +425,7 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- buffer_append_int(p->cmd, s->requests);
- buffer_append_string_len(p->cmd, CONST_STR_LEN("\n"));
-
-- if (-1 == (r = safe_write(p->write_fd, p->cmd->ptr, p->cmd->used - 1))) {
-+ if (-1 == (r = safe_write(p->write_fd, CONST_BUF_LEN(p->cmd)))) {
- p->rrdtool_running = 0;
-
- log_error_write(srv, __FILE__, __LINE__, "ss",
-@@ -435,7 +434,7 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- return HANDLER_ERROR;
- }
-
-- buffer_string_prepare_copy(p->resp, 4096);
-+ buffer_string_prepare_copy(p->resp, 4095);
- if (-1 == (r = safe_read(p->read_fd, p->resp->ptr, p->resp->size - 1))) {
- p->rrdtool_running = 0;
-
-@@ -445,8 +444,7 @@ TRIGGER_FUNC(mod_rrd_trigger) {
- return HANDLER_ERROR;
- }
-
-- p->resp->used = r;
-- p->resp->ptr[p->resp->used++] = '\0';
-+ buffer_commit(p->resp, r);
-
- if (p->resp->ptr[0] != 'O' ||
- p->resp->ptr[1] != 'K') {
-diff --git a/src/mod_scgi.c b/src/mod_scgi.c
-index 9ea16a4..9e88de3 100644
---- a/src/mod_scgi.c
-+++ b/src/mod_scgi.c
-@@ -664,19 +664,19 @@ static int scgi_spawn_connection(server *srv,
-
- #ifdef HAVE_SYS_UN_H
- scgi_addr_un.sun_family = AF_UNIX;
-- if (proc->socket->used > sizeof(scgi_addr_un.sun_path)) {
-+ if (buffer_string_length(proc->socket) + 1 > sizeof(scgi_addr_un.sun_path)) {
- log_error_write(srv, __FILE__, __LINE__, "sB",
- "ERROR: Unix Domain socket filename too long:",
- proc->socket);
- return -1;
- }
-- memcpy(scgi_addr_un.sun_path, proc->socket->ptr, proc->socket->used);
-+ memcpy(scgi_addr_un.sun_path, proc->socket->ptr, buffer_string_length(proc->socket) + 1);
-
- #ifdef SUN_LEN
- servlen = SUN_LEN(&scgi_addr_un);
- #else
- /* stevens says: */
-- servlen = proc->socket->used + sizeof(scgi_addr_un.sun_family);
-+ servlen = buffer_string_length(proc->socket) + 1 + sizeof(scgi_addr_un.sun_family);
- #endif
- socket_type = AF_UNIX;
- scgi_addr = (struct sockaddr *) &scgi_addr_un;
-@@ -1072,7 +1072,7 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) {
- /* unix domain socket */
- struct sockaddr_un un;
-
-- if (df->unixsocket->used > sizeof(un.sun_path) - 2) {
-+ if (buffer_string_length(df->unixsocket) + 1 > sizeof(un.sun_path) - 2) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "path of the unixdomain socket is too large");
- goto error;
-@@ -1338,19 +1338,19 @@ static int scgi_establish_connection(server *srv, handler_ctx *hctx) {
- #ifdef HAVE_SYS_UN_H
- /* use the unix domain socket */
- scgi_addr_un.sun_family = AF_UNIX;
-- if (proc->socket->used > sizeof(scgi_addr_un.sun_path)) {
-+ if (buffer_string_length(proc->socket) + 1 > sizeof(scgi_addr_un.sun_path)) {
- log_error_write(srv, __FILE__, __LINE__, "sB",
- "ERROR: Unix Domain socket filename too long:",
- proc->socket);
- return -1;
- }
-- memcpy(scgi_addr_un.sun_path, proc->socket->ptr, proc->socket->used);
-+ memcpy(scgi_addr_un.sun_path, proc->socket->ptr, buffer_string_length(proc->socket) + 1);
-
- #ifdef SUN_LEN
- servlen = SUN_LEN(&scgi_addr_un);
- #else
- /* stevens says: */
-- servlen = proc->socket->used + sizeof(scgi_addr_un.sun_family);
-+ servlen = buffer_string_length(proc->socket) + 1 + sizeof(scgi_addr_un.sun_family);
- #endif
- scgi_addr = (struct sockaddr *) &scgi_addr_un;
- #else
-@@ -1416,7 +1416,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat
-
- ds = (data_string *)con->request.headers->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1);
-
- scgi_env_add(p->scgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value));
-@@ -1428,7 +1428,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat
-
- ds = (data_string *)con->environment->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- scgi_env_add(p->scgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value));
-@@ -1471,8 +1471,8 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- scgi_env_add(p->scgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_BUF_LEN(con->conf.server_tag));
- }
-
-- if (con->server_name->used) {
-- size_t len = con->server_name->used - 1;
-+ if (!buffer_is_empty(con->server_name)) {
-+ size_t len = buffer_string_length(con->server_name);
-
- if (con->server_name->ptr[0] == '[') {
- const char *colon = strstr(con->server_name->ptr, "]:");
-@@ -1611,7 +1611,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) {
- buffer_append_string_buffer(b, p->scgi_env);
- buffer_append_string_len(b, CONST_STR_LEN(","));
-
-- hctx->wb->bytes_in += b->used - 1;
-+ hctx->wb->bytes_in += buffer_string_length(b);
- chunkqueue_append_buffer(hctx->wb, b);
- buffer_free(b);
-
-@@ -1757,8 +1757,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- return 1;
- }
-
-- hctx->response->ptr[n] = '\0';
-- hctx->response->used = n+1;
-+ buffer_commit(hctx->response, n);
-
- /* split header from body */
-
-@@ -1776,7 +1775,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- if (0 == strncmp(hctx->response_header->ptr, "HTTP/1.", 7)) in_header = 1;
-
- /* search for the \r\n\r\n or \n\n in the string */
-- for (c = hctx->response_header->ptr, cp = 0, used = hctx->response_header->used - 1; used; c++, cp++, used--) {
-+ for (c = hctx->response_header->ptr, cp = 0, used = buffer_string_length(hctx->response_header); used; c++, cp++, used--) {
- if (*c == ':') in_header = 1;
- else if (*c == '\n') {
- if (in_header == 0) {
-@@ -1832,11 +1831,10 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- http_chunk_append_buffer(srv, con, hctx->response_header);
- joblist_append(srv, con);
- } else {
-- size_t blen = hctx->response_header->used - hlen - 1;
-+ size_t blen = buffer_string_length(hctx->response_header) - hlen;
-
- /* a small hack: terminate after at the second \r */
-- hctx->response_header->used = hlen;
-- hctx->response_header->ptr[hlen - 1] = '\0';
-+ buffer_string_set_length(hctx->response_header, hlen - 1);
-
- /* parse the response header */
- scgi_response_parse(srv, con, p, hctx->response_header, eol);
-@@ -1847,7 +1845,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) {
- con->response.transfer_encoding = HTTP_TRANSFER_ENCODING_CHUNKED;
- }
-
-- if ((hctx->response->used != hlen) && blen > 0) {
-+ if (blen > 0) {
- http_chunk_append_mem(srv, con, hctx->response_header->ptr + hlen, blen);
- joblist_append(srv, con);
- }
-@@ -2110,20 +2108,20 @@ static handler_t scgi_write_request(server *srv, handler_ctx *hctx) {
- log_error_write(srv, __FILE__, __LINE__, "s", "fatal error: host = NULL");
- return HANDLER_ERROR;
- }
-- if (((!host->host->used || !host->port) && !host->unixsocket->used)) {
-+ if (((buffer_string_is_empty(host->host) || !host->port) && buffer_string_is_empty(host->unixsocket))) {
- log_error_write(srv, __FILE__, __LINE__, "sxddd",
- "write-req: error",
- host,
-- host->host->used,
-+ buffer_string_length(host->host),
- host->port,
-- host->unixsocket->used);
-+ buffer_string_length(host->unixsocket));
- return HANDLER_ERROR;
- }
-
-
- switch(hctx->state) {
- case FCGI_STATE_INIT:
-- ret = host->unixsocket->used ? AF_UNIX : AF_INET;
-+ ret = buffer_string_is_empty(host->unixsocket) ? AF_INET : AF_UNIX;
-
- if (-1 == (hctx->fd = socket(ret, SOCK_STREAM, 0))) {
- if (errno == EMFILE ||
-@@ -2653,7 +2651,7 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i
-
- if (buffer_string_is_empty(fn)) return HANDLER_GO_ON;
-
-- s_len = fn->used - 1;
-+ s_len = buffer_string_length(fn);
-
- scgi_patch_connection(srv, con, p);
-
-@@ -2662,9 +2660,9 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i
- size_t ct_len;
- scgi_extension *ext = p->conf.exts->exts[k];
-
-- if (ext->key->used == 0) continue;
-+ if (buffer_is_empty(ext->key)) continue;
-
-- ct_len = ext->key->used - 1;
-+ ct_len = buffer_string_length(ext->key);
-
- if (s_len < ct_len) continue;
-
-@@ -2778,17 +2776,14 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i
- /* the rewrite is only done for /prefix/? matches */
- if (host->fix_root_path_name && extension->key->ptr[0] == '/' && extension->key->ptr[1] == '\0') {
- buffer_copy_string(con->request.pathinfo, con->uri.path->ptr);
-- con->uri.path->used = 1;
-- con->uri.path->ptr[con->uri.path->used - 1] = '\0';
-+ buffer_string_set_length(con->uri.path, 0);
- } else if (extension->key->ptr[0] == '/' &&
-- con->uri.path->used > extension->key->used &&
-- NULL != (pathinfo = strchr(con->uri.path->ptr + extension->key->used - 1, '/'))) {
-+ buffer_string_length(con->uri.path) > buffer_string_length(extension->key) &&
-+ NULL != (pathinfo = strchr(con->uri.path->ptr + buffer_string_length(extension->key), '/'))) {
- /* rewrite uri.path and pathinfo */
-
- buffer_copy_string(con->request.pathinfo, pathinfo);
--
-- con->uri.path->used -= con->request.pathinfo->used - 1;
-- con->uri.path->ptr[con->uri.path->used - 1] = '\0';
-+ buffer_string_set_length(con->uri.path, buffer_string_length(con->uri.path) - buffer_string_length(con->request.pathinfo));
- }
- }
- } else {
-diff --git a/src/mod_secure_download.c b/src/mod_secure_download.c
-index d94482e..da98b61 100644
---- a/src/mod_secure_download.c
-+++ b/src/mod_secure_download.c
-@@ -198,7 +198,7 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_secdownload_patch_connection(srv, con, p);
-
-@@ -220,9 +220,9 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
- * /<uri-prefix>[a-f0-9]{32}/[a-f0-9]{8}/<rel-path>
- */
-
-- if (0 != strncmp(con->uri.path->ptr, p->conf.uri_prefix->ptr, p->conf.uri_prefix->used - 1)) return HANDLER_GO_ON;
-+ if (0 != strncmp(con->uri.path->ptr, p->conf.uri_prefix->ptr, buffer_string_length(p->conf.uri_prefix))) return HANDLER_GO_ON;
-
-- md5_str = con->uri.path->ptr + p->conf.uri_prefix->used - 1;
-+ md5_str = con->uri.path->ptr + buffer_string_length(p->conf.uri_prefix);
-
- if (!is_hex_len(md5_str, 32)) return HANDLER_GO_ON;
- if (*(md5_str + 32) != '/') return HANDLER_GO_ON;
-@@ -255,10 +255,9 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) {
- buffer_copy_buffer(p->md5, p->conf.secret);
- buffer_append_string(p->md5, rel_uri);
- buffer_append_string_len(p->md5, ts_str, 8);
-- force_assert(p->md5->used > 0);
-
- li_MD5_Init(&Md5Ctx);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)p->md5->ptr, p->md5->used - 1);
-+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(p->md5));
- li_MD5_Final(HA1, &Md5Ctx);
-
- buffer_copy_string_hex(p->md5, (char *)HA1, 16);
-diff --git a/src/mod_simple_vhost.c b/src/mod_simple_vhost.c
-index 6bb850f..fec8d54 100644
---- a/src/mod_simple_vhost.c
-+++ b/src/mod_simple_vhost.c
-@@ -124,12 +124,12 @@ SETDEFAULTS_FUNC(mod_simple_vhost_set_defaults) {
-
- static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *out, buffer *host) {
- stat_cache_entry *sce = NULL;
-- force_assert(p->conf.server_root->used > 1);
-+ force_assert(!buffer_string_is_empty(p->conf.server_root));
-
- buffer_string_prepare_copy(out, 127);
- buffer_copy_buffer(out, p->conf.server_root);
-
-- if (host->used) {
-+ if (!buffer_string_is_empty(host)) {
- /* a hostname has to start with a alpha-numerical character
- * and must not contain a slash "/"
- */
-@@ -145,8 +145,8 @@ static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *
- }
- buffer_append_slash(out);
-
-- if (p->conf.document_root->used > 2 && p->conf.document_root->ptr[0] == '/') {
-- buffer_append_string_len(out, p->conf.document_root->ptr + 1, p->conf.document_root->used - 2);
-+ if (buffer_string_length(p->conf.document_root) > 1 && p->conf.document_root->ptr[0] == '/') {
-+ buffer_append_string_len(out, p->conf.document_root->ptr + 1, buffer_string_length(p->conf.document_root) - 1);
- } else {
- buffer_append_string_buffer(out, p->conf.document_root);
- buffer_append_slash(out);
-@@ -227,17 +227,17 @@ static handler_t mod_simple_vhost_docroot(server *srv, connection *con, void *p_
- /* build_doc_root() requires a server_root; skip module if simple-vhost.server-root is not set
- * or set to an empty string (especially don't cache any results!)
- */
-- if (p->conf.server_root->used < 2) return HANDLER_GO_ON;
-+ if (buffer_string_is_empty(p->conf.server_root)) return HANDLER_GO_ON;
-
-- if (p->conf.docroot_cache_key->used &&
-- con->uri.authority->used &&
-+ if (!buffer_string_is_empty(p->conf.docroot_cache_key) &&
-+ !buffer_string_is_empty(con->uri.authority) &&
- buffer_is_equal(p->conf.docroot_cache_key, con->uri.authority)) {
- /* cache hit */
- buffer_copy_buffer(con->server_name, p->conf.docroot_cache_servername);
- buffer_copy_buffer(con->physical.doc_root, p->conf.docroot_cache_value);
- } else {
- /* build document-root */
-- if ((con->uri.authority->used == 0) ||
-+ if (buffer_string_is_empty(con->uri.authority) ||
- build_doc_root(srv, con, p, p->doc_root, con->uri.authority)) {
- /* not found, fallback the default-host */
- if (0 == build_doc_root(srv, con, p,
-diff --git a/src/mod_ssi.c b/src/mod_ssi.c
-index 981fd76..ed3b75c 100644
---- a/src/mod_ssi.c
-+++ b/src/mod_ssi.c
-@@ -172,7 +172,7 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data
-
- ds = (data_string *)con->request.headers->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- /* don't forward the Authorization: Header */
- if (0 == strcasecmp(ds->key->ptr, "AUTHORIZATION")) {
- continue;
-@@ -189,7 +189,7 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data
-
- ds = (data_string *)con->environment->data[i];
-
-- if (ds->value->used && ds->key->used) {
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) {
- buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0);
-
- ssi_env_add(p->ssi_cgi_env, srv->tmp_buf->ptr, ds->value->ptr);
-@@ -264,7 +264,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
- * parameter.
- */
-
-- if (con->request.pathinfo->used) {
-+ if (!buffer_string_is_empty(con->request.pathinfo)) {
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("PATH_INFO"), con->request.pathinfo->ptr);
- }
-
-@@ -272,7 +272,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) {
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("DOCUMENT_ROOT"), con->physical.doc_root->ptr);
-
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_URI"), con->request.uri->ptr);
-- ssi_env_add(p->ssi_cgi_env, CONST_STRING("QUERY_STRING"), con->uri.query->used ? con->uri.query->ptr : "");
-+ ssi_env_add(p->ssi_cgi_env, CONST_STRING("QUERY_STRING"), buffer_is_empty(con->uri.query) ? "" : con->uri.query->ptr);
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_METHOD"), get_http_method_name(con->request.http_method));
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("REDIRECT_STATUS"), "200");
- ssi_env_add(p->ssi_cgi_env, CONST_STRING("SERVER_PROTOCOL"), get_http_version_name(con->request.http_version));
-@@ -1029,7 +1029,7 @@ static int mod_ssi_handle_request(server *srv, connection *con, plugin_data *p)
- con->file_finished = 1;
- con->mode = p->id;
-
-- if (p->conf.content_type->used <= 1) {
-+ if (buffer_string_is_empty(p->conf.content_type)) {
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html"));
- } else {
- response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(p->conf.content_type));
-@@ -1100,16 +1100,16 @@ URIHANDLER_FUNC(mod_ssi_physical_path) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (con->physical.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON;
-
- mod_ssi_patch_connection(srv, con, p);
-
- for (k = 0; k < p->conf.ssi_extension->used; k++) {
- data_string *ds = (data_string *)p->conf.ssi_extension->data[k];
-
-- if (ds->value->used == 0) continue;
-+ if (buffer_is_empty(ds->value)) continue;
-
-- if (buffer_is_equal_right_len(con->physical.path, ds->value, ds->value->used - 1)) {
-+ if (buffer_is_equal_right_len(con->physical.path, ds->value, buffer_string_length(ds->value))) {
- /* handle ssi-request */
-
- if (mod_ssi_handle_request(srv, con, p)) {
-diff --git a/src/mod_ssi_expr.c b/src/mod_ssi_expr.c
-index 140d086..489fde4 100644
---- a/src/mod_ssi_expr.c
-+++ b/src/mod_ssi_expr.c
-@@ -35,7 +35,7 @@ void ssi_val_free(ssi_val_t *s) {
-
- int ssi_val_tobool(ssi_val_t *B) {
- if (B->type == SSI_TYPE_STRING) {
-- return B->str->used > 1 ? 1 : 0;
-+ return !buffer_string_is_empty(B->str);
- } else {
- return B->bo;
- }
-diff --git a/src/mod_staticfile.c b/src/mod_staticfile.c
-index e36c697..d40aa31 100644
---- a/src/mod_staticfile.c
-+++ b/src/mod_staticfile.c
-@@ -304,7 +304,7 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
- /* write END-OF-HEADER */
- buffer_append_string_len(b, CONST_STR_LEN("\r\n\r\n"));
-
-- con->response.content_length += b->used - 1;
-+ con->response.content_length += buffer_string_length(b);
- chunkqueue_append_buffer(con->write_queue, b);
- buffer_free(b);
- }
-@@ -325,7 +325,7 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data *
- buffer_append_string(b, boundary);
- buffer_append_string_len(b, "--\r\n", 4);
-
-- con->response.content_length += b->used - 1;
-+ con->response.content_length += buffer_string_length(b);
- chunkqueue_append_buffer(con->write_queue, b);
- buffer_free(b);
-
-@@ -363,8 +363,8 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) {
-
- /* someone else has done a decision for us */
- if (con->http_status != 0) return HANDLER_GO_ON;
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-- if (con->physical.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON;
-
- /* someone else has handled this request */
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-@@ -381,7 +381,7 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) {
-
- mod_staticfile_patch_connection(srv, con, p);
-
-- if (p->conf.disable_pathinfo && 0 != con->request.pathinfo->used) {
-+ if (p->conf.disable_pathinfo && !buffer_string_is_empty(con->request.pathinfo)) {
- if (con->conf.log_request_handling) {
- log_error_write(srv, __FILE__, __LINE__, "s", "-- NOT handling file as static file, pathinfo forbidden");
- }
-@@ -392,9 +392,9 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) {
- for (k = 0; k < p->conf.exclude_ext->used; k++) {
- ds = (data_string *)p->conf.exclude_ext->data[k];
-
-- if (ds->value->used == 0) continue;
-+ if (buffer_is_empty(ds->value)) continue;
-
-- if (buffer_is_equal_right_len(con->physical.path, ds->value, ds->value->used - 1)) {
-+ if (buffer_is_equal_right_len(con->physical.path, ds->value, buffer_string_length(ds->value))) {
- if (con->conf.log_request_handling) {
- log_error_write(srv, __FILE__, __LINE__, "s", "-- NOT handling file as static file, extension forbidden");
- }
-diff --git a/src/mod_status.c b/src/mod_status.c
-index 99b332a..daecb08 100644
---- a/src/mod_status.c
-+++ b/src/mod_status.c
-@@ -449,7 +449,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
- connection *c = srv->conns->ptr[j];
- const char *state;
-
-- if (CON_STATE_READ == c->state && c->request.orig_uri->used > 0) {
-+ if (CON_STATE_READ == c->state && !buffer_string_is_empty(c->request.orig_uri)) {
- state = "k";
- } else {
- state = connection_get_short_state(c->state);
-@@ -501,7 +501,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c
-
- buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"string\">"));
-
-- if (CON_STATE_READ == c->state && c->request.orig_uri->used > 0) {
-+ if (CON_STATE_READ == c->state && !buffer_string_is_empty(c->request.orig_uri)) {
- buffer_append_string_len(b, CONST_STR_LEN("keep-alive"));
- } else {
- buffer_append_string(b, connection_get_state(c->state));
-diff --git a/src/mod_trigger_b4_dl.c b/src/mod_trigger_b4_dl.c
-index cff125c..e1fa993 100644
---- a/src/mod_trigger_b4_dl.c
-+++ b/src/mod_trigger_b4_dl.c
-@@ -320,7 +320,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
-
- if (con->mode != DIRECT) return HANDLER_GO_ON;
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_trigger_b4_dl_patch_connection(srv, con, p);
-
-@@ -356,7 +356,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
- }
-
- /* check if URL is a trigger -> insert IP into DB */
-- if ((n = pcre_exec(p->conf.trigger_regex, NULL, con->uri.path->ptr, con->uri.path->used - 1, 0, 0, ovec, 3 * N)) < 0) {
-+ if ((n = pcre_exec(p->conf.trigger_regex, NULL, CONST_BUF_LEN(con->uri.path), 0, 0, ovec, 3 * N)) < 0) {
- if (n != PCRE_ERROR_NOMATCH) {
- log_error_write(srv, __FILE__, __LINE__, "sd",
- "execution error while matching:", n);
-@@ -383,11 +383,12 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
- # endif
- # if defined(HAVE_MEMCACHE_H)
- if (p->conf.mc) {
-- size_t i;
-+ size_t i, len;
- buffer_copy_buffer(p->tmp_buf, p->conf.mc_namespace);
- buffer_append_string(p->tmp_buf, remote_ip);
-
-- for (i = 0; i < p->tmp_buf->used - 1; i++) {
-+ len = buffer_string_length(p->tmp_buf);
-+ for (i = 0; i < len; i++) {
- if (p->tmp_buf->ptr[i] == ' ') p->tmp_buf->ptr[i] = '-';
- }
-
-@@ -407,7 +408,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
- }
-
- /* check if URL is a download -> check IP in DB, update timestamp */
-- if ((n = pcre_exec(p->conf.download_regex, NULL, con->uri.path->ptr, con->uri.path->used - 1, 0, 0, ovec, 3 * N)) < 0) {
-+ if ((n = pcre_exec(p->conf.download_regex, NULL, CONST_BUF_LEN(con->uri.path), 0, 0, ovec, 3 * N)) < 0) {
- if (n != PCRE_ERROR_NOMATCH) {
- log_error_write(srv, __FILE__, __LINE__, "sd",
- "execution error while matching: ", n);
-@@ -469,12 +470,13 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) {
- # if defined(HAVE_MEMCACHE_H)
- if (p->conf.mc) {
- void *r;
-- size_t i;
-+ size_t i, len;
-
- buffer_copy_buffer(p->tmp_buf, p->conf.mc_namespace);
- buffer_append_string(p->tmp_buf, remote_ip);
-
-- for (i = 0; i < p->tmp_buf->used - 1; i++) {
-+ len = buffer_string_length(p->tmp_buf);
-+ for (i = 0; i < len; i++) {
- if (p->tmp_buf->ptr[i] == ' ') p->tmp_buf->ptr[i] = '-';
- }
-
-diff --git a/src/mod_userdir.c b/src/mod_userdir.c
-index 392f4b2..682f950 100644
---- a/src/mod_userdir.c
-+++ b/src/mod_userdir.c
-@@ -181,14 +181,14 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) {
- struct passwd *pwd = NULL;
- #endif
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_userdir_patch_connection(srv, con, p);
-
- /* enforce the userdir.path to be set in the config, ugly fix for #1587;
- * should be replaced with a clean .enabled option in 1.5
- */
-- if (!p->conf.active || p->conf.path->used == 0) return HANDLER_GO_ON;
-+ if (!p->conf.active || buffer_is_empty(p->conf.path)) return HANDLER_GO_ON;
-
- /* /~user/foo.html -> /home/user/public_html/foo.html */
-
-diff --git a/src/mod_usertrack.c b/src/mod_usertrack.c
-index 29e9fdf..11aad95 100644
---- a/src/mod_usertrack.c
-+++ b/src/mod_usertrack.c
-@@ -101,8 +101,8 @@ SETDEFAULTS_FUNC(mod_usertrack_set_defaults) {
- if (buffer_string_is_empty(s->cookie_name)) {
- buffer_copy_string_len(s->cookie_name, CONST_STR_LEN("TRACKID"));
- } else {
-- size_t j;
-- for (j = 0; j < s->cookie_name->used - 1; j++) {
-+ size_t j, len = buffer_string_length(s->cookie_name);
-+ for (j = 0; j < len; j++) {
- char c = s->cookie_name->ptr[j] | 32;
- if (c < 'a' || c > 'z') {
- log_error_write(srv, __FILE__, __LINE__, "sb",
-@@ -115,8 +115,8 @@ SETDEFAULTS_FUNC(mod_usertrack_set_defaults) {
- }
-
- if (!buffer_string_is_empty(s->cookie_domain)) {
-- size_t j;
-- for (j = 0; j < s->cookie_domain->used - 1; j++) {
-+ size_t j, len = buffer_string_length(s->cookie_domain);
-+ for (j = 0; j < len; j++) {
- char c = s->cookie_domain->ptr[j];
- if (c <= 32 || c >= 127 || c == '"' || c == '\\') {
- log_error_write(srv, __FILE__, __LINE__, "sb",
-@@ -175,7 +175,7 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
- li_MD5_CTX Md5Ctx;
- char hh[LI_ITOSTRING_LENGTH];
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_usertrack_patch_connection(srv, con, p);
-
-@@ -193,7 +193,7 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
- char *nc;
-
- /* skip WS */
-- for (nc = g + p->conf.cookie_name->used-1; *nc == ' ' || *nc == '\t'; nc++);
-+ for (nc = g + buffer_string_length(p->conf.cookie_name); *nc == ' ' || *nc == '\t'; nc++);
-
- if (*nc == '=') {
- /* ok, found the key of our own cookie */
-@@ -219,8 +219,8 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) {
-
- /* generate shared-secret */
- li_MD5_Init(&Md5Ctx);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)con->uri.path->ptr, con->uri.path->used - 1);
-- li_MD5_Update(&Md5Ctx, (unsigned char *)"+", 1);
-+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(con->uri.path));
-+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN("+"));
-
- /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */
- li_itostr(hh, srv->cur_ts);
-diff --git a/src/mod_webdav.c b/src/mod_webdav.c
-index 433b904..654108a 100644
---- a/src/mod_webdav.c
-+++ b/src/mod_webdav.c
-@@ -446,7 +446,7 @@ URIHANDLER_FUNC(mod_webdav_uri_handler) {
-
- UNUSED(srv);
-
-- if (con->uri.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON;
-
- mod_webdav_patch_connection(srv, con, p);
-
-@@ -558,9 +558,8 @@ static int webdav_delete_file(server *srv, connection *con, plugin_data *p, phys
- /* bind the values to the insert */
-
- sqlite3_bind_text(stmt, 1,
-- dst->rel_path->ptr,
-- dst->rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(dst->rel_path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- /* */
-@@ -590,7 +589,7 @@ static int webdav_delete_dir(server *srv, connection *con, plugin_data *p, physi
- int status = 0;
-
- if ((de->d_name[0] == '.' && de->d_name[1] == '\0') ||
-- (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) {
-+ (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) {
- continue;
- /* ignore the parent dir */
- }
-@@ -636,9 +635,8 @@ static int webdav_delete_dir(server *srv, connection *con, plugin_data *p, physi
- /* bind the values to the insert */
-
- sqlite3_bind_text(stmt, 1,
-- d.rel_path->ptr,
-- d.rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(d.rel_path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- /* */
-@@ -714,14 +712,12 @@ static int webdav_copy_file(server *srv, connection *con, plugin_data *p, physic
-
- /* bind the values to the insert */
- sqlite3_bind_text(stmt, 1,
-- dst->rel_path->ptr,
-- dst->rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(dst->rel_path),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 2,
-- src->rel_path->ptr,
-- src->rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(src->rel_path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- /* */
-@@ -751,8 +747,8 @@ static int webdav_copy_dir(server *srv, connection *con, plugin_data *p, physica
- while (NULL != (de = readdir(srcdir))) {
- struct stat st;
-
-- if ((de->d_name[0] == '.' && de->d_name[1] == '\0') ||
-- (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) {
-+ if ((de->d_name[0] == '.' && de->d_name[1] == '\0')
-+ || (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) {
- continue;
- }
-
-@@ -793,14 +789,12 @@ static int webdav_copy_dir(server *srv, connection *con, plugin_data *p, physica
-
- /* bind the values to the insert */
- sqlite3_bind_text(stmt, 1,
-- dst->rel_path->ptr,
-- dst->rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(dst->rel_path),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 2,
-- src->rel_path->ptr,
-- src->rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(src->rel_path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- /* */
-@@ -851,9 +845,9 @@ static int webdav_get_live_property(server *srv, connection *con, plugin_data *p
- for (k = 0; k < con->conf.mimetypes->used; k++) {
- data_string *ds = (data_string *)con->conf.mimetypes->data[k];
-
-- if (ds->key->used == 0) continue;
-+ if (buffer_is_empty(ds->key)) continue;
-
-- if (buffer_is_equal_right_len(dst->path, ds->key, ds->key->used - 1)) {
-+ if (buffer_is_equal_right_len(dst->path, ds->key, buffer_string_length(ds->key))) {
- buffer_append_string_len(b,CONST_STR_LEN("<D:getcontenttype>"));
- buffer_append_string_buffer(b, ds->value);
- buffer_append_string_len(b, CONST_STR_LEN("</D:getcontenttype>"));
-@@ -907,17 +901,16 @@ static int webdav_get_property(server *srv, connection *con, plugin_data *p, phy
- /* bind the values to the insert */
-
- sqlite3_bind_text(stmt, 1,
-- dst->rel_path->ptr,
-- dst->rel_path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(dst->rel_path),
-+ SQLITE_TRANSIENT);
- sqlite3_bind_text(stmt, 2,
-- prop_name,
-- strlen(prop_name),
-- SQLITE_TRANSIENT);
-+ prop_name,
-+ strlen(prop_name),
-+ SQLITE_TRANSIENT);
- sqlite3_bind_text(stmt, 3,
-- prop_ns,
-- strlen(prop_ns),
-- SQLITE_TRANSIENT);
-+ prop_ns,
-+ strlen(prop_ns),
-+ SQLITE_TRANSIENT);
-
- /* it is the PK */
- while (SQLITE_ROW == sqlite3_step(stmt)) {
-@@ -1046,7 +1039,7 @@ static int webdav_parse_chunkqueue(server *srv, connection *con, plugin_data *p,
- break;
- case MEM_CHUNK:
- /* append to the buffer */
-- weHave = c->mem->used - 1 - c->offset;
-+ weHave = buffer_string_length(c->mem) - c->offset;
-
- if (weHave > weWant) weHave = weWant;
-
-@@ -1190,8 +1183,8 @@ static int webdav_has_lock(server *srv, connection *con, plugin_data *p, buffer
- sqlite3_reset(stmt);
-
- sqlite3_bind_text(stmt, 1,
-- CONST_BUF_LEN(uri),
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(uri),
-+ SQLITE_TRANSIENT);
-
- while (SQLITE_ROW == sqlite3_step(stmt)) {
- has_lock = 0;
-@@ -1223,7 +1216,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- if (!p->conf.enabled) return HANDLER_GO_ON;
- /* physical path is setup */
-- if (con->physical.path->used == 0) return HANDLER_GO_ON;
-+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON;
-
- /* PROPFIND need them */
- if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Depth"))) {
-@@ -1274,7 +1267,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- if (prop->type == XML_TEXT_NODE) continue; /* ignore WS */
-
- if (prop->ns &&
-- (0 == xmlStrcmp(prop->ns->href, BAD_CAST "")) &&
-+ (0 == xmlStrcmp(prop->ns->href, BAD_CAST "")) &&
- (0 != xmlStrcmp(prop->ns->prefix, BAD_CAST ""))) {
- size_t i;
- log_error_write(srv, __FILE__, __LINE__, "ss",
-@@ -1318,9 +1311,8 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- /* bind the values to the insert */
-
- sqlite3_bind_text(stmt, 1,
-- con->uri.path->ptr,
-- con->uri.path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(con->uri.path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- }
-@@ -1757,7 +1749,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- }
- break;
- case MEM_CHUNK:
-- if ((r = write(fd, c->mem->ptr + c->offset, c->mem->used - c->offset - 1)) < 0) {
-+ if ((r = write(fd, c->mem->ptr + c->offset, buffer_string_length(c->mem) - c->offset)) < 0) {
- switch(errno) {
- case ENOSPC:
- con->http_status = 507;
-@@ -1810,7 +1802,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- }
-
- if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Overwrite"))) {
-- if (ds->value->used != 2 ||
-+ if (buffer_string_length(ds->value) != 1 ||
- (ds->value->ptr[0] != 'F' &&
- ds->value->ptr[0] != 'T') ) {
- con->http_status = 400;
-@@ -1884,7 +1876,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- /* don't add a second / */
- if (p->physical.rel_path->ptr[0] == '/') {
-- buffer_append_string_len(p->physical.path, p->physical.rel_path->ptr + 1, p->physical.rel_path->used - 2);
-+ buffer_append_string_len(p->physical.path, p->physical.rel_path->ptr + 1, buffer_string_length(p->physical.rel_path) - 1);
- } else {
- buffer_append_string_buffer(p->physical.path, p->physical.rel_path);
- }
-@@ -1993,9 +1985,8 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- /* bind the values to the insert */
- sqlite3_bind_text(stmt, 1,
-- con->uri.path->ptr,
-- con->uri.path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(con->uri.path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "sql-move(delete old) failed:", sqlite3_errmsg(p->conf.sql));
-@@ -2009,14 +2000,12 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
-
- /* bind the values to the insert */
- sqlite3_bind_text(stmt, 1,
-- p->uri.path->ptr,
-- p->uri.path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(p->uri.path),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 2,
-- con->uri.path->ptr,
-- con->uri.path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(con->uri.path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "sql-move failed:", sqlite3_errmsg(p->conf.sql));
-@@ -2121,29 +2110,28 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) {
- /* bind the values to the insert */
-
- sqlite3_bind_text(stmt, 1,
-- con->uri.path->ptr,
-- con->uri.path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(con->uri.path),
-+ SQLITE_TRANSIENT);
- sqlite3_bind_text(stmt, 2,
-- (char *)prop->name,
-- strlen((char *)prop->name),
-- SQLITE_TRANSIENT);
-+ (char *)prop->name,
-+ strlen((char *)prop->name),
-+ SQLITE_TRANSIENT);
- if (prop->ns) {
- sqlite3_bind_text(stmt, 3,
-- (char *)prop->ns->href,
-- strlen((char *)prop->ns->href),
-- SQLITE_TRANSIENT);
-+ (char *)prop->ns->href,
-+ strlen((char *)prop->ns->href),
-+ SQLITE_TRANSIENT);
- } else {
- sqlite3_bind_text(stmt, 3,
-- "",
-- 0,
-- SQLITE_TRANSIENT);
-+ "",
-+ 0,
-+ SQLITE_TRANSIENT);
- }
- if (stmt == p->conf.stmt_update_prop) {
- sqlite3_bind_text(stmt, 4,
-- (char *)xmlNodeGetContent(prop),
-- strlen((char *)xmlNodeGetContent(prop)),
-- SQLITE_TRANSIENT);
-+ (char *)xmlNodeGetContent(prop),
-+ strlen((char *)xmlNodeGetContent(prop)),
-+ SQLITE_TRANSIENT);
- }
-
- if (SQLITE_DONE != (r = sqlite3_step(stmt))) {
-@@ -2290,9 +2278,8 @@ propmatch_cleanup:
- sqlite3_reset(stmt);
-
- sqlite3_bind_text(stmt, 1,
-- p->uri.path->ptr,
-- p->uri.path->used - 1,
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(p->uri.path),
-+ SQLITE_TRANSIENT);
-
- /* it is the PK */
- while (SQLITE_ROW == sqlite3_step(stmt)) {
-@@ -2339,32 +2326,32 @@ propmatch_cleanup:
- sqlite3_reset(stmt);
-
- sqlite3_bind_text(stmt, 1,
-- CONST_BUF_LEN(p->tmp_buf),
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(p->tmp_buf),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 2,
-- CONST_BUF_LEN(con->uri.path),
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(con->uri.path),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 3,
-- (const char *)lockscope,
-- xmlStrlen(lockscope),
-- SQLITE_TRANSIENT);
-+ (const char *)lockscope,
-+ xmlStrlen(lockscope),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 4,
-- (const char *)locktype,
-- xmlStrlen(locktype),
-- SQLITE_TRANSIENT);
-+ (const char *)locktype,
-+ xmlStrlen(locktype),
-+ SQLITE_TRANSIENT);
-
- /* owner */
- sqlite3_bind_text(stmt, 5,
-- "",
-- 0,
-- SQLITE_TRANSIENT);
-+ "",
-+ 0,
-+ SQLITE_TRANSIENT);
-
- /* depth */
- sqlite3_bind_int(stmt, 6,
-- depth);
-+ depth);
-
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
-@@ -2394,19 +2381,19 @@ propmatch_cleanup:
- sqlite3_stmt *stmt = p->conf.stmt_refresh_lock;
-
- /* remove the < > around the token */
-- if (locktoken->used < 6) {
-+ if (buffer_string_length(locktoken) < 5) {
- con->http_status = 400;
-
- return HANDLER_FINISHED;
- }
-
-- buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 2, locktoken->used - 5);
-+ buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 2, buffer_string_length(locktoken) - 4);
-
- sqlite3_reset(stmt);
-
- sqlite3_bind_text(stmt, 1,
-- CONST_BUF_LEN(p->tmp_buf),
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(p->tmp_buf),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- log_error_write(srv, __FILE__, __LINE__, "ss",
-@@ -2437,7 +2424,7 @@ propmatch_cleanup:
- sqlite3_stmt *stmt = p->conf.stmt_remove_lock;
-
- /* remove the < > around the token */
-- if (locktoken->used < 4) {
-+ if (buffer_string_length(locktoken) < 3) {
- con->http_status = 400;
-
- return HANDLER_FINISHED;
-@@ -2453,17 +2440,17 @@ propmatch_cleanup:
- * - 412
- * */
-
-- buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 1, locktoken->used - 3);
-+ buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 1, buffer_string_length(locktoken) - 2);
-
- sqlite3_reset(stmt);
-
- sqlite3_bind_text(stmt, 1,
-- CONST_BUF_LEN(p->tmp_buf),
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(p->tmp_buf),
-+ SQLITE_TRANSIENT);
-
- sqlite3_bind_text(stmt, 2,
-- CONST_BUF_LEN(con->uri.path),
-- SQLITE_TRANSIENT);
-+ CONST_BUF_LEN(con->uri.path),
-+ SQLITE_TRANSIENT);
-
- if (SQLITE_DONE != sqlite3_step(stmt)) {
- log_error_write(srv, __FILE__, __LINE__, "ss",
-diff --git a/src/network_linux_sendfile.c b/src/network_linux_sendfile.c
-index 8d7598a..b967f3c 100644
---- a/src/network_linux_sendfile.c
-+++ b/src/network_linux_sendfile.c
-@@ -54,12 +54,12 @@ int network_write_chunkqueue_linuxsendfile(server *srv, connection *con, int fd,
- tc = tc->next, num_chunks++);
-
- for (tc = c, i = 0; i < num_chunks; tc = tc->next, i++) {
-- if (tc->mem->used == 0) {
-+ if (buffer_string_is_empty(tc->mem)) {
- chunks[i].iov_base = tc->mem->ptr;
- chunks[i].iov_len = 0;
- } else {
- offset = tc->mem->ptr + tc->offset;
-- toSend = tc->mem->used - 1 - tc->offset;
-+ toSend = buffer_string_length(tc->mem) - tc->offset;
-
- chunks[i].iov_base = offset;
-
-diff --git a/src/network_openssl.c b/src/network_openssl.c
-index 04c29c0..d9ae33c 100644
---- a/src/network_openssl.c
-+++ b/src/network_openssl.c
-@@ -67,13 +67,13 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, SSL *ssl, chu
- off_t toSend;
- ssize_t r;
-
-- if (c->mem->used == 0 || c->mem->used == 1) {
-+ if (buffer_string_is_empty(c->mem)) {
- chunk_finished = 1;
- break;
- }
-
- offset = c->mem->ptr + c->offset;
-- toSend = c->mem->used - 1 - c->offset;
-+ toSend = buffer_string_length(c->mem) - c->offset;
- if (toSend > max_bytes) toSend = max_bytes;
-
- /**
-@@ -149,7 +149,7 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, SSL *ssl, chu
- max_bytes -= r;
- }
-
-- if (c->offset == (off_t)c->mem->used - 1) {
-+ if (c->offset == (off_t)buffer_string_length(c->mem)) {
- chunk_finished = 1;
- }
-
-diff --git a/src/network_write.c b/src/network_write.c
-index d46649b..6a89b50 100644
---- a/src/network_write.c
-+++ b/src/network_write.c
-@@ -36,13 +36,13 @@ int network_write_chunkqueue_write(server *srv, connection *con, int fd, chunkqu
- off_t toSend;
- ssize_t r;
-
-- if (c->mem->used == 0) {
-+ if (buffer_string_is_empty(c->mem)) {
- chunk_finished = 1;
- break;
- }
-
- offset = c->mem->ptr + c->offset;
-- toSend = c->mem->used - 1 - c->offset;
-+ toSend = buffer_string_length(c->mem) - c->offset;
- if (toSend > max_bytes) toSend = max_bytes;
-
- #ifdef __WIN32
-@@ -75,7 +75,7 @@ int network_write_chunkqueue_write(server *srv, connection *con, int fd, chunkqu
- cq->bytes_out += r;
- max_bytes -= r;
-
-- if (c->offset == (off_t)c->mem->used - 1) {
-+ if (c->offset == (off_t)buffer_string_length(c->mem)) {
- chunk_finished = 1;
- }
-
-diff --git a/src/network_writev.c b/src/network_writev.c
-index 1b93547..895336c 100644
---- a/src/network_writev.c
-+++ b/src/network_writev.c
-@@ -69,12 +69,12 @@ int network_write_chunkqueue_writev(server *srv, connection *con, int fd, chunkq
- chunks = calloc(num_chunks, sizeof(*chunks));
-
- for(tc = c, i = 0; i < num_chunks; tc = tc->next, i++) {
-- if (tc->mem->used == 0) {
-+ if (buffer_string_is_empty(tc->mem)) {
- chunks[i].iov_base = tc->mem->ptr;
- chunks[i].iov_len = 0;
- } else {
- offset = tc->mem->ptr + tc->offset;
-- toSend = tc->mem->used - 1 - tc->offset;
-+ toSend = buffer_string_length(tc->mem) - tc->offset;
-
- chunks[i].iov_base = offset;
-
-diff --git a/src/proc_open.c b/src/proc_open.c
-index c29b9c6..167027a 100644
---- a/src/proc_open.c
-+++ b/src/proc_open.c
-@@ -284,8 +284,7 @@ static void proc_read_fd_to_buffer(int fd, buffer *b) {
- if ((s = read(fd, (void *)(b->ptr + buffer_string_length(b)), buffer_string_space(b))) <= 0) {
- break;
- }
-- b->used += s;
-- b->ptr[b->used-1] = '\0';
-+ buffer_commit(b, s);
- }
- }
- /* }}} */
-@@ -298,7 +297,7 @@ int proc_open_buffer(const char *command, buffer *in, buffer *out, buffer *err)
- }
-
- if (in) {
-- if (write(proc.in.fd, (void *)in->ptr, in->used) < 0) {
-+ if (write(proc.in.fd, CONST_BUF_LEN(in)) < 0) {
- perror("error writing pipe");
- return -1;
- }
-@@ -315,7 +314,7 @@ int proc_open_buffer(const char *command, buffer *in, buffer *out, buffer *err)
- } else {
- buffer *tmp = buffer_init();
- proc_read_fd_to_buffer(proc.err.fd, tmp);
-- if (tmp->used > 0 && write(2, (void*)tmp->ptr, tmp->used) < 0) {
-+ if (!buffer_string_is_empty(tmp) && write(2, CONST_BUF_LEN(tmp)) < 0) {
- perror("error writing pipe");
- buffer_free(tmp);
- return -1;
-diff --git a/src/request.c b/src/request.c
-index 65d0a0e..993cb28 100644
---- a/src/request.c
-+++ b/src/request.c
-@@ -34,9 +34,9 @@ static int request_check_hostname(server *srv, connection *con, buffer *host) {
- */
-
- /* no Host: */
-- if (!host || host->used == 0) return 0;
-+ if (buffer_is_empty(host)) return 0;
-
-- host_len = host->used - 1;
-+ host_len = buffer_string_length(host);
-
- /* IPv6 adress */
- if (host->ptr[0] == '[') {
-@@ -92,10 +92,9 @@ static int request_check_hostname(server *srv, connection *con, buffer *host) {
- /* if the hostname ends in a "." strip it */
- if (host->ptr[host_len-1] == '.') {
- /* shift port info one left */
-- if (NULL != colon) memmove(colon-1, colon, host->used - host_len);
-- else host->ptr[host_len-1] = '\0';
-+ if (NULL != colon) memmove(colon-1, colon, buffer_string_length(host) - host_len);
-+ buffer_string_set_length(host, buffer_string_length(host) - 1);
- host_len -= 1;
-- host->used -= 1;
- }
-
- if (host_len == 0) return -1;
-@@ -213,7 +212,7 @@ static int request_check_hostname(server *srv, connection *con, buffer *host) {
- #endif
-
- static int http_request_split_value(array *vals, buffer *b) {
-- size_t i;
-+ size_t i, len;
- int state = 0;
-
- const char *current;
-@@ -226,10 +225,11 @@ static int http_request_split_value(array *vals, buffer *b) {
- * into a array (more or less a explode() incl. striping of whitespaces
- */
-
-- if (b->used == 0) return 0;
-+ if (buffer_string_is_empty(b)) return 0;
-
- current = b->ptr;
-- for (i = 0; i < b->used; ++i, ++current) {
-+ len = buffer_string_length(b);
-+ for (i = 0; i <= len; ++i, ++current) {
- data_string *ds;
-
- switch (state) {
-@@ -297,7 +297,7 @@ int http_request_parse(server *srv, connection *con) {
- int line = 0;
-
- int request_line_stage = 0;
-- size_t i, first;
-+ size_t i, first, ilen;
-
- int done = 0;
-
-@@ -310,7 +310,7 @@ int http_request_parse(server *srv, connection *con) {
- if (con->conf.log_request_header) {
- log_error_write(srv, __FILE__, __LINE__, "sdsdSb",
- "fd:", con->fd,
-- "request-len:", con->request.request->used,
-+ "request-len:", buffer_string_length(con->request.request),
- "\n", con->request.request);
- }
-
-@@ -319,7 +319,7 @@ int http_request_parse(server *srv, connection *con) {
- con->request.request->ptr[1] == '\n') {
- /* we are in keep-alive and might get \r\n after a previous POST request.*/
-
-- buffer_copy_string_len(con->parse_request, con->request.request->ptr + 2, con->request.request->used - 1 - 2);
-+ buffer_copy_string_len(con->parse_request, con->request.request->ptr + 2, buffer_string_length(con->request.request) - 2);
- } else {
- /* fill the local request buffer */
- buffer_copy_buffer(con->parse_request, con->request.request);
-@@ -334,15 +334,14 @@ int http_request_parse(server *srv, connection *con) {
- *
- * <method> <uri> <protocol>\r\n
- * */
-- for (i = 0, first = 0; i < con->parse_request->used && line == 0; i++) {
-- char *cur = con->parse_request->ptr + i;
--
-- switch(*cur) {
-+ ilen = buffer_string_length(con->parse_request);
-+ for (i = 0, first = 0; i < ilen && line == 0; i++) {
-+ switch(con->parse_request->ptr[i]) {
- case '\r':
- if (con->parse_request->ptr[i+1] == '\n') {
- http_method_t r;
- char *nuri = NULL;
-- size_t j;
-+ size_t j, jlen;
-
- /* \r\n -> \0\0 */
- con->parse_request->ptr[i] = '\0';
-@@ -476,7 +475,8 @@ int http_request_parse(server *srv, connection *con) {
- }
-
- /* check uri for invalid characters */
-- for (j = 0; j < con->request.uri->used - 1; j++) {
-+ jlen = buffer_string_length(con->request.uri);
-+ for (j = 0; j < jlen; j++) {
- if (!request_uri_is_valid_char(con->request.uri->ptr[j])) {
- unsigned char buf[2];
- con->http_status = 400;
-@@ -551,7 +551,7 @@ int http_request_parse(server *srv, connection *con) {
-
- in_folding = 0;
-
-- if (con->request.uri->used == 1) {
-+ if (buffer_string_is_empty(con->request.uri)) {
- con->http_status = 400;
- con->response.keep_alive = 0;
- con->keep_alive = 0;
-@@ -579,7 +579,7 @@ int http_request_parse(server *srv, connection *con) {
- con->request.http_host = ds->value;
- }
-
-- for (; i < con->parse_request->used && !done; i++) {
-+ for (; i <= ilen && !done; i++) {
- char *cur = con->parse_request->ptr + i;
-
- if (is_key) {
-@@ -825,7 +825,7 @@ int http_request_parse(server *srv, connection *con) {
- } else if (cmp > 0 && 0 == (cmp = buffer_caseless_compare(CONST_BUF_LEN(ds->key), CONST_STR_LEN("Content-Length")))) {
- char *err;
- unsigned long int r;
-- size_t j;
-+ size_t j, jlen;
-
- if (con_length_set) {
- con->http_status = 400;
-@@ -842,9 +842,8 @@ int http_request_parse(server *srv, connection *con) {
- return 0;
- }
-
-- if (ds->value->used == 0) SEGFAULT();
--
-- for (j = 0; j < ds->value->used - 1; j++) {
-+ jlen = buffer_string_length(ds->value);
-+ for (j = 0; j < jlen; j++) {
- char c = ds->value->ptr[j];
- if (!isdigit((unsigned char)c)) {
- log_error_write(srv, __FILE__, __LINE__, "sbs",
-@@ -1177,9 +1176,9 @@ int http_request_parse(server *srv, connection *con) {
- int http_request_header_finished(server *srv, connection *con) {
- UNUSED(srv);
-
-- if (con->request.request->used < 5) return 0;
-+ if (buffer_string_length(con->request.request) < 4) return 0;
-
-- if (0 == memcmp(con->request.request->ptr + con->request.request->used - 5, "\r\n\r\n", 4)) return 1;
-+ if (0 == memcmp(con->request.request->ptr + buffer_string_length(con->request.request) - 4, CONST_STR_LEN("\r\n\r\n"))) return 1;
- if (NULL != strstr(con->request.request->ptr, "\r\n\r\n")) return 1;
-
- return 0;
-diff --git a/src/response.c b/src/response.c
-index 5072d05..357f43b 100644
---- a/src/response.c
-+++ b/src/response.c
-@@ -70,7 +70,7 @@ int http_response_write_header(server *srv, connection *con) {
-
- ds = (data_string *)con->response.headers->data[i];
-
-- if (ds->value->used && ds->key->used &&
-+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key) &&
- 0 != strncasecmp(ds->key->ptr, CONST_STR_LEN("X-LIGHTTPD-")) &&
- 0 != strncasecmp(ds->key->ptr, CONST_STR_LEN("X-Sendfile"))) {
- if (0 == strcasecmp(ds->key->ptr, "Date")) have_date = 1;
-@@ -99,10 +99,7 @@ int http_response_write_header(server *srv, connection *con) {
- if (srv->cur_ts != srv->last_generated_date_ts) {
- buffer_string_prepare_copy(srv->ts_date_str, 255);
-
-- strftime(srv->ts_date_str->ptr, srv->ts_date_str->size - 1,
-- "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(srv->cur_ts)));
--
-- srv->ts_date_str->used = strlen(srv->ts_date_str->ptr) + 1;
-+ buffer_append_strftime(srv->ts_date_str, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(srv->cur_ts)));
-
- srv->last_generated_date_ts = srv->cur_ts;
- }
-@@ -113,7 +110,7 @@ int http_response_write_header(server *srv, connection *con) {
- if (!have_server) {
- if (buffer_is_empty(con->conf.server_tag)) {
- buffer_append_string_len(b, CONST_STR_LEN("\r\nServer: " PACKAGE_DESC));
-- } else if (con->conf.server_tag->used > 1) {
-+ } else if (!buffer_string_is_empty(con->conf.server_tag)) {
- buffer_append_string_len(b, CONST_STR_LEN("\r\nServer: "));
- buffer_append_string_encoded(b, CONST_BUF_LEN(con->conf.server_tag), ENCODING_HTTP_HEADER);
- }
-@@ -121,7 +118,7 @@ int http_response_write_header(server *srv, connection *con) {
-
- buffer_append_string_len(b, CONST_STR_LEN("\r\n\r\n"));
-
-- con->bytes_header = b->used - 1;
-+ con->bytes_header = buffer_string_length(b);
-
- if (con->conf.log_response_header) {
- log_error_write(srv, __FILE__, __LINE__, "sSb", "Response-Header:", "\n", b);
-@@ -204,8 +201,7 @@ static void https_add_ssl_entries(connection *con) {
- buffer_string_prepare_copy(envds->value, n);
- BIO_read(bio, envds->value->ptr, n);
- BIO_free(bio);
-- envds->value->ptr[n] = '\0';
-- envds->value->used = n+1;
-+ buffer_commit(envds->value, n);
- array_insert_unique(con->environment, (data_unset *)envds);
- }
- }
-@@ -229,7 +225,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
- }
-
- /* no decision yet, build conf->filename */
-- if (con->mode == DIRECT && con->physical.path->used == 0) {
-+ if (con->mode == DIRECT && buffer_is_empty(con->physical.path)) {
- char *qstr;
-
- /* we only come here when we have the parse the full request again
-@@ -294,8 +290,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
-
- /** their might be a fragment which has to be cut away */
- if (NULL != (qstr = strchr(con->request.uri->ptr, '#'))) {
-- con->request.uri->used = qstr - con->request.uri->ptr;
-- con->request.uri->ptr[con->request.uri->used++] = '\0';
-+ buffer_string_set_length(con->request.uri, qstr - con->request.uri->ptr);
- }
-
- /** extract query string from request.uri */
-@@ -451,23 +446,18 @@ handler_t http_response_prepare(server *srv, connection *con) {
-
- if (con->physical.rel_path->used > 1) {
- buffer *b = con->physical.rel_path;
-+ size_t len = buffer_string_length(b);
- size_t i;
-
-- if (b->used > 2 &&
-- b->ptr[b->used-2] == '/' &&
-- (b->ptr[b->used-3] == ' ' ||
-- b->ptr[b->used-3] == '.')) {
-- b->ptr[b->used--] = '\0';
-- }
--
-- for (i = b->used - 2; b->used > 1; i--) {
-- if (b->ptr[i] == ' ' ||
-- b->ptr[i] == '.') {
-- b->ptr[b->used--] = '\0';
-- } else {
-- break;
-- }
-+ /* strip trailing " /" or "./" once */
-+ if (len > 1 &&
-+ b->ptr[len - 1] == '/' &&
-+ (b->ptr[len - 2] == ' ' || b->ptr[len - 2] == '.')) {
-+ len -= 2;
- }
-+ /* strip all trailing " " and "." */
-+ while (len > 0 && ( ' ' == b->ptr[len-1] || '.' == b->ptr[len-1] ) ) --len;
-+ buffer_string_set_length(b, len);
- }
- #endif
-
-@@ -515,9 +505,9 @@ handler_t http_response_prepare(server *srv, connection *con) {
- buffer_copy_buffer(con->physical.basedir, con->physical.doc_root);
- buffer_copy_buffer(con->physical.path, con->physical.doc_root);
- buffer_append_slash(con->physical.path);
-- if (con->physical.rel_path->used &&
-+ if (!buffer_string_is_empty(con->physical.rel_path) &&
- con->physical.rel_path->ptr[0] == '/') {
-- buffer_append_string_len(con->physical.path, con->physical.rel_path->ptr + 1, con->physical.rel_path->used - 2);
-+ buffer_append_string_len(con->physical.path, con->physical.rel_path->ptr + 1, buffer_string_length(con->physical.rel_path) - 1);
- } else {
- buffer_append_string_buffer(con->physical.path, con->physical.rel_path);
- }
-@@ -589,7 +579,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
- };
- #endif
- if (S_ISDIR(sce->st.st_mode)) {
-- if (con->uri.path->ptr[con->uri.path->used - 2] != '/') {
-+ if (con->uri.path->ptr[buffer_string_length(con->uri.path) - 1] != '/') {
- /* redirect to .../ */
-
- http_response_redirect_to_directory(srv, con);
-@@ -672,7 +662,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
- }
-
- if (slash) pathinfo = slash;
-- } while ((found == 0) && (slash != NULL) && ((size_t)(slash - srv->tmp_buf->ptr) > (con->physical.basedir->used - 2)));
-+ } while ((found == 0) && (slash != NULL) && ((size_t)(slash - srv->tmp_buf->ptr) > (buffer_string_length(con->physical.basedir) - 1)));
-
- if (found == 0) {
- /* no it really doesn't exists */
-@@ -711,8 +701,7 @@ handler_t http_response_prepare(server *srv, connection *con) {
- * shorten uri.path
- */
-
-- con->uri.path->used -= strlen(pathinfo);
-- con->uri.path->ptr[con->uri.path->used - 1] = '\0';
-+ buffer_string_set_length(con->uri.path, buffer_string_length(con->uri.path) - strlen(pathinfo));
- }
-
- if (con->conf.log_request_handling) {
-diff --git a/src/server.c b/src/server.c
-index 71d3538..5089375 100644
---- a/src/server.c
-+++ b/src/server.c
-@@ -666,7 +666,7 @@ int main (int argc, char **argv) {
- #endif
-
- /* check document-root */
-- if (srv->config_storage[0]->document_root->used <= 1) {
-+ if (buffer_string_is_empty(srv->config_storage[0]->document_root)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "document-root is not set\n");
-
-@@ -686,7 +686,7 @@ int main (int argc, char **argv) {
- }
-
- /* open pid file BEFORE chroot */
-- if (srv->srvconf.pid_file->used) {
-+ if (!buffer_string_is_empty(srv->srvconf.pid_file)) {
- if (-1 == (pid_fd = open(srv->srvconf.pid_file->ptr, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))) {
- struct stat st;
- if (errno != EEXIST) {
-@@ -780,7 +780,7 @@ int main (int argc, char **argv) {
-
- #ifdef HAVE_PWD_H
- /* set user and group */
-- if (srv->srvconf.username->used) {
-+ if (!buffer_string_is_empty(srv->srvconf.username)) {
- if (NULL == (pwd = getpwnam(srv->srvconf.username->ptr))) {
- log_error_write(srv, __FILE__, __LINE__, "sb",
- "can't find username", srv->srvconf.username);
-@@ -794,7 +794,7 @@ int main (int argc, char **argv) {
- }
- }
-
-- if (srv->srvconf.groupname->used) {
-+ if (!buffer_string_is_empty(srv->srvconf.groupname)) {
- if (NULL == (grp = getgrnam(srv->srvconf.groupname->ptr))) {
- log_error_write(srv, __FILE__, __LINE__, "sb",
- "can't find groupname", srv->srvconf.groupname);
-@@ -828,13 +828,13 @@ int main (int argc, char **argv) {
- log_error_write(srv, __FILE__, __LINE__, "ss", "setgroups failed: ", strerror(errno));
- return -1;
- }
-- if (srv->srvconf.username->used) {
-+ if (!buffer_string_is_empty(srv->srvconf.username)) {
- initgroups(srv->srvconf.username->ptr, grp->gr_gid);
- }
- }
- #endif
- #ifdef HAVE_CHROOT
-- if (srv->srvconf.changeroot->used) {
-+ if (!buffer_string_is_empty(srv->srvconf.changeroot)) {
- tzset();
-
- if (-1 == chroot(srv->srvconf.changeroot->ptr)) {
-@@ -1001,8 +1001,7 @@ int main (int argc, char **argv) {
- if (pid_fd != -1) {
- buffer_copy_int(srv->tmp_buf, getpid());
- buffer_append_string_len(srv->tmp_buf, CONST_STR_LEN("\n"));
-- force_assert(srv->tmp_buf->used > 0);
-- write(pid_fd, srv->tmp_buf->ptr, srv->tmp_buf->used - 1);
-+ write(pid_fd, CONST_BUF_LEN(srv->tmp_buf));
- close(pid_fd);
- pid_fd = -1;
- }
-@@ -1425,8 +1424,8 @@ int main (int argc, char **argv) {
-
- /* network_close() will cleanup after us */
-
-- if (srv->srvconf.pid_file->used &&
-- srv->srvconf.changeroot->used == 0) {
-+ if (!buffer_string_is_empty(srv->srvconf.pid_file) &&
-+ buffer_string_is_empty(srv->srvconf.changeroot)) {
- if (0 != unlink(srv->srvconf.pid_file->ptr)) {
- if (errno != EACCES && errno != EPERM) {
- log_error_write(srv, __FILE__, __LINE__, "sbds",
-@@ -1542,8 +1541,8 @@ int main (int argc, char **argv) {
- srv->joblist->used = 0;
- }
-
-- if (srv->srvconf.pid_file->used &&
-- srv->srvconf.changeroot->used == 0 &&
-+ if (!buffer_string_is_empty(srv->srvconf.pid_file) &&
-+ buffer_string_is_empty(srv->srvconf.changeroot) &&
- 0 == graceful_shutdown) {
- if (0 != unlink(srv->srvconf.pid_file->ptr)) {
- if (errno != EACCES && errno != EPERM) {
-diff --git a/src/stat_cache.c b/src/stat_cache.c
-index b63140e..dedea4b 100644
---- a/src/stat_cache.c
-+++ b/src/stat_cache.c
-@@ -222,8 +222,7 @@ static int stat_cache_attr_get(buffer *buf, char *name) {
- buffer_string_prepare_copy(buf, 1023);
- attrlen = buf->size - 1;
- if(0 == (ret = attr_get(name, "Content-Type", buf->ptr, &attrlen, 0))) {
-- buf->used = attrlen + 1;
-- buf->ptr[attrlen] = '\0';
-+ buffer_commit(buf, attrlen);
- }
- return ret;
- }
-@@ -332,7 +331,7 @@ static int buffer_copy_dirname(buffer *dst, buffer *file) {
-
- if (buffer_string_is_empty(file)) return -1;
-
-- for (i = file->used - 1; i+1 > 0; i--) {
-+ for (i = buffer_string_length(file); i > 0; i--) {
- if (file->ptr[i] == '/') {
- buffer_copy_string_len(dst, file->ptr, i);
- return 0;
-@@ -499,7 +498,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
-
- if (S_ISREG(st.st_mode)) {
- /* fix broken stat/open for symlinks to reg files with appended slash on freebsd,osx */
-- if (name->ptr[name->used-2] == '/') {
-+ if (name->ptr[buffer_string_length(name) - 1] == '/') {
- errno = ENOTDIR;
- return HANDLER_ERROR;
- }
-@@ -571,16 +570,15 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- * we assume "/" can not be symlink, so
- * skip the symlink stuff if our path is /
- **/
-- else if ((name->used > 2)) {
-+ else if (buffer_string_length(name) > 1) {
- buffer *dname;
- char *s_cur;
-
- dname = buffer_init();
- buffer_copy_buffer(dname, name);
-
-- while ((s_cur = strrchr(dname->ptr,'/'))) {
-- *s_cur = '\0';
-- dname->used = s_cur - dname->ptr + 1;
-+ while ((s_cur = strrchr(dname->ptr, '/'))) {
-+ buffer_string_set_length(dname, s_cur - dname->ptr);
- if (dname->ptr == s_cur) {
- #ifdef DEBUG_STAT_CACHE
- log_error_write(srv, __FILE__, __LINE__, "s", "reached /");
-@@ -615,16 +613,19 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
- #endif
- /* xattr did not set a content-type. ask the config */
- if (buffer_string_is_empty(sce->content_type)) {
-+ size_t namelen = buffer_string_length(name);
-+
- for (k = 0; k < con->conf.mimetypes->used; k++) {
- data_string *ds = (data_string *)con->conf.mimetypes->data[k];
- buffer *type = ds->key;
-+ size_t typelen = buffer_string_length(type);
-
-- if (type->used == 0) continue;
-+ if (buffer_is_empty(type)) continue;
-
- /* check if the right side is the same */
-- if (type->used > name->used) continue;
-+ if (typelen > namelen) continue;
-
-- if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) {
-+ if (0 == strncasecmp(name->ptr + namelen - typelen, type->ptr, typelen)) {
- buffer_copy_buffer(sce->content_type, ds->value);
- break;
- }
---
-2.4.5
-
diff --git a/main/lighttpd/0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch b/main/lighttpd/0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
deleted file mode 100644
index 16441ace75..0000000000
--- a/main/lighttpd/0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From 91a9a6b3910df8be3936ed0a70b0ac6cbdc10079 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:46 +0000
-Subject: [PATCH 20/29] rename buffer_append_long_hex to buffer_append_uint_hex
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-* takes uintmax_t now
-* use in http_chunk_append_len
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2980 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/buffer.c | 4 ++--
- src/buffer.h | 2 +-
- src/http_chunk.c | 22 +++-------------------
- src/log.c | 4 ++--
- 4 files changed, 8 insertions(+), 24 deletions(-)
-
-diff --git a/src/buffer.c b/src/buffer.c
-index d343731..425d700 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -234,12 +234,12 @@ void buffer_append_string_buffer(buffer *b, const buffer *src) {
- }
- }
-
--void buffer_append_long_hex(buffer *b, unsigned long value) {
-+void buffer_append_uint_hex(buffer *b, uintmax_t value) {
- char *buf;
- int shift = 0;
-
- {
-- unsigned long copy = value;
-+ uintmax_t copy = value;
- do {
- copy >>= 8;
- shift += 2; /* counting nibbles (4 bits) */
-diff --git a/src/buffer.h b/src/buffer.h
-index e2ac778..f5d0224 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -89,7 +89,7 @@ void buffer_append_string(buffer *b, const char *s);
- void buffer_append_string_len(buffer *b, const char *s, size_t s_len);
- void buffer_append_string_buffer(buffer *b, const buffer *src);
-
--void buffer_append_long_hex(buffer *b, unsigned long len);
-+void buffer_append_uint_hex(buffer *b, uintmax_t len);
- void buffer_append_int(buffer *b, intmax_t val);
- void buffer_copy_int(buffer *b, intmax_t val);
-
-diff --git a/src/http_chunk.c b/src/http_chunk.c
-index 79e4586..45db56c 100644
---- a/src/http_chunk.c
-+++ b/src/http_chunk.c
-@@ -21,31 +21,15 @@
- #include <string.h>
-
- static void http_chunk_append_len(server *srv, connection *con, size_t len) {
-- size_t i, olen = len, j;
- buffer *b;
-
- force_assert(NULL != srv);
-
- b = srv->tmp_chunk_len;
-
-- if (len == 0) {
-- buffer_copy_string_len(b, CONST_STR_LEN("0\r\n"));
-- } else {
-- for (i = 0; i < 8 && len; i++) {
-- len >>= 4;
-- }
--
-- /* i is the number of hex digits we have, + \r\n */
-- buffer_string_prepare_copy(b, i + 2);
--
-- for (j = i-1, len = olen; j+1 > 0; j--) {
-- b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10);
-- len >>= 4;
-- }
-- buffer_commit(b, i);
--
-- buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
-- }
-+ buffer_string_set_length(b, 0);
-+ buffer_append_uint_hex(b, len);
-+ buffer_append_string_len(b, CONST_STR_LEN("\r\n"));
-
- chunkqueue_append_buffer(con->write_queue, b);
- }
-diff --git a/src/log.c b/src/log.c
-index 6c9c38d..9322d2c 100644
---- a/src/log.c
-+++ b/src/log.c
-@@ -288,7 +288,7 @@ static void log_buffer_append_printf(buffer *out, const char *fmt, va_list ap) {
- case 'x': /* int (hex) */
- d = va_arg(ap, int);
- buffer_append_string_len(out, CONST_STR_LEN("0x"));
-- buffer_append_long_hex(out, d);
-+ buffer_append_uint_hex(out, d);
- buffer_append_string_len(out, CONST_STR_LEN(" "));
- break;
- case 'S': /* string */
-@@ -310,7 +310,7 @@ static void log_buffer_append_printf(buffer *out, const char *fmt, va_list ap) {
- case 'X': /* int (hex) */
- d = va_arg(ap, int);
- buffer_append_string_len(out, CONST_STR_LEN("0x"));
-- buffer_append_long_hex(out, d);
-+ buffer_append_uint_hex(out, d);
- break;
- case '(':
- case ')':
---
-2.4.5
-
diff --git a/main/lighttpd/0021-buffer-constify-some-parameters.patch b/main/lighttpd/0021-buffer-constify-some-parameters.patch
deleted file mode 100644
index d99e114906..0000000000
--- a/main/lighttpd/0021-buffer-constify-some-parameters.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From 66ad587f2f9e9d9ce44437c1e185a961cfc13290 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:49 +0000
-Subject: [PATCH 21/29] [buffer] constify some parameters
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2981 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/buffer.c | 12 ++++++------
- src/buffer.h | 12 ++++++------
- 2 files changed, 12 insertions(+), 12 deletions(-)
-
-diff --git a/src/buffer.c b/src/buffer.c
-index 425d700..57c1613 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -409,11 +409,11 @@ char * buffer_search_string_len(buffer *b, const char *needle, size_t len) {
- return NULL;
- }
-
--int buffer_is_empty(buffer *b) {
-+int buffer_is_empty(const buffer *b) {
- return NULL == b || 0 == b->used;
- }
-
--int buffer_string_is_empty(buffer *b) {
-+int buffer_string_is_empty(const buffer *b) {
- return 0 == buffer_string_length(b);
- }
-
-@@ -424,7 +424,7 @@ int buffer_string_is_empty(buffer *b) {
- * alignment properly.
- */
-
--int buffer_is_equal(buffer *a, buffer *b) {
-+int buffer_is_equal(const buffer *a, const buffer *b) {
- force_assert(NULL != a && NULL != b);
-
- if (a->used != b->used) return 0;
-@@ -433,7 +433,7 @@ int buffer_is_equal(buffer *a, buffer *b) {
- return (0 == memcmp(a->ptr, b->ptr, a->used));
- }
-
--int buffer_is_equal_string(buffer *a, const char *s, size_t b_len) {
-+int buffer_is_equal_string(const buffer *a, const char *s, size_t b_len) {
- force_assert(NULL != a && NULL != s);
- force_assert(b_len + 1 > b_len);
-
-@@ -445,7 +445,7 @@ int buffer_is_equal_string(buffer *a, const char *s, size_t b_len) {
- }
-
- /* buffer_is_equal_caseless_string(b, CONST_STR_LEN("value")) */
--int buffer_is_equal_caseless_string(buffer *a, const char *s, size_t b_len) {
-+int buffer_is_equal_caseless_string(const buffer *a, const char *s, size_t b_len) {
- force_assert(NULL != a);
- if (a->used != b_len + 1) return 0;
- force_assert('\0' == a->ptr[a->used - 1]);
-@@ -472,7 +472,7 @@ int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b
- return a_len < b_len ? -1 : 1;
- }
-
--int buffer_is_equal_right_len(buffer *b1, buffer *b2, size_t len) {
-+int buffer_is_equal_right_len(const buffer *b1, const buffer *b2, size_t len) {
- /* no len -> equal */
- if (len == 0) return 1;
-
-diff --git a/src/buffer.h b/src/buffer.h
-index f5d0224..b6065d4 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -112,14 +112,14 @@ char * buffer_search_string_len(buffer *b, const char *needle, size_t len);
- * unset "string" (buffer) config options are initialized to used == 0,
- * while setting an empty string leads to used == 1
- */
--int buffer_is_empty(buffer *b);
-+int buffer_is_empty(const buffer *b);
- /* NULL buffer, empty buffer (used == 0) or empty string (used == 1) */
--int buffer_string_is_empty(buffer *b);
-+int buffer_string_is_empty(const buffer *b);
-
--int buffer_is_equal(buffer *a, buffer *b);
--int buffer_is_equal_right_len(buffer *a, buffer *b, size_t len);
--int buffer_is_equal_string(buffer *a, const char *s, size_t b_len);
--int buffer_is_equal_caseless_string(buffer *a, const char *s, size_t b_len);
-+int buffer_is_equal(const buffer *a, const buffer *b);
-+int buffer_is_equal_right_len(const buffer *a, const buffer *b, size_t len);
-+int buffer_is_equal_string(const buffer *a, const char *s, size_t b_len);
-+int buffer_is_equal_caseless_string(const buffer *a, const char *s, size_t b_len);
- int buffer_caseless_compare(const char *a, size_t a_len, const char *b, size_t b_len);
-
- typedef enum {
---
-2.4.5
-
diff --git a/main/lighttpd/0022-bitset-unused-remove.patch b/main/lighttpd/0022-bitset-unused-remove.patch
deleted file mode 100644
index 572f7a5e25..0000000000
--- a/main/lighttpd/0022-bitset-unused-remove.patch
+++ /dev/null
@@ -1,170 +0,0 @@
-From bfce99aacc99d962a9855fbbae61c309728122fe Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:51 +0000
-Subject: [PATCH 22/29] [bitset] unused -> remove
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2982 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/CMakeLists.txt | 2 +-
- src/Makefile.am | 4 ++--
- src/SConscript | 2 +-
- src/bitset.c | 67 ------------------------------------------------------
- src/bitset.h | 19 ----------------
- src/fdevent.h | 1 -
- 6 files changed, 4 insertions(+), 91 deletions(-)
- delete mode 100644 src/bitset.c
- delete mode 100644 src/bitset.h
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index a5471ff..a4ada19 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -66,7 +66,7 @@ common_src=buffer.c log.c \
- fdevent_poll.c fdevent_linux_sysepoll.c \
- fdevent_solaris_devpoll.c fdevent_solaris_port.c \
- fdevent_freebsd_kqueue.c \
-- data_config.c bitset.c \
-+ data_config.c \
- inet_ntop_cache.c crc32.c \
- connections-glue.c \
- configfile-glue.c \
-@@ -273,7 +273,7 @@ hdr = server.h buffer.h network.h log.h keyvalue.h \
- fdevent.h connections.h base.h stat_cache.h \
- plugin.h mod_auth.h \
- etag.h joblist.h array.h crc32.h \
-- network_backends.h configfile.h bitset.h \
-+ network_backends.h configfile.h \
- mod_ssi.h mod_ssi_expr.h inet_ntop_cache.h \
- configparser.h mod_ssi_exprparser.h \
- sys-mmap.h sys-socket.h mod_cml.h mod_cml_funcs.h \
-diff --git a/src/SConscript b/src/SConscript
-index 7565094..bb507a5 100644
---- a/src/SConscript
-+++ b/src/SConscript
-@@ -14,7 +14,7 @@ common_src = Split("buffer.c log.c \
- fdevent_poll.c fdevent_linux_sysepoll.c \
- fdevent_solaris_devpoll.c fdevent_solaris_port.c \
- fdevent_freebsd_kqueue.c \
-- data_config.c bitset.c \
-+ data_config.c \
- inet_ntop_cache.c crc32.c \
- connections-glue.c \
- configfile-glue.c \
-diff --git a/src/bitset.c b/src/bitset.c
-deleted file mode 100644
-index 27c93a8..0000000
---- a/src/bitset.c
-+++ /dev/null
-@@ -1,67 +0,0 @@
--#include "buffer.h"
--#include "bitset.h"
--
--#include <limits.h>
--#include <stdlib.h>
--#include <string.h>
--#include <stdio.h>
--#include <assert.h>
--
--#define BITSET_BITS \
-- ( CHAR_BIT * sizeof(size_t) )
--
--#define BITSET_MASK(pos) \
-- ( ((size_t)1) << ((pos) % BITSET_BITS) )
--
--#define BITSET_WORD(set, pos) \
-- ( (set)->bits[(pos) / BITSET_BITS] )
--
--#define BITSET_USED(nbits) \
-- ( ((nbits) + (BITSET_BITS - 1)) / BITSET_BITS )
--
--bitset *bitset_init(size_t nbits) {
-- bitset *set;
--
-- set = malloc(sizeof(*set));
-- force_assert(set);
--
-- set->bits = calloc(BITSET_USED(nbits), sizeof(*set->bits));
-- set->nbits = nbits;
--
-- force_assert(set->bits);
--
-- return set;
--}
--
--void bitset_reset(bitset *set) {
-- memset(set->bits, 0, BITSET_USED(set->nbits) * sizeof(*set->bits));
--}
--
--void bitset_free(bitset *set) {
-- free(set->bits);
-- free(set);
--}
--
--void bitset_clear_bit(bitset *set, size_t pos) {
-- if (pos >= set->nbits) {
-- SEGFAULT();
-- }
--
-- BITSET_WORD(set, pos) &= ~BITSET_MASK(pos);
--}
--
--void bitset_set_bit(bitset *set, size_t pos) {
-- if (pos >= set->nbits) {
-- SEGFAULT();
-- }
--
-- BITSET_WORD(set, pos) |= BITSET_MASK(pos);
--}
--
--int bitset_test_bit(bitset *set, size_t pos) {
-- if (pos >= set->nbits) {
-- SEGFAULT();
-- }
--
-- return (BITSET_WORD(set, pos) & BITSET_MASK(pos)) != 0;
--}
-diff --git a/src/bitset.h b/src/bitset.h
-deleted file mode 100644
-index 467e13f..0000000
---- a/src/bitset.h
-+++ /dev/null
-@@ -1,19 +0,0 @@
--#ifndef _BITSET_H_
--#define _BITSET_H_
--
--#include <stddef.h>
--
--typedef struct {
-- size_t *bits;
-- size_t nbits;
--} bitset;
--
--bitset *bitset_init(size_t nbits);
--void bitset_reset(bitset *set);
--void bitset_free(bitset *set);
--
--void bitset_clear_bit(bitset *set, size_t pos);
--void bitset_set_bit(bitset *set, size_t pos);
--int bitset_test_bit(bitset *set, size_t pos);
--
--#endif
-diff --git a/src/fdevent.h b/src/fdevent.h
-index 5147baa..235d68b 100644
---- a/src/fdevent.h
-+++ b/src/fdevent.h
-@@ -6,7 +6,6 @@
- #endif
-
- #include "settings.h"
--#include "bitset.h"
-
- #if defined HAVE_STDINT_H
- # include <stdint.h>
---
-2.4.5
-
diff --git a/main/lighttpd/0023-remove-unused-stuff-from-server.h.patch b/main/lighttpd/0023-remove-unused-stuff-from-server.h.patch
deleted file mode 100644
index 178cba4c40..0000000000
--- a/main/lighttpd/0023-remove-unused-stuff-from-server.h.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 68add2602b15638f2bb8cb7710a0dd60e95c6ac3 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:53 +0000
-Subject: [PATCH 23/29] remove unused stuff from server.h
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2983 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/server.h | 8 --------
- 1 file changed, 8 deletions(-)
-
-diff --git a/src/server.h b/src/server.h
-index bca2d52..67d4e7c 100644
---- a/src/server.h
-+++ b/src/server.h
-@@ -3,15 +3,7 @@
-
- #include "base.h"
-
--typedef struct {
-- char *key;
-- char *value;
--} two_strings;
--
--typedef enum { CONFIG_UNSET, CONFIG_DOCUMENT_ROOT } config_var_t;
--
- int config_read(server *srv, const char *fn);
- int config_set_defaults(server *srv);
--buffer *config_get_value_buffer(server *srv, connection *con, config_var_t field);
-
- #endif
---
-2.4.5
-
diff --git a/main/lighttpd/0024-crc32-fix-method-signature-const-pointer.patch b/main/lighttpd/0024-crc32-fix-method-signature-const-pointer.patch
deleted file mode 100644
index f53cc5b2cf..0000000000
--- a/main/lighttpd/0024-crc32-fix-method-signature-const-pointer.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From deceae78c9584350d17a9b5b9a5d2fef3def5e45 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:56 +0000
-Subject: [PATCH 24/29] [crc32] fix method signature (const pointer)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2984 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- src/crc32.c | 2 +-
- src/crc32.h | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/crc32.c b/src/crc32.c
-index cdad7bc..b19bec5 100644
---- a/src/crc32.c
-+++ b/src/crc32.c
-@@ -70,7 +70,7 @@ static const unsigned int crc_c[256] = {
- };
-
-
--uint32_t generate_crc32c(char *buffer, size_t length) {
-+uint32_t generate_crc32c(const char *buffer, size_t length) {
- size_t i;
- uint32_t crc32 = ~0L;
-
-diff --git a/src/crc32.h b/src/crc32.h
-index c5b4245..10e0e90 100644
---- a/src/crc32.h
-+++ b/src/crc32.h
-@@ -13,6 +13,6 @@
- # include <inttypes.h>
- #endif
-
--uint32_t generate_crc32c(char *string, size_t length);
-+uint32_t generate_crc32c(const char *string, size_t length);
-
- #endif
---
-2.4.5
-
diff --git a/main/lighttpd/0025-tests-fix-undefined-index-warning-in-sendfile.php.patch b/main/lighttpd/0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
deleted file mode 100644
index f37b98cdba..0000000000
--- a/main/lighttpd/0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 673923daf839fda59e4dc1e5f95f5b265a65e802 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Sun, 8 Feb 2015 19:10:58 +0000
-Subject: [PATCH 25/29] [tests] fix undefined index warning in sendfile.php
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2985 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- tests/docroot/www/sendfile.php | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tests/docroot/www/sendfile.php b/tests/docroot/www/sendfile.php
-index 0aa8786..e460220 100644
---- a/tests/docroot/www/sendfile.php
-+++ b/tests/docroot/www/sendfile.php
-@@ -6,7 +6,7 @@ function pathencode($path) {
-
- $val = "X-Sendfile2: " . pathencode(getcwd() . "/index.txt") . " " . $_GET["range"];
-
--if ($_GET["range2"]) $val .= ", " . pathencode(getcwd() . "/index.txt") . " " . $_GET["range2"];
-+if (isset($_GET["range2"])) $val .= ", " . pathencode(getcwd() . "/index.txt") . " " . $_GET["range2"];
-
- header($val);
-
---
-2.4.5
-
diff --git a/main/lighttpd/0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch b/main/lighttpd/0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
deleted file mode 100644
index 8fbefeb99e..0000000000
--- a/main/lighttpd/0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-From c92496720d21ea7888187a8ae305c392d4fe824a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 12 Feb 2015 06:39:39 +0000
-Subject: [PATCH 26/29] [mod_auth] use crypt_r instead of crypt if available
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2986 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- configure.ac | 22 +++++++++++++++-------
- src/CMakeLists.txt | 12 +++++++++---
- src/config.h.cmake | 3 ++-
- src/http_auth.c | 10 +++++++++-
- 5 files changed, 36 insertions(+), 12 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index ddb370d..59fd4f6 100644
---- a/NEWS
-+++ b/NEWS
-@@ -16,6 +16,7 @@ NEWS
- * [connections] fix bug in connection state handling
- * print backtrace in assert logging with libunwind
- * major refactoring of internal buffer/chunk handling
-+ * [mod_auth] use crypt_r instead of crypt if available
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/configure.ac b/configure.ac
-index c846d1a..16e66d6 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -528,19 +528,27 @@ if test "$WITH_LUA" != "no"; then
- AC_SUBST(LUA_LIBS)
- fi
-
-+dnl search for crypt_r and (fallback) for crypt
- save_LIBS=$LIBS
--AC_SEARCH_LIBS(crypt,crypt,[
-+LIBS=
-+AC_SEARCH_LIBS([crypt_r],[crypt],[
-+ AC_DEFINE([HAVE_CRYPT_R], [1], [crypt_r])
- AC_CHECK_HEADERS([crypt.h],[
-- AC_DEFINE([HAVE_CRYPT_H], [1])
-+ AC_DEFINE([HAVE_CRYPT_H], [1], [crypt.h])
- ])
-
-- AC_DEFINE([HAVE_LIBCRYPT], [1], [libcrypt])
-- if test "$ac_cv_search_crypt" != no; then
-- test "$ac_cv_search_crypt" = "none required" || CRYPT_LIB="$ac_cv_search_crypt"
-- fi
-+ CRYPT_LIB=$LIBS
-+],[
-+ AC_SEARCH_LIBS([crypt],[crypt],[
-+ AC_CHECK_HEADERS([crypt.h],[
-+ AC_DEFINE([HAVE_CRYPT_H], [1], [crypt.h])
-+ ])
-+
-+ CRYPT_LIB=$LIBS
-+ ])
- ])
- LIBS=$save_LIBS
--AC_SUBST(CRYPT_LIB)
-+AC_SUBST([CRYPT_LIB])
-
- save_LIBS=$LIBS
- AC_SEARCH_LIBS(sendfilev,sendfile,[
-diff --git a/src/http_auth.c b/src/http_auth.c
-index a98ea62..dacf70a 100644
---- a/src/http_auth.c
-+++ b/src/http_auth.c
-@@ -669,15 +669,23 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p
- return (strcmp(sample, password->ptr) == 0) ? 0 : 1;
- #endif
- } else {
--#ifdef HAVE_CRYPT
-+#if defined(HAVE_CRYPT_R) || defined(HAVE_CRYPT)
- char *crypted;
-+#if defined(HAVE_CRYPT_R)
-+ struct crypt_data crypt_tmp_data;
-+ crypt_tmp_data.initialized = 0;
-+#endif
-
- /* a simple DES password is 2 + 11 characters. everything else should be longer. */
- if (buffer_string_length(password) < 13) {
- return -1;
- }
-
-+#if defined(HAVE_CRYPT_R)
-+ if (0 == (crypted = crypt_r(pw, password->ptr, &crypt_tmp_data))) {
-+#else
- if (0 == (crypted = crypt(pw, password->ptr))) {
-+#endif
- /* crypt failed. */
- return -1;
- }
---
-2.4.5
-
diff --git a/main/lighttpd/0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch b/main/lighttpd/0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
deleted file mode 100644
index c11a695e72..0000000000
--- a/main/lighttpd/0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From df87b3ef98711b6a4ca4cefb1fceec022ddcdc13 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 14 May 2015 09:38:30 +0000
-Subject: [PATCH 27/29] fix error message for T_CONFIG_ARRAY config values if
- an entry value is not a string
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2987 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/configfile-glue.c | 6 +++---
- 2 files changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 59fd4f6..4d19144 100644
---- a/NEWS
-+++ b/NEWS
-@@ -17,6 +17,7 @@ NEWS
- * print backtrace in assert logging with libunwind
- * major refactoring of internal buffer/chunk handling
- * [mod_auth] use crypt_r instead of crypt if available
-+ * fix error message for T_CONFIG_ARRAY config values if an entry value is not a string
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/configfile-glue.c b/src/configfile-glue.c
-index f411d72..807e307 100644
---- a/src/configfile-glue.c
-+++ b/src/configfile-glue.c
-@@ -56,9 +56,9 @@ int config_insert_values_internal(server *srv, array *ca, const config_values_t
-
- array_insert_unique(cv[i].destination, (data_unset *)ds);
- } else {
-- log_error_write(srv, __FILE__, __LINE__, "sssd",
-- "the key of an array can only be a string or a integer, variable:",
-- cv[i].key, "type:", da->value->data[j]->type);
-+ log_error_write(srv, __FILE__, __LINE__, "sssbsd",
-+ "the value of an array can only be a string, variable:",
-+ cv[i].key, "[", da->value->data[j]->key, "], type:", da->value->data[j]->type);
-
- return -1;
- }
---
-2.4.5
-
diff --git a/main/lighttpd/0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch b/main/lighttpd/0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
deleted file mode 100644
index d35b478424..0000000000
--- a/main/lighttpd/0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
+++ /dev/null
@@ -1,447 +0,0 @@
-From 33cebeb0f778d437e1a6070504f588b2531fa291 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 14 May 2015 09:38:33 +0000
-Subject: [PATCH 28/29] fix segfaults in many plugins if they failed
- configuration
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2988 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 1 +
- src/mod_access.c | 2 ++
- src/mod_accesslog.c | 2 +-
- src/mod_alias.c | 2 +-
- src/mod_auth.c | 2 +-
- src/mod_cgi.c | 2 ++
- src/mod_cml.c | 2 ++
- src/mod_compress.c | 2 +-
- src/mod_evasive.c | 2 ++
- src/mod_evhost.c | 2 +-
- src/mod_expire.c | 3 ++-
- src/mod_extforward.c | 2 +-
- src/mod_fastcgi.c | 2 +-
- src/mod_flv_streaming.c | 2 +-
- src/mod_indexfile.c | 2 +-
- src/mod_magnet.c | 2 +-
- src/mod_proxy.c | 7 +++----
- src/mod_redirect.c | 2 ++
- src/mod_rewrite.c | 3 +++
- src/mod_rrdtool.c | 2 ++
- src/mod_scgi.c | 2 +-
- src/mod_secure_download.c | 2 ++
- src/mod_setenv.c | 2 ++
- src/mod_skeleton.c | 2 +-
- src/mod_ssi.c | 2 ++
- src/mod_staticfile.c | 2 ++
- src/mod_trigger_b4_dl.c | 2 +-
- src/mod_uploadprogress.c | 2 ++
- src/mod_userdir.c | 2 ++
- src/mod_usertrack.c | 2 ++
- src/mod_webdav.c | 2 +-
- 31 files changed, 49 insertions(+), 19 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index 4d19144..dd2d1b8 100644
---- a/NEWS
-+++ b/NEWS
-@@ -18,6 +18,7 @@ NEWS
- * major refactoring of internal buffer/chunk handling
- * [mod_auth] use crypt_r instead of crypt if available
- * fix error message for T_CONFIG_ARRAY config values if an entry value is not a string
-+ * fix segfaults in many plugins if they failed configuration
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-diff --git a/src/mod_access.c b/src/mod_access.c
-index a6c25a4..e6a9a14 100644
---- a/src/mod_access.c
-+++ b/src/mod_access.c
-@@ -40,6 +40,8 @@ FREE_FUNC(mod_access_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- array_free(s->access_deny);
-
- free(s);
-diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c
-index 9bb3fe2..f5be7d2 100644
---- a/src/mod_accesslog.c
-+++ b/src/mod_accesslog.c
-@@ -414,7 +414,7 @@ FREE_FUNC(mod_accesslog_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- if (!buffer_string_is_empty(s->access_logbuffer)) {
- if (s->log_access_fd != -1) {
-diff --git a/src/mod_alias.c b/src/mod_alias.c
-index 4625973..f9d7b51 100644
---- a/src/mod_alias.c
-+++ b/src/mod_alias.c
-@@ -45,7 +45,7 @@ FREE_FUNC(mod_alias_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if(!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->alias);
-
-diff --git a/src/mod_auth.c b/src/mod_auth.c
-index 1870893..edddaa8 100644
---- a/src/mod_auth.c
-+++ b/src/mod_auth.c
-@@ -60,7 +60,7 @@ FREE_FUNC(mod_auth_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- mod_auth_plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->auth_require);
- buffer_free(s->auth_plain_groupfile);
-diff --git a/src/mod_cgi.c b/src/mod_cgi.c
-index 8a7cc2b..01b1877 100644
---- a/src/mod_cgi.c
-+++ b/src/mod_cgi.c
-@@ -127,6 +127,8 @@ FREE_FUNC(mod_cgi_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- array_free(s->cgi);
-
- free(s);
-diff --git a/src/mod_cml.c b/src/mod_cml.c
-index baa23b3..98f8d77 100644
---- a/src/mod_cml.c
-+++ b/src/mod_cml.c
-@@ -43,6 +43,8 @@ FREE_FUNC(mod_cml_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- buffer_free(s->ext);
-
- buffer_free(s->mc_namespace);
-diff --git a/src/mod_compress.c b/src/mod_compress.c
-index f0ffa1c..29d5ab5 100644
---- a/src/mod_compress.c
-+++ b/src/mod_compress.c
-@@ -90,7 +90,7 @@ FREE_FUNC(mod_compress_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->compress);
- buffer_free(s->compress_cache_dir);
-diff --git a/src/mod_evasive.c b/src/mod_evasive.c
-index d9b8732..da45c9a 100644
---- a/src/mod_evasive.c
-+++ b/src/mod_evasive.c
-@@ -58,6 +58,8 @@ FREE_FUNC(mod_evasive_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- free(s);
- }
- free(p->config_storage);
-diff --git a/src/mod_evhost.c b/src/mod_evhost.c
-index e728551..3c49adf 100644
---- a/src/mod_evhost.c
-+++ b/src/mod_evhost.c
-@@ -46,7 +46,7 @@ FREE_FUNC(mod_evhost_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- if(s->path_pieces) {
- size_t j;
-diff --git a/src/mod_expire.c b/src/mod_expire.c
-index e26c3c6..0794c15 100644
---- a/src/mod_expire.c
-+++ b/src/mod_expire.c
-@@ -62,7 +62,8 @@ FREE_FUNC(mod_expire_free) {
- size_t i;
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-- if (!s) continue;
-+
-+ if (NULL == s) continue;
-
- array_free(s->expire_url);
- free(s);
-diff --git a/src/mod_extforward.c b/src/mod_extforward.c
-index 7f77982..557c505 100644
---- a/src/mod_extforward.c
-+++ b/src/mod_extforward.c
-@@ -135,7 +135,7 @@ FREE_FUNC(mod_extforward_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->forwarder);
- array_free(s->headers);
-diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c
-index d16306c..5be73df 100644
---- a/src/mod_fastcgi.c
-+++ b/src/mod_fastcgi.c
-@@ -693,7 +693,7 @@ FREE_FUNC(mod_fastcgi_free) {
- plugin_config *s = p->config_storage[i];
- fcgi_exts *exts;
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- exts = s->exts;
-
-diff --git a/src/mod_flv_streaming.c b/src/mod_flv_streaming.c
-index db041e2..6e92c74 100644
---- a/src/mod_flv_streaming.c
-+++ b/src/mod_flv_streaming.c
-@@ -54,7 +54,7 @@ FREE_FUNC(mod_flv_streaming_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->extensions);
-
-diff --git a/src/mod_indexfile.c b/src/mod_indexfile.c
-index 13d18e2..3c57256 100644
---- a/src/mod_indexfile.c
-+++ b/src/mod_indexfile.c
-@@ -51,7 +51,7 @@ FREE_FUNC(mod_indexfile_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->indexfiles);
-
-diff --git a/src/mod_magnet.c b/src/mod_magnet.c
-index 8f89d4e..0d99fdf 100644
---- a/src/mod_magnet.c
-+++ b/src/mod_magnet.c
-@@ -71,7 +71,7 @@ FREE_FUNC(mod_magnet_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->url_raw);
- array_free(s->physical_path);
-diff --git a/src/mod_proxy.c b/src/mod_proxy.c
-index dfdc636..7821072 100644
---- a/src/mod_proxy.c
-+++ b/src/mod_proxy.c
-@@ -167,12 +167,11 @@ FREE_FUNC(mod_proxy_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (s) {
-+ if (NULL == s) continue;
-
-- array_free(s->extensions);
-+ array_free(s->extensions);
-
-- free(s);
-- }
-+ free(s);
- }
- free(p->config_storage);
- }
-diff --git a/src/mod_redirect.c b/src/mod_redirect.c
-index 615c7db..769c8c8 100644
---- a/src/mod_redirect.c
-+++ b/src/mod_redirect.c
-@@ -47,6 +47,8 @@ FREE_FUNC(mod_redirect_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- pcre_keyvalue_buffer_free(s->redirect);
-
- free(s);
-diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c
-index 5191a64..113cc54 100644
---- a/src/mod_rewrite.c
-+++ b/src/mod_rewrite.c
-@@ -146,6 +146,9 @@ FREE_FUNC(mod_rewrite_free) {
- size_t i;
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-+
-+ if (NULL == s) continue;
-+
- rewrite_rule_buffer_free(s->rewrite);
- rewrite_rule_buffer_free(s->rewrite_NF);
-
-diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c
-index 0532e4d..6b8cdae 100644
---- a/src/mod_rrdtool.c
-+++ b/src/mod_rrdtool.c
-@@ -65,6 +65,8 @@ FREE_FUNC(mod_rrd_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- buffer_free(s->path_rrdtool_bin);
- buffer_free(s->path_rrd);
-
-diff --git a/src/mod_scgi.c b/src/mod_scgi.c
-index 9e88de3..733b51c 100644
---- a/src/mod_scgi.c
-+++ b/src/mod_scgi.c
-@@ -554,7 +554,7 @@ FREE_FUNC(mod_scgi_free) {
- plugin_config *s = p->config_storage[i];
- scgi_exts *exts;
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- exts = s->exts;
-
-diff --git a/src/mod_secure_download.c b/src/mod_secure_download.c
-index da98b61..d85872d 100644
---- a/src/mod_secure_download.c
-+++ b/src/mod_secure_download.c
-@@ -65,6 +65,8 @@ FREE_FUNC(mod_secdownload_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- buffer_free(s->secret);
- buffer_free(s->doc_root);
- buffer_free(s->uri_prefix);
-diff --git a/src/mod_setenv.c b/src/mod_setenv.c
-index 60e9b55..34075c1 100644
---- a/src/mod_setenv.c
-+++ b/src/mod_setenv.c
-@@ -67,6 +67,8 @@ FREE_FUNC(mod_setenv_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- array_free(s->request_header);
- array_free(s->response_header);
- array_free(s->environment);
-diff --git a/src/mod_skeleton.c b/src/mod_skeleton.c
-index 68d272d..8461279 100644
---- a/src/mod_skeleton.c
-+++ b/src/mod_skeleton.c
-@@ -79,7 +79,7 @@ FREE_FUNC(mod_skeleton_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- array_free(s->match);
-
-diff --git a/src/mod_ssi.c b/src/mod_ssi.c
-index ed3b75c..07b695d 100644
---- a/src/mod_ssi.c
-+++ b/src/mod_ssi.c
-@@ -69,6 +69,8 @@ FREE_FUNC(mod_ssi_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- array_free(s->ssi_extension);
- buffer_free(s->content_type);
-
-diff --git a/src/mod_staticfile.c b/src/mod_staticfile.c
-index d40aa31..22929bb 100644
---- a/src/mod_staticfile.c
-+++ b/src/mod_staticfile.c
-@@ -63,6 +63,8 @@ FREE_FUNC(mod_staticfile_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- array_free(s->exclude_ext);
-
- free(s);
-diff --git a/src/mod_trigger_b4_dl.c b/src/mod_trigger_b4_dl.c
-index e1fa993..4a3eac2 100644
---- a/src/mod_trigger_b4_dl.c
-+++ b/src/mod_trigger_b4_dl.c
-@@ -89,7 +89,7 @@ FREE_FUNC(mod_trigger_b4_dl_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- buffer_free(s->db_filename);
- buffer_free(s->download_url);
-diff --git a/src/mod_userdir.c b/src/mod_userdir.c
-index 682f950..f6f1d8a 100644
---- a/src/mod_userdir.c
-+++ b/src/mod_userdir.c
-@@ -60,6 +60,8 @@ FREE_FUNC(mod_userdir_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- array_free(s->include_user);
- array_free(s->exclude_user);
- buffer_free(s->path);
-diff --git a/src/mod_usertrack.c b/src/mod_usertrack.c
-index 11aad95..3adedcf 100644
---- a/src/mod_usertrack.c
-+++ b/src/mod_usertrack.c
-@@ -48,6 +48,8 @@ FREE_FUNC(mod_usertrack_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-+ if (NULL == s) continue;
-+
- buffer_free(s->cookie_name);
- buffer_free(s->cookie_domain);
-
-diff --git a/src/mod_webdav.c b/src/mod_webdav.c
-index 654108a..2fff8c3 100644
---- a/src/mod_webdav.c
-+++ b/src/mod_webdav.c
-@@ -120,7 +120,7 @@ FREE_FUNC(mod_webdav_free) {
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
-- if (!s) continue;
-+ if (NULL == s) continue;
-
- buffer_free(s->sqlite_db_name);
- #ifdef USE_PROPPATCH
---
-2.4.5
-
diff --git a/main/lighttpd/0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch b/main/lighttpd/0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch
deleted file mode 100644
index 20307fb204..0000000000
--- a/main/lighttpd/0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch
+++ /dev/null
@@ -1,174 +0,0 @@
-From 427120b41a141626dbb40a752c848f199fc9f7a8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de>
-Date: Thu, 28 May 2015 15:47:14 +0000
-Subject: [PATCH 29/29] =?UTF-8?q?escape=20all=20strings=20for=20logging=20?=
- =?UTF-8?q?(fixes=20#2646=20log=20file=20injection,=20reported=20by=20Jaan?=
- =?UTF-8?q?us=20K=C3=A4=C3=A4p)?=
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Stefan Bühler <stbuehler@web.de>
-
-git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2989 152afb58-edef-0310-8abb-c4023f1b3aa9
----
- NEWS | 5 +++--
- src/buffer.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/buffer.h | 5 ++++-
- src/log.c | 8 ++++----
- 4 files changed, 70 insertions(+), 7 deletions(-)
-
-diff --git a/NEWS b/NEWS
-index dd2d1b8..18007fc 100644
---- a/NEWS
-+++ b/NEWS
-@@ -19,6 +19,7 @@ NEWS
- * [mod_auth] use crypt_r instead of crypt if available
- * fix error message for T_CONFIG_ARRAY config values if an entry value is not a string
- * fix segfaults in many plugins if they failed configuration
-+ * escape all strings for logging (fixes #2646 log file injection, reported by Jaanus Kääp)
-
- - 1.4.35 - 2014-03-12
- * [network/ssl] fix build error if TLSEXT is disabled
-@@ -557,10 +558,10 @@ NEWS
- * ignore empty packets from STDERR stream. #998
- * fix a crash for files with an mtime of 0 reported by cubiq on irc [1519]
- CVE-2007-1870
-- * allow empty passwords with ldap (Jörg Sonnenberger) [1516]
-+ * allow empty passwords with ldap (Jörg Sonnenberger) [1516]
- * mod_scgi.c segfault fix #964 [1501]
- * Added round-robin support to mod_fastcgi [1500]
-- * Handle DragonFlyBSD the same way as Freebsd (Jörg Sonnenberger) [1492,1676]
-+ * Handle DragonFlyBSD the same way as Freebsd (Jörg Sonnenberger) [1492,1676]
- * added now and weeks support to mod_expire. #943
- * fix cpu hog in certain requests [1473] CVE-2007-1869
- * fix for handling hostnames with trailing dot [1406]
-diff --git a/src/buffer.c b/src/buffer.c
-index 57c1613..36995a0 100644
---- a/src/buffer.c
-+++ b/src/buffer.c
-@@ -731,6 +731,65 @@ void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer
- }
- }
-
-+void buffer_append_string_c_escaped(buffer *b, const char *s, size_t s_len) {
-+ unsigned char *ds, *d;
-+ size_t d_len, ndx;
-+
-+ force_assert(NULL != b);
-+ force_assert(NULL != s || 0 == s_len);
-+
-+ if (0 == s_len) return;
-+
-+ /* count to-be-encoded-characters */
-+ for (ds = (unsigned char *)s, d_len = 0, ndx = 0; ndx < s_len; ds++, ndx++) {
-+ if ((*ds < 0x20) /* control character */
-+ || (*ds >= 0x7f)) { /* DEL + non-ASCII characters */
-+ switch (*ds) {
-+ case '\t':
-+ case '\r':
-+ case '\n':
-+ d_len += 2;
-+ break;
-+ default:
-+ d_len += 4; /* \xCC */
-+ break;
-+ }
-+ } else {
-+ d_len++;
-+ }
-+ }
-+
-+ d = (unsigned char*) buffer_string_prepare_append(b, d_len);
-+ buffer_commit(b, d_len); /* fill below */
-+ force_assert('\0' == *d);
-+
-+ for (ds = (unsigned char *)s, d_len = 0, ndx = 0; ndx < s_len; ds++, ndx++) {
-+ if ((*ds < 0x20) /* control character */
-+ || (*ds >= 0x7f)) { /* DEL + non-ASCII characters */
-+ d[d_len++] = '\\';
-+ switch (*ds) {
-+ case '\t':
-+ d[d_len++] = 't';
-+ break;
-+ case '\r':
-+ d[d_len++] = 'r';
-+ break;
-+ case '\n':
-+ d[d_len++] = 'n';
-+ break;
-+ default:
-+ d[d_len++] = 'x';
-+ d[d_len++] = hex_chars[((*ds) >> 4) & 0x0F];
-+ d[d_len++] = hex_chars[(*ds) & 0x0F];
-+ break;
-+ }
-+ } else {
-+ d[d_len++] = *ds;
-+ }
-+ }
-+}
-+
-+
- void buffer_copy_string_encoded_cgi_varnames(buffer *b, const char *s, size_t s_len, int is_http_header) {
- size_t i, j;
-
-diff --git a/src/buffer.h b/src/buffer.h
-index b6065d4..5f659df 100644
---- a/src/buffer.h
-+++ b/src/buffer.h
-@@ -133,6 +133,9 @@ typedef enum {
-
- void buffer_append_string_encoded(buffer *b, const char *s, size_t s_len, buffer_encoding_t encoding);
-
-+/* escape non-printable characters; simple escapes for \t, \r, \n; fallback to \xCC */
-+void buffer_append_string_c_escaped(buffer *b, const char *s, size_t s_len);
-+
- /* to upper case, replace non alpha-numerics with '_'; if is_http_header prefix with "HTTP_" unless s is "content-type" */
- void buffer_copy_string_encoded_cgi_varnames(buffer *b, const char *s, size_t s_len, int is_http_header);
-
-@@ -164,7 +167,7 @@ static inline void buffer_append_slash(buffer *b); /* append '/' no non-empty st
- buffer_copy_string_len(x, y, sizeof(y) - 1)
-
- #define CONST_STR_LEN(x) x, (x) ? sizeof(x) - 1 : 0
--#define CONST_BUF_LEN(x) (x)->ptr, buffer_string_length(x)
-+#define CONST_BUF_LEN(x) ((x) ? (x)->ptr : NULL), buffer_string_length(x)
-
-
- #define UNUSED(x) ( (void)(x) )
-diff --git a/src/log.c b/src/log.c
-index 9322d2c..94f4710 100644
---- a/src/log.c
-+++ b/src/log.c
-@@ -267,12 +267,12 @@ static void log_buffer_append_printf(buffer *out, const char *fmt, va_list ap) {
- switch(*fmt) {
- case 's': /* string */
- s = va_arg(ap, char *);
-- buffer_append_string(out, s);
-+ buffer_append_string_c_escaped(out, s, (NULL != s) ? strlen(s) : 0);
- buffer_append_string_len(out, CONST_STR_LEN(" "));
- break;
- case 'b': /* buffer */
- b = va_arg(ap, buffer *);
-- buffer_append_string_buffer(out, b);
-+ buffer_append_string_c_escaped(out, CONST_BUF_LEN(b));
- buffer_append_string_len(out, CONST_STR_LEN(" "));
- break;
- case 'd': /* int */
-@@ -293,11 +293,11 @@ static void log_buffer_append_printf(buffer *out, const char *fmt, va_list ap) {
- break;
- case 'S': /* string */
- s = va_arg(ap, char *);
-- buffer_append_string(out, s);
-+ buffer_append_string_c_escaped(out, s, (NULL != s) ? strlen(s) : 0);
- break;
- case 'B': /* buffer */
- b = va_arg(ap, buffer *);
-- buffer_append_string_buffer(out, b);
-+ buffer_append_string_c_escaped(out, CONST_BUF_LEN(b));
- break;
- case 'D': /* int */
- d = va_arg(ap, int);
---
-2.4.5
-
diff --git a/main/lighttpd/APKBUILD b/main/lighttpd/APKBUILD
index e3a7d7cc12..6a60ae7891 100644
--- a/main/lighttpd/APKBUILD
+++ b/main/lighttpd/APKBUILD
@@ -1,8 +1,8 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=lighttpd
-pkgver=1.4.35
+pkgver=1.4.36
_streamver=2.2.0
-pkgrel=4
+pkgrel=0
pkgdesc="a secure, fast, compliant and very flexible web-server"
url="http://www.lighttpd.net/"
arch="all"
@@ -13,39 +13,9 @@ pkgusers="lighttpd"
pkggroups="lighttpd"
makedepends="flex pcre-dev openssl-dev zlib-dev bzip2-dev lua-dev
automake autoconf openldap-dev libxml2-dev sqlite-dev libev-dev"
-source="http://download.lighttpd.net/lighttpd/releases-1.4.x/$pkgname-$pkgver.tar.bz2
+source="http://download.lighttpd.net/lighttpd/releases-1.4.x/$pkgname-$pkgver.tar.xz
http://h264.code-shop.com/download/lighttpd-1.4.18_mod_h264_streaming-$_streamver.tar.gz
- 0001-next-is-1.4.36.patch
- 0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
- 0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
- 0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
- 0005-fix-typo-in-NEWS-entry-for-2579.patch
- 0006-add-support-for-Free-BSD-extended-attributes.patch
- 0007-build-use-fortify-flags-with-extra-warnings.patch
- 0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
- 0009-ssl-disable-SSL3.0-by-default.patch
- 0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
- 0011-add-NEWS-entry-for-previous-commit.patch
- 0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
- 0013-connections-fix-bug-in-connection-state-handling.patch
- 0014-print-backtrace-in-assert-logging-with-libunwind.patch
- 0015-fix-buffer-chunk-and-http_chunk-API.patch
- 0016-Remove-chunkqueue_get_-append-prepend-API.patch
- 0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
- 0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
- 0019-Use-buffer-API-to-read-and-modify-used-member.patch
- 0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
- 0021-buffer-constify-some-parameters.patch
- 0022-bitset-unused-remove.patch
- 0023-remove-unused-stuff-from-server.h.patch
- 0024-crc32-fix-method-signature-const-pointer.patch
- 0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
- 0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
- 0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
- 0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
- 0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch
-
$pkgname.initd
$pkgname.confd
$pkgname.logrotate
@@ -162,37 +132,8 @@ mod_webdav() {
}
-md5sums="f7a88130ee9984b421ad8aa80629750a lighttpd-1.4.35.tar.bz2
+md5sums="1843daffcb018aa528f6d15d43544654 lighttpd-1.4.36.tar.xz
ac37885c881a058194405232e7737a7a lighttpd-1.4.18_mod_h264_streaming-2.2.0.tar.gz
-00ee47ed4f38b4feede5bc015466966f 0001-next-is-1.4.36.patch
-bd2d1fba09c4ccee295a3c2dcafe8257 0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
-dd6668db0b13257cbf63e6964e14edc3 0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
-0fb4734ad0d3a669e29593a3bee8cb19 0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
-0f3bf205dfa4bc26c27e6d91bae5a77d 0005-fix-typo-in-NEWS-entry-for-2579.patch
-148470359b1c253d926929cbf4a3df6e 0006-add-support-for-Free-BSD-extended-attributes.patch
-7a295bd597977549912a995cac4c16d2 0007-build-use-fortify-flags-with-extra-warnings.patch
-f7eae7225e3bbb176c805c4781c20fdd 0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
-71745edff2b66f6e3764008f265922cf 0009-ssl-disable-SSL3.0-by-default.patch
-3dfd329eba6cbe2d5561a4a86be41d41 0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
-d3701826b4d2e62eb915e2add340ab64 0011-add-NEWS-entry-for-previous-commit.patch
-0fb5b2d1047abf714072ac1d5e4d8e9d 0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
-719ea46ccbd435b4e0a5b7679f6e6619 0013-connections-fix-bug-in-connection-state-handling.patch
-ab768bf719f1c80bcfec3921f597e9ce 0014-print-backtrace-in-assert-logging-with-libunwind.patch
-b45c3022b16bac36ed542e7761d1fc8d 0015-fix-buffer-chunk-and-http_chunk-API.patch
-4cae316e303cc74e6ceba6d9bb31b118 0016-Remove-chunkqueue_get_-append-prepend-API.patch
-5fdc9ba9824c47e92e35a87ed77cf673 0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
-bb6293085a26d2585fd1a9027ee163df 0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
-1df70c6be883619b1c0e0b225e8a76d9 0019-Use-buffer-API-to-read-and-modify-used-member.patch
-8cbc257ca7cb41933ed19bd096d63953 0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
-abaa48bc0376b5bc2266159c81b386fd 0021-buffer-constify-some-parameters.patch
-0d2b7108b95bf4a26830e45337da57a9 0022-bitset-unused-remove.patch
-5f7c377944b94ae35e4360296241eab1 0023-remove-unused-stuff-from-server.h.patch
-7ab10c7e1f8ccb260289ab55d3588110 0024-crc32-fix-method-signature-const-pointer.patch
-ef60f4c3935b3b1a70e3ea0159208d7e 0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
-24efc5f5dc32f35b34935cb69f7ff064 0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
-f4d7686b793434bba88c03cbbc783440 0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
-d7b916dab3c4440e0f5cee327f6e3993 0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
-92a0c1b87737ac0f845ac10fefcf724a 0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch
b3f7106fa5dcdadf3b0e1bb98bba5e3a lighttpd.initd
0dede109282bfe685bdec6b35f0e4b6b lighttpd.confd
ad091c9157134890499f26d170352c9f lighttpd.logrotate
@@ -201,37 +142,8 @@ f3353baa4577703ec3a30c03482df986 mime-types.conf
9c1407e95f62ed22da66c4ef5f69c3b5 mod_cgi.conf
f3363e39832f1b6678468b482d121afb mod_fastcgi.conf
aee5947a1abf380b0685a534ca384b42 mod_fastcgi_fpm.conf"
-sha256sums="4a71c1f6d8af41ed894b507720c4c17184dc320590013881d5170ca7f15c5bf7 lighttpd-1.4.35.tar.bz2
+sha256sums="897ab6b1cc7bd51671f8af759e7846245fbbca0685c30017e93a5882a9ac1a53 lighttpd-1.4.36.tar.xz
732cf98d823f2c7ddc96a3130a3c88d588b02ed20a0e7f8c9be25a265fbea2d6 lighttpd-1.4.18_mod_h264_streaming-2.2.0.tar.gz
-c879dbe0d41e2b5e9d79e94c621bcb6498170a9949aa9944009aebf7266f6574 0001-next-is-1.4.36.patch
-ea90697199e2dafb483942e44558bb73727b3ba2e2afe9017735a92db5a92b9e 0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
-2de1193ee68715de6f92654a439c09254500c6d371fd979400265af1c31e2f64 0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
-1708a734bb0bd9a6e5ff4357da82bf5dffc15bbb89e3fb369e4ed21408431081 0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
-69b6b9986c6dd69ea77b60d61da8c984869a34d2e48928d774678392e9e0b377 0005-fix-typo-in-NEWS-entry-for-2579.patch
-959120d7c256733292aaeb6595c55e9b703968d3de3093ec3c65163f86859058 0006-add-support-for-Free-BSD-extended-attributes.patch
-e6e5984fb33ed89d7961e39ea75467a644a8f70ab931ff886545ee271b3e4079 0007-build-use-fortify-flags-with-extra-warnings.patch
-5a59ef2bf5efd77770a02421451372ec08b00a2e27cd4ce1312301ea94be58af 0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
-b204c4bf8572f41cd31d4de34529ab65ec42a0d32eb4bcd4b77d42afd3858ff5 0009-ssl-disable-SSL3.0-by-default.patch
-c25c136143f597a557df676bb80dc549d44b4216de2bbec578b02e474532b7f5 0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
-f0759a4fd37e43abb4901ecc53cfa64bc24ffcc52d425d1057b63d5e696ccddc 0011-add-NEWS-entry-for-previous-commit.patch
-91cc0d32a195178d78923749e0d9f49cba3806e988f3ec30ec1011bb5f10c888 0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
-3c1ec290a581afb0c11d5743ecdffbee4bb2caec790e9c174fce2ce7501dcc96 0013-connections-fix-bug-in-connection-state-handling.patch
-afdfe2f60b91367eecc00b63d6e7f5bad221c9d719f4f827aef2b5fd35fecdaa 0014-print-backtrace-in-assert-logging-with-libunwind.patch
-fff02538e63edb68e4c070f0c5f518a43630addd7b4ce33b321caa9071f05357 0015-fix-buffer-chunk-and-http_chunk-API.patch
-c72d9b344ba4784cb1db1d9fca4fc88c86dca25ec1cfc91688424474da22e5f9 0016-Remove-chunkqueue_get_-append-prepend-API.patch
-600a3698a6d8882bf1f91a0f1e636395736f479d3fa2dda0b0ab099dbe648e73 0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
-20b759bf8f4c7c79862f919fce2dc1b3348695993ba1033449df9558dbe01a6d 0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
-4b5538e7428ac2d625655b35f46afcdf794f9cf7fab11d2fb2f626d9c0684dd9 0019-Use-buffer-API-to-read-and-modify-used-member.patch
-17b240483cd3b326e67c6dc38b53a9041623b9aec664e883c81f4ce525a36108 0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
-58b7afa5a8e98a700c8856174586d4f458019308313864fcddcb974cf94650b2 0021-buffer-constify-some-parameters.patch
-d98d8bc7ddd107bca0b7653a7c9ac7f6874b986864f00c4a359a71892dda9da7 0022-bitset-unused-remove.patch
-3f4524142df2db012c5a8f0ab0dac2bdc53d5a253d18b842e4ba0649e37ac435 0023-remove-unused-stuff-from-server.h.patch
-45ae49ec62907750b5741d726942bc5171397a88cf676ff7750d54a89f94e8a8 0024-crc32-fix-method-signature-const-pointer.patch
-7adefe15856cb965f6ab102d8e655513b229c475951003766ea15d60e0f95536 0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
-e46917c0731eff62ee5d73ecbdd6d4276674893936132a050c855c419d1dc8e6 0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
-a1c8b496be35065ea72a115462c3a23c78995b953ce15b806d2ef6b6b6758523 0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
-42192c43bd917a6b196e8b3fb52cfc76b9165f0b3de08bd30d0fab08b3ce2444 0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
-dca7509a720ce26488685ce7acca041e83e1e1f2eb195adc36338ef4031b90fc 0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch
097a4df1a6470e2e9fd2097c7c1daa7b1ee6341faddc35a65e975af019beaebd lighttpd.initd
94f69a173dc26610a43532474230537b9bc31ec846fb9f94cb72765f125edf87 lighttpd.confd
503ee1cd454e2c0f9a212ef60dc8321893eda06ccf721ecbe94d189a09e0bc6c lighttpd.logrotate
@@ -240,37 +152,8 @@ dca7509a720ce26488685ce7acca041e83e1e1f2eb195adc36338ef4031b90fc 0029-escape-al
322656b4cfd22ca9f1f8ab160e0b932f1646622422fd49c6fc82ab416223eecf mod_cgi.conf
d1adc1358b5d9e85353caa2e706bfa231d145dd59c075cdcb3f818b3cb5d722e mod_fastcgi.conf
e7eb047360e09d1a2b693f08d4a912b99954090c5bdea706f46a33554e867043 mod_fastcgi_fpm.conf"
-sha512sums="13f8562fb735964fe7ef1b127a15c43907f34be70b6bd2dd4ba61b59275d7c2a8d9a7947ff1a4d7cc5fd7efd309fc66b7de6d954b59424f814ea2eb98fd876b9 lighttpd-1.4.35.tar.bz2
+sha512sums="97aaea65fef2db5c310f849842ed40e66f50b857c28f5f8c073be9d5daa58b2be049a987d958a0fdfb98c9c5b8e5344ee57c1fa7eed3a2d18e20f2447f0ceab0 lighttpd-1.4.36.tar.xz
12e1b7c8146cccfa78678ce56cd2f704423559b23b90996dff00602634f110512146386086ac234293a3c28900a06c2bec1c97e680e7eed5173372f88177b351 lighttpd-1.4.18_mod_h264_streaming-2.2.0.tar.gz
-622314eae65e08866dd55efbbf0a3c9b84818e4f5f5e4c4a602883c0123cf448edbfd1dd1c69a288fae923c730be213a4cf358aa6334caf57c62b54330fa2765 0001-next-is-1.4.36.patch
-23a9f56e402fc24cea33e2d4d84ed7c4c0473b4c28bab9837294756ea27b5f6682393871188ec9b3744591aa01c75804a3373999842f3e44935c87e7b0f214de 0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
-7ebe0117493bcea361e1dc60a394e57fb52b6d83c284af246179af58e41c2b2a95255f257fd8706c31dddf67559c8f807db1c959fd39777f5ec1d31bc48ed1c2 0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
-85ad87b3632ad145812a1cf1bcaf321d98a000a0e50fdbbdbacf1b3a3e53e3081044da070ce41e2d2a234a82f4bfb7938ce09d8db289e5c469254d2b6cd6f487 0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
-64a75d212a8f4388be909d4f6b341f5567a028469b91db49df9ef018248ad78d6468d945c582090f762ea2f778568aedfb572e5493927cab25476966d11ef479 0005-fix-typo-in-NEWS-entry-for-2579.patch
-09d3722fa79423bb0bfc7c1fc5fd1b2a8022127b40b8a1055ac26aec369861b27b8be2394bfcf2dd0f33adc1063e7ba1d3bac3ced9e6d4d74c824c870aede879 0006-add-support-for-Free-BSD-extended-attributes.patch
-1df20ff4c5b48e60fdd8b4c37d47016667b7ad6c74ea8d4d8bb53b84bd0f90e9905fdc500df319a5288e92761500e8ddd6a15e5b946e34c819628bef6c501610 0007-build-use-fortify-flags-with-extra-warnings.patch
-9fb01cec49962a47db026befd73a13026df06b7ee16d4870394ce5c3dd3ff4c671b53425a1066a43482854dca7f4dad234100c0dc71e7647dc70202d61053a61 0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
-cb94bfb83ddbe1f2aaccf844ab262139f111dbc8cd522cfe3621e235b5e058fdf960d9245f154c0da17f5c52d1c2f56f37d473fdbb5c71ca584ce408ae9affca 0009-ssl-disable-SSL3.0-by-default.patch
-385db7d9879584e76ddd1e01a1d30bd8488a440ddc9ab014de5db72f001d6370007b0e96dd83f5875b154dd34ad289c7ed4d93b42c8143d81b0598dfbee38674 0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
-3409867e77a2a7dfbd429e1ea8b5c45573c75c8574edd71fb206a3fc76a230f98b1232bfc3e7a77c59008c4c32155e360c972dd7ebcb42baf9671af2b388df2a 0011-add-NEWS-entry-for-previous-commit.patch
-cf5fbcc8742757bed684e23a8c2ca3fe66184fd5d5e153f54a24108a8ddde2062f4adb300211c56759a3401ae24c1b1e6313e8bb07e9688cc25a3fe83fae29e5 0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
-836703b795bcb9601b6212c8b7e1be50a681e50697dc564749f1a5cc3795ecc16de4e86be98037b6fca98ba728835f3a5f7261e9b39e4ebe3824e3d58fcd7559 0013-connections-fix-bug-in-connection-state-handling.patch
-aca54c61898d26e6e729be421e96e595929646f4361dd905c22dc4aed6ba795c33c233f76961f2b6401ad60104c0fdfce263c1240aeeed29e3fc7bd7e7ed67a1 0014-print-backtrace-in-assert-logging-with-libunwind.patch
-d97bb6832e85923454ed3ff5c2d739c7f70b0141f08fe6c1326ca86eb55a75f5a4bf7e761b2d73402c0552bb76faefff2b442030d76891fade51197b34719839 0015-fix-buffer-chunk-and-http_chunk-API.patch
-f9a1c772a3a8cdc3d0e5dd6430d3ac5651cda2bb1f6dc156474477c6c9509ff98fcfe76bf89d9761970ccd8ae56c8585d51b81757b46ded356a55f8247efb248 0016-Remove-chunkqueue_get_-append-prepend-API.patch
-500ede5ad01476afe0e65d1cef22f0c89df3b91d330479cd23071aa594276560bf045de9531a61e5a15821ba5389e616fbdf6532caf25882d9ec86ec0c882a53 0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
-c22dad92b15655cb071c0e96f43bd1f6af55f1f4c468279814aa5643ec601d5e0ba5d0829470d6125a7da979fed7c79689af453e5b127310d7c5cfb77e0479ad 0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
-7d3133bd31cd413eef55cff57a4deeeb553db1c23cc17eb1655a0c02b70aa4f11ef069b47979966c1e0e6512a9b74a5bfcc50b4c91c55115b55d4861d3b95581 0019-Use-buffer-API-to-read-and-modify-used-member.patch
-0b37401c1acbf5b7bb633758024c2a09fe22a54731175fe5475217952691059fac1b757bf2a651c2f91ce2b71c010ad05b2015523954062cae5d88103f1eb783 0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
-558a8333f509a3cbd7a4c04b745ab407e7d846a01fbd400e873dc9a18e90b8042bb46e34c0475dbfa203fe39ba201145d06384f5c1f42a2dc0894c43cc984dac 0021-buffer-constify-some-parameters.patch
-49c6c3d032b69740e1b9ae9f2c0b09d13a34a4e2aed890c12af78bfd2a2266319d282b0a2a63dab214189bcd9b4596226818dfca44dfed0f44d7494976f98b2c 0022-bitset-unused-remove.patch
-b1299b16f14feaf848344d27dd6b6529543d49b8ec26bf03de3e2fe7551254cc00eec1b3309f73b8e6541b730b047425feabb8f5c6a822757b7934825d79bbbc 0023-remove-unused-stuff-from-server.h.patch
-40f6436720ecf43370a32081da1529a9df1faee15e29056ec8832456beacfff2ea19e73b9c6377f1942d7852eaad2ea88cc1b4e49c0a317768f3b4a7cfb97cc1 0024-crc32-fix-method-signature-const-pointer.patch
-7c9772483e7d32cbc80dd9133661bf8a7542e2c571ecc9745d926de78f6879067cfd0feb7725235f23fa715febb5b810bcb352170cb8e6e09ce861961f937db4 0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
-f01032d73b5a0f7b339fa4ea863767acf39a4ae84ab90eeac702eac029982017e659afc3da21198919c63a739412f12a31756cfa8ad1bcd8cc651cbd70d00b7d 0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
-bedd3fa6a02e315e11109ec0b5dd3ef2c3a8a250d45fdd673254cce20059165b1c96227725e01ac5e9b85fe93da2ac89770d5b2fe414bbf66063b5fe7d3ee38b 0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
-974ac318ad22aa164b860bf9273f0ccb10b08f43642bcd90008e31844d65329b89ff7100538971d068a1f42ea451639c5345dd94fe303a936e4ebd6212e431a6 0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
-8fb56b604c89129ba84fd2d34dc38ea31eb07b377b69f8551c831d65d0076cfc7f0d9219bda4b0ad122e12102aecf29a84c6111a8bfc232f97652efc5f14e600 0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch
69b7574a8d4384bcbbca587aa643aeb55c2b237e726093d1443982d8ec1d085b15c3891a273f7901a9554df4d0842a586d59cc6062b8347e72dad8c6c37bc39a lighttpd.initd
93a05dddab14ba6355a0345f1da2fe900c8b55fed8f98506295dc12d96c7cef803c4aca77f016b8acea7bbde485be1e09a57d31fdca6f91023fbeb4db9a90a8b lighttpd.confd
e1284fe9ab4b9a53c21b40a5ac3e77e66343e187321b8a2f7464db64747f3a99f7e17a9e7c0e298db84a24fa1286cfe344dbff182eddd9de5c0605f5397a6972 lighttpd.logrotate