Dear all,
on sourceforge is now the release of NaviServer 4.99.17 [1].
Below is a summary of the changes. This release was tested
under Windows 8.1 (32bit) and 10 (64bit) many thanks to
Oleg Oleinik), various Linux versions (e.g. Ubuntu 18.04,
FC 27, including Raspberry PI Raspbian GNU/Linux 9.4
with ARM processor), and OmniOS and OpenBSD, with
Tcl 8.5, 8.6 and 8.7 (alpha). Many thanks to all contributors!
all the best
-gustaf
[1] https://sourceforge.net/projects/naviserver/files/naviserver/4.99.17/
=======================================
NaviServer 4.99.17, released 2018-11-04
=======================================
421 files changed, 17805 insertions(+), 10275 deletions(-)
New Features:
-------------
- Added brotli support for delivering static content
---------------------------------------------------
The brotli compression format (RFC 7932) achieves better results for
compression for typical web content compared to e.g. gzip and is
supported by most current browsers. The definition of static
content delivery is exactly the same for "brotli" as for static
"gzip" content.
New configuration options for ns/fastpath:
* "brotli_static": should static brotli delivery be checked?
* "brotli_refresh": should outdated brotli compressed files be refreshed?
* "brotli_cmd": OS-level command with options used for brotli compression
- "ns_conn" additions:
* New subcommand "ns_conn acceptedcompression" to return accepted
compressions for the current connection (gzip or brotli)
* New subcommands "ns_conn currentaddr" and "ns_conn currentport"
to refer to the address and port of the currently open server side
of the socket.
- New feature for GDPR: add mask IP addresses optionally in access log
--------------------------------------------------------------------
This feature is similar to "anonip" IP anonymizer of the Swiss
privacy foundation): When this feature is activated, all IP
addresses are masked in the log file, such that the host-specific
(= person- specific) information is masked out and the IP-address
does not match a particular individual anymore. Still, with the
masking turned on, reverse DNS lookup and/or geolocation is
possible.
The option can be configured via the following parameters in the
".../module/nslog" section of the config file of NaviServer:
* "masklogaddr": boolean value to turn feature on/off (default off)
* "maskipv4": mask for IPv4 addresses (default 255.255.255.0)
* "maskipv6": mask for IPv6 addresses (default ff:ff:ff:ff::)
- New atomic "nsv_set" commands/options
-------------------------------------
* Obtain (old) value from nsv ARRAY and set it to a new value set foo
set foo [nsv_set -reset ARRAY KEY NEWVALUE]
After the operation, ARRAY(KEY) has a new value.
The operation is similar to "nsv_set ARRAY KEY NEWVALUE",
but the variant with "-reset" returns the old value.
Similar to GETSET in REDIS.
* Obtain a value from nsv ARRAY and unset it (no new value is provided).
set foo [nsv_set -reset ARRAY KEY]
The operations returns the old value of ARRAY(KEY) or empty, if
it does not exist. After the operation, the ARRAY(KEY) is unset.
* Set a default value for a nsv ARRAY
nsv_set -default ARRAY KEY DEFAULTVALUE
Do nothing when ARRAY(KEY) has already a value.
Return an error, when DEFAULTVALUE is not provided.
Similar to SETNX in REDIS.
- Extended functionality of "ns_http"
-----------------------------------
* Changed return value for "ns_http run" and "ns_http wait".
Now the commands return attribute value pairs (Tcl dict).
Previously, the commands returned different results,
depending on the options
- "ns_http run" returned the name of the queued command (which
was completely useless, this the queued command was already
terminated)
- "ns_http wait" returned sometimes the body of the reply (when
the reply was not spooled) or empty (spooled) or "1", when the
option "-R" was specified
Now the result is always a dict containing "status" (HTTP status
code), "time" (elapsed time), "headers" (ns_set of the reply
header fields, and either the "body" (reply body) or "file" (the
name of the spooled file). The values in the dict might mirror
the result of other (optional) output variables, which continue
to work.
Since the results were irregular and not documented in the man
pages, the backward compatibility should be high. Also, the
regression test of NaviServer was not effected by this change.
* Support for asynchronous “ns_http” tasks:
When the new flag "-donecallback” is provided, then a “ns_http”
task is started in the background and does not require an
“ns_http wait” anymore. Instead, when it finishes it executes
the provided donecallback which receives as additional arguments
the Tcl result (in form of an integer) and the result dict,
returned otherwise from e.g. “ns_http run”.
As a consequence, requests of the form
ns_http queue … -donecallback …
differ from client requests without the callback
in the following points:
a) the command does not return a handle for “ns_http wait”
b) The command is not automatically cleaned up (canceled)
at the end of a connection requests
c) Typically, donecallbacks are executed in a different
thread than it was started.
Some more options, which were previously only valid on
“ns_http wait” (such as e.g. spoolsize) are now valid
for “ns_http queue” as well.
The new flag allows a developer to start many requests in
parallel without having to start many threads or complex
synchronization tasks.
* New option "-body_file" for "ns_http wait" (similar to "ns_http
queue" which can be used to specify a filename for the
downloaded content)
* New option "-outputfile" to "ns_http run" and "ns_http wait":
by specifying the option "-outputfile" the received file will be
always written to the disk, no matter how large it is.
* New subcommand "ns_http stats": returns a dict (flat list of
attributes and values). The list contains "task", "url",
"requestlength", "sent", "replylength" and "received".
- Support resolving a hostname against multiple IP addresses
----------------------------------------------------------
* In case, one domain name has multiple IP addresses registered,
previous versions of NaviServer tried only the first returned
address and returned an error, when this failed. This happened
when using client functions (e.g. ns_http).
* host names with multiple IP addresses are nowadays quite common,
e.g. "localhost" having an IPv4 and an IPv6 address registered. In
previous versions, when e.g. localhost has as first address the IPv6
address, but IPv6 was not active, it returned an error.
* resolving against IP addresses continues to work as always.
- Extended crypto functionality
-----------------------------
* Added HMAC-based Extract-and-Expand Key Derivation Function (HKDF)
::ns_crypto::md hkdf -digest sha256 ....
(requires OpenSSL 1.1.0 or newer)
* Added support for elliptic curve cryptography
. ns_crypto::eckey import ?-string string? ?-encoding encoding?
. ns_crypto::eckey priv ?-pem pem? ?-encoding encoding?
. ns_crypto::eckey pub ?-pem pem? ?-encoding encoding?
. ns_crypto::eckey sharedsecret ?-pem pem? ?-encoding encoding? pubkey
. ns_crypto::eckey generate ?-name name? ?-pem pem?
* Added support for getting an arbitrary number of random bytes
based on crypto support on OpenSSL:
. ns_crypto::randombytes ?-encoding encoding? bytes
* Added support for Authenticated Encryption with Associated Data
(AEAD) scheme, which provides confidentiality, integrity, and
authenticity.
. ns_crypto::aead::encrypt string ?-aad aad? ?-cipher cipher? ?-encoding
encoding? ?-iv iv? ?-key key? input"
. ns_crypto::aead::decrypt string ?-aad aad? ?-cipher cipher? ?-encoding
encoding? ?-iv iv? ?-key key? ?-tag tag? input"
* Added "-encoding hex|base64url|base64" option for output encoding
for the crypto functions. Previously, all these functions returned the
result in "hex" format. If the option is not specified, the result
is the same as before (hex). The encoding option was added to the
following functions:
- ns_crypto::hmac string
- ns_crypto::hmac get
- ns_crypto::md string
- ns_crypto::md get
- ns_crypto::md vapidsign
- ns_crypto::enc
- "ns_connchan" improvements
--------------------------
* Callback suspension: a Tcl socket callback function might now
return the value "2" to flag that the callback will be
suspended, but it keeps the socket open. Previously, the Tcl
callback could return just "0" (callback is cancelled, socket is
closed) or "1" (continue callback handling, keep socket open).
This can be used to suspend callback handling on bottlenecks and
continue later, when situation improves.
* "ns_connchan write": The function returns now the number of
bytes sent, which might be less than the length of the data to
be sent.
* "ns_connchan list": the function returns now two more fields per
entry: a) cmd name of the callback (eases debugging, when
callbacks are changed dynamically) b) conditions used for
registering the callback.
* The "ns_connchan" callbacks are now listed via the nsstats
interface as well (with proper callback info).
- Added Possibility to add per-server "initcmds" to config file
-------------------------------------------------------------
This new feature provides an easy means to add command which
should be executed after server initialization into a configuration
files. By using the "initcmds" one can start multiple instances
of NaviServer differing just in the initialization command
by providing different config files. The "initcmds" approach
has the advantage over e.g. "ns_atserverstart" that it is
executed in a state when the server is fully initialized.
- Improved readability for config files
-------------------------------------
The "ns_section" command has new an optional last argument for the
parameters of its configuration section. Instead of writing e.g.
ns_section ns/parameters
ns_param serverlog $logroot/error.log
ns_param pidfile $logroot/nsd.pid
ns_param home $homedir
#...
one can write now
ns_section ns/parameters {
ns_param serverlog $logroot/error.log
ns_param pidfile $logroot/nsd.pid
ns_param home $homedir
#...
}
This block notation has two advantages: a) it shows clearly, where
the section ends and b) when using an editor with automatic
indentation, the log file looks nicer without manual indentation
work. This change is fully backward compatible, old style config
files continue to work.
- Further new commands and features
---------------------------------
* "ns_hash": provide a interface for the HashStringKey() function
(very useful for e.g. cache partitioning)
* "ns_reflow_text".
ns_reflow_text ?-width width? ?-offset offset? ?-prefix prefix? ?--?
text
Tcl-based solutions are surprisingly slow on largish input.
* "ns_base64urlendcode", "ns_base64urldedcode": URL-save variants of base64,
used in various new RFCs for passing base64 values in HTTP requests.
* "ns_uuid": runtime efficient version of a version 4 UUID
according to RFC 4122: A Universally Unique IDentifier (UUID)
URN Namespace
* Improved results of [ns_cache_stats -contents ...]. The command
returns now a tcl list instead of a string, including reuse count.
- Improved results of "ns_striphtml":
* Added resolving of all HTML4 entities (including etc.)
* Stripped as well HTML comments.
Performance Improvements:
-------------------------
- Check for epoch updates on blue-prints as well in cleanup phase
(deallocate trace) to reduce latency for client requests.
Bug Fixes:
----------
- Don't try to serve redirected files in case the connection is
already closed (will lead only to confusing messages)
- Ns_IsBinaryMimeType(): When a chartype is specified, never assume
the mimetype is binary.
- ns_getformfile: Don't rely on global variables
(see https://sourceforge.net/p/naviserver/bugs/80/)
Before this change, Depending on configured values,
ns_getformfile could have missed uploaded files.
- Added missing fetch commands for obtaining handles (on obviously
seldom used subcommands "ns_db setexception|sp_setparam")
- ns_http:
* Timeout and connection behavior show works now consistent
for HTTP and HTTPS URLs.
* Fixed a potential bug (infinite loop) when requests
run into timeouts.
- "ns_set print": align with documented behavior
- "ns_parseurl": make results more robust, when a URL with a colon
in the path was given, but no port provided (detected a port
incorrectly)
- "ns_parseformfile": handle also www-form-urlencoded (in
addition to multipart/form-data as before)
- Windows:
* Make sure to create temporary files correctly under windows (many
thanks to Oleg Oleinik)
* Incorrect handle was used to perform operations on the
process in Ns_WaitForProcess (many thanks to Oleg Oleinik)
Documentation improvements:
---------------------------
- Updated several man pages
* admin-db.man:
* admin-install.man
* admin-maintenance.man
* adp-overview.man
* commandlist.man
* main-features.man
* main-history.man
* ns_accesslog.man
* ns_adp.man
* ns_adp_argc.man
* ns_adp_argv.man
* ns_adp_bind_args.man
* ns_adp_eval.man
* ns_adp_flush.man
* ns_adp_info.man
* ns_adp_safeeval.man
* ns_atexit.man
* ns_atexit.man
* ns_atshutdown.man
* ns_atsignal.man
* ns_base64.man
* ns_base64encode.man
* ns_conn.man
* ns_connchan.man
* ns_cookie.man
* ns_db.man
* ns_driver.man
* ns_fmttime.man
* ns_getcontent.man
* ns_getform.man
* ns_hmac.man
* ns_hotp.man
* ns_http.man
* ns_httpget.man
* ns_httpopen.man
* ns_ictl.man
* ns_job.man
* ns_kill.man
* ns_md.man
* ns_memoize.man
* ns_mutex.man
* ns_parsequery.man
* ns_perm.man
* ns_proxy.man
* ns_queryexists.man
* ns_queryget.man
* ns_querygetall.man
* ns_quotehtml.man
* ns_rand.man
* ns_register.man
* ns_return.man
* ns_rlimit.man
* ns_schedule_proc.man
* ns_sendmail.man
* ns_server.man
* ns_set.man
* ns_set.man:
* ns_setexpires.man
* ns_sockopen.man
* ns_sockselect.man
* ns_striphtml.man
* ns_thread.man
* ns_time.man
* ns_tmpnam.man
* ns_totp.man
* ns_urlspace.man
* ns_uuencode.man
* ns_writer.man
* nscgi.man
* nsperm.man
* nssock.man
* nsv.man
* returnstatus-cmds.man
* tcl-lib-file.man
* tcl-lib-nstrace.man
* tcl-libraries.man
* tcl-overview.man
Tcl API Changes:
----------------
- "ns_conn isconnected": returns now false, when the connection is
already closed. Otherwise we have to add a new subcommand
"ns_conn closed", which seems somewhat odd (isconnected true and
closed true?)
- "ns_cache_stats" returns now hitrate in form of a float instead of
an integer.
C API Changes:
--------------
- Ns_SockTimedConnect2() returns now Ns_ReturnCode to be able to
distinguish between timeouts and errors
- Ns_SockConnectError(): new call to provide consistent error messages
and to set Tcl error info consistently
Configuration Changes:
----------------------
- Use same initialization for "enablelclpages" when configured over
"ns/server/$server" or over "ns/server/$server/adp" to avoid subtle
differences on global variables.
- Extended sample config files:
* nsd-config.tcl
. Added parameter "masklogaddr" for "nslog" section
. Added parameter for "gzip" and "brotli" static delivery
. Added parameter for "initcmds"
. Added setting for recommended environment variables
HOME, LANG and RANDFILE. RANDFILE is sometimes needed
to avoid surprises with permissions, when OpenSSL
crypto functions are called from the server
* openacs-config.tcl
. Switched to PostgreSQL's conninfo notation in the datasource
to hint that more such parameters are possible as well
(e.g. connections via SSL)
. Added comments and examples for configuring OpenACS caches
. Added comments how to configure EmailDeliveryMode via config file
. Added comments how to configure IncludeCallingInfo of OpenACS API
browser
. Added comments how to configure WithDeprecatedCode
. Added example for activating more intense SQL logging
. Added subsite-based error pages
. Added section indicating how to configure for nsstats module
. Added parameter settings for "reuseport"
. Added parameter "masklogaddr" for "nslog" section
. Added parameter for "brotli" static delivery
. Preconfigure customized error pages based on subsites
- Config files changed to block notation (see above)
- Improved handling of configuration errors:
* Provided better log message, when configured value is out of range
* Updated config values when range check corrects the value to get the
finally configured value via introspection.
Code Changes:
-------------
- Extended regression test:
* tests/adp.test
* tests/compat.test
* tests/http.test
* tests/ns_base64.test
* tests/ns_base64encode.test
* tests/ns_cache.test
* tests/ns_conn.test
* tests/ns_crypto.test
* tests/ns_nsv.test
* tests/ns_parseurl.test
* tests/ns_reflow_text.test
* tests/ns_server.test
* tests/ns_striphtml.test
- Added version tag of NaviServer to "starting" message in log file
to ease analysis in case of problems.
- Implemented deprecated commands as Tcl proc and complain on
its usage
. ns_adp_eval
. ns_adp_safeeval
- Improved Platform support:
* Extended list of platforms for manual provisioning of __PRIPTR_PREFIX
in case it is not defined.
* Do not rely on implementation defined print/scan format "%p",
but use instead standardized integer types.
* Windows:
. Improved type-cleanness (many thanks to Oleg Oleinik)
. Support to compile with MSVC 2017 (many thanks to Oleg Oleinik)
. When compiling with VS 2012, use built-in support for
intptr_t and uintptr_t.
. Added support to run regression test under Windows
(many thanks to Oleg Oleinik)
- Changed preset encodings (when not specified in config file) for
files with extensions .htm, .html, and .adp from iso8859-1 to
utf-8.
- Improved debugging support:
* Added compiler-flag NS_MUTEX_NAME_DEBUG for ease locating
anonymous mutexes.
* Provided names for all remaining mutexes to make it easier
to pinpoint bottlenecks due to mutexes
* Improve debugging output in various messages, when debugging
options are activated.
- Minor update of mime types based on actual IANA media types.
- Provided compatibility with Tcl 8.7.2 (removed CONST and VOID macros)
- Further improved robustness by avoiding potential NULL dereferences
found be static code analyzers (mostly error cases)
- Improved configure scripts
- Make sure, we have enough space for the terminating null character
- Added "pure" specifier for improved code generation
- Various code smell removals
* Prefer boolean type over int
* Improved type cleanness
* Reduced implicit conversions
* Reduced number of return statements before end of function
* Don't pass implementation-defined NULL after the last typed argument
to a variadic function
* Removed dead assignments
* Added "const" declarations
* Fixed typos, improved comments
Modules:
--------
- nsdbbdb (many thanks to Brendan Graves):
* Changed to work with FreeTDS 1.00.86
* Updated outdated paths.
- nsdbpg:
* Added sample configuration to include hints how to use SSL
connections to the database
* Provided compatibility with Tcl 8.7.2
* Minor code cleanups
- nssmtpd, nsdns, nstftpd, nsradiusd, nsdbi, nsdbipg:
* Brought code in sync with the current code base (including IPv6, 8.7.2
compat)
* Improved spelling
- nsphp (many thanks to Anthony Bennett):
* Refactored for newer versions of NaviServer
* Improved README and spelling
- nsstats:
* Added results to "ns_connchan list" to per-server info
* Added optional query parameter "raw=0|1" to switch between
raw and prettified numbers
* Improved number prettification
* Added optional query parameter "max=..." for controlling the number of
per-cache entries shown (default 50)
* Improved cache statistics: added hits/req, saved/req, saved/hit; dropped
saved/KB
* Improved mutex statistics: added locks/req, potential locks/req, potential
locks per second
* Added summative statistics to mutex locks page
* Made background locks (locks, not included in per-request statistics)
configurable via NaviServer config file
* Various other small changes and beautifications (use more CSS)
* Bumped version to 1.8
- nsoracle:
* Fixed potential crash when oci_error_p is called with dbh == NULL
(many thanks to Oleg Oleinik)
* Some more code cleanup and improved spellings.
- websocket:
* Fixed potential bug: make sure that upgrade header is sent as a single
block.
* More minor code cleanup.
- revproxy:
* Fixed potential blocking conditions when send buffer of OS overflows.
With "-sendtimeout 0" a call to "ns_connchan write" might write less
bytes than desired; In this case, callbacks are suspended and continue
when the situation improves.
* Added new switches "-sendtimeout" and "-receivetimeout" to
revproxy::upstream
* Added "-backend_reply_callback" to ::revproxy::upstream to allow proxy the
modification of backend header fields per request.
* Bumped version number to 0.11
- letsencrypt:
* Modernized code: use built-in ns_base64urlencode (requires 4.99.17)
* Changed order of certificates in pem file (private key first)
* Don't hard-code OpenSSL dir on OS (many thanks to Stefan Sobernig)
- nswebpush:
* New module for implementing Web Push via NaviServer
(Many thanks to Georg Prohaska)
* For details, see: https://bitbucket.org/naviserver/nswebpush/src/default/
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel