pax_global_header 0000666 0000000 0000000 00000000064 13243617477 0014530 g ustar 00root root 0000000 0000000 52 comment=8ab2918638f14a7da78a6f9cefa5dec846aa1450
vibe.d-0.8.2/ 0000775 0000000 0000000 00000000000 13243617477 0012706 5 ustar 00root root 0000000 0000000 vibe.d-0.8.2/.codecov.yml 0000664 0000000 0000000 00000000426 13243617477 0015133 0 ustar 00root root 0000000 0000000 # Documentation: https://github.com/codecov/support/wiki/codecov.yml
coverage:
precision: 3
round: down
range: 80...100
status:
# Learn more at https://codecov.io/docs#yaml_default_commit_status
project: true
patch: true
changes: false
comment: false
vibe.d-0.8.2/.editorconfig 0000664 0000000 0000000 00000000244 13243617477 0015363 0 ustar 00root root 0000000 0000000 root = true
[*.{c,h,d,di,dd,json}]
end_of_line = lf
insert_final_newline = true
indent_style = tab
indent_size = 4
trim_trailing_whitespace = true
charset = utf-8
vibe.d-0.8.2/.gitignore 0000664 0000000 0000000 00000002772 13243617477 0014706 0 ustar 00root root 0000000 0000000 *.[oa]
*.so
*.lib
*.dll
.*.sw*
*.lst
docs.json
/docs/index.html
/docs/sitemap.xml
/docs/vibe
/docs/images
/docs/prettify
/docs/scripts
/docs/styles
__dummy.html
.dub
dub.selections.json
# Auto-downloaded 3rd-party
lib/subprojects/diet/
lib/subprojects/libevent/
lib/subprojects/openssl/
# Mono-D files
*.userprefs
# Unittest binaries
vibe-d
tests/*/tests
__test__*__
vibe-d-test*
vibe-d-*-test*
# Examples
examples/app_skeleton/__test__library__
examples/bench-http-request/bench-http-request
examples/bench-http-server/bench-http-server
examples/daytime/daytime-example
examples/diet/diet-example
examples/download/download-example
examples/echoserver/echoserver-example
examples/form_interface/form-interface-example
examples/http_info/http-info-example
examples/http_request/http-request-example
examples/http_reverse_proxy/http-reverse-proxy-example
examples/http_server/http-server-example
examples/http_static_server/http-static-server-example
examples/https_server/https-server-example
examples/json/json-example
examples/message/message-example
examples/mongodb/mongodb-example
examples/app_skeleton/app-skeleton
examples/redis-pubsub/redis-pubsub-example
examples/redis/redis-example
examples/rest/rest-example
examples/sendmail/sendmail-example
examples/serialization/serialization-example
examples/task_control/task-control-example
examples/tcp_separate/tcp-separate-example
examples/udp/udp-example
examples/uploader/uploader-example
examples/web/web-framework-example
examples/websocket/websocket-example
*.exe
vibe.d-0.8.2/.travis.yml 0000664 0000000 0000000 00000003177 13243617477 0015027 0 ustar 00root root 0000000 0000000 language: d
sudo: false
dist: trusty
services:
- mongodb
- redis-server
addons:
apt:
packages:
- pkg-config
- zlib1g-dev
- libevent-dev
- libssl-dev
d:
# order: latest DMD, oldest DMD, LDC/GDC, remaining DMD versions
# this way the overall test time gets cut down (GDC/LDC are a lot
# slower tham DMD, so they should be started early), while still
# catching most DMD version related build failures early
- dmd-2.077.0
- dmd-2.071.2
- ldc-1.5.0
- ldc-1.4.0
- ldc-1.3.0
- ldc-1.2.0
- ldc-1.1.1
- dmd-2.076.1
- dmd-2.075.1
- dmd-2.074.1
- dmd-2.073.2
- dmd-2.072.2
- dmd-beta
env:
- VIBED_DRIVER=libevent BUILD_EXAMPLE=1 RUN_TEST=1
- VIBED_DRIVER=vibe-core BUILD_EXAMPLE=1 RUN_TEST=1
- VIBED_DRIVER=libasync BUILD_EXAMPLE=0 RUN_TEST=0
matrix:
include:
- d: dmd
# https://issues.dlang.org/show_bug.cgi?id=13742
env: DFLAGS="-cov -version=VibedSetCoverageMerge" DUB_BUILD_MODE="singleFile"
exclude:
- d: ldc-1.2.0
env: VIBED_DRIVER=libasync BUILD_EXAMPLE=0 RUN_TEST=0
- d: ldc-1.1.1
env: VIBED_DRIVER=libasync BUILD_EXAMPLE=0 RUN_TEST=0
allow_failures:
- d: dmd-beta
- d: ldc-1.3.0
env: VIBED_DRIVER=libasync BUILD_EXAMPLE=0 RUN_TEST=0
before_install:
- pyenv global system 3.5
- pip3 install 'meson>=0.42,!=0.43'
install:
- mkdir .ntmp
- curl -L https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip -o .ntmp/ninja-linux.zip
- unzip .ntmp/ninja-linux.zip -d .ntmp
before_script:
- export PATH=$PATH:$PWD/.ntmp
script: ./travis-ci.sh
after_success:
- bash <(curl -s https://codecov.io/bash)
vibe.d-0.8.2/CHANGELOG.md 0000664 0000000 0000000 00000557305 13243617477 0014536 0 ustar 00root root 0000000 0000000 Changelog
=========
v0.8.2 - 2017-12-11
-------------------
The major changes in this release are HTTP forward proxy support, handling incoming HTTP requests on custom transports and a MongoDB based session store. On top of that, there are many smaller improvements in the HTTP server, web/REST generator, JSON/BSON support and the TLS sub system.
### Features and improvements ###
- Web/REST framework
- Added support for `@noRoute` in the REST interface generator - [issue #1934][issue1934]
- Added support for `@requiresAuth` on REST interfaces in addition to classes - [pull #1939][issue1939]
- Added global `request`/`response` properties for the web interface generator (by Benjamin Schaaf) - [issue #1937][issue1937], [pull #1938][issue1938]
- The language list for `@translationContext` can now be specified as a compile-time constant array in addition to a tuple (by Jan Jurzitza aka WebFreak) - [pull #1879][issue1879]
- HTTP sub system
- Added HTTP forward proxy support based on the existing reverse proxy code (by Matt Remmel) - [pull #1893][issue1893]
- Deprecated non-`nothrow` WebSocket handler callbacks - [issue #1420][issue1420], [pull #1890][issue1890]
- Added `handleHTTPConnection` to serve HTTP requests on a custom transport - [pull #1929][issue1929]
- Added `HTTPServerRequest.requestPath` as an `InetPath` property replacing `.path` to avoid encoding related issues - [pull #1940][issue1940]
- Added `HTTPClientRequest.remoteAddress`
- Added `HTTPListener.bindAddresses` property, this allows querying the actual port when passing `0` to `HTTPServerSettings.bindPort` - [issue #1818][issue1818], [pull #1930][issue1930]
- Added `SysTime`/`Duration` based overloads for `Cookie.expire`/`.maxAge` - [issue #1701][issue1701], [pull #1889][issue1889]
- MongoDB driver
- Added `MongoSessionStore` for MongoDB based HTTP session storage
- The MongoDB driver now forwards server error messages (by Martin Nowak) - [pull #1951][issue1951]
- Extended the JSON parser to handle forward ranges in addition to random access ranges (by John Colvin) - [pull #1906][issue1906]
- Added `std.uuid.UUID` conversion support for `Bson` (by Denis Feklushkin) - [pull #1404][issue1404]
- Added "openssl-1.1" and "openssl-0.9" configurations to the vibe-d:tls package to enable switching the OpenSSL target version without having to define version constants - [pull #1965][issue1965]
- Added `NativePath` based overloads of `TLSContext.usePrivateKeyFile` and `.useCertificateChainFile`
- Added `setCommandLineArgs` - can be used together with a `VibeDisableCommandLineParsing` version to customize command line parsing - [pull #1916][issue1916]
### Bug fixes ###
- Fixed getting the X509 certificate for printing certificate errors on OpenSSL 1.1 (by Martin Nowak) - [pull #1921][issue1921]
- Fixed handling of `out` parameters in the REST interface (were erroneously read from the request) - [issue #1933][issue1933], [pull #1935][issue1935]
- Fixed an "orphan format specifier" error in the web interface handling code
- Fixed the JSON parser to work at compile-time (by Benjamin Schaaf) - [pull #1960][issue1960]
- Fixed an error in the Botan TLS provider if used to serve HTTPS - [issue #1918][issue1918], [pull #1964][issue1964]
- Fixed a web interface generator compile error in case of an empty language list in the `@translationContext` - [issue #1955][issue1955], [pull #1956][issue1956]
- Fixed a bogus error during HTTP request finalization - [issue #1966][issue1966]
- Fixed the command line argument parser getting tripped up by druntime arguments ("--DRT-...") (by Martin Nowak) - [pull #1944][issue1944]
- Fixed a possible race condition when stopping a `RedisListener` (by Etienne Cimon) - [pull #1201][issue1201], [pull #1971][issue1971]
- Fixed support for `TCPListenOptions.reusePort` on macOS and FreeBSD - [pull #1972][issue1972]
- Fixed handling of CONNECT requests in the HTTP proxy server - [pull #1973][issue1973]
[issue1701]: https://github.com/vibe-d/vibe.d/issues/1701
[issue1889]: https://github.com/vibe-d/vibe.d/issues/1889
[issue1420]: https://github.com/vibe-d/vibe.d/issues/1420
[issue1890]: https://github.com/vibe-d/vibe.d/issues/1890
[issue1916]: https://github.com/vibe-d/vibe.d/issues/1916
[issue1906]: https://github.com/vibe-d/vibe.d/issues/1906
[issue1929]: https://github.com/vibe-d/vibe.d/issues/1929
[issue1818]: https://github.com/vibe-d/vibe.d/issues/1818
[issue1930]: https://github.com/vibe-d/vibe.d/issues/1930
[issue1934]: https://github.com/vibe-d/vibe.d/issues/1934
[issue1939]: https://github.com/vibe-d/vibe.d/issues/1939
[issue1937]: https://github.com/vibe-d/vibe.d/issues/1937
[issue1938]: https://github.com/vibe-d/vibe.d/issues/1938
[issue1940]: https://github.com/vibe-d/vibe.d/issues/1940
[issue1951]: https://github.com/vibe-d/vibe.d/issues/1951
[issue1404]: https://github.com/vibe-d/vibe.d/issues/1404
[issue1965]: https://github.com/vibe-d/vibe.d/issues/1965
[issue1879]: https://github.com/vibe-d/vibe.d/issues/1879
[issue1893]: https://github.com/vibe-d/vibe.d/issues/1893
[issue1921]: https://github.com/vibe-d/vibe.d/issues/1921
[issue1933]: https://github.com/vibe-d/vibe.d/issues/1933
[issue1935]: https://github.com/vibe-d/vibe.d/issues/1935
[issue1960]: https://github.com/vibe-d/vibe.d/issues/1960
[issue1918]: https://github.com/vibe-d/vibe.d/issues/1918
[issue1964]: https://github.com/vibe-d/vibe.d/issues/1964
[issue1955]: https://github.com/vibe-d/vibe.d/issues/1955
[issue1956]: https://github.com/vibe-d/vibe.d/issues/1956
[issue1966]: https://github.com/vibe-d/vibe.d/issues/1966
[issue1944]: https://github.com/vibe-d/vibe.d/issues/1944
[issue1201]: https://github.com/vibe-d/vibe.d/issues/1201
[issue1971]: https://github.com/vibe-d/vibe.d/issues/1971
[issue1972]: https://github.com/vibe-d/vibe.d/issues/1972
[issue1973]: https://github.com/vibe-d/vibe.d/issues/1973
v0.8.1 - 2017-08-30
-------------------
Apart from removing the old `vibe-d:diet` package in favor of `diet-ng`, this release most notably contains a number of performance improvements in the HTTP server, as well as improvements and fixes in the WebSocket code. Furthermore, initial OpenSSL 1.1.x support has been added and a few `@safe` related issues introduced in 0.8.0 have been fixed.
### Features and improvements ###
- Compiles on DMD 2.071.2 up to DMD 2.076.0-rc1
- Removed vibe-d:diet sub package (superseded by diet-ng) - [pull #1835][issue1835]
- Web framework
- Added convenience functions `status` and `header` to `vibe.web.web` (by Sebastian Wilzbach) - [pull #1696][issue1696]
- Added `vibe.web.web.determineLanguageByHeader` and improved the default language determination (by Jan Jurzitza aka WebFreak) - [pull #1850][issue1850]
- Added `vibe.web.web.language` property to determine the detected language (by Jan Jurzitza aka WebFreak) - [pull #1860][issue1860]
- Marked the global API functions in `vibe.web.web` as `@safe` - [pull #1886][issue1886]
- The REST interface generator avoids blindly instantiating serialization code for *all* parameters
- No stack trace is shown on the generated error page anymore in case of bad (query/form) parameter formatting
- HTTP sub system
- The HTTP server now accepts a UTF-8 BOM for JSON requests (by Sebanstian Wilzbach) - [pull #1799][issue1799]
- Most parsing features activated by `HTTPServerOption` (for `HTTPServerRequest`) are now evaluated lazily instead - the corresponding options are now deprecated (by Sebastian Wilzbach):
- `.json` / `HTTPServerOption.parseJsonBody` - [pull #1677][issue1677]
- `.cookies` / `HTTPServerOption.parseCookies` - [pull #1801][issue1801]
- `.form` / `HTTPServerOption.parseFormBody` - [pull #1801][issue1801]
- `.files` / `HTTPServerOption.parseMultiPartBody` - [pull #1801][issue1801]
- `.query` / `HTTPServerOption.parseQueryString` - [pull #1821][issue1821]
- `.queryString`, `.username` and `.password` are now always filled, regardless of `HTTPServerOption.parseURL` - [pull #1821][issue1821]
- `HTTPServerRequest.peer` is now computed lazily
- Deprecated `HTTPServerOption.distribute` because of its non-thread-safe design
- The `HTTPServerSettings` constructor now accepts a convenient string to set the bind address - [pull #1810][issue1810]
- `listenHTTP` accepts the same convenience string as `HTTPServerSettings` (by Sebastian Wilzbach) - [pull #1816][issue1816]
- Added `HTTPReverseProxySettings.destination` (`URL`) to made UDS destinations work (by Georgi Dimitrov) - [pull #1813][issue1813]
- Increased the network output chunk sizes from 256 to 1024 in the HTTP client/server
- WebSocket messages now produce only a single network packet of possible (header and payload sent at once) - [issue #1791][issue1791], [pull #1792][issue1792]
- WebSocket API improvements (by Mathias Lang aka Geod24) - [pull #1534][issue1534], [pull #1836][issue1836]
- Renamed `HTTPServerRequest.requestURL` to `requestURI`
- Added `HTTPClientRequest.peerCertificate` property
- Serialization
- Added deserialization support for unnamed `Tuple!(...)` (by Dentcho Bankov) - [pull #1693][issue1693]
- Added serialization support for named `Tuple!(...)` (by Dentcho Bankov) - [pull #1662][issue1662]
- Added UDP multicast properties (implemented for libevent, by Sebastian Koppe) - [pull #1806][issue1806]
- Markdown embedded URLs are now filtered by a whitelist to avoid URL based XSS exploits - [issue #1845][issue1845], [pull #1846][issue1846]
- `lowerPrivileges` is now marked `@safe` (by Sebastian Wilzbach) - [pull #1807][issue1807]
- Improved `urlDecode` to return a slice of its input if possible - [pull #1828][issue1828]
- Added `DictionaryList.toString` and deprecated `alias byKeyValue this` - [issue #1873][issue1873]
- Added support for defining a compatibility version `VibeUseOpenSSL11` to build against OpenSSL 1.1.0 instead of 1.0.x (by Robert Schadek aka burner) - [issue #1651][issue1651], [issue #1748][issue1748], [issue #1758][issue1758], [pull #1759][issue1759]
- Added a Meson project file analogous to the 0.7.x branch (by Matthias Klumpp aka ximion) - [pull #1894][issue1894]
- The functions in `vibe.stream.operations` now compile with non-`@safe` streams and ranges - [pull #1902][issue1902]
- Added `TLSCertificateInformation._x509` as an temporary means to access the raw certificate (`X509*` for OpenSSL)
### Bug fixes ###
- Fixed "SSL_read was unsuccessful with ret 0" errors in the OpenSSL TLS implementation (by machindertech) - [issue #1124][issue1124], [pull #1395][issue1395]
- Fixed the JSON generator to output valid JSON for `Json.undefined` values (by by Tomáš Chaloupka) - [pull #1737][issue1737], [issue #1735][issue1735]
- Fixed using HTTP together with USDS sockets in the HTTP client (by Johannes Pfau aka jpf91) - [pull #1747][issue1747]
- Fixed handling of `Nullable!T` in the web interface generator - invalid values are treated as an error now instead of as a
null value
- Fixed a compilation error in the Botan based TLS implementation
- Fixed an assertion in the HTTP client by using a custom allocator instead of the buggy `RegionAllocator`
- Fixed sending of WebSocket messages with a payload length of 65536
- Fixed an intermittent failure at shutdown when using libasync - [pull #1837][issue1837]
- Fixed MongoDB SASL authentication when used within `shared static this` (by Sebastian Wilzbach) - [pull #1841][issue1841]
- Fixed authentication with default settings on modern MongoDB versions by defaulting to SCRAM-SHA-1 (by Sebastian Wilzbach) - [issue #1785][issue1785], [issue #1843][issue1843]
- Fixed the WebSocket ping logic - [issue #1471][issue1471], [pull #1848][issue1848]
- Fixed a cause of "dwarfeh(224) fatal error" during fatal app exit and possible an infinite loop by using `abort()` instead of `exit()`
- Fixed `URLRouter.match` to accept delegate literals (by Sebastian Wilzbach) - [pull #1866][issue1866]
- Fixed a possible range error in the libasync driver
- Fixed serialization of recursive data types to JSON (by Jan Jurzitza aka WebFreak) - [issue #1855][issue1855]
- Fixed `MongoCursor.limit` and made the API `@safe` (by Jan Jurzitza aka WebFreak) - [issue #967][issue967], [pull #1871][issue1871]
- Fixed determining the host name in `SyslogLogger` (by Jan Jurzitza aka WebFreak) - [pull #1874][issue1874]
[issue967]: https://github.com/vibe-d/vibe.d/issues/967
[issue1124]: https://github.com/vibe-d/vibe.d/issues/1124
[issue1395]: https://github.com/vibe-d/vibe.d/issues/1395
[issue1471]: https://github.com/vibe-d/vibe.d/issues/1471
[issue1534]: https://github.com/vibe-d/vibe.d/issues/1534
[issue1651]: https://github.com/vibe-d/vibe.d/issues/1651
[issue1662]: https://github.com/vibe-d/vibe.d/issues/1662
[issue1674]: https://github.com/vibe-d/vibe.d/issues/1674
[issue1677]: https://github.com/vibe-d/vibe.d/issues/1677
[issue1691]: https://github.com/vibe-d/vibe.d/issues/1691
[issue1692]: https://github.com/vibe-d/vibe.d/issues/1692
[issue1693]: https://github.com/vibe-d/vibe.d/issues/1693
[issue1696]: https://github.com/vibe-d/vibe.d/issues/1696
[issue1735]: https://github.com/vibe-d/vibe.d/issues/1735
[issue1737]: https://github.com/vibe-d/vibe.d/issues/1737
[issue1747]: https://github.com/vibe-d/vibe.d/issues/1747
[issue1748]: https://github.com/vibe-d/vibe.d/issues/1748
[issue1758]: https://github.com/vibe-d/vibe.d/issues/1758
[issue1759]: https://github.com/vibe-d/vibe.d/issues/1759
[issue1785]: https://github.com/vibe-d/vibe.d/issues/1785
[issue1791]: https://github.com/vibe-d/vibe.d/issues/1791
[issue1792]: https://github.com/vibe-d/vibe.d/issues/1792
[issue1799]: https://github.com/vibe-d/vibe.d/issues/1799
[issue1801]: https://github.com/vibe-d/vibe.d/issues/1801
[issue1806]: https://github.com/vibe-d/vibe.d/issues/1806
[issue1807]: https://github.com/vibe-d/vibe.d/issues/1807
[issue1810]: https://github.com/vibe-d/vibe.d/issues/1810
[issue1813]: https://github.com/vibe-d/vibe.d/issues/1813
[issue1816]: https://github.com/vibe-d/vibe.d/issues/1816
[issue1821]: https://github.com/vibe-d/vibe.d/issues/1821
[issue1828]: https://github.com/vibe-d/vibe.d/issues/1828
[issue1835]: https://github.com/vibe-d/vibe.d/issues/1835
[issue1836]: https://github.com/vibe-d/vibe.d/issues/1836
[issue1837]: https://github.com/vibe-d/vibe.d/issues/1837
[issue1841]: https://github.com/vibe-d/vibe.d/issues/1841
[issue1843]: https://github.com/vibe-d/vibe.d/issues/1843
[issue1845]: https://github.com/vibe-d/vibe.d/issues/1845
[issue1846]: https://github.com/vibe-d/vibe.d/issues/1846
[issue1848]: https://github.com/vibe-d/vibe.d/issues/1848
[issue1850]: https://github.com/vibe-d/vibe.d/issues/1850
[issue1855]: https://github.com/vibe-d/vibe.d/issues/1855
[issue1860]: https://github.com/vibe-d/vibe.d/issues/1860
[issue1866]: https://github.com/vibe-d/vibe.d/issues/1866
[issue1871]: https://github.com/vibe-d/vibe.d/issues/1871
[issue1873]: https://github.com/vibe-d/vibe.d/issues/1873
[issue1874]: https://github.com/vibe-d/vibe.d/issues/1874
[issue1886]: https://github.com/vibe-d/vibe.d/issues/1886
[issue1894]: https://github.com/vibe-d/vibe.d/issues/1894
[issue1902]: https://github.com/vibe-d/vibe.d/issues/1902
v0.8.0 - 2017-07-10
-------------------
The 0.8.x branch marks the final step before switching each individual sub package to version 1.0.0. This has already been done for the Diet template module (now [`diet-ng`][diet-ng]) and for the new [vibe-core][vibe-core] package that is released simultaneously. The most prominent changes in this release are a full separation of all sub modules into individual folders, as well as the use of `@safe` annotations throughout the code base. The former change may require build adjustments for projects that don't use DUB to build vibe.d, the latter leads to some breaking API changes.
### Features and improvements ###
- Compiles on DMD 2.070.2 up to DMD 2.075.0-b1, this release also adds support for `-m32mscoff` builds ("x86_mscoff")
- Global API changes
- Split up the library into fully separate sub packages/folders
- Added a "vibe-core" configuration to "vibe-d" and "vibe-d:core" that uses the new [vibe-core][vibe-core] package
- Added `@safe` and `nothrow` annotations in many places of the API - this is a breaking change in cases where callbacks were annotated - [pull #1618][issue1618], [issue 1595][issue1595]
- Reworked the buffered I/O stream API
- The `InputStream` based overload of `OutputStream.write` has been moved to a global function `pipe()`
- `read` and `write` now accept an optional `IOMode` parameter (only `IOMode.all` is supported for the original `vibe:core`, but `vibe-core` supports all modes)
- `InputStream.leastSize` and `.dataAvailableForRead` are scheduled for deprecation - `IOMode.immediate` and `IOMode.once` can be used in their place
- Added forward compatibility code to "vibe:core" so that dependent code can use either that or [vibe-core][vibe-core] as a drop-in replacement
- HTTP server
- Server contexts are now managed thread-locally, which means that multiple threads will attempt to listen on the same port if requested to do so - use `HTTPServerOption.reusePort` if necessary
- Added support for simple range queries in the HTTP file server (by Jan Jurzitza aka WebFreak001) - [issue #716][issue716], [pull #1634][issue1634], [pull #1636][issue1636]
- The HTTP file server only sets a default content type header if none was already set (by Remi A. Solås aka rexso) - [pull #1642][issue1642]
- `HTTPServerResponse.writeJsonBody` only sets a default content type header if none was already set
- Added `HTTPServerResponse.writePrettyJsonBody`
- `HTTPServerResponse.writeBody` only sets a default content type if none is already set - [issue #1655][issue1655]
- Added `Session.remove` to remove session keys (by Sebastian Wilzbach) - [pull #1670][issue1670]
- Added `WebSocket.closeCode` and `closeReason` properties (by Andrei Zbikowski aka b1naryth1ef) - [pull #1675][issue1675]
- Added a `Variant` dictionary as `HTTPServerRequest.context` for custom value storage by high level code - [issue1529][issue1529] [pull #1550][issue1550]
- Usability improvements by Harry T. Vennik aka thaven - [pull #1745][issue1745]
- Added `checkBasicAuth` as a non-enforcing counterpart of `performBasicAuth` - [issue #1449][issue1449], [pull #1687][issue1687]
- Diet templates are rendered as pretty HTML by default if "diet-ng" is used (can be disabled using `VibeOutputCompactHTML`) - [issue #1616][issue1616]
- Added `HTTPClientRequest.writeFormBody`
- Disabled stack traces on the default error page for non-debug builds by default (`HTTPServerOption.defaults`)
- REST interface generator
- Added single-argument `@bodyParam` to let a single parameter represent the whole request body (by Sebastian Wilzbach) - [issue #1549][issue1549], [pull #1723][issue1723]
- Boolean parameters now accept "1" and case insensitive "true" as `true` - [pull #1712][issue1712]
- Server responses now output prettified JSON if built in debug mode
- Stack traces are only written in debug mode - [issue #1623][issue1623]
- Reduced the number of chunks written by `StreamOutputRange.put` for large input buffers (affects WebSockets and chunked HTTP responses)
- Switched to `std.experimental.allocator` instead of the integrated `vibe.utils.memory` module
- The string sequence `` is now encoded as `<\/` by the JSON module to avoid a common XSS attack vector
- Reduced synchronization overhead in the libevent driver for entities that are single-threaded
- Added support for MongoDB SCRAM-SHA1 authentication (by Nicolas Gurrola) - [pull #1632][issue1632]
- Added `RedisCollection.initialize`
- The trigger mode for `FileDescriptorEvent` can now be configured (by Jack Applegame) - [pull #1596][issue1596]
- Enabled minimal delegate syntax for `URLRouter` (e.g. `URLRouter.get("/", (req, res) { ... });`) - [issue #1668][issue1668]
- Added serialization support for string based enum types as associative array keys (by Tomoya Tanjo) - [issue #1660][issue1660], [pull #1663][issue1663]
- Added serialization support for `Typedef!T` - [pull #1617][issue1617]
- Added `DictionaryList!T.byKeyValue` to replace `opApply` based iteration
- Added `.byValue`/`.byKeyValue`/`.byIndexValue` properties to `Bson` and `Json` as a replacement for `opApply` based iteration (see [issue #1688][issue1688])
- Added `StreamOutputRange.drop()`
- Updated the Windows OpenSSL binaries to 1.0.2k
- The session life time in `RedisSessionStore` is now refreshed on every access to the session (by Steven Schveighoffer) - [pull #1778][issue1778]
- Reduced session storage overhead in `RedisSessionStore` (by Steven Schveighoffer) - [pull #1777][issue1777]
- Enabled `HashMap`'s postblit constructor, supported by a reference counting + copy-on-write strategy
### Bug fixes ###
- Fixed compile error for deserializing optional class/struct fields
- Fixed GET requests in the REST client to not send a body
- Fixed REST request responses that return void to send an empty body (see also [issue #1682](issue1682))
- Fixed a possible idle loop in `Task.join()` if called from outside of an event loop
- Fixed `TaskPipe.waitForData` to actually time out if a timeout value was passed - [issue #1605][issue1605]
- Fixed a compilation error for GDC master - [issue #1602][issue1602]
- Fixed a linker issue for LDC on Windows - [issue #1629][issue1629]
- Fixed a (single-threaded) concurrent AA iteration/write issue that could result in an access violation in the Win32 driver - [issue #1608][issue1608]
- Fixed the JavaScript REST client generator to handle XHR errors (by Timoses) - [pull #1645][issue1645], [pull #1646][issue1646]
- Fixed a possible `InvalidMemoryOperationError` in `SystemRNG`
- Fixed `runApplication` to be able to handle extraneous command line arguments
- Fixed a possible crash in `RedisSubscriber.blisten` due to a faulty shutdown procedure
- Fixed detection of non-keep-alive connections in the HTTP server (upgraded connections were treated as keep-alive)
- Fixed bogus static assertion failure in `RestInterfaceClient!I` when `I` is annotated with `@requiresAuth` - [issue #1648][issue1648]
- Fixed a missing `toRedis` conversion in `RedisHash.setIfNotExist` (by Tuukka Kurtti aka Soletek) - [pull #1659][issue1659]
- Fixed `createTempFile` on Windows
- Fixed the HTTP reverse proxy to send 502 (bad gateway) instead of 500 (internal server error) for upstream errors
- Fixed a possible `InvalidMemoryOperationError` on shutdown for failed MongoDB requests - [issue #1707][issue1707]
- Fixed `readOption!T` to work for array types - [issue #1713][issue1713]
- Fixed handling of remote TCP connection close during concurrent read/write - [issue #1726][issue1726], [pull #1727][issue1727]
- Fixed libevent driver to properly handle allocator `null` return values
- Fixed invoking vibe.d functionality from a plain `Fiber` - [issue #1742][issue1742]
- Fixed parsing of "tcp://" URLs - [issue #1732][issue1732], [pull #1733][issue1733]
- Fixed handling `@before` attributes on REST interface classes and intermediate interfaces - [issue #1753][issue1753], [pull #1754][issue1754]
- Fixed a deadlock situation in the libevent driver - [pull #1756][issue1756]
- Fixed `readUntilSmall`/`readLine` to handle alternating availability of a peek buffer - [issue #1741][issue1741], [pull #1761][issue1761]
- Fixed `parseMultiPartForm` to handle unquoted strings in the "Content-Disposition" header (by Tomáš Chaloupka) - [issue #1562][issue1562] [pull #1725][issue1725]
- Fixed `HTTPServerRequest.fullURL` for IPv6 address based host strings
- Fixed building on Windows with x86_mscoff (the win32 configuration is chosen by default now) - [issue #1771][issue1771]
[issue716]: https://github.com/vibe-d/vibe.d/issues/716
[issue1449]: https://github.com/vibe-d/vibe.d/issues/1449
[issue1529]: https://github.com/vibe-d/vibe.d/issues/1529
[issue1549]: https://github.com/vibe-d/vibe.d/issues/1549
[issue1550]: https://github.com/vibe-d/vibe.d/issues/1550
[issue1562]: https://github.com/vibe-d/vibe.d/issues/1562
[issue1595]: https://github.com/vibe-d/vibe.d/issues/1595
[issue1596]: https://github.com/vibe-d/vibe.d/issues/1596
[issue1602]: https://github.com/vibe-d/vibe.d/issues/1602
[issue1605]: https://github.com/vibe-d/vibe.d/issues/1605
[issue1608]: https://github.com/vibe-d/vibe.d/issues/1608
[issue1616]: https://github.com/vibe-d/vibe.d/issues/1616
[issue1617]: https://github.com/vibe-d/vibe.d/issues/1617
[issue1618]: https://github.com/vibe-d/vibe.d/issues/1618
[issue1623]: https://github.com/vibe-d/vibe.d/issues/1623
[issue1629]: https://github.com/vibe-d/vibe.d/issues/1629
[issue1632]: https://github.com/vibe-d/vibe.d/issues/1632
[issue1634]: https://github.com/vibe-d/vibe.d/issues/1634
[issue1636]: https://github.com/vibe-d/vibe.d/issues/1636
[issue1642]: https://github.com/vibe-d/vibe.d/issues/1642
[issue1645]: https://github.com/vibe-d/vibe.d/issues/1645
[issue1646]: https://github.com/vibe-d/vibe.d/issues/1646
[issue1648]: https://github.com/vibe-d/vibe.d/issues/1648
[issue1655]: https://github.com/vibe-d/vibe.d/issues/1655
[issue1659]: https://github.com/vibe-d/vibe.d/issues/1659
[issue1660]: https://github.com/vibe-d/vibe.d/issues/1660
[issue1663]: https://github.com/vibe-d/vibe.d/issues/1663
[issue1668]: https://github.com/vibe-d/vibe.d/issues/1668
[issue1670]: https://github.com/vibe-d/vibe.d/issues/1670
[issue1675]: https://github.com/vibe-d/vibe.d/issues/1675
[issue1682]: https://github.com/vibe-d/vibe.d/issues/1682
[issue1687]: https://github.com/vibe-d/vibe.d/issues/1687
[issue1688]: https://github.com/vibe-d/vibe.d/issues/1688
[issue1707]: https://github.com/vibe-d/vibe.d/issues/1707
[issue1712]: https://github.com/vibe-d/vibe.d/issues/1712
[issue1713]: https://github.com/vibe-d/vibe.d/issues/1713
[issue1723]: https://github.com/vibe-d/vibe.d/issues/1723
[issue1725]: https://github.com/vibe-d/vibe.d/issues/1725
[issue1726]: https://github.com/vibe-d/vibe.d/issues/1726
[issue1727]: https://github.com/vibe-d/vibe.d/issues/1727
[issue1732]: https://github.com/vibe-d/vibe.d/issues/1732
[issue1733]: https://github.com/vibe-d/vibe.d/issues/1733
[issue1741]: https://github.com/vibe-d/vibe.d/issues/1741
[issue1742]: https://github.com/vibe-d/vibe.d/issues/1742
[issue1745]: https://github.com/vibe-d/vibe.d/issues/1745
[issue1753]: https://github.com/vibe-d/vibe.d/issues/1753
[issue1754]: https://github.com/vibe-d/vibe.d/issues/1754
[issue1756]: https://github.com/vibe-d/vibe.d/issues/1756
[issue1761]: https://github.com/vibe-d/vibe.d/issues/1761
[issue1771]: https://github.com/vibe-d/vibe.d/issues/1771
[issue1777]: https://github.com/vibe-d/vibe.d/issues/1777
[issue1778]: https://github.com/vibe-d/vibe.d/issues/1778
[vibe-core]: https://github.com/vibe-d/vibe-core
v0.7.31 - 2017-04-10
--------------------
This release is a backport release of the smaller changes that got into 0.8.0. The 0.7.x branch will continue to be maintained for a short while, but only bug fixes will be included from now on. Applications should switch to the 0.8.x branch as soon as possible.
### Features and improvements ###
- Compiles on DMD 2.068.2 up to DMD 2.074.0
- HTTP server
- Added support for simple range queries in the HTTP file server (by Jan Jurzitza aka WebFreak001) - [issue #716][issue716], [pull #1634][issue1634], [pull #1636][issue1636]
- The HTTP file server only sets a default content type header if none was already set (by Remi A. Solås aka rexso) - [pull #1642][issue1642]
- `HTTPServerResponse.writeJsonBody` only sets a default content type header if none was already set
- `HTTPServerResponse.writeBody` only sets a default content type if none is already set - [issue #1655][issue1655]
- Added `HTTPServerResponse.writePrettyJsonBody`
- Diet templates are rendered as pretty HTML by default if diet-ng is used (can be disabled using `VibeOutputCompactHTML`)
- Reduced synchronization overhead in the libevent driver for entities that are single-threaded
- The REST interface server now responds with prettified JSON if built in debug mode
- Stack traces are only written in REST server responses in debug mode - [issue #1623][issue1623]
- The trigger mode for `FileDescriptorEvent` can now be configured (by Jack Applegame) - [pull #1596][issue1596]
- Added `.byValue`/`.byKeyValue`/`.byIndexValue` properties to `Bson` and `Json` as a replacement for `opApply` based iteration (see [issue #1688][issue1688])
### Bug fixes ###
- Fixed compile error for deserializing optional `class`/ struct` fields
- Fixed GET requests in the REST client to not send a body
- Fixed REST request responses that return void to not send a body
- Fixed a possible idle loop in `Task.join()` if called from outside of an event loop
- Fixed `TaskPipe.waitForData` to actually time out if a timeout value was passed - [issue #1605][issue1605]
- Fixed a compilation error for GDC master - [issue #1602][issue1602]
- Fixed a linker issue for LDC on Windows - [issue #1629][issue1629]
- Fixed a (single-threaded) concurrent AA iteration/write issue that could result in an access violation in the Win32 driver - [issue #1608][issue1608]
- Fixed the JavaScript REST client generator to handle XHR errors (by Timoses) - [pull #1645][issue1645], [pull #1646][issue1646]
- Fixed a possible `InvalidMemoryOperationError` in `SystemRNG`
- Fixed `runApplication` to be able to handle extraneous command line arguments
- Fixed a possible crash in `RedisSubscriber.blisten` due to a faulty shutdown procedure
- Fixed detection of non-keep-alive connections in the HTTP server (upgraded connections were treated as keep-alive)
- Fixed bogus static assertion failure in `RestInterfaceClient!I` when `I` is annotated with `@requiresAuth` - [issue #1648][issue1648]
- Fixed a missing `toRedis` conversion in `RedisHash.setIfNotExist` (by Tuukka Kurtti aka Soletek) - [pull #1659][issue1659]
- Fixed an assertion failure for malformed HTML form upload filenames - [issue #1630][issue1630]
- Fixed the HTTP server to not use chunked encoding for HTTP/1.0 requests - [issue #1721][issue1721], [pull #1722][issue1722]
[issue716]: https://github.com/vibe-d/vibe.d/issues/716
[issue1596]: https://github.com/vibe-d/vibe.d/issues/1596
[issue1602]: https://github.com/vibe-d/vibe.d/issues/1602
[issue1605]: https://github.com/vibe-d/vibe.d/issues/1605
[issue1608]: https://github.com/vibe-d/vibe.d/issues/1608
[issue1623]: https://github.com/vibe-d/vibe.d/issues/1623
[issue1629]: https://github.com/vibe-d/vibe.d/issues/1629
[issue1630]: https://github.com/vibe-d/vibe.d/issues/1630
[issue1634]: https://github.com/vibe-d/vibe.d/issues/1634
[issue1636]: https://github.com/vibe-d/vibe.d/issues/1636
[issue1642]: https://github.com/vibe-d/vibe.d/issues/1642
[issue1645]: https://github.com/vibe-d/vibe.d/issues/1645
[issue1646]: https://github.com/vibe-d/vibe.d/issues/1646
[issue1648]: https://github.com/vibe-d/vibe.d/issues/1648
[issue1655]: https://github.com/vibe-d/vibe.d/issues/1655
[issue1659]: https://github.com/vibe-d/vibe.d/issues/1659
[issue1688]: https://github.com/vibe-d/vibe.d/issues/1688
[issue1721]: https://github.com/vibe-d/vibe.d/issues/1721
[issue1722]: https://github.com/vibe-d/vibe.d/issues/1722
v0.7.30 - 2016-10-31
--------------------
### Features and improvements ###
- General changes
- Compiles on DMD 2.068.2 up to 2.072.0
- Added `runApplication` as a single API entry point to properly initialize and run a vibe.d application (this will serve as the basis for slowly phasing out the `VibeDefaultMain` convenience mechanism)
- Started using an SDLang based DUB package recipe (upgrade to DUB 1.0.0 if you haven't already)
- Defining both, `VibeDefaultMain` and `VibeCustomMain`, results in a compile-time error to help uncover hidden build issues (by John Colvin) - [pull #1551][issue1551]
- Web/REST interface generator
- Added `vibe.web.auth` as a generic way to express authorization rules and to provide a common hook for authentication
- Added `@noRoute` attribute for `registerWebInterface` to keep methods from generating a HTTP endpoint
- Added `@nestedNameStyle` to choose between the classical underscore mapping and D style mapping for form parameter names in `registerWebInterface`
- Serialization framework
- All hooks now get a traits struct that carries additional information, such as user defined attributes - note that this is a breaking change for any serializer implementation! - [pull #1542][issue1542]
- Added `beginWriteDocument` and `endWriteDocument` hooks - [pull #1542][issue1542]
- Added `(begin/end)WriteDictionaryEntry` and `(begin/end)WriteArrayEntry` hooks - [pull #1542][issue1542]
- Exposed `vibe.data.serialization.DefaultPolicy` publicly
- HTTP server
- Added `HTTPServerSettings.accessLogger` to enable using custom logger implementations
- Added support for the "X-Forwarded-Port" header used by reverse proxies (by Mihail-K) - [issue #1409][issue1490], [pull #1491][issue1491]
- Added an overload of `HTTPServerResponse.writeJsonBody` that doesn't set the response status (by Irenej Marc) - [pull #1488][issue1488]
- Can now use the new [diet-ng][diet-ng] package in `render()`
- To force using it on existing projects, simply add "diet-ng" as a dependency
- "diet-ng" is an optional dependency of vibe.d that is chosen by default - to avoid that, remove the "diet-ng" entry from dub.selections.json.
- Related issues [issue #1554][issue1554], [issue #1555][issue1555]
- Added partial Unix client socket support, HTTP client support in particular (use `http+unix://...`) (by Sebastian Koppe) - [pull #1547][issue1547]
- Removed `Json.opDispatch` and `Bson.opDispatch`
- Added `Bson.remove` to remove elements from a BSON object - [issue #345][issue345]
the use of `VibeDefaultMain`)
- Added support for tables in the Markdown compiler - [issue #1493][issue1493]
- Added `MongoCollection.distinct()`
- The `std.concurrency` integration code now let's the behavior of `spawn()` be configurable, defaulting now to `runWorkerTask` instead of the previous `runTask`
- Using `VibeNoSSL` now also disables Botan support in addition to OpenSSL (by Martin Nowak) - [pull #1444][issue1444]
- Use a minimum protocol version of TLS 1.0 for Botan, fixes compilation on Botan 1.12.6 (by Tomáš Chaloupka) - [pull #1553][issue1553]
- Some more `URLRouter` memory/performance optimization
- Corrected the naming convention of `vibe.db.mongo.flags.IndexFlags` - [issue #1571][issue1571]
- Added `connectRedisDB`, taking a Redis database URL
- `FileDescriptorEvent.wait()` now returns which triggers have fired (by Jack Applegame) - [pull #1586][issue1586]
### Bug fixes ###
- Fixed a compile error that happened when using the JavaScript REST interface generator for sub interfaces - [issue #1506][issue1506]
- Fixed protocol violations in the WebSocket module (by Mathias Lang) - [pull #1508][issue1508], [pull #1511][issue1511]
- The HTTP client now correctly appends the port in the "Host" header - [issue #1507][issue1507], [pull #1510][issue1510]
- Fixed a possible null pointer error in `HTTPServerResponse.switchProtocol` - [issue #1502][issue1502]
- Fixed parsing of indented Markdown code blocks (empty lines don't interrupt the block anymore) - [issue #1527][issue1527]
- Fixed open TCP connections being left alive by `download()` (by Steven Dwy) - [pull #1532][issue1532]
- Fixed the error message for invalid types in `Json.get` (by Charles Thibaut) - [pull #1537][issue1537]
- Fixed the HTTP status code for invalid JSON in the REST interface generator (bad request instead of internal server error) (by Jacob Carlborg) - [pull #1538][issue1538]
- Fixed yielded task execution in case no explicit event loop is used
- Fixed a memory hog/leak in the libasync driver (by Martin Nowak) - [pull #1543][issue1543]
- Fixed the JSON module to output NaN as `null` instead of `undefined` (by John Colvin) - [pull #1548][issue1548], [issue #1442][issue1442], [issue #958][issue958]
- Fixed a possible deadlock in `LocalTaskSemaphore` (by Etienne Cimon) - [pull #1563][issue1563]
- Fixed URL generation for paths with placeholders in the JavaScript REST client generator - [issue #1564][issue1564]
- Fixed code generation errors in the JavaScript REST client generator and added `JSRestClientSettings` (by Oleg B. aka deviator) - [pull #1566][issue1566]
- Fixed a bug in `FixedRingBuffer.removeAt` which potentially affected the task scheduler (by Tomáš Chaloupka) - [pull #1572][issue1572]
- Fixed `validateEmail` to properly use `isEmail` (which used to be broken) (by Stanislav Blinov aka radcapricorn) - [issue #1580][issue1580], [pull #1582][issue1582]
- Fixed `yield()` to always return after a single event loop iteration - [issue #1583][issue1583]
- Fixed parsing of Markdown text nested in blockquotes, code in particular
- Fixed a buffer read overflow in `OpenSSLContext` - [issue #1577][issue1577]
[issue345]: https://github.com/vibe-d/vibe.d/issues/345
[issue958]: https://github.com/vibe-d/vibe.d/issues/958
[issue1442]: https://github.com/vibe-d/vibe.d/issues/1442
[issue1444]: https://github.com/vibe-d/vibe.d/issues/1444
[issue1488]: https://github.com/vibe-d/vibe.d/issues/1488
[issue1490]: https://github.com/vibe-d/vibe.d/issues/1490
[issue1491]: https://github.com/vibe-d/vibe.d/issues/1491
[issue1493]: https://github.com/vibe-d/vibe.d/issues/1493
[issue1502]: https://github.com/vibe-d/vibe.d/issues/1502
[issue1506]: https://github.com/vibe-d/vibe.d/issues/1506
[issue1507]: https://github.com/vibe-d/vibe.d/issues/1507
[issue1508]: https://github.com/vibe-d/vibe.d/issues/1508
[issue1510]: https://github.com/vibe-d/vibe.d/issues/1510
[issue1511]: https://github.com/vibe-d/vibe.d/issues/1511
[issue1527]: https://github.com/vibe-d/vibe.d/issues/1527
[issue1532]: https://github.com/vibe-d/vibe.d/issues/1532
[issue1537]: https://github.com/vibe-d/vibe.d/issues/1537
[issue1538]: https://github.com/vibe-d/vibe.d/issues/1538
[issue1542]: https://github.com/vibe-d/vibe.d/issues/1542
[issue1543]: https://github.com/vibe-d/vibe.d/issues/1543
[issue1547]: https://github.com/vibe-d/vibe.d/issues/1547
[issue1548]: https://github.com/vibe-d/vibe.d/issues/1548
[issue1551]: https://github.com/vibe-d/vibe.d/issues/1551
[issue1553]: https://github.com/vibe-d/vibe.d/issues/1553
[issue1554]: https://github.com/vibe-d/vibe.d/issues/1554
[issue1555]: https://github.com/vibe-d/vibe.d/issues/1555
[issue1563]: https://github.com/vibe-d/vibe.d/issues/1563
[issue1564]: https://github.com/vibe-d/vibe.d/issues/1564
[issue1566]: https://github.com/vibe-d/vibe.d/issues/1566
[issue1571]: https://github.com/vibe-d/vibe.d/issues/1571
[issue1572]: https://github.com/vibe-d/vibe.d/issues/1572
[issue1577]: https://github.com/vibe-d/vibe.d/issues/1577
[issue1580]: https://github.com/vibe-d/vibe.d/issues/1580
[issue1582]: https://github.com/vibe-d/vibe.d/issues/1582
[issue1583]: https://github.com/vibe-d/vibe.d/issues/1583
[diet-ng]: https://github.com/rejectedsoftware/diet-ng
v0.7.29 - 2016-07-04
--------------------
### Features and improvements ###
- Dropped support for DMD frontend versions below 2.067.x - supports 2.067.1 up to 2.071.0 now
- Removed the libev driver
- Removed all deprecated symbols
- Heavily optimized the `URLRouter` (>5x faster initial match graph building and around 60% faster route match performance)
- Added CONNECT and `Connection: Upgrade` support to the reverse proxy module (by Georgi Dimitrov) - [pull #1392][issue1392]
- Added support for using an explicit network interface for outgoing TCP and HTTP connections - [pull #1407][issue1407]
- Cookies are now stored with their raw value, enabling handling of non-base64 encoded values (by Yannick Koechlin) - [pull #1401][issue1401]
- Added HyperLogLog functions to the Redis client (by Yannick Koechlin) - [pull #1435][issue1435]
- Added `RestInterfaceSettings.httpClientSettings`
- Added `HTTPClientSettings.dnsAddressFamily`
- Added `TCPListener.bindAddress`
- Made `@ignore`, `@name`, `@optional`, `@byName` and `@asArray` serialization attributes customizable per serialization policy - [pull #1438][issue1438], [issue #1352][issue1352]
- Added `HTTPStatus.unavailableForLegalReasons` (by Andrew Benton) - [pull #1358][issue1358]
- Added support or logger implementations that can log multiple lines per log call (by Martin Nowak) - [pull #1428][issue1428]
- Added `HTTPServerResponse.connected` (by Alexander Tumin) - [pull #1474][issue1474]
- Added allocation free string conversion methods to `NetworkAddress`
- Added diagnostics in case of connections getting closed during process shutdown (after the driver is already shut down) - [issue #1452][issue1452]
- Added `disableDefaultSignalHandlers` that can be used to avoid vibe.d registering its default signal handlers - [pull #1454][issue1454], [issue #1333][issue1333]
- Added detection of SQLite data base extensions for `getMimeTypeForFile` (by Stefan Koch) - [pull #1456][issue1456]
- The markdown module now emits XHTML compatible `
` tags (by Stefan Schmidt) - [pull #1461][issue1461]
- Added `RedisDatabase.srandMember` overload taking a count (by Yannick Koechlin) - [pull #1447][issue1447]
- The HTTP client now accepts `const` settings
- Removed the libevent/Win64 configuration as the libevent binaries for that platform never existed - [issue #832][issue832]
- Improvements to the WebSockets module, most notably reduction of memory allocations (by Mathias Lang) - [pull #1497][issue1497]
- Added version `VibeNoOpDispatch` to force removal of `opDispatch` for `Json` and `Bson` (by David Monagle) - [pull #1526][issue1526]
- Added a manual deprecation message for `Json.opDispatch`/`Bson.opDispatch` because `deprecated` did not have an effect
### Bug fixes ###
- Fixed the internal `BsonObjectID` counter to be initialized with a random value (by machindertech) - [pull #1128][issue1128]
- Fixed a possible race condition for ID assignment in the libasync driver (by Etienne Cimon) - [pull #1399][issue1399]
- Fixed compilation of `Bson.opt` for both const and non-const AAs/arrays - [issue #1394][issue1394]
- Fixed handling of POST methods in the REST JavaScript client for methods with no parameters - [issue #1434][issue1434]
- Fixed `RedisDatabase.blpop` and `RedisList.removeFrontBlock`
- Fixed a protocol error/assertion failure when a Redis reply threw an exception - [pull #1416][issue1416], [issue #1412][issue1412]
- Fixed possible assertion failures "Manually resuming taks that is already scheduled"
- Fixed FreeBSD and NetBSD support (by Nikolay Tolstokulakov) - [pull #1448][issue1448]
- Fixed handling of multiple methods with `@headerParam` parameters with the same name (by Irenej Marc) - [pull #1453][issue1453]
- Fixed calling `async()` with an unshared delegate or with a callback that returns a `const`/`immutable` result
- Fixed `Tid` to be considered safe to pass between threads (for worker tasks or `vibe.core.concurrency`)
- Fixed the `HTTPClient`/`download()` to properly use TLS when redirects happen between HTTP and HTTPS (by Martin Nowak) - [pull #1265][issue1265]
- Fixed recognizing certain HTTP content encoding strings ("x-gzip" and "") (by Ilya Yaroshenko) - [pull #1477][issue1477]
- Fixed parsing IPv6 "Host" headers in the HTTP server - [issue #1388][issue1388], [issue #1402][issue1402]
- Fixed an assertion failure when using threads together with `VibeIdleCollect` - [issue #1476][issue1476]
- Fixed parsing of `vibe.conf` files that contain a UTF BOM - [issue #1470][issue1470]
- Fixed `@before`/`@after` annotations to work for template member functions
- Fixed "Host" header handling in the HTTP server (now optional for HTTP/1.0 and responds with "bad request" if missing)
- Fixed `Json` to work at CTFE (by Mihail-K) - [pull #1489][issue1489]
- Fixed `adjustMethodStyle` (used throughout `vibe.web`) for method names with trailing upper case characters
- Fixed alignment of the `Json` type on x64, fixes possible dangling pointers due to the GC not recognizing unaligned pointers - [issue #1504][issue1504]
- Fixed serialization policies to work for enums and other built-in types (by Tomáš Chaloupka) - [pull #1500][issue1500]
- Fixed a bogus assertion error in `Win32TCPConnection.tcpNoDelay` and `.keepAlive` (by Денис Хлякин aka aka-demik) - [pull #1514][issue1514]
- Fixed a deadlock in `TaskPipe` - [issue #1501][issue1501]
[issue832]: https://github.com/vibe-d/vibe.d/issues/832
[issue1128]: https://github.com/vibe-d/vibe.d/issues/1128
[issue1265]: https://github.com/vibe-d/vibe.d/issues/1265
[issue1333]: https://github.com/vibe-d/vibe.d/issues/1333
[issue1352]: https://github.com/vibe-d/vibe.d/issues/1352
[issue1358]: https://github.com/vibe-d/vibe.d/issues/1358
[issue1388]: https://github.com/vibe-d/vibe.d/issues/1388
[issue1392]: https://github.com/vibe-d/vibe.d/issues/1392
[issue1394]: https://github.com/vibe-d/vibe.d/issues/1394
[issue1399]: https://github.com/vibe-d/vibe.d/issues/1399
[issue1401]: https://github.com/vibe-d/vibe.d/issues/1401
[issue1402]: https://github.com/vibe-d/vibe.d/issues/1402
[issue1407]: https://github.com/vibe-d/vibe.d/issues/1407
[issue1412]: https://github.com/vibe-d/vibe.d/issues/1412
[issue1416]: https://github.com/vibe-d/vibe.d/issues/1416
[issue1428]: https://github.com/vibe-d/vibe.d/issues/1428
[issue1434]: https://github.com/vibe-d/vibe.d/issues/1434
[issue1435]: https://github.com/vibe-d/vibe.d/issues/1435
[issue1438]: https://github.com/vibe-d/vibe.d/issues/1438
[issue1447]: https://github.com/vibe-d/vibe.d/issues/1447
[issue1448]: https://github.com/vibe-d/vibe.d/issues/1448
[issue1452]: https://github.com/vibe-d/vibe.d/issues/1452
[issue1453]: https://github.com/vibe-d/vibe.d/issues/1453
[issue1454]: https://github.com/vibe-d/vibe.d/issues/1454
[issue1456]: https://github.com/vibe-d/vibe.d/issues/1456
[issue1461]: https://github.com/vibe-d/vibe.d/issues/1461
[issue1470]: https://github.com/vibe-d/vibe.d/issues/1470
[issue1474]: https://github.com/vibe-d/vibe.d/issues/1474
[issue1476]: https://github.com/vibe-d/vibe.d/issues/1476
[issue1477]: https://github.com/vibe-d/vibe.d/issues/1477
[issue1489]: https://github.com/vibe-d/vibe.d/issues/1489
[issue1500]: https://github.com/vibe-d/vibe.d/issues/1500
[issue1504]: https://github.com/vibe-d/vibe.d/issues/1504
[issue1514]: https://github.com/vibe-d/vibe.d/issues/1514
[issue1526]: https://github.com/vibe-d/vibe.d/issues/1526
v0.7.28 - 2016-02-27
--------------------
This is a hotfix release, which fixes two critical regressions. The first one resulted in memory leaks or memory corruption, while the second one could cause TCP connections to hang indefinitely in the `close` method for the libevent driver.
### Bug fixes ###
- Fixed a regression in `FreeListRef` which caused the reference count to live outside of the allocated memory bounds - [issue #1432][issue1432]
- Fixed a task starvation regression in the libevent driver that happened when a connection got closed by the TCP remote peer while there was still data in the write buffer - [pull #1443][issue1443], [issue #1441][issue1441]
- Fixed recognizing "Connection: close" headers for non-lowercase spelling of "close" - [issue #1426][issue1426]
- Fixed the UDP receive timeout to actually work in the libevent driver - [issue #1429][issue1429]
- Fixed handling of the "Connection" header in the HTTP server to be case insensitive - [issue #1426][issue1426]
[issue1426]: https://github.com/vibe-d/vibe.d/issues/1426
[issue1429]: https://github.com/vibe-d/vibe.d/issues/1429
[issue1432]: https://github.com/vibe-d/vibe.d/issues/1432
[issue1441]: https://github.com/vibe-d/vibe.d/issues/1441
[issue1443]: https://github.com/vibe-d/vibe.d/issues/1443
v0.7.27 - 2016-02-09
--------------------
In preparation for a full separation of the individual library components, this release splits up the code logically into multiple DUB sub packages. This enables dependent code to reduce the dependency footprint and compile times. In addition to this and a bunch of further improvements, a lot of performance tuning and some important REST interface additions went into this release.
Note that the integration code for `std.concurrency` has been re-enabled with this release. This means that you can use `std.concurrency` without worrying about blocking the event loop now. However, there are a few incompatibilities between `std.concurrency` and vibe.d's own version in `vibe.core.concurrency`, such as `std.concurrency` not supporting certain `shared(T)` or `Isolated!T` to be passed to spawned tasks. If you hit any issues that cannot be easily resolved, the usual vibe.d behavior is available in the form of "Compat" suffixed functions (i.e. `sendCompat`, `receiveCompat` etc.). But note that these functions operate on separate message queue structures, so mixing the "Compat" functions with non-"Compat" versions will not work.
### Features and improvements ###
- Compiles on DMD frontend versions 2.066.0 up to 2.070.0
- Split up the library into sub packages - this prepares for a deeper split that is going to happen in the next release
- A lot of performance tuning went into the network and HTTP code, leading to a 50% increase in single-core HTTP performance and a lot more in the multi-threaded case over 0.7.26
- Marked more of the API `@safe` and `nothrow`
- Re-enabled the `std.concurrency` integration that went MIA a while ago - `std.concurrency` can now be used transparently in vibe.d applications - [issue #1343][issue1343], [pull #1345][issue1345]
- REST interface generator changes
- Added support for REST collections with natural D syntax using the new `Collection!I` type - [pull #1268][issue1268]
- Implemented CORS support for the REST interface server (by Sebastian Koppe) - [pull #1299][issue1299]
- Conversion errors for path parameters (e.g. `@path("/foo/:someparam")`) in REST interfaces now result in a 404 error instead of 500
- HTTP server/client changes
- The `URLRouter` now adds a `"routerRootDir"` entry with the relative path to the router base directory to `HTTPServerRequest.params` (by Steven Dwy) - [pull #1301][issue1301]
- Added a WebSocket client implementation (by Kemonozume) - [pull #1332][issue1332]
- Added the possibility to access cookie contents as a raw string
- The HTTP client now retries a request if a keep-alive connection gets closed before the response gets read
- Added `HTTPServerResponse.finalize` to manually force sending and finalization of the response - [issue #1347][issue1347]
- Added `scope` callback based overloads of `switchProtocol` in `HTTPServerResponse` and `HTTPClientResponse`
- Added `ChunkedOutputStream.chunkExtensionCallback` to control HTTP chunk-extensions (by Manuel Frischknecht and Yannick Koechlin) - [pull #1340][issue1340]
- Passing an empty string to `HTTPClientResponse.switchProtocol` now skips the "Upgrade" header validation
- Enabled TCP no-delay in the HTTP server
- Redundant calls to `HTTPServerResponse.terminateSession` are now ignored instead of triggering an assertion - [issue #472][issue472]
- Added log output for newly registered HTTP virtual hosts - [issue #1271][issue1271]
- The Markdown compiler now adds "id" attributes to headers to enable cross-referencing
- Added `getMarkdownOutline`, which returns a tree of sections in a Markdown document
- Added `Path.relativeToWeb`, a version of `relativeTo` with web semantics
- Added `vibe.core.core.setupWorkerThreads` to customize the number of worker threads on startup (by Jens K. Mueller) - [pull #1350][issue1350]
- Added support for parsing IPv6 URLs (by Mathias L. Baumann aka Marenz) - [pull #1341][issue1341]
- Enabled TCP no-delay in the Redis client (by Etienne Cimon) - [pull #1361][issue1361]
- Switch the `:javascript` Diet filter to use "application/json" as the content type - [issue #717][issue717]
- `NetworkAddress` now accepts `std.socket.AddressFamily` constants in addition to the `AF_` ones - [issue #925][issue925]
- Added support for X509 authentication in the MongoDB client (by machindertech) - [pull #1235][issue1235]
- Added `TCPListenOptions.reusePort` to enable port reuse as an OS supported means for load-balancing (by Soar Qin) - [pull #1379][issue1379]
- Added a `port` parameter to `RedisSessionStore.this()`
- Added code to avoid writing to `HTTPServerResponse.bodyWriter` after a fixed-length response has been fully written
### Bug fixes ###
- Fixed behavior of `ZlibInputStream` in case of premature end of input - [issue #1116][issue1116]
- Fixed a memory leak in `ZlibInputStream` (by Etienne Cimon) - [pull #1116][issue1116]
- Fixed a regression in the OpenSSL certificate validation code - [issue #1325][issue1325]
- Fixed the behavior of `TCPConnection.waitForData` in all drivers - [issue #1326][issue1326]
- Fixed a memory leak in `Libevent2Driver.connectTCP` on connection failure (by Etienne Cimon) - [pull #1322][issue1322], [issue #1321][issue1321]
- Fixed concatenation of static and dynamic class attributes in Diet templates - [issue #1312][issue1312]
- Fixed resource leaks in `connectTCP` for libevent when the task gets interrupted - [issue #1331][issue1331]
- Fixed `ZlibInputStream` in case of the target buffer matching up exactly with the uncompressed data (by Ilya Lyubimov aka villytiger) - [pull #1339][issue1339]
- Fixed some issues with triggering assertions on yielded tasks
- Fixed TLS SNI functionality in the HTTP server
- Fixed excessive CPU usage in the libasync driver (by Etienne Cimon) - [pull #1348][issue1348]
- Fixed exiting multi-thread event loops for the libasync driver (by Etienne Cimon) - [pull #1349][issue1349]
- Fixed the default number of worker threads to equal all logical cores in the system
- Fixed an assertion failure in the WebSocket server (by Ilya Yaroshenko aka 9il) - [pull #1356][issue1356], [issue #1354][issue1354]
- Fixed a range violation error in `InotifyDirectoryWatcher` - [issue #1364][issue1364]
- Fixed `readUntil` to not use the buffer returned by `InputStream.peek()` after a call to `InputStream.read()` - [issue #960][issue960]
- Disabled the case randomization feature of libevent's DNS resolver to work around issues with certain servers - [pull #1366][issue1366]
- Fixed the behavior of multiple `runEventLoop`/`exitEventLoop` calls in sequence for the win32 driver
- Fixed reading response bodies for "Connection: close" connections without a "Content-Length" in the HTTP client - [issue #604][issue604]
- Fixed indentation of `:javascript` blocks in Diet templates - [issue #837][issue837]
- Fixed assertion failure in the win32 driver when sending files over TCP - [issue #932][issue932]
- Fixed `exitEventLoop` having no effect if called while the event loop is in the idle handler
- Fixed an assertion failure in the libevent driver when actively closing a connection that is currently being read from - [issue #1376][issue1376]
- Fixed a null-pointer dereference when `waitForData` gets called on a fully closed TCP connection - [issue #1384][issue1384]
- Fixed a crash at exit caused by a bad module destructor call sequence when `std.parallelism.TaskPool` is used - [issue #1374][issue1374]
[issue472]: https://github.com/vibe-d/vibe.d/issues/472
[issue604]: https://github.com/vibe-d/vibe.d/issues/604
[issue717]: https://github.com/vibe-d/vibe.d/issues/717
[issue837]: https://github.com/vibe-d/vibe.d/issues/837
[issue925]: https://github.com/vibe-d/vibe.d/issues/925
[issue932]: https://github.com/vibe-d/vibe.d/issues/932
[issue960]: https://github.com/vibe-d/vibe.d/issues/960
[issue1116]: https://github.com/vibe-d/vibe.d/issues/1116
[issue1235]: https://github.com/vibe-d/vibe.d/issues/1235
[issue1268]: https://github.com/vibe-d/vibe.d/issues/1268
[issue1271]: https://github.com/vibe-d/vibe.d/issues/1271
[issue1299]: https://github.com/vibe-d/vibe.d/issues/1299
[issue1301]: https://github.com/vibe-d/vibe.d/issues/1301
[issue1312]: https://github.com/vibe-d/vibe.d/issues/1312
[issue1321]: https://github.com/vibe-d/vibe.d/issues/1321
[issue1322]: https://github.com/vibe-d/vibe.d/issues/1322
[issue1325]: https://github.com/vibe-d/vibe.d/issues/1325
[issue1326]: https://github.com/vibe-d/vibe.d/issues/1326
[issue1331]: https://github.com/vibe-d/vibe.d/issues/1331
[issue1332]: https://github.com/vibe-d/vibe.d/issues/1332
[issue1339]: https://github.com/vibe-d/vibe.d/issues/1339
[issue1340]: https://github.com/vibe-d/vibe.d/issues/1340
[issue1341]: https://github.com/vibe-d/vibe.d/issues/1341
[issue1343]: https://github.com/vibe-d/vibe.d/issues/1343
[issue1345]: https://github.com/vibe-d/vibe.d/issues/1345
[issue1347]: https://github.com/vibe-d/vibe.d/issues/1347
[issue1348]: https://github.com/vibe-d/vibe.d/issues/1348
[issue1349]: https://github.com/vibe-d/vibe.d/issues/1349
[issue1350]: https://github.com/vibe-d/vibe.d/issues/1350
[issue1354]: https://github.com/vibe-d/vibe.d/issues/1354
[issue1356]: https://github.com/vibe-d/vibe.d/issues/1356
[issue1361]: https://github.com/vibe-d/vibe.d/issues/1361
[issue1364]: https://github.com/vibe-d/vibe.d/issues/1364
[issue1366]: https://github.com/vibe-d/vibe.d/issues/1366
[issue1374]: https://github.com/vibe-d/vibe.d/issues/1374
[issue1376]: https://github.com/vibe-d/vibe.d/issues/1376
[issue1379]: https://github.com/vibe-d/vibe.d/issues/1379
[issue1384]: https://github.com/vibe-d/vibe.d/issues/1384
v0.7.26 - 2015-11-04
--------------------
A large revamp of the REST interface generator was done in this release, which will enable faster future developments. The new JavaScript client generator is the first feature made possible by this. Apart from a good chunk of functional improvements in various areas, a notable change on the build level is that the `VibeCustomMain` version is no longer required for projects that implement their own `main` function.
### Features and improvements ###
- Compiles on 2.066.x up to 2.069.0
- Removed deprecated symbols and deprecated those that were scheduled for deprecation
- The `VibeCustomMain` version identifier is now a no-op and the new default behavior
- Added a JavaScript REST client generator to `vibe.web.rest` - [pull #1209][issue1209]
- Added translation support for plural forms in `vibe.web.i18n` (by Nathan Coe) - [pull #1290][issue1290]
- Added a fiber compatible read-write mutex implementation (`TaskReadWriteMutex`) (by Manuel Frischknecht) - [pull #1287][issue1287]
- Added `vibe.http.fileserver.sendFile`
- Added ALPN support to the TLS module (by Etienne Cimon)
- Added an optional [Botan](https://github.com/etcimon/botan) based TLS implementation (by Etienne Cimon)
- Switched the `vibe.core.log` module to support allocation-less logging (range like interface)
- Removed all intrinsic dynamic allocations in all built-in logger implementations - this makes it possible to log from within class finalizers
- Added `Cookie.toString()` (by Etienne Cimon)
- Added `MarkdownSettings.urlFilter` in order to be able to customize contained links
- Made `Json.toString` `@safe` so that `Json` values can be logged using `std.experimental.logger`
- Added `HTTPServerRequest.noLog`, usable to disable access logging for particular requests (by Márcio Martins) - [pull #1281][issue1281]
- Added support for static array parameters in `vibe.web.web`
- Added `LocalTaskSemaphore`, a single-threaded task-compatible semaphore implementation (by Etienne Cimon)
- Added `ConnectionPool.maxConcurrency` (by Etienne Cimon)
- Added `MongoCollection.findAndModifyExt`, which takes a parameter with custom options - [issue #911][issue911]
- `TLSVersion.any` now only matches TLS 1.0 and up; SSL 3 is explicitly excluded (by Márcio Martins) - [pull #1280][issue1280]
- Removed some bad dependencies to prepare for splitting up the library (dependency cycles between low-level and high-level packages)
- Implemented timer support for the libev driver - [pull #1206][issue1206]
- Improved the method prefix semantics in the web/REST interface generators, so that only whole words are recognized
- Mime type `"application/vnd.api+json"` is now recognized to have a JSON body in the HTTP server (by Szabo Bogdan) - [pull #1296][issue1296]
### Bug fixes ###
- Fixes in the libasync driver (by Etienne Cimon)
- Various correctness and crash fixes
- Fixed handling files with non-ASCII characters on Windows - [pull #1273][issue1273]
- Fixed timers with a zero timeout - [pull #1204][issue1204]
- Fixed a possible TCP connection stall for blocking writes - [pull #1247][issue1247]
- Fixed partially dropped data for TCP connections - [issue #1297][issue1297], [pull #1298][issue1298]
- Fixed properly waiting for blocking operations - [issue #1227][issue1227]
- Missing HTML form parameters are now properly handled by `@errorDisplay` in the web interface generator
- Fixed bogus Diet template dependencies caused by interpreting *all* lines that started with "extends ..." as extension directives
- Fixed `runWorkerTaskH` to be callable outside of a task context - [pull #1206][issue1206]
- Fixed `LibevManualEvent` to actually work across threads - [pull #1206][issue1206]
- Fixed a bug in the shutdown sequence that could cause the application to hang if worker threads had been started - [pull #1206][issue1206]
- Fixed multiple loggers not working - [issue #1294][issue1294]
- Fixed `workerThreadCount` to always return a non-zero number by letting it start up the workers if necessary
- Fixed `Path.toString()` to output trailing slashes if required for empty paths
- Fixed an TLS connection failure in the OpenSSL based implementation when no `peer_name` was set
- Fixed linking on Debian, which has removed certain public OpenSSL functions (by Luca Niccoli) - [issue #1315][issue1315], [pull #1316][issue1316]
- Fixed an assertion happening when parsing malformed URLs - [issue #1318][issue1318]
[issue911]: https://github.com/vibe-d/vibe.d/issues/911
[issue1204]: https://github.com/vibe-d/vibe.d/issues/1204
[issue1206]: https://github.com/vibe-d/vibe.d/issues/1206
[issue1209]: https://github.com/vibe-d/vibe.d/issues/1209
[issue1273]: https://github.com/vibe-d/vibe.d/issues/1273
[issue1280]: https://github.com/vibe-d/vibe.d/issues/1280
[issue1281]: https://github.com/vibe-d/vibe.d/issues/1281
[issue1287]: https://github.com/vibe-d/vibe.d/issues/1287
[issue1290]: https://github.com/vibe-d/vibe.d/issues/1290
[issue1294]: https://github.com/vibe-d/vibe.d/issues/1294
[issue1227]: https://github.com/vibe-d/vibe.d/issues/1227
[issue1247]: https://github.com/vibe-d/vibe.d/issues/1247
[issue1296]: https://github.com/vibe-d/vibe.d/issues/1296
[issue1297]: https://github.com/vibe-d/vibe.d/issues/1297
[issue1298]: https://github.com/vibe-d/vibe.d/issues/1298
[issue1315]: https://github.com/vibe-d/vibe.d/issues/1315
[issue1316]: https://github.com/vibe-d/vibe.d/issues/1316
[issue1318]: https://github.com/vibe-d/vibe.d/issues/1318
v0.7.25 - 2015-09-20
--------------------
Mostly a bugfix release, including a regression fix in the web form parser, this release also drops official support for the DMD 2.065.0 front end (released February 2014). Most functionality will probably still stay functional on 2.065.0 for a while.
### Features and improvements ###
- Contains some compile fixes for the upcoming 2.069 version of DMD
- The REST interface generator adds support for `out`/`ref` `@headerParam` parameters
- Stripping `id`/`_id` fields for `RedisStripped!T` is now optional
- `registerWebInterface` and `registerRestInterface` now return the `URLRouter` instance to enable method chaining (by Martin Nowak) - [pull #1208][issue1208]
### Bug fixes ###
- Fixed parsing of multi-part forms when a `Content-Length` part header is present (by sigod) - [issue #1220][issue1220], [pull #1221][issue1221]
- Fixed parsing of multi-part forms that don't end in `"--\r\n"` (by Etienne Cimon) - [pull #1232][issue1232]
- Fixed an exception occurring in `waitForData()` when calling `Libevent2TCPConnection.close()` concurrently (by machindertech) - [pull #1205][issue1205]
- Fixed handling of `WebInterfaceSettings.ignoreTrailingSlash` for sub interfaces (by Marc Schütz) - [pull #1237][issue1237]
- Fixed an alignment issue in conjunction with atomic operations on the upcoming LDC 0.16.0 (by Kai Nacke aka redstar) - [pull #1255][issue1255]
- Fixed parsing of empty HTTP request headers - [issue #1254][issue1254]
- Fixed using the MongoDB client on a mongos instance - [pull #1246][issue1246]
- Fixed using `LibasyncUDPConnection.recv` without a timeout (by Daniel Kozak) - [pull #1242][issue1242]
- Fixed a regression in `RestInterfaceClient`, where a `get(T id)` method would result in a URL with two consecutive underscores
[issue1205]: https://github.com/vibe-d/vibe.d/issues/1205
[issue1220]: https://github.com/vibe-d/vibe.d/issues/1220
[issue1221]: https://github.com/vibe-d/vibe.d/issues/1221
[issue1232]: https://github.com/vibe-d/vibe.d/issues/1232
[issue1237]: https://github.com/vibe-d/vibe.d/issues/1237
[issue1242]: https://github.com/vibe-d/vibe.d/issues/1242
[issue1246]: https://github.com/vibe-d/vibe.d/issues/1246
[issue1254]: https://github.com/vibe-d/vibe.d/issues/1254
[issue1255]: https://github.com/vibe-d/vibe.d/issues/1255
v0.7.24 - 2015-08-10
--------------------
Adds DMD 2.068.0 compatibility and contains a number of additions and fixes in all parts of the library. Some notable changes are the addition of WebSocket support in the `vibe.web.web` module and the planned deprecation of `opDispatch` for `Json` and `Bson`, as well as the rename of all "SSL" symbols to "TLS". HTTP request handlers can, and should, now take the request/response parameters as `scope`, which will later allow to improve performance without compromising safety.
### Features and improvements ###
- Fixed compilation on DMD 2.068 (most fixes by Mathias Lang)
- Web interface generator (`vibe.web.web`)
- Added support for `WebSocket` routes - [issue #952][issue952]
- Doesn't intercept `HTTPStatusException`s thrown during parameter assembly anymore
- Replaced the deprecated form interface example project with a `vibe.web.web` based "web_ajax" example
- Added support for the `@path` attribute on registered classes - [issue #1036][issue1036]
- REST interface generator (`vibe.web.rest`)
- Removed support for `index()` methods (use `get()` or `@path("/")`) (by Mathias Lang) - [pull #1010][issue1010]
- Deprecated the `@rootPath` attribute (use `@path` instead) (by Mathias Lang) - [pull #999][issue999]
- Deprecated symbols that were scheduled for deprecation and removed deprecated symbols
- Added version `VibeNoDefaultArgs` to disable the built-in command line options
- Renamed "SSL" to "TLS" in most places
- Scheduled `Json.opDispatch` and `Bson.opDispatch` for deprecation (use `opIndex` instead)
- Added `Bson.tryIndex` (by Marc Schütz) - [pull #1032][issue1032]
- Added support for all standard HTTP methods (RFC) (by Szabo Bogdan) - [pull #1068][issue1068], [pull #1082][issue1082]
- Added overloads for `scope` based HTTP server callbacks
- These will later be used for safe, allocation-less HTTP request processing
- Always prefer this over the non-`scope` callbacks, as these will imply a performance impact in later versions
- Added `vibe.core.stream.nullSink` as a convenient way to get a generic data sink stream
- Added overloads of `writeFormData` and `writeFormBody` that accept ranges of key/value tuples (by Tobias Pankrath)
- Added `HTTPClientResponse.switchProtocol` (by Luca Niccoli) - [pull #945][issue945]
- `listenHTTP` now returns a `HTTPListener` instance that can be used to stop listening - [issue #1074][issue1074]
- Added an `AppenderResetMode` parameter to `MemoryOutputStream.reset()` (by Etienne Cimon)
- Changed `urlEncode` to only allocate if necessary (by Marc Schütz) - [pull #1076][issue1076]
- Optimize multi-part form decoding for cases where "Content-Length" is given (by Etienne Cimon) - [pull #1101][issue1101]
- Added serialization support for `std.typecons.BitFlags!T`
- Removed the `HTTPRouter` interface (now just a compatibility alias to `URLRouter`) (by Mathias Lang) - [pull #1106][issue1106]
- Added `HTTPStatus.tooManyRequests` (by Jack Applegame) - [pull #1103][issue1103]
- Added optional `code` and `reason` parameters to `WebSocket.close()` (by Steven Dwy) - [pull #1107][issue1107]
- Added an optional copy+delete fallback to `moveFile()` (by Etienne Cimon and Martin Nowak)
- Let `ConnectionProxyStream` work without an underlying `ConnectionStream` (by Etienne Cimon)
- Added a `ConnectionProxyStream` constructor taking separate input and output streams
- Updated the OpenSSL Windows binaries to 1.0.1m
- Added `BigInt` support to the JSON module (by Igor Stepanov) - [pull #1118][issue1118]
- The event loop of the win32 driver can now be stopped by sending a `WM_QUIT` message (by Денис Хлякин aka aka-demik) - [pull #1120][issue1120]
- Marked `vibe.inet.path` as `pure` and removed casts that became superfluous
- Added an `InputStream` based overload of `HTTPServerResponse.writeBody` - [issue #1594][issue1594]
- Added all Redis modules to the `vibe.vibe` module
- Added a version of `FixedRingBuffer.opApply` that supports an index (by Tomáš Chaloupka) - [pull #1198][issue1198]
### Bug fixes ###
- Fixed listening on IPv6 interfaces for the win32 driver
- Fixed `URL.localURI` updating the query string and anchor parts properly - [issue #1044][issue1044]
- Fixed `Task.join()` to work outside of a running event loop
- Fixed the automatic redirection in `vibe.web.web` in case of mismatching trailing slash
- Fixed `MongoCollection.count()` when used with MongoDB 3.x - [issue #1058][issue1058]
- Fixed detection of non-copyable, but movable types for `runTask`
- Fixed processing of translation strings with escape sequences in `vibe.web.web` (by Andrey Zelenchuk) - [pull #1067][issue1067]
- Fixed unnecessarily closing HTTP client connections
- Fixed using `TCPConnection.close()` with a concurrent `read()` operation (libevent driver)
- Fixed parsing of HTTP digest authentication headers with different whitespace padding or differing case (by Денис Хлякин aka aka-demik) - [pull 1083][issue1083]
- Fixed parsing various HTTP request headers case insensitively
- Fixed validation of untrusted certificates without `TLSPeerValidationMode.checkTrust` for `OpenSSLStream`
- Fixed TLS certificate host/address validation in the SMTP client
- Fixed `@bodyParam` parameters with default value in the REST interface generator (by Mathias Lang) - [issue #1125][issue1125], [pull #1129][issue1129]
- Fixed running the TLS context setup for STARTTLS SMTP connections (by Nathan Christenson) - [pull #1132][issue1132]
- Fixed JSON serialization of `const(Json)` (by Jack Applegame) - [pull #1109][issue1109]
- Fixed runtime error for Windows GUI apps that use the Visual Studio runtime
- Various fixes in the libasync event driver (by Etienne Cimon)
- Fixed the REST interface generator to treat `get`/`post`/... methods as `@path("/")` (by Mathias Lang) - [pull #1135][issue1135]
- Fixed `URL`'s internal encoding of the path string (by Igor Stepanov) - [pull #1148][issue1148]
- Fixed decoding query parameters in the REST interface generator (by Igor Stepanov) - [pull #1143][issue1143]
- Fixed a possible range violation when writing long HTTP access log messages (by Márcio Martins) - [pull #1156][issue1156]
- Fixed support of typesafe variadic methods in the REST interface generator (by Mathias Lang) - [issue #1144][issue1144], [pull #1159][issue1159]
- Fixed `getConfig`, `setConfig` and `configResetStat` in `RedisClient` (by Henning Pohl) - [pull #1158][issue1158]
- Fixed possible CPU hog in timer code for periodic timer events that were triggered too fast
- Fixed a possible memory leak and wrongly reported request times for HTTP connections that get terminated before finishing a response - [issue #1157][issue1157]
- Fixed `vibe.web.web.redirect()` to work properly for relative paths with query strings
- Fixed invalid JSON syntax in dub.json - [issue #1172][issue1172]
- Fixed `LibasyncFileStream` when used with `FileMode.createTrunc` (by Etienne Cimon) - [pull #1176][issue1176]
- Fixed `deserialize` when operating on a struct/class that is annotated with `@asArray` (by Colden Cullen) - [pull #1182][issue1182]
- Fixed parsing quoted HTTP multi part form boundaries (by Mathias L. Baumann aka Marenz) - [pull #1183][issue1183]
- Fixed `LibasyncFileStream.peek()` to always return `null` (by Etienne Cimon) - [pull #1179][issue1179]
- Fixed `ThreadedFile.seek` for 32-bit Windows applications (libevent driver) - [issue #1189][issue1189]
- Fixed parsing of relative `file://` URLs
- Fixed a possible `RangeError` in the JSON parser (by Takaaki Seki) - [pull #1199][issue1199]
- Fixed a possible resource leak in `HashMap` (destructors not run)
- Fixed `pipeRealtime` to always adhere to the maximum latency
- Fixed deserialization of `immutable` fields (by Jack Applegame) - [pull #1190][issue1190]
[issue945]: https://github.com/vibe-d/vibe.d/issues/945
[issue952]: https://github.com/vibe-d/vibe.d/issues/952
[issue999]: https://github.com/vibe-d/vibe.d/issues/999
[issue1010]: https://github.com/vibe-d/vibe.d/issues/1010
[issue1032]: https://github.com/vibe-d/vibe.d/issues/1032
[issue1036]: https://github.com/vibe-d/vibe.d/issues/1036
[issue1044]: https://github.com/vibe-d/vibe.d/issues/1044
[issue1058]: https://github.com/vibe-d/vibe.d/issues/1058
[issue1067]: https://github.com/vibe-d/vibe.d/issues/1067
[issue1068]: https://github.com/vibe-d/vibe.d/issues/1068
[issue1074]: https://github.com/vibe-d/vibe.d/issues/1074
[issue1076]: https://github.com/vibe-d/vibe.d/issues/1076
[issue1082]: https://github.com/vibe-d/vibe.d/issues/1082
[issue1083]: https://github.com/vibe-d/vibe.d/issues/1083
[issue1101]: https://github.com/vibe-d/vibe.d/issues/1101
[issue1103]: https://github.com/vibe-d/vibe.d/issues/1103
[issue1106]: https://github.com/vibe-d/vibe.d/issues/1106
[issue1107]: https://github.com/vibe-d/vibe.d/issues/1107
[issue1109]: https://github.com/vibe-d/vibe.d/issues/1109
[issue1118]: https://github.com/vibe-d/vibe.d/issues/1118
[issue1120]: https://github.com/vibe-d/vibe.d/issues/1120
[issue1125]: https://github.com/vibe-d/vibe.d/issues/1125
[issue1129]: https://github.com/vibe-d/vibe.d/issues/1129
[issue1132]: https://github.com/vibe-d/vibe.d/issues/1132
[issue1135]: https://github.com/vibe-d/vibe.d/issues/1135
[issue1143]: https://github.com/vibe-d/vibe.d/issues/1143
[issue1144]: https://github.com/vibe-d/vibe.d/issues/1144
[issue1148]: https://github.com/vibe-d/vibe.d/issues/1148
[issue1156]: https://github.com/vibe-d/vibe.d/issues/1156
[issue1157]: https://github.com/vibe-d/vibe.d/issues/1157
[issue1158]: https://github.com/vibe-d/vibe.d/issues/1158
[issue1159]: https://github.com/vibe-d/vibe.d/issues/1159
[issue1172]: https://github.com/vibe-d/vibe.d/issues/1172
[issue1176]: https://github.com/vibe-d/vibe.d/issues/1176
[issue1179]: https://github.com/vibe-d/vibe.d/issues/1179
[issue1182]: https://github.com/vibe-d/vibe.d/issues/1182
[issue1183]: https://github.com/vibe-d/vibe.d/issues/1183
[issue1189]: https://github.com/vibe-d/vibe.d/issues/1189
[issue1190]: https://github.com/vibe-d/vibe.d/issues/1190
[issue1198]: https://github.com/vibe-d/vibe.d/issues/1198
[issue1199]: https://github.com/vibe-d/vibe.d/issues/1199
v0.7.23 - 2015-03-25
--------------------
Apart from fixing compilation on DMD 2.067 and revamping the `vibe.core.sync` module to support `nothrow`, notable changes are extended parameter support in `vibe.web.rest`, improved translation support in `vibe.web.web` and new support for policy based customization of (de-)serialization. The Diet template parser has also received a good chunk of fixes and improvements in this release.
### Features and improvements ###
- Compiles on DMD frontend 2.065 up to 2.067 (most fixes for 2.067 are by Mathias Lang) - [pull #972][pull 972], [pull #992][issue992]
- Changed semantics of `TaskMutex` and `TaskCondition` - **this can be a breaking change for certain applications**
- The classes are now `nothrow` to stay forward compatible with D's `Mutex` and `Condition` classes,
- Interruption using `Task.interrupt()` now gets deferred to the next wait/yield operation
- The old behavior can be achieved using the new `InterruptipleTaskMutex` and `InterruptibleTaskCondition` classes
- Definition of either `VibeCustomMain` or `VibeDefaultMain` is now a hard requirement - this is the final deprecation phase for `VibeCustomMain`
- Added an overload of `lowerPrivileges` that takes explicit user/group arguments (by Darius Clark) - [pull #948][issue948]
- Added `handleWebSocket` as a procedural alternative to `handleWebSockets` (by Luca Niccoli) - [pull #946][issue946]
- Added support for "msgctxt" in .po files for the `vibe.web.web` translation framework (by Nathan Coe) - [pull #896][issue896]
- Added overloads of `HTTPServerResponse.writeBody` and `writeRawBody` with an additional status code parameter (by Martin Nowak) - [pull #980][issue980]
- Added `@queryParam` and `@bodyParam` to the `vibe.web.rest` module (by Mathias Lang) - [pull #969][issue969]
- Added support for serving an "index.html" file when requesting a directory (by Martin Nowak) - [pull #902][issue902]
- Added policy based customization for `vibe.data.serialization` (by Luca Niccoli) - [pull #937][issue937]
- Added `SSLStream.peerCertificate` and `HTTPServerRequest.clientCertificate` properties (by Rico Huijbers) - [pull #965][issue965]
- Added `RedisDatabase.zrangeByLex` (by Etienne Cimon) - [pull #993][issue993]
- Added support for HTTP digest authentication (by Kai Nacke aka redstar) - [pull #1000][issue1000]
- Diet template features
- Added support for plain text lines starting with `<` (plain HTML lines) (by Kai Nacke aka redstar) - [pull #1007][issue1007]
- Added support for default and "prepend" modes for blocks (help from Kai Nacke aka redstar) - [issue #905][issue905], [pull #1002][issue1002]
- Multiple "id" attributes are now explicitly disallowed (by Kai Nacke aka redstar) - [pull #1008][issue1008]
### Bug fixes ###
- Fixed ping handling for WebSockets and added automatic keep-alive pinging (by Luca Niccoli) - [pull #947][issue947]
- Fixed wrapped texts in .po files for the `vibe.web.web` translation framework (by Nathan Coe) - [pull #896][issue896]
- Fixed a crash issue when storing a `Timer` in a class instance that does not get destroyed before application exit - [issue #978][issue978]
- Fixed `HTTPRouter.any` to match all supported HTTP verbs (by Szabo Bogdan) - [pull #984][issue984]
- Fixed setting `TCPConnection.localAddr` in the libasync driver (by Etienne Cimon) - [issue #961][issue961], [pull #962][issue962]
- Fixed some cases of missing destructor calls in `vibe.utils.memory` (partially by Etienne Cimon) - [pull #987][issue987]
- Fixed some failed incoming SSL connection attempts by setting a default session context ID (by Rico Huijbers) - [pull #970][issue970]
- Fixed `RedisSessionStore.create()` (by Yusuke Suzuki) - [pull #996][issue996]
- Fixed HTML output of `//` style comments in Diet templates (by Kai Nacke) - [pull #1004][issue1004]
- Fixed the error message for mismatched `@path` placeholder parameters in `vibe.web.rest` (by Mathias Lang aka Geod24) - [issue #949][issue949], [pull #1001][issue1001]
- Fixed parsing of hidden comments in Diet templates that have no leading space (by Kai Nacke) - [pull #1012][issue1012]
- Fixed serialization of `const(Json)` values
- Fixed handling of struct parameter types in `vibe.web.rest` that implicitly convert to `string`, but not vice-versa
- Fixed HTTP request parsing with uppercase letters in the "Transfer-Encoding" header (by Szabo Bogdan) - [pull #1015][issue1015]
- Fixed parsing of Diet attributes that are followed by whitespace - [issue #1021][issue1021]
- Fixed parsing of Diet string literal attributes that contain unbalanced parenthesis - [issue #1033][issue1033]
[issue896]: https://github.com/vibe-d/vibe.d/issues/896
[issue896]: https://github.com/vibe-d/vibe.d/issues/896
[issue902]: https://github.com/vibe-d/vibe.d/issues/902
[issue905]: https://github.com/vibe-d/vibe.d/issues/905
[issue937]: https://github.com/vibe-d/vibe.d/issues/937
[issue946]: https://github.com/vibe-d/vibe.d/issues/946
[issue947]: https://github.com/vibe-d/vibe.d/issues/947
[issue948]: https://github.com/vibe-d/vibe.d/issues/948
[issue949]: https://github.com/vibe-d/vibe.d/issues/949
[issue961]: https://github.com/vibe-d/vibe.d/issues/961
[issue962]: https://github.com/vibe-d/vibe.d/issues/962
[issue965]: https://github.com/vibe-d/vibe.d/issues/965
[issue969]: https://github.com/vibe-d/vibe.d/issues/969
[issue970]: https://github.com/vibe-d/vibe.d/issues/970
[issue978]: https://github.com/vibe-d/vibe.d/issues/978
[issue980]: https://github.com/vibe-d/vibe.d/issues/980
[issue984]: https://github.com/vibe-d/vibe.d/issues/984
[issue987]: https://github.com/vibe-d/vibe.d/issues/987
[issue992]: https://github.com/vibe-d/vibe.d/issues/992
[issue993]: https://github.com/vibe-d/vibe.d/issues/993
[issue996]: https://github.com/vibe-d/vibe.d/issues/996
[issue1000]: https://github.com/vibe-d/vibe.d/issues/1000
[issue1001]: https://github.com/vibe-d/vibe.d/issues/1001
[issue1002]: https://github.com/vibe-d/vibe.d/issues/1002
[issue1004]: https://github.com/vibe-d/vibe.d/issues/1004
[issue1007]: https://github.com/vibe-d/vibe.d/issues/1007
[issue1008]: https://github.com/vibe-d/vibe.d/issues/1008
[issue1012]: https://github.com/vibe-d/vibe.d/issues/1012
[issue1015]: https://github.com/vibe-d/vibe.d/issues/1015
[issue1021]: https://github.com/vibe-d/vibe.d/issues/1021
[issue1033]: https://github.com/vibe-d/vibe.d/issues/1033
v0.7.22 - 2015-01-12
--------------------
A small release mostly fixing compilation issues on DMD 2.065, LDC 0.14.0 and GDC. It also contains the new optional libasync based event driver for initial testing.
### Features and improvements ###
- Added a new event driver based on the [libasync](https://github.com/etcimon/libasync) native D event loop abstraction library (by Etienne Cimon) - [pull #814][issue814]
- Added support for `@headerParam` in the REST interface generator (by Mathias Lang aka Geod24) - [pull #908][issue908]
- Added `font/woff` as a recognized compressed MIME type to avoid redundant compression for HTTP transfers (by Márcio Martins) - [pull #923][issue923]
- The BSON deserialization routines now transparently convert from `long` to `int` where required (by David Monagle) - [pull #913][issue913]
### Bug fixes ###
- Fixed an overload conflict for `urlEncode` introduced in 0.7.21
- Fixed a compilation issue with `Exception` typed `_error` parameters in web interface methods (by Denis Hlyakin) - [pull #900][issue900]
- Fixed conversion of `Bson.Type.undefined` to `Json` (by Márcio Martins) - [pull #922][issue922]
- Fixed messages leaking past the end of a task to the next task handled by the same fiber (by Luca Niccoli) - [pull #934][issue934]
- Fixed various compilation errors and ICEs for DMD 2.065, GDC and LDC 0.14.0 (by Martin Nowak) - [pull #901][issue901], [pull #907][issue907], [pull #927][issue927]
[issue814]: https://github.com/vibe-d/vibe.d/issues/814
[issue900]: https://github.com/vibe-d/vibe.d/issues/900
[issue901]: https://github.com/vibe-d/vibe.d/issues/901
[issue907]: https://github.com/vibe-d/vibe.d/issues/907
[issue908]: https://github.com/vibe-d/vibe.d/issues/908
[issue913]: https://github.com/vibe-d/vibe.d/issues/913
[issue922]: https://github.com/vibe-d/vibe.d/issues/922
[issue923]: https://github.com/vibe-d/vibe.d/issues/923
[issue927]: https://github.com/vibe-d/vibe.d/issues/927
[issue934]: https://github.com/vibe-d/vibe.d/issues/934
v0.7.21 - 2014-11-18
--------------------
Due to a number of highly busy months (more to come), this release got delayed far more than planned. However, development didn't stall and, finally, a huge list of over 150 changes found its way into the new version. Major changes are all over the place, including some notable changes in the SSL/TLS support and the web interface generator.
### Features and improvements ###
- SSL/TLS support
- Added support for TLS server name indication (SNI) to the SSL support classes and the HTTP client and server implementation
- Changed `SSLPeerValidationMode` into a set of bit flags (different modes can now be combined)
- Made the SSL implementation pluggable (currently only OpenSSL is supported)
- Moved all OpenSSL code into a separate module to avoid importing the OpenSSL headers in `vibe.stream.ssl` (by Martin Nowak) - [pull #757][issue757]
- Added support for a `VibeUseOldOpenSSL` version to enable use with pre 1.0 versions of OpenSSL
- Upgraded the included OpenSSL Windows binaries to 1.0.1j
- Web interface generator
- Added support for `Json` as a return type for web interface methods (by Stefan Koch) - [pull #684][issue684]
- Added support for a `@contentType` attribute for web interface methods (by Stefan Koch) - [pull #684][issue684]
- Added `vibe.web.web.trWeb` for runtime string translation support
- Added support for nesting web interface classes using properties that return a class instance
- Added support for `@before`/`@after` attributes for web interface methods
- Added a `PrivateAccessProxy` mixin as a way to enable use of private and non-static methods for `@before` in web interfaces
- Added support for validating parameter types to `vibe.web.web` (`vibe.web.validation`)
- Added the possibility to customize the language selection in the translation context for web interface translations
- Added optional support for matching request paths with mismatching trailing slash in web interfaces
- `SessionVar`, if necessary, now starts a new session also for read accesses
- HTTP sessions
- Added a check to disallow storing types with aliasing in sessions
- Session values are now always returned as `const` to avoid unintended mutation of the returned temporary
- Added initial support for JSON and BSON based session stores
- Added a Redis based HTTP session store (`vibe.db.redis.sessionstore.RedisSessionStore`)
- Deprecated index operator based access of session values (recommended to use `vibe.web.web.SessionVar` instead)
- Redis database driver
- Added some missing Redis methods and rename `RedisClient.flushAll` to `deleteAll`
- Added the `vibe.db.redis.types` module for type safe access of Redis keys
- `RedisReply` is now a typed output range
- Added a module for Redis with common high level idioms (`vibe.db.redis.idioms`)
- Improved the Redis interface with better template constraints, support for interval specifications and support for `Nullable!T` to determine key existence
- Made the `member` argument to the sorted set methods in `RedisDatabase` generic instead of `string` - [issue #811][issue811]
- Added support for `ubyte[]` as a return type for various Redis methods (by sinkuu) - [pull #761][issue761]
- MongoDB database driver
- `MongoConnection.defaultPort` is now an `ushort` (by Martin Nowak) - [pull #725][issue725]
- Added support for expiring indexes and dropping indexes/collections in the MongoDB client (by Márcio Martins) - [pull #799][issue799]
- Added `MongoClient.getDatabases` (by Peter Eisenhower) - [pull #822][issue822]
- Added an array based overload of `MongoCollection.ensureIndex` - [issue #824][issue824]
- Added `MongoCursor.skip` as an alternative to setting the skip value using an argument to `find` (by Martin Nowak) - [pull 888][issue888]
- HTTP client
- Made the handling of redirect responses more specific in the HTTP client (reject unknown status codes)
- Added support for using a proxy server in the HTTP client (by Etienne Cimon) - [pull #731][issue731]
- Added `HTTPClientSettings.defaultKeepAliveTimeout` and handle the optional request count limit of keep-alive connections (by Etienne Cimon) - [issue 744][issue744], [pull #756][issue756]
- Added an assertion to the HTTP client when a relative path is used for the request URL instead of constructing an invalid request
- Avoid using chunked encoding for `HTTPClientRequest.writeJsonBody`
- HTTP server
- Added support for IP based client certificate validation in the HTTP server (by Eric Cornelius) - [pull #723][issue723]
- Avoid using chunked encoding for `HTTPServerResponse.writeJsonBody` - [issue #619][issue619]
- Added `HTTPServerResponse.waitForConnectionClose` to support certain kinds of long-polling applications
- Compiles on DMD 2.064 up to DMD 2.067.0-b1
- All external dependencies are now version based (OpenSSL/libevent/libev)
- Removed deprecated symbols of 0.7.20
- Increased the default fiber stack size to 512 KiB (32-bit) and 16 MiB (64-bit) respectively - [issue #861][issue861]
- Enabled the use of `shared` delegates for `runWorkerTask` and avoid creation of a heap delegate
- Added support for more parameter types in `runTask`/`runWorkerTask` by avoiding `Variant`
- Added an initial implementation of a `Future!T` (future/promise) in `vibe.core.concurrency`
- Deprecated the output range interface of `OutputStream`, use `vibe.stream.wrapper.StreamOutputRange` instead
- Prefer `.toString()` to `cast(string)` when converting values to string in Diet templates (changes how `Json` values are converted!) - [issue #714][issue714]
- Added variants of the `vibe.utils.validation` functions that don't throw
- Added `UDPConnection.close()`
- Deprecated `registerFormInterface` and `registerFormMethod`
- Added support for implicit parameter conversion of arguments passed to `runTask`/`runWorkerTask` (by Martin Nowak) - [pull #719][issue719]
- Added `vibe.stream.stdio` for vibe.d compatible wrapping of stdin/stdout and `std.stdio.File` (by Eric Cornelius) - [pull #729][issue729]
- Added `vibe.stream.multicast.MultiCastStream` for duplicating a stream to multiple output streams (by Eric Cornelius) - [pull #732][issue732]
- Added support for an `inotify` based directory watcher in the libevent driver (by Martin Nowak) - [pull #743][issue743]
- Added support for `Nullable!T` in `vibe.data.serialization` - [issue #752][issue752]
- Added a constructor for `BsonObjectID` that takes a specific time stamp (by Martin Nowak) - [pull #759][issue759]
- Added output range based overloads of `std.stream.operations.readUntil` and `readLine`
- Added `vibe.data.json.serializeToJsonString`
- Added `vibe.inet.webform.formEncode` for encoding a dictionary/AA as a web form (by Etienne Cimon) - [pull #748][issue748]
- `BsonObjectID.fromString` now throws an `Exception` instead of an `AssertError` for invalid inputs
- Avoid using initialized static array for storing task parameters (by Михаил Страшун aka Dicebot) - [pull #778][issue778]
- Deprecated the simple password hash functions due to their weak security - [issue #794][issue794]
- Added support for serializing tuple fields
- Added `convertJsonToASCII` to force escaping of all Unicode characters - see [issue #809][issue809]
- Added a parameter to set the information log format for `setLogFormat` (by Márcio Martins) - [pull #808][issue808]
- Serializer implementations now get the number of dictionary elements passed up front (by Johannes Pfau) - [pull #823][issue823]
- Changed `readRequiredOption` to not throw when the `--help` switch was passed (by Jack Applegame) - [pull #803][issue803]
- Added `RestInterfaceSettings` as the new way to configure REST interfaces
- Implemented optional stripping of trailing underscores for REST parameters (allows the use of keywords as parameter names)
- Made the `message` parameter of `enforceHTTP` `lazy` (by Mathias Lang aka Geod24) - [pull #839][issue839]
- Improve the format of JSON parse errors to enable IDE go-to-line support
- Removed all console and file system output from unit tests (partially by Etienne Cimon, [pull #852][issue852])
- Improved performance of libevent timers by avoiding redundant rescheduling of the master timer
### Bug fixes ###
- Fixed BSON custom serialization of `const` classes
- Fixed serialization of `DictionaryList` - [issue #621][issue621]
- Fixed a bogus deprecation message for Diet script/style blocks without child nodes
- Fixed an infinite loop in `HTTPRouter` when no routes were registered - [issue #691][issue691]
- Fixed iterating over `const(DictionaryList)` (by Mathias Lang aka Geod24) - [pull #693][issue693]
- Fixed an assertion in the HTTP file server that was triggered when drive letters were contained in the request path - [pull #694][issue694]
- Fixed recognizing `application/javascript` in script tags to trigger the block syntax deprecation message
- Fixed support for boolean parameters in web interfaces
- Fixed falling back to languages without country suffix in the web interface generator
- Fixed alignment of the backing memory for a `TaskLocal!T`
- Fixed the port reported by `UDPConnection.bindAddress` when 0 was specified as the bind port (libevent)
- Fixed busy looping the event loop when there is unprocessed UDP data - [issue #715][issue715]
- Fixed `exitEventLoop()` to work when there is a busy tasks that calls `yield()` - [issue #720][issue720]
- Avoid querying the clock when processing timers and no timers are pending (performance bug)
- Fixed `ManualEvent.wait()` to work outside of a task (fixes various secondary facilities that use `ManualEvent` implicitly) - [issue #663][issue663]
- Fixed encoding of `StreamOutputRange.put(dchar)` (by sinkuu) - [pull #733][issue733]
- Fixed treating `undefined` JSON values as `null` when converting to a string - [issue #735][issue735]
- Fixed using an `id` parameter together with `@path` in REST interfaces - [issue #738][issue738]
- Fixed handling of multi-line responses in the SMTP client (by Etienne Cimon) - [pull #746][issue746]
- Fixed compile error for certain uses of `Nullable!T` in web interfaces
- Enable use of non-virtual access of the event driver using `VibeUseNativeDriverType`
- Fixed building the "libev" configuration (by Lionello Lunesu) - [pull #755][issue755]
- Fixed `TaskLocal!T` top properly call destructors after a task has ended (by Etienne Cimon) - [issue #753][issue753], [pull #754][issue754]
- Fixed the name of `RedisDatabase.zcard` (was `Zcard`)
- Fixed a possible race condition causing a hang in `MessageQueue.receive`/`receiveTimeout`(by Ilya Lyubimov) - [pull #760][issue760]
- Fixed `RangeCounter` to behave properly when inserting single `char` values
- Fixed `RedisDatabase.getSet` (by Stephan Dilly) - [pull #769][issue769]
- Fixed out-of-range array access in the Diet template compiler when the last attribute of a tag is value-less (by Martin Nowak) - [pull #771][issue771]
- Fixed output of line breaks in the Markdown compiler
- Fixed handling of the `key` argument of `getRange`, `lrem` and `zincrby` in `RedisDatabase` (by sinkuu) - [pull #772][issue772]
- Fixed handling of `Nullable!T` and `isISOExtStringSerializable` parameters in REST interfaces
- Fixed escaping of Diet tag attributes with string interpolations (by sinkuu) - [pull #779][issue779]
- Fixed handling a timeout smaller or equal to zero (infinity) for `RedisSubscriber.blisten` (by Etienne Cimon aka etcimon) - [issue #776][issue776], [pull #781][issue781]
- Fixed handling of Unicode escape sequences in the JSON parser (by Etienne Cimon aka etcimon) - [pull #782][issue782]
- Fixed `HTTPServerRequest.fullURL` for requests without a `Host` header - [issue #786][issue786]
- Fixed `RedisClient` initialization for servers that require authentication (by Pedro Yamada aka yamadapc) - [pull #785][issue785]
- Fixed the JSON parser to not accept numbers containing ':'
- Removed an invalid assertion in `HTTPServerResponse.writeJsonBody` - [issue #788][issue788]
- Fixed handling of explicit "identity" content encoding in the HTTP client (by sinkuu) - [pull #789][issue789]
- Fixed `HTTPServerRequest.fullURL` for HTTPS requests with a non-default port (by Arjuna aka arjunadeltoso) - [pull #790][issue790]
- Fixed detection of string literals in Diet template attributes - [issue #792][issue792]
- Fixed output of Diet attributes using `'` as the string delimiter
- Fixed detection of numeric types in `BsonSerializer` (do not treat `Nullable!T` as numeric)
- Fixed the REST interface client to accept 201 responses (by Yuriy Glukhov) - [pull #806][issue806]
- Fixed some potential lock related issues in the worker task handler loop
- Fixed memory corruption when `TCPListenOptions.disableAutoClose` is used and the `TCPConnection` outlives the accepting task - [issue #807][issue807]
- Fixed a range violation when parsing JSON strings that end with `[` or `{` - [issue #805][issue805]
- Fixed compilation of `MongoCollection.aggregate` and support passing an array instead of multiple parameters - [issue #783][issue783]
- Fixed compilation and formatting issues in the HTTP logger (by Márcio Martins) - [pull #808][issue808]
- Fixed assertion condition in `DebugAllocator.realloc`
- Fixed shutdown when daemon threads are involved - [issue #758][issue758]
- Fixed some serialization errors for structs with variadic constructors or properties or with nested type declarations/aliases (by Rene Zwanenburg) - [pull #817][issue817], [issue #818][issue818], [pull #819][issue819]
- The HTTP server now terminates a connection if the response was not completely written to avoid protocol errors
- Fixed an assertion triggered by a `vibe.web.rest` server trying to write an error message when a response had already been made - [issue #821][issue821]
- Fixed using `TaskLocal!T` with types that have certain kinds of "copy constructors" - [issue #825][issue825]
- Fixed `-version=VibeNoSSL` (by Dragos Carp) - [pull #834][issue834]
- Use "bad request" replies instead of "internal server error" for various cases where a HTTP request is invalid (by Marc Schütz) - [pull #827][issue827]
- Removed a leading newline in compiled Diet templates
- Fixed serialization of nested arrays as JSON (by Rene Zwanenburg) - [issue #840][issue840], [pull #841][issue841]
- Fixed OpenSSL error messages in certain cases (by Andrea Agosti) - [pull #796][issue796]
- Fixed parsing of MongoDB URLs containing `/` in the password field (by Martin Nowak) - [pull #843][issue843]
- Fixed an assertion in `TCPConnection.waitForData` when called outside of a task (libevent) - [issue #829][issue829]
- Fixed an `InvalidMemoryOperationError` in `HTTPClientResponse.~this()`
- Fixed a memory corruption issue for HTTPS servers (by Etienne Cimon) - [issue #846][issue846], [pull #849][issue849]
- Fixed low-precision floating point number output in `JsonStringSerializer`
- Fixed compilation in release mode (not recommended for safety reasons!) - [issue #847][issue847]
- Fixed low-precision floating point number output in the Redis client - [issue #857][issue857]
- Fixed handling of NaN in the JSON module (output as `undefined`) (by David Monagle)- [pull #860][issue860]
- Fixed the Redis subscriber implementation (by Etienne Cimon) - [issue #855][issue855], [pull #815][issue815]
- Fixed compilation of the `Isolated!T` framework - [issue #801][issue801]
- Fixed an `InvalidMemoryOperationError` in `DebugAllocator` (by Etienne Cimon) - [pull #848][issue848]
- Fixed detection of numeric types in `JsonSerializer` (do not treat `Nullable!T` as numeric) (by Jack Applegame) - [issue #686][issue868], [pull #869][issue869]
- Fixed error handling in `Win32TCPConnection.connect` and improved error messages
- Fixed ping handling of WebSocket ping messages (by Vytautas Mickus aka Eximius) - [pull #883][issue883]
- Fixed always wrapping the e-mail address in angular brackets in the SMTP client (by ohenley) - [pull #887][issue887]
- Fixed custom serialization of `const` instances (by Jack Applegame) - [pull #879][issue879]
- Fixed the `RedisDatabase.set*X` to properly test the success condition (by Stephan Dilly aka Extrawurst) - [pull #890][issue890]
- Fixed `sleep(0.seconds)` to be a no-op instead of throwing an assertion error
- Fixed a potential resource leak in `HashMap` by using `freeArray` instead of directly deallocating the block of memory (by Etienne Cimon) - [pull #893][issue893]
[issue619]: https://github.com/vibe-d/vibe.d/issues/619
[issue621]: https://github.com/vibe-d/vibe.d/issues/621
[issue663]: https://github.com/vibe-d/vibe.d/issues/663
[issue684]: https://github.com/vibe-d/vibe.d/issues/684
[issue684]: https://github.com/vibe-d/vibe.d/issues/684
[issue691]: https://github.com/vibe-d/vibe.d/issues/691
[issue693]: https://github.com/vibe-d/vibe.d/issues/693
[issue694]: https://github.com/vibe-d/vibe.d/issues/694
[issue714]: https://github.com/vibe-d/vibe.d/issues/714
[issue715]: https://github.com/vibe-d/vibe.d/issues/715
[issue719]: https://github.com/vibe-d/vibe.d/issues/719
[issue720]: https://github.com/vibe-d/vibe.d/issues/720
[issue723]: https://github.com/vibe-d/vibe.d/issues/723
[issue725]: https://github.com/vibe-d/vibe.d/issues/725
[issue729]: https://github.com/vibe-d/vibe.d/issues/729
[issue731]: https://github.com/vibe-d/vibe.d/issues/731
[issue732]: https://github.com/vibe-d/vibe.d/issues/732
[issue733]: https://github.com/vibe-d/vibe.d/issues/733
[issue735]: https://github.com/vibe-d/vibe.d/issues/735
[issue738]: https://github.com/vibe-d/vibe.d/issues/738
[issue743]: https://github.com/vibe-d/vibe.d/issues/743
[issue744]: https://github.com/vibe-d/vibe.d/issues/744
[issue746]: https://github.com/vibe-d/vibe.d/issues/746
[issue748]: https://github.com/vibe-d/vibe.d/issues/748
[issue752]: https://github.com/vibe-d/vibe.d/issues/752
[issue753]: https://github.com/vibe-d/vibe.d/issues/753
[issue754]: https://github.com/vibe-d/vibe.d/issues/754
[issue755]: https://github.com/vibe-d/vibe.d/issues/755
[issue756]: https://github.com/vibe-d/vibe.d/issues/756
[issue757]: https://github.com/vibe-d/vibe.d/issues/757
[issue758]: https://github.com/vibe-d/vibe.d/issues/758
[issue759]: https://github.com/vibe-d/vibe.d/issues/759
[issue760]: https://github.com/vibe-d/vibe.d/issues/760
[issue761]: https://github.com/vibe-d/vibe.d/issues/761
[issue769]: https://github.com/vibe-d/vibe.d/issues/769
[issue771]: https://github.com/vibe-d/vibe.d/issues/771
[issue772]: https://github.com/vibe-d/vibe.d/issues/772
[issue776]: https://github.com/vibe-d/vibe.d/issues/776
[issue778]: https://github.com/vibe-d/vibe.d/issues/778
[issue779]: https://github.com/vibe-d/vibe.d/issues/779
[issue781]: https://github.com/vibe-d/vibe.d/issues/781
[issue782]: https://github.com/vibe-d/vibe.d/issues/782
[issue783]: https://github.com/vibe-d/vibe.d/issues/783
[issue785]: https://github.com/vibe-d/vibe.d/issues/785
[issue786]: https://github.com/vibe-d/vibe.d/issues/786
[issue788]: https://github.com/vibe-d/vibe.d/issues/788
[issue789]: https://github.com/vibe-d/vibe.d/issues/789
[issue790]: https://github.com/vibe-d/vibe.d/issues/790
[issue792]: https://github.com/vibe-d/vibe.d/issues/792
[issue794]: https://github.com/vibe-d/vibe.d/issues/794
[issue796]: https://github.com/vibe-d/vibe.d/issues/796
[issue799]: https://github.com/vibe-d/vibe.d/issues/799
[issue801]: https://github.com/vibe-d/vibe.d/issues/801
[issue803]: https://github.com/vibe-d/vibe.d/issues/803
[issue805]: https://github.com/vibe-d/vibe.d/issues/805
[issue806]: https://github.com/vibe-d/vibe.d/issues/806
[issue807]: https://github.com/vibe-d/vibe.d/issues/807
[issue808]: https://github.com/vibe-d/vibe.d/issues/808
[issue808]: https://github.com/vibe-d/vibe.d/issues/808
[issue809]: https://github.com/vibe-d/vibe.d/issues/809
[issue811]: https://github.com/vibe-d/vibe.d/issues/811
[issue815]: https://github.com/vibe-d/vibe.d/issues/815
[issue817]: https://github.com/vibe-d/vibe.d/issues/817
[issue818]: https://github.com/vibe-d/vibe.d/issues/818
[issue819]: https://github.com/vibe-d/vibe.d/issues/819
[issue821]: https://github.com/vibe-d/vibe.d/issues/821
[issue822]: https://github.com/vibe-d/vibe.d/issues/822
[issue823]: https://github.com/vibe-d/vibe.d/issues/823
[issue824]: https://github.com/vibe-d/vibe.d/issues/824
[issue825]: https://github.com/vibe-d/vibe.d/issues/825
[issue827]: https://github.com/vibe-d/vibe.d/issues/827
[issue829]: https://github.com/vibe-d/vibe.d/issues/829
[issue834]: https://github.com/vibe-d/vibe.d/issues/834
[issue839]: https://github.com/vibe-d/vibe.d/issues/839
[issue840]: https://github.com/vibe-d/vibe.d/issues/840
[issue841]: https://github.com/vibe-d/vibe.d/issues/841
[issue843]: https://github.com/vibe-d/vibe.d/issues/843
[issue845]: https://github.com/vibe-d/vibe.d/issues/845
[issue846]: https://github.com/vibe-d/vibe.d/issues/846
[issue847]: https://github.com/vibe-d/vibe.d/issues/847
[issue848]: https://github.com/vibe-d/vibe.d/issues/848
[issue849]: https://github.com/vibe-d/vibe.d/issues/849
[issue855]: https://github.com/vibe-d/vibe.d/issues/855
[issue860]: https://github.com/vibe-d/vibe.d/issues/860
[issue861]: https://github.com/vibe-d/vibe.d/issues/861
[issue868]: https://github.com/vibe-d/vibe.d/issues/868
[issue869]: https://github.com/vibe-d/vibe.d/issues/869
[issue879]: https://github.com/vibe-d/vibe.d/issues/879
[issue883]: https://github.com/vibe-d/vibe.d/issues/883
[issue887]: https://github.com/vibe-d/vibe.d/issues/887
[issue888]: https://github.com/vibe-d/vibe.d/issues/888
[issue890]: https://github.com/vibe-d/vibe.d/issues/890
[issue893]: https://github.com/vibe-d/vibe.d/issues/893
v0.7.20 - 2014-06-03
--------------------
The `vibe.web.web` web interface generator module has been extended with some important features, making it a full replacement (and more) of the old `registerFormInterface` functionality. Other important changes include the use of strong TLS ciphers out of the box, as well as a heavily optimized `URLRouter` implementation and support for compile-time localization of Diet templates.
### Features and improvements ###
- Web interface generator and Diet template system
- Added `vibe.web.web.terminateSession()` and `redirect()`
- Added support for `struct` and array parameters, as well as `Nullable!T` in `vibe.web.web`
- Added the `@errorDisplay` annotation to `vibe.web.web` to enable automatic exception display using an existing request handler
- Added built-in, compile-time, gettext compatible localization support for Diet templates using the `tag& text` syntax
- HTTP router
- Implemented a new match tree based routing algorithm for `URLRouter`, resulting in great speedups for complex routing setups
- Added `URLRouter.prefix` to configure a prefix to append to every route
- The `HTTPRouter` router interface is scheduled for removal
- Serialization system
- Added `@asArray` to force serialization of composite types as arrays instead of dictionaries
- Added support for using a pre-allocated buffer for `serializeToBson`
- Added support for custom serialization representations of user defined types using `toRepresentation`/`fromRepresentation` methods - [issue #618][issue618]
- Made `DictionaryList` serializable as an array by adding `toRepresentation`/`fromRepresentation` - [issue #621][issue621]
- SSL/TLS
- Using only strong ciphers by default for SSL server contexts
- Added out-of-the box support for perfect forward secrecy (PFS) (by Martin Nowak) - [pull #630][issue630]
- Changed the default from `SSLVersion.tls1` (fixed TLS 1.0) to `SSLVersion.any` (SSL 3 and up, including TLS 1.1 and TLS 1.2)
- Added `SMTPClientSettings.sslContextSetup` to enable customization of the SSL context (e.g. adding trusted certificates)
- Upgraded the Windows OpenSSL binaries to 1.0.1g
- Performance tuning
- Added `HTTPServerOption.errorStackTraces` to make costly stack trace generation optional
- Arguments to the logging functions are now evaluated lazily to avoid computations when messages are not actually logged
- Added support for direct de-serialization of MongoDB query results
- Reduced memory allocations in the HTTP logger module
- Heavily reduced the number of memory allocations happening in the MongoDB driver - see [issue #633][issue633]
- General
- Removed deprecated symbols and deprecated symbols that were scheduled for deprecation
- Added `runWorkerTaskH` to run a worker task and return its handle in one step (by Luca Niccoli aka lultimouomo) - [pull #601][issue601]
- Added `createTestHTTPServerRequest` and `createTestHTTPServerResponse` to support writing unit tests
- Added `vibe.core.file.readFile`, `readFileUTF8`, `writeFile` and `writeFileUTF8`
- Added a limited overload of `RedisDatabase.zrevRangeByScore` and fix the type of the `start`/`end` parameters (by Jens K. Mueller) - [pull #637][issue637]
- Added `TCPListenOptions.disableAutoClose` to make incoming TCP connections independent of the initial handler task
- Added `vibe.core.concurrency.thisTid` as an alias to `Task.getThis()` for improved API compatibility to `std.concurrency`
- Added an overload of `UDPConnection.recv` taking a timeout parameter - [issue #540][issue540]
- Added `toString` to `HTTPRequest` and `HTTPResponse` for convenient logging
- Added `MarkdownSettings` with additional support of setting the base heading level of the generated HTML
- Added `TCPConnection.keepAlive` to set the `SO_KEEPALIVE` option - [issue #622][issue622]
- `Error` derived exceptions are not caught anymore (use `-version=VibeDebugCatchAll` to get the old unsafe behavior)
- Annotated some basic modules with `@safe`/`@trusted`/`pure`
- Extended `ProxyStream` to optionally take distinct streams for input and output
- Replaced all remaining uses of `renderCompat` with `render`
- Removed unused variables and made `Bson.toString` `const` (thanks to Brian Schott aka Hackerpilot) - [issue #659][issue659]
### Bug fixes ###
- Fixed the order of events reported by `setTaskEventCallback` when new tasks are started within an existing task
- Fixed HTTP multi-file uploads by changing `HTTPServerRequest.files` to a `DictionaryList`
- Fixed `@byName` to work for serializing (associative) arrays of enums
- Fixed SSL based SMTP connections (by Martin Nowak) - [pull #609][issue609]
- Fixed Diet text blocks (`tag.` style) to properly remove the input file indentation - [issue #614][issue614]
- Fixed `isStronglyIsolated!T` to work for interface types
- Fixed `filterURLEncode` to encode certain special characters (such as "{") - [issue #632][issue632]
- Fixed a crash when accessing vibe.d event functionality from within `shared static ~this`
- Fixed `Task.join` and `Task.interrupt` to work when called from outside of the event loop (e.g. when `processEvents` is used instead of `runEventLoop`) - [issue #443][issue443]
- Fixed serialization of `const` class instances (by Jack Applegame) - [issue #653][issue653]
- Fixed compilation of `renderCompat!()` on GDC (invalid use of `va_list`/`void*`)
- Fixed handling of paths with empty path entries (e.g. "/some///path") - [issue #410][issue410]
- Fixed a crash caused by `GCAllocator` - `GC.extend` is now used instead of `GC.realloc` to sidestep the issue - [issue #470][issue470]
- Fixed rendering of Markdown links with styled captions
- Fixed `Path.relativeTo` step over devices for UNC paths on Windows
- Fixed compilation on 2.064 frontend based GDC - [issue #647][issue647]
- Fixed output of empty lines in "tag." style Diet template text blocks
[issue410]: https://github.com/vibe-d/vibe.d/issues/410
[issue443]: https://github.com/vibe-d/vibe.d/issues/443
[issue470]: https://github.com/vibe-d/vibe.d/issues/470
[issue540]: https://github.com/vibe-d/vibe.d/issues/540
[issue601]: https://github.com/vibe-d/vibe.d/issues/601
[issue609]: https://github.com/vibe-d/vibe.d/issues/609
[issue614]: https://github.com/vibe-d/vibe.d/issues/614
[issue618]: https://github.com/vibe-d/vibe.d/issues/618
[issue621]: https://github.com/vibe-d/vibe.d/issues/621
[issue622]: https://github.com/vibe-d/vibe.d/issues/622
[issue630]: https://github.com/vibe-d/vibe.d/issues/630
[issue632]: https://github.com/vibe-d/vibe.d/issues/632
[issue633]: https://github.com/vibe-d/vibe.d/issues/633
[issue637]: https://github.com/vibe-d/vibe.d/issues/637
[issue647]: https://github.com/vibe-d/vibe.d/issues/647
[issue653]: https://github.com/vibe-d/vibe.d/issues/653
[issue659]: https://github.com/vibe-d/vibe.d/issues/659
v0.7.19 - 2014-04-09
--------------------
Apart from working on the latest DMD versions, this release includes an important security enhancement in the form of new experimental code for SSL certificate validation. Other major changes include many improvements to the Diet template compiler, various performance improvements, a new `FileDescriptorEvent` to interface with other I/O libraries, a new web interface generator similar to the REST interface generator, many improvements to the Redis client, and a bunch of other fixes and additions.
### Features and improvements ###
- Compiles with DMD 2.065 (and the current DMD HEAD)
- API improvements for the SSL support code
- Implemented SSL certificate validation (partially by David Nadlinger aka klickverbot, [pull #474][issue474])
- Removed the old `EventedObject` interface
- Implemented support for string includes in Diet templates (idea by Stefan Koch aka Uplink_Coder) - [issue #482][issue482]
- JSON answers in the REST interface generator are now directly serialized, improving performance and memory requirements
- Reimplemented the timer code to guarantee light weight timers on all event drivers
- `Libevent2TCPConnection` now has a limited read buffer size to avoid unbounded memory consumption
- Fixed the semantics of `ConnectionStream.empty` and `connected` - `empty` is generally useful for read loops and `connected` for write loops
- Added an overload of `runTask` that takes a delegate with additional parameters to bind to avoid memory allocations in certain situations
- Added `vibe.core.core.createFileDescriptorEvent` to enable existing file descriptors to be integrated into vibe.d's event loop
- HTTP response compression is now disabled by default (controllable by the new `HTTPServerSettings.useCompressionIfPossible)
- Removed the deprecated `sslKeyFile` and `sslCertFile` fields from `HTTPServerSettings`
- Removed the compatibility alias `Signal` (alias for `ManualEvent`)
- `:htmlescape` in Diet templates is now processed at compile time if possible
- Added support for `Rebindable!T` in `isStronglyIsolated` and `isWeaklyIsolated` - [issue #421][issue421]
- Added `RecursiveTaskMutex`
- `Throwable` is now treated as weakly isolated to allow passing exceptions using `vibe.core.concurrency.send`
- `exitEventLoop` by default now only terminates the current thread's event loop and always works asynchronously
- `Session` is now a `struct` instead of a `class`
- Added support for storing arbitrary types in `Session`
- Moved the REST interface generator from `vibe.http.rest` to `vibe.web.rest`
- Added a new web interface generator (`vibe.web.web`), similar to `vibe.http.form`, but with full support for attribute based customization
- Added a compile time warning when neither `VibeCustomMain`, nor `VibeDefaultMain` versions are specified - starts the transition from `VibeCustomMain` to `VibeDefaultMain`
- Added `requireBoundsCheck` to the build description
- Added assertions to help debug accessing uninitialized `MongoConnection` values
- Added `logFatal` as a shortcut to `log` called with `LogLevel.fatal` (by Daniel Killebrew aka gittywithexcitement) - [pull #441][issue441]
- Empty JSON request bodies are now handled gracefully in the HTTP server (by Ryan Scott aka Archytaus) - [pull #440][issue440]
- Improved documentation of `sleep()` - [issue #434][issue434]
- The libevent2 and Win32 event drivers now outputs proper error messages for socket errors
- Changed `setTaskEventCallback` to take a delegate with a `Task` parameter instead of `Fiber`
- Added a `Task.taskCounter` property
- `AutoFreeListAllocator.realloc` can now reuse blocks of memory and uses `realloc` on the base allocator if possible
- HTML forms now support multiple values per key
- Inverted the `no_dns` parameter of `EventDriver.resolveHost` to `use_dns` to be consistent with `vibe.core.net.resolveHost` - [issue #430][issue430]
- `Task` doesn't `alias this` to `TaskFiber` anymore, but forwards just a selected set of methods
- Added `vibe.core.args.readRequiredOption - [issue #442][issue442]
- `NetworkAddress` is now fully `pure nothrow`
- Refactored the Redis client to use much less allocations and a much shorter source code
- Added `Bson.toString()` (by David Nadlinger aka klickverbot) - [pull #468][issue468]
- Added `connectTCP(NetworkAddress)` and `NetworkAddress.toString()` (by Stefan Koch aka Uplink_Coder) - [pull #485][issue485]
- Added `NetworkAddress.toAddressString` to output only the address portion (without the port number)
- Added `compileDietFileIndent` to generate indented HTML output
- Added Travis CI integration (by Martin Nowak) - [pull #486][issue486]
- Added `appendToFile` to conveniently append to a file without explicitly opening it (by Stephan Dilly aka extrawurst) - [pull #489][issue489]
- Tasks started before starting the event loop are now deferred until after the loop has been started
- Worker threads are started lazily instead of directly on startup
- Added `MongoCursor.limit()` to limit the amount of documents returned (by Damian Ziemba aka nazriel) - [pull #499][issue499]
- The HTTP client now sets a basic-auth header when the request URL contains a username/password (by Damian Ziemba aka nazriel) - [issue #481][issue481], [pull #501][issue501]
- Added `RedisClient.redisVersion` (by Fabian Wallentowitz aka fabsi88) - [pull #502][issue502]
- Implemented handling of doctypes other than HTML 5 in the Diet compiler (by Damian Ziemba aka nazriel) - [issue #505][issue505], [pull #509][issue509]
- Boolean attributes in Diet templates are now written without value for HTML 5 documents (by Damian Ziemba aka nazriel) - [issue #475][issue475], [pull #512][issue512]
- Empty "class" attributes in Diet templates are not written to the final HTML output (by Damian Ziemba aka nazriel) - [issue #372][issue372], [pull #519][issue519]
- Implemented PUB/SUB support for the Redis client (by Michael Eisendle with additional fixes by Etienne Cimon aka etcimon)
- The logging functions take now any kind of string instead of only `string` (by Mathias Lang aka Geod24) - [pull #532][issue532]
- Added `SMTPClientSettings.peerValidationMode` (by Stephan Dilly aka Extrawurst) - [pull #528][issue528]
- Diet templates that are set to `null` are now omitted in the HTML output (by Damian Ziemba aka nazriel) - [issue #520][issue520], [pull #521][issue521]
- Extended the REST interface generator to cope with any type of error response and to always throw a `RestException` on error (by Stephan Dilly aka Extrawurst) - [pull #533][issue533]
- Added support for [text blocks](http://jade-lang.com/reference/#blockinatag) in Diet templates (by Damian Ziemba aka nazriel) - [issue #510][issue510], [pull #518][issue518]
- Added `RedisClient.blpop` and changed all numbers to `long` to be in line with Redis (by Etienne Cimon aka etcimon) - [pull #527][issue527]
- Changed `WebSocket.receiveBinary` and `WebSocket.receiveText` to strictly expect the right type by default (by Martin Nowak) - [pull #543][issue543]
- Avoid using an exception to signal HTTP 404 errors for unprocessed requests, resulting in a large performance increas for that case
- Modernized the Diet templates used for the example projects (by Damian Ziemba aka nazriel) - [pull #551][issue551]
- Added WebDAV HTTP status codes to the `HTTPStatusCode` enum (by Dmitry Mostovenko aka TrueBers) - [pull #574][issue574]
- Added support for multiple recipient headers (including "CC" and "BCC") in `sendMail` (by Stephan Dilly aka Extrawurst) - [pull #582][issue582]
- Added support for comma separated recipients in `sendMail`
- Added SSL support for the MongoDB client (by Daniel Killebrew aka gittywithexcitement) - [issue #575][issue575], [pull #587][issue587]
- Made all overloads of `listenHTTPPlain` private (as they were supposed to be since a year)
- Added using `-version=VibeDisableCommandLineParsing` to disable default command line argument interpretation
- Added using `-version=VibeNoSSL` to disable using OpenSSL and added free functions to create SSL contexts/streams
- Functions in `vibe.data.json` now throw a `JSONException` instead of a bare `Exception` (by Luca Niccoli aka lultimouomo) - [pull #590][issue590]
- Functions in `vibe.http.websocket` now throw a `WebSocketException` instead of a bare `Exception` (by Luca Niccoli aka lultimouomo) - [pull #590][issue590]
### Bug fixes ###
- Fixed a condition under which a `WebSocket` could still be used after its handler function has thrown an exception - [issue #407][issue407]
- Fixed a `null` pointer dereference in `Libevent2TCPConnection` when trying to read from a closed connection
- Fixed the HTTP client to still properly shutdown the connection when an exception occurs during the shutdown
- Fixed `SSLStream` to perform proper locking for multi-threaded servers
- Fixed the signature of `TaskLocal.opAssign` - [issue #432][issue432]
- Fixed thread shutdown in cases where multiple threads are used - [issue #419][issue419]
- Fixed SIGINT/SIGTERM application shutdown - [issue #419][issue419]
- Fixed `HashMap` to properly handle `null` keys
- Fixed processing WebSocket requests sent from IE 10 and IE 11
- Fixed the HTTP client to assume keep-alive for HTTP/1.1 connections that do not explicitly specify something else (by Daniel Killebrew aka gittywithexcitement) - [issue #448][issue448], [pull #450][issue450]
- Fixed `Win32FileStream` to report itself as readable for `FileMode.createTrunc`
- Fixed a possible memory corruption bug for an assertion in `AllocAppender`
- Fixed clearing of cookies on old browsers - [issue #453][issue453]
- Fixed handling of `yield()`ed tasks so that events are guaranteed to be processed
- Fixed `Libevent2EventDriver.resolveHost` to take the local hosts file into account (by Daniel Killebrew aka gittywithexcitement) - [issue #289][issue289], [pull #460][issue460]
- Fixed `RedisClient.zcount` to issue the right command (by David Nadlinger aka klickverbot) - [pull #467][issue467]
- Fixed output of leading white space in the `HTMLLogger` - now replaced by ` `
- Fixed serialization of AAs with `const(string)` or `immutable(string)` keys (by David Nadlinger aka klickverbot) - [pull #473][issue473]
- Fixed double-URL-decoding of path parameters in `URLRouter`
- Fixed `URL.toString()` to output username/password, if set
- Fixed a crash caused by a double-free when an SSL handshake had failed
- Fixed `Libevent2UDPConnection.recv` to work inside of a `Task`
- Fixed handling of "+" in the path part of URLs (is *not* replaced by a space) - [issue #498][issue498]
- Fixed handling of `