From e6c1f4a663bf13c35e0a92ce7243d282a4a29c8c Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
Date: Mon, 27 Jul 2015 08:08:54 +0000
Subject: [PATCH] main/lighttpd: upgrade to 1.4.36

---
 main/lighttpd/0001-next-is-1.4.36.patch       |   72 -
 ...imeout-while-waiting-for-HTTP-header.patch |   72 -
 ...-in-conditional-netmask-.-0-handling.patch |   61 -
 ...pes-and-a-script-to-generate-mime.co.patch |  857 ---
 ...0005-fix-typo-in-NEWS-entry-for-2579.patch |   31 -
 ...ort-for-Free-BSD-extended-attributes.patch |  175 -
 ...se-fortify-flags-with-extra-warnings.patch |   88 -
 ...od_redirect-mod_rewrite-abort-config.patch |  163 -
 .../0009-ssl-disable-SSL3.0-by-default.patch  |   44 -
 ...po-found-by-openSUSE-user-boo-907709.patch |   38 -
 ...1-add-NEWS-entry-for-previous-commit.patch |   30 -
 ...ile-break-in-calculation-of-sockaddr.patch |   66 -
 ...fix-bug-in-connection-state-handling.patch |   69 -
 ...ace-in-assert-logging-with-libunwind.patch |  187 -
 ...-fix-buffer-chunk-and-http_chunk-API.patch | 6095 -----------------
 ...e-chunkqueue_get_-append-prepend-API.patch | 1537 -----
 ...epare_copy-and-buffer_prepare_append.patch | 1182 ----
 ...lgrind-and-strace-TRACEME-disable-co.patch |   79 -
 ...r-API-to-read-and-modify-used-member.patch | 4346 ------------
 ...pend_long_hex-to-buffer_append_uint_.patch |  117 -
 ...0021-buffer-constify-some-parameters.patch |   98 -
 main/lighttpd/0022-bitset-unused-remove.patch |  170 -
 ...23-remove-unused-stuff-from-server.h.patch |   38 -
 ...2-fix-method-signature-const-pointer.patch |   44 -
 ...efined-index-warning-in-sendfile.php.patch |   31 -
 ...rypt_r-instead-of-crypt-if-available.patch |  102 -
 ...e-for-T_CONFIG_ARRAY-config-values-i.patch |   49 -
 ...-many-plugins-if-they-failed-configu.patch |  447 --
 ...gs-for-logging-fixes-2646-log-file-i.patch |  174 -
 main/lighttpd/APKBUILD                        |  129 +-
 30 files changed, 6 insertions(+), 16585 deletions(-)
 delete mode 100644 main/lighttpd/0001-next-is-1.4.36.patch
 delete mode 100644 main/lighttpd/0002-use-keep-alive-timeout-while-waiting-for-HTTP-header.patch
 delete mode 100644 main/lighttpd/0003-fix-bad-shift-in-conditional-netmask-.-0-handling.patch
 delete mode 100644 main/lighttpd/0004-add-more-mime-types-and-a-script-to-generate-mime.co.patch
 delete mode 100644 main/lighttpd/0005-fix-typo-in-NEWS-entry-for-2579.patch
 delete mode 100644 main/lighttpd/0006-add-support-for-Free-BSD-extended-attributes.patch
 delete mode 100644 main/lighttpd/0007-build-use-fortify-flags-with-extra-warnings.patch
 delete mode 100644 main/lighttpd/0008-mod_dirlisting-mod_redirect-mod_rewrite-abort-config.patch
 delete mode 100644 main/lighttpd/0009-ssl-disable-SSL3.0-by-default.patch
 delete mode 100644 main/lighttpd/0010-Fixed-typo-found-by-openSUSE-user-boo-907709.patch
 delete mode 100644 main/lighttpd/0011-add-NEWS-entry-for-previous-commit.patch
 delete mode 100644 main/lighttpd/0012-network-fix-compile-break-in-calculation-of-sockaddr.patch
 delete mode 100644 main/lighttpd/0013-connections-fix-bug-in-connection-state-handling.patch
 delete mode 100644 main/lighttpd/0014-print-backtrace-in-assert-logging-with-libunwind.patch
 delete mode 100644 main/lighttpd/0015-fix-buffer-chunk-and-http_chunk-API.patch
 delete mode 100644 main/lighttpd/0016-Remove-chunkqueue_get_-append-prepend-API.patch
 delete mode 100644 main/lighttpd/0017-Remove-buffer_prepare_copy-and-buffer_prepare_append.patch
 delete mode 100644 main/lighttpd/0018-tests-improve-valgrind-and-strace-TRACEME-disable-co.patch
 delete mode 100644 main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch
 delete mode 100644 main/lighttpd/0020-rename-buffer_append_long_hex-to-buffer_append_uint_.patch
 delete mode 100644 main/lighttpd/0021-buffer-constify-some-parameters.patch
 delete mode 100644 main/lighttpd/0022-bitset-unused-remove.patch
 delete mode 100644 main/lighttpd/0023-remove-unused-stuff-from-server.h.patch
 delete mode 100644 main/lighttpd/0024-crc32-fix-method-signature-const-pointer.patch
 delete mode 100644 main/lighttpd/0025-tests-fix-undefined-index-warning-in-sendfile.php.patch
 delete mode 100644 main/lighttpd/0026-mod_auth-use-crypt_r-instead-of-crypt-if-available.patch
 delete mode 100644 main/lighttpd/0027-fix-error-message-for-T_CONFIG_ARRAY-config-values-i.patch
 delete mode 100644 main/lighttpd/0028-fix-segfaults-in-many-plugins-if-they-failed-configu.patch
 delete mode 100644 main/lighttpd/0029-escape-all-strings-for-logging-fixes-2646-log-file-i.patch

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 88512bbf3ece..000000000000
--- 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 13774eb4e6e4..000000000000
--- 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 0a3b51f34284..000000000000
--- 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 7803f6837000..000000000000
--- 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 9f252e53069c..000000000000
--- 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 f3affb9119e0..000000000000
--- 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 13db16ac19e4..000000000000
--- 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 637f1721d0fa..000000000000
--- 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 6980a1949763..000000000000
--- 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 9f95d3ee41d4..000000000000
--- 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 791eafaf902f..000000000000
--- 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 9aa38e537da0..000000000000
--- 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 15677598999a..000000000000
--- 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 ff6ef0690216..000000000000
--- 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 7380ce5ce8e3..000000000000
--- 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 6f265d155ba3..000000000000
--- 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 97e6d3015be7..000000000000
--- 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 e56fa442443b..000000000000
--- 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 d455ff9a67db..000000000000
--- 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 16441ace7577..000000000000
--- 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 d99e11490674..000000000000
--- 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 572f7a5e2531..000000000000
--- 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 178cba4c40db..000000000000
--- 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 f53cc5b2cfdf..000000000000
--- 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 f37b98cdbaea..000000000000
--- 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 8fbefeb99e16..000000000000
--- 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 c11a695e72ee..000000000000
--- 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 d35b478424df..000000000000
--- 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 20307fb204a4..000000000000
--- 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 e3a7d7cc12a9..6a60ae789184 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
-- 
GitLab