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.
- Fixed compilation on DMD 2.068 (most fixes by Mathias Lang)
- Web interface generator (
vibe.web.web
)- Added support for
WebSocket
routes - issue #952 - 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
- Added support for
- REST interface generator (
vibe.web.rest
)- Removed support for
index()
methods (useget()
or@path("/")
) (by Mathias Lang) - pull #1010 - Deprecated the
@rootPath
attribute (use@path
instead) (by Mathias Lang) - pull #999
- Removed support for
- 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
andBson.opDispatch
for deprecation (useopIndex
instead) - Added
Bson.tryIndex
(by Marc Schütz) - pull #1032 - Added support for all standard HTTP methods (RFC) (by Szabo Bogdan) - pull #1068, pull #1082
- 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
andwriteFormBody
that accept ranges of key/value tuples (by Tobias Pankrath) - Added
HTTPClientResponse.switchProtocol
(by Luca Niccoli) - pull #945 listenHTTP
now returns aHTTPListener
instance that can be used to stop listening - issue #1074- Added an
AppenderResetMode
parameter toMemoryOutputStream.reset()
(by Etienne Cimon) - Changed
urlEncode
to only allocate if necessary (by Marc Schütz) - pull #1076 - Optimize multi-part form decoding for cases where "Content-Length" is given (by Etienne Cimon) - pull #1101
- Added serialization support for
std.typecons.BitFlags!T
- Removed the
HTTPRouter
interface (now just a compatibility alias toURLRouter
) (by Mathias Lang) - pull #1106 - Added
HTTPStatus.tooManyRequests
(by Jack Applegame) - pull #1103 - Added optional
code
andreason
parameters toWebSocket.close()
(by Steven Dwy) - pull #1107 - Added an optional copy+delete fallback to
moveFile()
(by Etienne Cimon and Martin Nowak) - Let
ConnectionProxyStream
work without an underlyingConnectionStream
(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 - The event loop of the win32 driver can now be stopped by sending a
WM_QUIT
message (by Денис Хлякин aka aka-demik) - pull #1120 - Marked
vibe.inet.path
aspure
and removed casts that became superfluous - Added an
InputStream
based overload ofHTTPServerResponse.writeBody
- Added all Redis modules to the
vibe.vibe
module - Added a version of
FixedRingBuffer.opApply
that supports an index (by Tomáš Chaloupka) - pull #1198
- Fixed listening on IPv6 interfaces for the win32 driver
- Fixed
URL.localURI
updating the query string and anchor parts properly - issue #1044 - 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 - 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 - Fixed unnecessarily closing HTTP client connections
- Fixed using
TCPConnection.close()
with a concurrentread()
operation (libevent driver) - Fixed parsing of HTTP digest authentication headers with different whitespace padding or differing case (by Денис Хлякин aka aka-demik) - pull 1083
- Fixed parsing various HTTP request headers case insensitively
- Fixed validation of untrusted certificates without
TLSPeerValidationMode.checkTrust
forOpenSSLStream
- 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, pull #1129 - Fixed running the TLS context setup for STARTTLS SMTP connections (by Nathan Christenson) - pull #1132
- Fixed JSON serialization of
const(Json)
(by Jack Applegame) - pull #1109 - 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 - Fixed
URL
's internal encoding of the path string (by Igor Stepanov) - pull #1148 - Fixed decoding query parameters in the REST interface generator (by Igor Stepanov) - pull #1143
- Fixed a possible range violation when writing long HTTP access log messages (by Márcio Martins) - pull #1156
- Fixed support of typesafe variadic methods in the REST interface generator (by Mathias Lang) - issue #1144, pull #1159
- Fixed
getConfig
,setConfig
andconfigResetStat
inRedisClient
(by Henning Pohl) - pull #1158 - 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
- Fixed
vibe.web.web.redirect()
to work properly for relative paths with query strings - Fixed invalid JSON syntax in dub.json - issue #1172
- Fixed
LibasyncFileStream
when used withFileMode.createTrunc
(by Etienne Cimon) - pull #1176 - Fixed
deserialize
when operating on a struct/class that is annotated with@asArray
(by Colden Cullen) - pull #1182 - Fixed parsing quoted HTTP multi part form boundaries (by Mathias L. Baumann aka Marenz) - pull #1183
- Fixed
LibasyncFileStream.peek()
to always returnnull
(by Etienne Cimon) - pull #1179 - Fixed
ThreadedFile.seek
for 32-bit Windows applications (libevent driver) - issue #1189 - Fixed parsing of relative
file://
URLs - Fixed a possible
RangeError
in the JSON parser (by Takaaki Seki) - pull #1199 - 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
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.
- 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
- Changed semantics of
TaskMutex
andTaskCondition
- this can be a breaking change for certain applications- The classes are now
nothrow
to stay forward compatible with D'sMutex
andCondition
classes, - Interruption using
Task.interrupt()
now gets deferred to the next wait/yield operation - The old behavior can be achieved using the new
InterruptipleTaskMutex
andInterruptibleTaskCondition
classes
- The classes are now
- Definition of either
VibeCustomMain
orVibeDefaultMain
is now a hard requirement - this is the final deprecation phase forVibeCustomMain
- Added an overload of
lowerPrivileges
that takes explicit user/group arguments (by Darius Clark) - pull #948 - Added
handleWebSocket
as a procedural alternative tohandleWebSockets
(by Luca Niccoli) - pull #946 - Added support for "msgctxt" in .po files for the
vibe.web.web
translation framework (by Nathan Coe) - pull #896 - Added overloads of
HTTPServerResponse.writeBody
andwriteRawBody
with an additional status code parameter (by Martin Nowak) - pull #980 - Added
@queryParam
and@bodyParam
to thevibe.web.rest
module (by Mathias Lang) - pull #969 - Added support for serving an "index.html" file when requesting a directory (by Martin Nowak) - pull #902
- Added policy based customization for
vibe.data.serialization
(by Luca Niccoli) - pull #937 - Added
SSLStream.peerCertificate
andHTTPServerRequest.clientCertificate
properties (by Rico Huijbers) - pull #965 - Added
RedisDatabase.zrangeByLex
(by Etienne Cimon) - pull #993 - Added support for HTTP digest authentication (by Kai Nacke aka redstar) - pull #1000
- Diet template features
- Added support for plain text lines starting with
<
(plain HTML lines) (by Kai Nacke aka redstar) - pull #1007 - Added support for default and "prepend" modes for blocks (help from Kai Nacke aka redstar) - issue #905, pull #1002
- Multiple "id" attributes are now explicitly disallowed (by Kai Nacke aka redstar) - pull #1008
- Added support for plain text lines starting with
- Fixed ping handling for WebSockets and added automatic keep-alive pinging (by Luca Niccoli) - pull #947
- Fixed wrapped texts in .po files for the
vibe.web.web
translation framework (by Nathan Coe) - pull #896 - Fixed a crash issue when storing a
Timer
in a class instance that does not get destroyed before application exit - issue #978 - Fixed
HTTPRouter.any
to match all supported HTTP verbs (by Szabo Bogdan) - pull #984 - Fixed setting
TCPConnection.localAddr
in the libasync driver (by Etienne Cimon) - issue #961, pull #962 - Fixed some cases of missing destructor calls in
vibe.utils.memory
(partially by Etienne Cimon) - pull #987 - Fixed some failed incoming SSL connection attempts by setting a default session context ID (by Rico Huijbers) - pull #970
- Fixed
RedisSessionStore.create()
(by Yusuke Suzuki) - pull #996 - Fixed HTML output of
//
style comments in Diet templates (by Kai Nacke) - pull #1004 - Fixed the error message for mismatched
@path
placeholder parameters invibe.web.rest
(by Mathias Lang aka Geod24) - issue #949, pull #1001 - Fixed parsing of hidden comments in Diet templates that have no leading space (by Kai Nacke) - pull #1012
- Fixed serialization of
const(Json)
values - Fixed handling of struct parameter types in
vibe.web.rest
that implicitly convert tostring
, but not vice-versa - Fixed HTTP request parsing with uppercase letters in the "Transfer-Encoding" header (by Szabo Bogdan) - pull #1015
- Fixed parsing of Diet attributes that are followed by whitespace - issue #1021
- Fixed parsing of Diet string literal attributes that contain unbalanced parenthesis - issue #1033
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.
- Added a new event driver based on the libasync native D event loop abstraction library (by Etienne Cimon) - pull #814
- Added support for
@headerParam
in the REST interface generator (by Mathias Lang aka Geod24) - pull #908 - Added
font/woff
as a recognized compressed MIME type to avoid redundant compression for HTTP transfers (by Márcio Martins) - pull #923 - The BSON deserialization routines now transparently convert from
long
toint
where required (by David Monagle) - pull #913
- 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 - Fixed conversion of
Bson.Type.undefined
toJson
(by Márcio Martins) - pull #922 - Fixed messages leaking past the end of a task to the next task handled by the same fiber (by Luca Niccoli) - pull #934
- Fixed various compilation errors and ICEs for DMD 2.065, GDC and LDC 0.14.0 (by Martin Nowak) - pull #901, pull #907, pull #927
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.
- 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 - 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 - Added support for a
@contentType
attribute for web interface methods (by Stefan Koch) - pull #684 - 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
- Added support for
- 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
todeleteAll
- 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 inRedisDatabase
generic instead ofstring
- issue #811 - Added support for
ubyte[]
as a return type for various Redis methods (by sinkuu) - pull #761
- Added some missing Redis methods and rename
- MongoDB database driver
MongoConnection.defaultPort
is now anushort
(by Martin Nowak) - pull #725- Added support for expiring indexes and dropping indexes/collections in the MongoDB client (by Márcio Martins) - pull #799
- Added
MongoClient.getDatabases
(by Peter Eisenhower) - pull #822 - Added an array based overload of
MongoCollection.ensureIndex
- issue #824 - Added
MongoCursor.skip
as an alternative to setting the skip value using an argument tofind
(by Martin Nowak) - pull 888
- 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
- Added
HTTPClientSettings.defaultKeepAliveTimeout
and handle the optional request count limit of keep-alive connections (by Etienne Cimon) - issue 744, pull #756 - 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
- Avoid using chunked encoding for
HTTPServerResponse.writeJsonBody
- issue #619 - 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
- Enabled the use of
shared
delegates forrunWorkerTask
and avoid creation of a heap delegate - Added support for more parameter types in
runTask
/runWorkerTask
by avoidingVariant
- Added an initial implementation of a
Future!T
(future/promise) invibe.core.concurrency
- Deprecated the output range interface of
OutputStream
, usevibe.stream.wrapper.StreamOutputRange
instead - Prefer
.toString()
tocast(string)
when converting values to string in Diet templates (changes howJson
values are converted!) - issue #714 - Added variants of the
vibe.utils.validation
functions that don't throw - Added
UDPConnection.close()
- Deprecated
registerFormInterface
andregisterFormMethod
- Added support for implicit parameter conversion of arguments passed to
runTask
/runWorkerTask
(by Martin Nowak) - pull #719 - Added
vibe.stream.stdio
for vibe.d compatible wrapping of stdin/stdout andstd.stdio.File
(by Eric Cornelius) - pull #729 - Added
vibe.stream.multicast.MultiCastStream
for duplicating a stream to multiple output streams (by Eric Cornelius) - pull #732 - Added support for an
inotify
based directory watcher in the libevent driver (by Martin Nowak) - pull #743 - Added support for
Nullable!T
invibe.data.serialization
- issue #752 - Added a constructor for
BsonObjectID
that takes a specific time stamp (by Martin Nowak) - pull #759 - Added output range based overloads of
std.stream.operations.readUntil
andreadLine
- Added
vibe.data.json.serializeToJsonString
- Added
vibe.inet.webform.formEncode
for encoding a dictionary/AA as a web form (by Etienne Cimon) - pull #748 BsonObjectID.fromString
now throws anException
instead of anAssertError
for invalid inputs- Avoid using initialized static array for storing task parameters (by Михаил Страшун aka Dicebot) - pull #778
- Deprecated the simple password hash functions due to their weak security - issue #794
- Added support for serializing tuple fields
- Added
convertJsonToASCII
to force escaping of all Unicode characters - see issue #809 - Added a parameter to set the information log format for
setLogFormat
(by Márcio Martins) - pull #808 - Serializer implementations now get the number of dictionary elements passed up front (by Johannes Pfau) - pull #823
- Changed
readRequiredOption
to not throw when the--help
switch was passed (by Jack Applegame) - pull #803 - 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 ofenforceHTTP
lazy
(by Mathias Lang aka Geod24) - pull #839 - 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
- Fixed BSON custom serialization of
const
classes - Fixed serialization of
DictionaryList
- issue #621 - 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 - Fixed iterating over
const(DictionaryList)
(by Mathias Lang aka Geod24) - pull #693 - Fixed an assertion in the HTTP file server that was triggered when drive letters were contained in the request path - pull #694
- 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
- Fixed
exitEventLoop()
to work when there is a busy tasks that callsyield()
- issue #720 - 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 useManualEvent
implicitly) - issue #663 - Fixed encoding of
StreamOutputRange.put(dchar)
(by sinkuu) - pull #733 - Fixed treating
undefined
JSON values asnull
when converting to a string - issue #735 - Fixed using an
id
parameter together with@path
in REST interfaces - issue #738 - Fixed handling of multi-line responses in the SMTP client (by Etienne Cimon) - pull #746
- 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
- Fixed
TaskLocal!T
top properly call destructors after a task has ended (by Etienne Cimon) - issue #753, pull #754 - Fixed the name of
RedisDatabase.zcard
(wasZcard
) - Fixed a possible race condition causing a hang in
MessageQueue.receive
/receiveTimeout
(by Ilya Lyubimov) - pull #760 - Fixed
RangeCounter
to behave properly when inserting singlechar
values - Fixed
RedisDatabase.getSet
(by Stephan Dilly) - pull #769 - 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
- Fixed output of line breaks in the Markdown compiler
- Fixed handling of the
key
argument ofgetRange
,lrem
andzincrby
inRedisDatabase
(by sinkuu) - pull #772 - Fixed handling of
Nullable!T
andisISOExtStringSerializable
parameters in REST interfaces - Fixed escaping of Diet tag attributes with string interpolations (by sinkuu) - pull #779
- Fixed handling a timeout smaller or equal to zero (infinity) for
RedisSubscriber.blisten
(by Etienne Cimon aka etcimon) - issue #776, pull #781 - Fixed handling of Unicode escape sequences in the JSON parser (by Etienne Cimon aka etcimon) - pull #782
- Fixed
HTTPServerRequest.fullURL
for requests without aHost
header - issue #786 - Fixed
RedisClient
initialization for servers that require authentication (by Pedro Yamada aka yamadapc) - pull #785 - Fixed the JSON parser to not accept numbers containing ':'
- Removed an invalid assertion in
HTTPServerResponse.writeJsonBody
- issue #788 - Fixed handling of explicit "identity" content encoding in the HTTP client (by sinkuu) - pull #789
- Fixed
HTTPServerRequest.fullURL
for HTTPS requests with a non-default port (by Arjuna aka arjunadeltoso) - pull #790 - Fixed detection of string literals in Diet template attributes - issue #792
- Fixed output of Diet attributes using
'
as the string delimiter - Fixed detection of numeric types in
BsonSerializer
(do not treatNullable!T
as numeric) - Fixed the REST interface client to accept 201 responses (by Yuriy Glukhov) - pull #806
- Fixed some potential lock related issues in the worker task handler loop
- Fixed memory corruption when
TCPListenOptions.disableAutoClose
is used and theTCPConnection
outlives the accepting task - issue #807 - Fixed a range violation when parsing JSON strings that end with
[
or{
- issue #805 - Fixed compilation of
MongoCollection.aggregate
and support passing an array instead of multiple parameters - issue #783 - Fixed compilation and formatting issues in the HTTP logger (by Márcio Martins) - pull #808
- Fixed assertion condition in
DebugAllocator.realloc
- Fixed shutdown when daemon threads are involved - issue #758
- Fixed some serialization errors for structs with variadic constructors or properties or with nested type declarations/aliases (by Rene Zwanenburg) - pull #817, issue #818, pull #819
- 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 - Fixed using
TaskLocal!T
with types that have certain kinds of "copy constructors" - issue #825 - Fixed
-version=VibeNoSSL
(by Dragos Carp) - pull #834 - Use "bad request" replies instead of "internal server error" for various cases where a HTTP request is invalid (by Marc Schütz) - pull #827
- Removed a leading newline in compiled Diet templates
- Fixed serialization of nested arrays as JSON (by Rene Zwanenburg) - issue #840, pull #841
- Fixed OpenSSL error messages in certain cases (by Andrea Agosti) - pull #796
- Fixed parsing of MongoDB URLs containing
/
in the password field (by Martin Nowak) - pull #843 - Fixed an assertion in
TCPConnection.waitForData
when called outside of a task (libevent) - issue #829 - Fixed an
InvalidMemoryOperationError
inHTTPClientResponse.~this()
- Fixed a memory corruption issue for HTTPS servers (by Etienne Cimon) - issue #846, pull #849
- Fixed low-precision floating point number output in
JsonStringSerializer
- Fixed compilation in release mode (not recommended for safety reasons!) - issue #847
- 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 - Fixed the Redis subscriber implementation (by Etienne Cimon) - issue #855, pull #815
- Fixed compilation of the
Isolated!T
framework - issue #801 - Fixed an
InvalidMemoryOperationError
inDebugAllocator
(by Etienne Cimon) - pull #848 - Fixed detection of numeric types in
JsonSerializer
(do not treatNullable!T
as numeric) (by Jack Applegame) - issue #686, pull #869 - Fixed error handling in
Win32TCPConnection.connect
and improved error messages - Fixed ping handling of WebSocket ping messages (by Vytautas Mickus aka Eximius) - pull #883
- Fixed always wrapping the e-mail address in angular brackets in the SMTP client (by ohenley) - pull #887
- Fixed custom serialization of
const
instances (by Jack Applegame) - pull #879 - Fixed the
RedisDatabase.set*X
to properly test the success condition (by Stephan Dilly aka Extrawurst) - pull #890 - Fixed
sleep(0.seconds)
to be a no-op instead of throwing an assertion error - Fixed a potential resource leak in
HashMap
by usingfreeArray
instead of directly deallocating the block of memory (by Etienne Cimon) - pull #893
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.
- Web interface generator and Diet template system
- Added
vibe.web.web.terminateSession()
andredirect()
- Added support for
struct
and array parameters, as well asNullable!T
invibe.web.web
- Added the
@errorDisplay
annotation tovibe.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
- Added
- 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
- Implemented a new match tree based routing algorithm for
- 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 - Made
DictionaryList
serializable as an array by addingtoRepresentation
/fromRepresentation
- issue #621
- Added
- 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
- Changed the default from
SSLVersion.tls1
(fixed TLS 1.0) toSSLVersion.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
- Added
- 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 - Added
createTestHTTPServerRequest
andcreateTestHTTPServerResponse
to support writing unit tests - Added
vibe.core.file.readFile
,readFileUTF8
,writeFile
andwriteFileUTF8
- Added a limited overload of
RedisDatabase.zrevRangeByScore
and fix the type of thestart
/end
parameters (by Jens K. Mueller) - pull #637 - Added
TCPListenOptions.disableAutoClose
to make incoming TCP connections independent of the initial handler task - Added
vibe.core.concurrency.thisTid
as an alias toTask.getThis()
for improved API compatibility tostd.concurrency
- Added an overload of
UDPConnection.recv
taking a timeout parameter - issue #540 - Added
toString
toHTTPRequest
andHTTPResponse
for convenient logging - Added
MarkdownSettings
with additional support of setting the base heading level of the generated HTML - Added
TCPConnection.keepAlive
to set theSO_KEEPALIVE
option - issue #622 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
withrender
- Removed unused variables and made
Bson.toString
const
(thanks to Brian Schott aka Hackerpilot) - issue #659
- 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 aDictionaryList
- Fixed
@byName
to work for serializing (associative) arrays of enums - Fixed SSL based SMTP connections (by Martin Nowak) - pull #609
- Fixed Diet text blocks (
tag.
style) to properly remove the input file indentation - issue #614 - Fixed
isStronglyIsolated!T
to work for interface types - Fixed
filterURLEncode
to encode certain special characters (such as "{") - issue #632 - Fixed a crash when accessing vibe.d event functionality from within
shared static ~this
- Fixed
Task.join
andTask.interrupt
to work when called from outside of the event loop (e.g. whenprocessEvents
is used instead ofrunEventLoop
) - issue #443 - Fixed serialization of
const
class instances (by Jack Applegame) - issue #653 - Fixed compilation of
renderCompat!()
on GDC (invalid use ofva_list
/void*
) - Fixed handling of paths with empty path entries (e.g. "/some///path") - issue #410
- Fixed a crash caused by
GCAllocator
-GC.extend
is now used instead ofGC.realloc
to sidestep the issue - issue #470 - 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
- Fixed output of empty lines in "tag." style Diet template text blocks
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.
- 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)
- Removed the old
EventedObject
interface - Implemented support for string includes in Diet templates (idea by Stefan Koch aka Uplink_Coder) - issue #482
- 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
andconnected
-empty
is generally useful for read loops andconnected
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
andsslCertFile
fields fromHTTPServerSettings
- Removed the compatibility alias
Signal
(alias forManualEvent
) :htmlescape
in Diet templates is now processed at compile time if possible- Added support for
Rebindable!T
inisStronglyIsolated
andisWeaklyIsolated
- issue #421 - Added
RecursiveTaskMutex
Throwable
is now treated as weakly isolated to allow passing exceptions usingvibe.core.concurrency.send
exitEventLoop
by default now only terminates the current thread's event loop and always works asynchronouslySession
is now astruct
instead of aclass
- Added support for storing arbitrary types in
Session
- Moved the REST interface generator from
vibe.http.rest
tovibe.web.rest
- Added a new web interface generator (
vibe.web.web
), similar tovibe.http.form
, but with full support for attribute based customization - Added a compile time warning when neither
VibeCustomMain
, norVibeDefaultMain
versions are specified - starts the transition fromVibeCustomMain
toVibeDefaultMain
- Added
requireBoundsCheck
to the build description - Added assertions to help debug accessing uninitialized
MongoConnection
values - Added
logFatal
as a shortcut tolog
called withLogLevel.fatal
(by Daniel Killebrew aka gittywithexcitement) - pull #441 - Empty JSON request bodies are now handled gracefully in the HTTP server (by Ryan Scott aka Archytaus) - pull #440
- Improved documentation of
sleep()
- issue #434 - The libevent2 and Win32 event drivers now outputs proper error messages for socket errors
- Changed
setTaskEventCallback
to take a delegate with aTask
parameter instead ofFiber
- Added a
Task.taskCounter
property AutoFreeListAllocator.realloc
can now reuse blocks of memory and usesrealloc
on the base allocator if possible- HTML forms now support multiple values per key
- Inverted the
no_dns
parameter ofEventDriver.resolveHost
touse_dns
to be consistent withvibe.core.net.resolveHost
- issue #430 Task
doesn'talias this
toTaskFiber
anymore, but forwards just a selected set of methods- Added `vibe.core.args.readRequiredOption - issue #442
NetworkAddress
is now fullypure 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 - Added
connectTCP(NetworkAddress)
andNetworkAddress.toString()
(by Stefan Koch aka Uplink_Coder) - pull #485 - 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
- Added
appendToFile
to conveniently append to a file without explicitly opening it (by Stephan Dilly aka extrawurst) - pull #489 - 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 - The HTTP client now sets a basic-auth header when the request URL contains a username/password (by Damian Ziemba aka nazriel) - issue #481, pull #501
- Added
RedisClient.redisVersion
(by Fabian Wallentowitz aka fabsi88) - pull #502 - Implemented handling of doctypes other than HTML 5 in the Diet compiler (by Damian Ziemba aka nazriel) - issue #505, pull #509
- Boolean attributes in Diet templates are now written without value for HTML 5 documents (by Damian Ziemba aka nazriel) - issue #475, pull #512
- Empty "class" attributes in Diet templates are not written to the final HTML output (by Damian Ziemba aka nazriel) - issue #372, pull #519
- 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 - Added
SMTPClientSettings.peerValidationMode
(by Stephan Dilly aka Extrawurst) - pull #528 - Diet templates that are set to
null
are now omitted in the HTML output (by Damian Ziemba aka nazriel) - issue #520, pull #521 - 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 - Added support for text blocks in Diet templates (by Damian Ziemba aka nazriel) - issue #510, pull #518
- Added
RedisClient.blpop
and changed all numbers tolong
to be in line with Redis (by Etienne Cimon aka etcimon) - pull #527 - Changed
WebSocket.receiveBinary
andWebSocket.receiveText
to strictly expect the right type by default (by Martin Nowak) - pull #543 - 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
- Added WebDAV HTTP status codes to the
HTTPStatusCode
enum (by Dmitry Mostovenko aka TrueBers) - pull #574 - Added support for multiple recipient headers (including "CC" and "BCC") in
sendMail
(by Stephan Dilly aka Extrawurst) - pull #582 - Added support for comma separated recipients in
sendMail
- Added SSL support for the MongoDB client (by Daniel Killebrew aka gittywithexcitement) - issue #575, pull #587
- 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 aJSONException
instead of a bareException
(by Luca Niccoli aka lultimouomo) - pull #590 - Functions in
vibe.http.websocket
now throw aWebSocketException
instead of a bareException
(by Luca Niccoli aka lultimouomo) - pull #590
- Fixed a condition under which a
WebSocket
could still be used after its handler function has thrown an exception - issue #407 - Fixed a
null
pointer dereference inLibevent2TCPConnection
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 - Fixed thread shutdown in cases where multiple threads are used - issue #419
- Fixed SIGINT/SIGTERM application shutdown - issue #419
- Fixed
HashMap
to properly handlenull
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, pull #450
- Fixed
Win32FileStream
to report itself as readable forFileMode.createTrunc
- Fixed a possible memory corruption bug for an assertion in
AllocAppender
- Fixed clearing of cookies on old browsers - issue #453
- 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, pull #460 - Fixed
RedisClient.zcount
to issue the right command (by David Nadlinger aka klickverbot) - pull #467 - Fixed output of leading white space in the
HTMLLogger
- now replaced by
- Fixed serialization of AAs with
const(string)
orimmutable(string)
keys (by David Nadlinger aka klickverbot) - pull #473 - 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 aTask
- Fixed handling of "+" in the path part of URLs (is not replaced by a space) - issue #498
- Fixed handling of
<style>
tags with inline content in the Diet compiler - issue #507 - Fixed some possible sources for stale TCP sockets when an error occurred in the close sequence
- Fixed the Win64 build (using the "win32" driver) that failed due to user32.dll not being linked
- Fixed
URLRouter
to expose all overloads ofmatch()
- see also pull #535 - Fixed deserialization of unsigned integers in the BSON serializer (by Anton Gushcha aka NCrashed) - issue #538, pull #539
- Fixed deserialization of unsigned integers in the JSON serializer
- Fixed serialization of nested composite types in the JSON serializer
- Fixed two bogus assertions in the win32 event driver (one in the timer code and one for socket events after a socket has been closed)
- Fixed
WebSocket.waitForData
to always obey the given timeout value (by Martin Nowak) - issue #544, pull #545 - Fixed the high level tests in the "tests/" directory (by Mathias Lang aka Geod24) - pull #541
- Fixed
HashMap
to always use the suppliedTraits.equals
for comparison - Fixed the example projects and switched from "package.json" to "dub.json" (by Mathias Lang aka Geod24) - pull #552
- Fixed emitting an idle event when using
processEvents
to run the event loop - Fixed
Path.relativeTo
to retain a possible trailing slash - Fixed image links with titles in the Markdown compiler (by Mike Wey) - pull #563
- Fixed a possible stale TCP connection after finalizing a HTTP client request had failed
- Fixed
makeIsolated
to work for structs - Fixed
listenHTTP
to throw an exception if listening on all supplied bind addresses has failed - Fixed a possible crash or false pointers in
HashMap
due to a missing call toGC.removeRange
- issue #591 - Fixed non-working disconnect of keep-alive connections in the HTTP server (by Stephan Dilly aka Extrawurst) - pull #597
- Fixed a possible source for orphaned TCP connections in the libevent driver
- Fixed
exitEventLoop
to work when called in a task that has been started just beforerunEventLoop
was called - Fixed
isWeaklyIsolated
to work properly for interface types (by Luca Niccoli aka lultimouomo) - pull #602 - Fixed the
BsonSerializer
to correctly serializeSysTime
as aBsonDate
instead of as astring
Note that some fixes have been left out because they are related to changes within the development cycle of this release.
The new release adds support for DMD 2.064 and contains an impressive number of almost 90 additions and bug fixes. Some notable improvements are a better serialization system, reworked WebSocket support, native MongoDB query sorting support and vastly improved stability of the HTTP client and other parts of the system.
- Compiles using DMD 2.064 (and DMD 2.063.2)
- Added
vibe.data.serialization
with support for annotations to control serialization (replaces/extends the serialization code invibe.data.json
andvibe.data.bson
) - Added range based allocation free (de-)serialization for JSON strings and more efficient BSON serialization
- Added
File.isOpen
- Added a
ConnectionStream
interface from whichTCPConnection
andTaskPipe
now derive - Added
BsonDate.fromStdTime
and improve documentation to avoid time zone related bugs - Added a
TaskMutex.this(Object)
constructor to be able to use them as object monitors - Added a non-blocking (infinitely buffering) mode for
TaskPipe
- Added (de)serialization support for AAs with string serializable key types (with
toString
/fromString
methods) (by Daniel Davidson) - pull #333 - Added (de)serialization support for scalar types as associative array keys
- Added
setLogFormat
as a more flexible replacement forsetPlainLogging
- Added
MongoCollection.aggregate()
(by Jack Applegame) - pull #348 - Added
WebSocket.request
to enable access to the original HTTP request and add scoped web socket callbacks for avoiding GC allocations - Added
HTTPServerRequest.clientAddress
to get the full remote address including the port - issue #357 - Added
vibe.stream.wrapper.ProxyStream
to enable dynamically switching the underlying stream - Added
vibe.stream.wrapper.StreamInputRange
to provide a buffered input range interface for anInputStream
- Added
vibe.stream.wrapper.ConnectionProxyStream
that allows wrapping aConnectionStream
along with aStream
to allow forwarding connection specific functionality together with a wrapped stream - Added
URL
based overloads forHTTPServerResponse.redirect
andstaticRedirect
- Added
RedisClient.hset
(by Martin Mauchauffée aka moechofe) - pull #386 - Added a WebSockets example project
- Added
MongoCursor.sort
to allow sorted queries using the same syntax as other MongoDB drivers (by Jack Applegame) - pull #353 - Added random number generators suited for cryptographic applications, which is now used for session ID generation (by Ilya Shipunov) - pull #352, pull #364, issue #350
- Added parameter and return value modifier user attributes for the REST interface generator and refactor meta programming facilities (by Михаил Страшун aka Dicebot) - pull #340, pull #344, pull #349
- Added
vibe.stream.operations.pipeRealtime
for piping stream data with a defined maximum latency OutgoingWebSocketMessage
is now automatically finalizedHTTPServerResponse.switchProtocol
now returns aConnectionStream
to allow controlling the underlying TCP connectionHTTPServerResponse.startSession
now sets the "HttpOnly" attribute by default to better prevent session theft (by Ilya Shipunov) - issue #368, pull #373HTTPServerResponse.startSession
now automatically sets the "Secure" attribute by default when a HTTPS connection was used to initiate the session - issue #368- Implemented Scalate whitespace stripping syntax for Diet templates (by Jack Applegame) - pull #362
htmlAttribEscape
and friends now also escape single quotes (') - issue #377vibe.stream.operations.readAll()
now preallocates if possible- Optimized HTML escaping performance (by Martin Nowak) - pull #327
- Adjusted naming of
Bson.Type
andJson.Type
members for naming conventions render!()
for rendering Diet templates is assumed to be safe starting with DMD 2.064- Improved
Json
usability by enabling~=
and some more use cases for~
- Added a workaround for excessive compile times for large static arrays (by Martin Nowak) - pull #341
- Improved the HTTP reverse proxy by handling HEAD requests correctly, avoiding GC allocations and optionally disabling transfer compression
HashMap
now moves elements when resizing instead of copying- Added a new mode for
parseRFC5322Header
that outputs multiple fields with the same value as separate fields instead of concatenating them as per RFC 822 and use the new behavior for the HTTP server - issue #380 ThreadedFileStream
now usesyield()
to avoid stalling the event loop- Improved the performance of
yield()
by using a singly linked list instead of a dynamic array to store yielded tasks (incl. bugfix by Martin Nowak, see pull #402 and issue #401)
- Fixed wrongly triggering assertions on Windows when
INVALID_SOCKET
is returned - Fixed issues with
vibe.stream.zlib
by reimplementing everything using zlib directly instead ofstd.zlib
- Fixed an exception in the HTTP file server when downloading a compressed file with no content transfer encoding requested
- Fixed compilation in release and unit test modes
- Fixed a data corruption bug caused by changed alignment in memory returned by
GC.realloc
- Fixed the libevent driver to avoid infinite buffering of output data - issue #191
- Fixed (de)serialization of BSON/JSON with (to/from)(String/Json) methods (by Jack Applegame) - pull #309
- Fixed possible finalization errors and possible interleaved requests in
HTTPClient.request
- Fixed a possible access violation in
Libevent2TCPConnection
when the connection was closed by the remote peer - issue #321 - Fixed
Win32TCPConnection.connect
to wait for the connection to be established (and throw proper exceptions on failure) - Fixed HTTP client requests for URLs with an empty path component (ending directly with the host name)
- Fixed out-of-range errors when parsing JSON with malformed keywords
- Fixed an exception when disconnecting HTTP client connections where the remote has already disconnected
- Fixed
vibe.core.args.getOption
to return true when an option was found (by Martin Nowak) - pull #331 - Fixed command line options to have precedence over configuration settings for
getOption
- Fixed
Cookie.maxAge
having no effect (by Jack Applegame) - pull #334, issue #330 - Fixed request/response delays in
Libevent2TCPConnection
(by Martin Nowak) - issue #338 - Fixed conditional use of
std.net.isemail
to validate emails - Fixed an assertion triggering for very small wait timeouts
- Fixed markdown
[ref][]
style links (by Martin Nowak) - pull #343 - Fixed cache headers in the HTTP file server and sending a "Date" header for all HTTP server responses
- Fixed interleaved HTTP client requests when dropping a previous response has failed for some reason
- Fixed opening files with
FileMode.readWrite
andFileMode.createTrunc
to allow both, reading and writing - issue #337, issue #354 - Fixed documentation of some parameters - issue #322
- Fixed
HTTPServerRequest.fullURL
to properly set the port - issue #365 - Fixed
vibe.core.concurrency.send
/receive
in conjunction withimmutable
values - Fixed an assertion in
Libevent2ManualEvent
caused by an AA bug - Fixed a possible crash in
Libevent2ManualEvent
when using deterministic destruction - Fixed a resource/memory leak in the libevent2 driver
- Fixed the "http-request" example to use the recommended
requestHTTP
function - issue #374 - Fixed appending of
Path
values to preserve the trailing slash, if any - Fixed deserialization of JSON integer values as floating point values as FP values often end up without a decimal point
- Fixed
yield()
to be a no-op when called outside of a fiber - Fixed a crash when WebSockets were used over a HTTPS connection - issue #385
- Fixed a crash in
SSLStream
that occurred when the server certificate was rejected by the client - issue #384 - Fixed a number of bogus error messages when a connection was terminated before a HTTP request was fully handled
- Fixed the console logger to be disabled on Windows application without a console (avoids crashing)
- Fixed
HTTPLogger
avoid mixing line contents by using a mutex - Fixed the semantics of
WebSocket.connected
and addedWebSocket.waitForData
- issue #370 - Fixed a memory leak and keep-alive connection handling in the HTTP client
- Fixed settings of path placeholder values when "*" is used in
URLRouter
routes - Fixed a memory leak where unused fibers where never recycled
- Fixed handling "Connection: close" HTTP client requests
- Fixed the WebSockets code to accept requests without "Origin" headers as this is only required for web browser clients - issue #389
- Fixed the markdown compiler to be CTFEable again (by Martin Nowak) - see pull #398
- Fixed fixed markdown named links containing square brackets in their name - see pull #399
- Fixed a crash (finalization error) in the HTTP client when an SSL read error occurs
- Fixed a race condition during shutdown in
Libevent2ManualEvent
- Fixed the
Task.this(in Task)
constructor to preserve the task ID
This release fixes compiling on DMD 2.063.2 and DMD HEAD and performs a big API cleanup by removing a lot of deprecated functionality and deprecating some additional symbols. New is also a better task local storage support, a SyslogLogger class and a number of smaller additions and bug fixes.
- Compiles using DMD 2.063.2 and DMD HEAD
- Removed a big chunk of deprecated functionality and marked declarations "scheduled for deprecation" as actually deprecated
- Implemented
TaskPipe
to support piping of data between tasks/threads (usable for converting synchronous I/O to asynchronous I/O) - Implemented
TaskLocal!T
for faster and safer task local storage - Implemented a
SyslogLogger
class (by Jens K. Mueller) - pull #294 - Implement support for transferring pre-compressed files in the HTTP file server (by Jens K. Mueller) - pull #270
- Implemented a first version of
writeFormBody
(by Ben Gradham aka SerialVelocity) - pull #288 - Implemented
vibe.inet.message.decodeMessage
for decoding an internet message body - Implemented a moving
opCast
forIsolatedRef!T
to allow safe casting to base or derived classes and a booleanopCast
to allow checking fornull
- Implemented a basic version of a WinRT based driver
- Added
localAddress
andremoteAddress
properties toTCPConnection
- Added
localAddress
property and aconnect(NetworkAddress)
overload toUDPConnection
- Added
localAddress
property toHTTPClientRequest
- Added
setTaskEventCallback
to support task level debugging - Added
RedisClient.rpush
andRedisClient.rpushx
(by Martin Mauchauffée aka moechofe) - pull #280 - Added a write buffer size limit to
ChunkedOutputStream
- Added
HTTPClientResponse.disconnect
to force disconnecting the client during request handling - Deprecated the
index()
special method for the REST interface generator in favor of@path
(by Михаил Страшун aka Dicebot) MongoDatabase.runCommand
is now publicly accessible - issue #261- Cookies are now cleared on the client if set to
null
(by Sergey Shamov) - pull #293 - The optional
do_flush
argument ofOutputStream.write
has been removed - flushing needs to be done explicitly now
- Fixed the HTTP file server to ignore directories (so that other handlers can e.g. generate an index page) - issue #256
- Fixed BSON/JSON (de)serialization of string type enum values
- Fixed inversion of boolean values when converting from
Json
toBson
(by Nicolas Sicard aka biozic) - pull #260 - Fixed a possible source for memory corruption by making allocators shared between threads
- Fixed
parseRFC822DateTimeString
(by Nathan M. Swan) - pull #264 - Fixed
adjustMethodStyle
to cope with non-ASCII characters and fixed conversion of identifiers starting with acronyms - Fixed preferring compression over non-chunked transfer when both are requested for
HTTPServerResponse.bodyWriter
(by Jens K. Mueller) - pull #268 - Fixed assertion in
HTTPClientReponse.~this
(was causing anInvalidMemoryOperationError
instead of the expectedAssertError
) - issue #273 - Fixed the VibeDist support code to match the latest VibeDist version (still WIP)
- Fixed
validateIdent
to properly check validity of the first character - Fixed handling of RFC2616 HTTP chunk extensions (ignoring them for now, by Nathan M. Swan) - pull #274
- Fixed
RedisClient.smembers
(by Nicolas Sigard aka biozic) - pull #277 - Fixed
RedisClient.echo
andRedisClient.lpop
(by Martin Mauchauffée aka moechofe) - pull #279 - Fixed
FixedRingBuffer.put
(used for message passing) - Fixed handling of out-of-memory situations in
MallocAllocator
- Fixed sending of
Isolated!T
values usingvibe.core.concurrency
- Fixed several concurrency related bugs in
ChunkedOutputStream
andLibevent2ManualEvent
- Fixed handling of the
max_lenger
parameter invalidateEmail
(by Mike Wey) - pull #296 - Fixed possible failed listen attempts in the example projects - issue #8, issue #249, issue #298
- Fixed compilation of the libevent2 driver on Win64
This release finally features support for DMD 2.063. It also contains two breaking changes by removing support for the "vibe" script (aka VPM) and switching to an implicit task ownership model for streams (no more explicit acquire/release). It requires DUB 0.9.15 or later to build.
- Fiber ownership of network connections and file streams is now handled implicitly to be more in line with classic blocking I/O and to lower the code overhead to share/pass connections between threads
- Removed support for the "vibe" script (aka "VPM") in favor of DUB
- Uses external Deimos packages instead of the included copies for binding to external C libraries
- Improvements on the REST interface front (by Михаил Страшун aka Dicebot):
registerRestInterface
deduces the base interface from a passed class instance- New overload of
registerRestInterface
for use with@rootPath
- Added an overload of
handleWebSockets
that takes a function pointer - Improved documentation of
vibe.core.log
and re-enabled logging of date/time to plain text log files - Compiles with the release version of DMD 2.063 (various authors involved)
- The idle handler is now called after processing all events in a spinning round after
yield()
call - Added
serveStaticFile
in addition toserveStaticFiles
- issue #227 - The thread/fiber ID is logged again by default if verbose logging is enabled
- Fixed "INCR" and "DECR" methods in the Redis client - issue #200, issue #206
- Fixed the utility
HashMap
to properly callGC.addRange
on manually allocated memory - Fixed erroneous crosstalk between multiple
ManualEvent
instances in the libevent driver - Fixed self-sending of messages to the caller in
vibe.core.concurrency
- Fixed syntax errors in the documentation of
URLRouter
- issue #223 - Fixed calling the HTML logger from a thread that is not registered with the D runtime
- Fixed
exitEventLoop
with no call toenableWorkerThreads
, as well as when called from the idle handler - Fixed
HTTPServerRequest.path
to contain the URL-decoded version of the path - issue #229 - Fixed
URLRouter
to not extract parameters of partial matches - issue #230 - Fixed documentation example of
registerFormInterface
- Fixed lax indentation style checking in the Diet template compiler
- Fixed unit tests for
parseMongoDBUrl
after the recently added support for digest authentication - Fixed construction of
Bson.Type.Regex
Bson
objects (by Rene Zwanenburg) - issue #238 - Fixed handling of Windows UNC paths - See DUB issue #75
- Fixed the Redis methods taking varargs - issue #234
- Fixed failure to free memory after an
SSLStream
has failed to initiate the tunnel
This release cleans up the API in several places (scheduling some symbols for deprecation) and largely improves the multi-threading primitives. It also features initial support for Win64 and a revamped logging system, as well as authentication support for the MongoDB client and a lot of smaller enhancements.
- Improved the logging system with pluggable loggers, more specified verbose log levels, an HTML logger, and proper use of stdout/stderr
- Added basic compile support for 64-bit Windows (using the "win32" driver)
- Add a scoped alternative version of
vibe.core.concurrency.lock
(used for safe access toshared
objects with unshared methods) - Add support to repeat the idle event until a new message arrives
- Task is now weakly isolated and can thus be passed to other threads using
runWorkerTask
- Implemented digest authentication in the MongoDB client (by Christian Schneider aka HowToMeetLadies) - pull #218
- The number of worker threads is now
core.cpuid.threadsPerCPU
TaskMutex
is now fully thread safe and has much lower overhead when no contention happensTaskCondition
now also works with a plainMutex
in addition to aTaskMutex
- Removed the deprecated
Mutex
alias - Renamed
Signal
toManualEvent
to avoid confusion with other kinds of "signals" MemoryStream
now supports dynamically growing to the buffer limitHttpServer
will now drop incoming connections that don't send data within 10 seconds after the connection has been established- Added a new
createTimer
overload that doesn't automatically arm the timer after creation exitEventLoop
now by default also shuts down the worker threads (ifenableWorkerThreads
was called)- Added new command line options "--vv", "--vvv" and "--vvvv" to specify more verbose logging
- Added connection pooling to the Redis client (by Junho Nurminen aka jupenur) - pull #199
- Various documentation improvements and better adherence to the style guide
- Compiles with DMD 2.063 (mostly by Vladimir Panteleev aka CyberShadow) - pull #207
- All examples now use exact imports rather than using
import vibe.vibe;
orimport vibe.d;
- Moved basic WWW form parsing from
vibe.http.form
tovibe.inet.webform
to reduce intermodule dependencies and improve compile time - MongoDB URL parsing code uses
vibe.inet.webform
to parse query string arguments now instead ofstd.regex
- improves compile time - Much more complete REST interface generator example (by Михаил Страшун aka Dicebot) - pull #210
- Updated OpenSSL DLLs to 1.0.1e (important security fixes)
- Renamed
EventedObject.isOwner
toamOwner
- Improved intermodule dependencies, configuration option/file handling and added
pragma(lib)
(using "--version=VibePragmaLib") for more comfortable building without dub/vibe (by Vladimir Panteleev aka CyberShadow) - pull #211 - Implemented an automatic command line help screen (inferred from calls to
vibe.core.args.getOption
) - Added meaningful error messages when the connection to a MongoDB or Redis server fails
- Deprecated
vibe.http.server.startListening
, which is not necessary anymore
- Fixed
vibe.core.concurrency.receiveTimeout
to actually work at all - Fixed
Win32Timer.stop
to reset thepending
state and allow repeated calls - Fixed
HttpClient
to avoid running into keep-alive timeouts (will close the connection 2 seconds before the timeout now) - Fixed
HttpClient
to properly handle responses without a "Keep-Alive" header - Fixed
isWeaklyIsolated
for structs containing functions - Fixed all invalid uses of
countUntil
wherestd.string.indexOf
should have been used instead - issue #205 - Fixed spelling of the "--distport" command line switch and some documentation - pull #203, pull #204
- Fixed spurious error messages when accepting connections in the libevent driver (by Vladimir Panteleev aka CyberShadow) - pull #207
- Fixed adjusting of method names in the REST interface generator for sub interfaces (by Михаил Страшун aka Dicebot) - pull #210
- Fixed falling back to IPv4 if listening on IPv6 fails when calling
listenTCP
without a bind address - Fixed
Libevent2MenualEvent.~this
to not access GC memory which may already be finalized - Fixed
Win32TCPConnection.peerAddress
andWin32UDPConnection.bindAddress
- Partially fixed automatic event loop exit in the Win32 driver (use -version=VibePartialAutoExit for now) - pull #213
- Fixed
renderCompat
to work withconst
parameters - Fixed an error in the Deimos bindings (by Henry Robbins Gouk) - pull #220
- Fixed a compilation error in the REST interface client (multiple definitions of "url__")
A lot has been improved on the performance and multi-threading front. The HTTP server benchmark jumped from around 17k req/s up to 48k req/s on a certain quad-core test system and >10k connections can now be handled at the same time (on 64-bit systems due to virtual memory requirements).
- Performance tuning for the HTTP server and client
- Implemented distributed listening and HTTP server request processing (using worker threads to accept connections)
- Stable memory usage for HTTP client and server (tested for 50 million requests)
- Implemented new
TaskMutex
andTaskCondition
classes deriving from Druntime'sMutex
andCondition
for drop-in replacement - Added a simplified version of the
std.concurrency
API that works with vibe.d's tasks (temporary drop-in replacement) - Added support for customizing the HTTP method and path using UDAs in the REST interface generator (by Михаил Страшун aka Dicebot) - pull #189
vibe.core.mutex
andvibe.core.signal
have been deprecated- Added support for WebDAV specific HTTP methods - see also issue #109
- Compiles on DMD 2.061/2.062 in unit test mode
- Added
Json.remove()
for JSON objects - Added
Isolated!T
in preparation of a fully thread-safe API - The package description now exposes a proper set of configurations
- VPM uses the new download URL schema instead of relying on a
"downloadUrl"
field in the package description to stay forward compatible with DUB - The default order to listen is now IPv6 and then IPv4 to avoid the IPv4 listener blocking the IPv6 one on certain systems
- Added
HttpServerSettings.disableDistHost
to forcelistenHttp
to listen immediately, even during initialization - Added
WebSocket.receiveBinary
andWebSocket.receiveText
- issue #182 - Added
HttpServerResponse.writeRawBody
andHttpClientResponse.readRwaBody
to allow for verbatim forwarding - ".gz" and ".tgz" are now recognized as compressed formats and are not transferred with a compressed "Content-Encoding"
- Added a pure scoped callback based version of
requestHttp
to allow GC-less operation and also automatic pipelining of requests in the future
- Fixed some possible crashes and memory leaks in the
HttpClient
- Fixed the
HttpRouter
interface to derive fromHttpServerRequestHandler
- Fixed parsing of version ranges in the deprecated VPM
- Fixed some examples by added a
VibeCustomMain
version to their package.json - Fixed a possible range violation in the Diet compiler for raw/filter nodes
- Fixed detection of horizontal lines in the Markdown parser
- Fixed handling of one character methods in the REST interface generator - pull #195
- Fixed the reverse proxy to not drop the "Content-Length" header
- Fixed
HttpClient
to obey "Connection: close" responses - Fixed
Libevent2Signal
to not move tasks between threads
This release solves some issues with the HttpClient
in conjunction with SSL connection and contains a lot of cleaning up. Many modules and symbols have been deprecated or renamed to streamline the API and reduce redundant functionality with Phobos.
- Compiles with the latest DUB, which is now the recommended way to build vibe.d projects
- Changed all public enums to use Phobos' naming convention (except for JSON and BSON)
- Moved
vibe.http.common.StrMapCI
tovibe.inet.nessage.InetHeaderMap
- Deprecated all hash modules in
vibe.crypto
in favor ofstd.digest
- Deprecated the
vibe.crypto.ssl
module (functionality moved tovibe.stream.ssl
) - Deprecated a number of functions that are available in Phobos
- Deprecated the setter methods in the
Cookie
class
- Fixed connection unlocking in the
HttpClient
- Fixed detection of unsuccessful SSL connection attempts
- Fixed freeing of SSL/BIO contexts
- Fixed some places in the deprecated VPM to use
Path.toNativeString()
instead ofPath.toString()
- Fixed the
package.json
file of the benchmark project - Fixed cross-thread invocations of
vibe.core.signal.Signal
in the Win32 driver - Fixed compilation on DMD 2.062 - issue #183, issue #184
Main changes are a refactored MiongoDB client, important fixes to the HttpClient
and memory alignment fixes in the custom allocators. The library and all examples are now also valid DUB* packages as a first step to remove the 'vibe' script in favor of the more powerful 'dub'.
- Big refactoring of the MongoDB interface to be more consistent with its API (by Михаил Страшун aka Dicebot) - pull #171
- Added a range interface to
MongoCursor
- redo of pull #172 - Added a dub compatible "package.json" file for vibe.d and all example projects
- Parameters can be made optional for
registerFormInterface
now (by Robert Klotzner aka eskimor) - issue #156 - The REST interface generator also supports optional parameters by defining default parameter values
- Added
Task.interrupt()
,Task.join()
andTask.running
- Improved detection of needed imports in the REST interface generator (by Михаил Страшун aka Dicebot) - pull #164
- Partially implemented zero-copy file transfers (still disabled for libevent) - issue #143
- Added
HttpRequest.contentType
andcontentTypeParameters
to avoid errors by direct comparison with the "Content-Type" header - issue #154 - Added a small forward compatibility fix for DUB packages ("vibe.d" is ignored as a dependency)
- Cleaned up the function names for writing out
Json
objects as a string and added convenience methods (partially done in pull #166 by Joshua Niehus) - Renamed
HttpRequest.url
toHttpRequest.requestUrl
and addedHttpRequest.fullUrl
- Added the possibility to write a request body in chunked transfer mode in the
HttpClient
- Added
HttpServerRequest.ssl
to determine if a request was sent encrypted - Changed several interfaces to take
scope
delegates to avoid useless GC allocations - Removed the
in_url
parameter fromPath.toString
- now assumed to betrue
SysTime
andDateTime
are now specially treated by the JSON/BSON serialization code- Refactored the
Cookie
interface to properly use@property
(by Nick Sabalausky aka Abcissa) - pull #176 - Added
HttpRouter
as an interface forUrlRouter
(by Laurie Clark-Michalek aka bluepeppers) - pull #177 - Changed
HttpFileServerSettings.maxAge
fromlong
toDuration
(by Nick Sabalausky aka Abcissa) - pull #178 - Added
HttpFileServerSettings.preWriteCallback
(by Nick Sabalausky aka Abcissa) - pull #180
- Fixed matching of the host name in
HttpServer
- is case insensitive now - Fixed issues in
ConnectionPool
andHttpClient
that causedInvalidMemoryOperationError
and invalid multiplexed requests - Fixed
GCAllocator
andPoolAllocator
to enforce proper alignment - Fixed passing of misaligned base pointers to
free()
inMallocAllocator
- at least 32-bit Linux seems to choke on it - issue #157 - Fixed
listenTcp
without an explicit bind address - now returns an array of listeners with one entry per IP protocol version - Fixed "Connection: close" hangs also for HTTP/1.0 clients - those that depended on this behavior are broken anyway - issue #147
- Fixed possible invalid line markers in the mixin generated by the Diet compiler - issue #155
- Fixed all uses of
render!()
in the example projects by replacing them withrenderCompat!()
- issue 159 - Fixed concatenation of
Path
objects, where the LHS is not normalized - Fixed
serializeToBson
in conjunction with read-only fields (by Михаил Страшун aka Dicebot) - pull #168 - Fixed a possible endless loop caused by
ChunkedOutputStream
due to an inconsistent redundant field - Fixed
serializeToJson
in conjunction with read-only fields (same fix as for BSON) - Fixed
download
ignoring theport
property of the target URL - Fixed termination of Fibers by exceptions of already terminated tasks
- Fixed propagation of
HttpStatusException
in the REST interface generator (by Михаил Страшун aka Dicebot) - pull #173 - Fixed handling of multiple cookies with the same name
HttpServerRequest.cookies.getAll()
can now be used to query them - fixes [issue #174][issue174] - Fixed
WebSocket.connected
- issue #169 - Fixed accepting of invalid JSON syntax - issue #161
- Fixed use of
tmpnam
on Posix by replacing withmkstemps
, still used on Windows - issue #137 - Fixed
ZlibInputStream.empty
to be consistent withleastSize
Improves installation on Linux and fixes a configuration file handling error, as well as a hang in conjunction with Nginx used as a reverse proxy.
- The
setup-linux.sh
script now installs to/usr/local/share
and uses any existingwww-data
user for its config if possible (by Jordi Sayol) - issue #150, issue #152, issue #153
- Fixed hanging HTTP 1.1 requests with "Connection: close" when no "Content-Length" or "Transfer-Encoding" header is set - issue #147
- User/group for privilege lowering are now specified as "user"/"group" in vibe.conf instead of "uid"/"gid" - see issue #133
- Invalid uid/gid now actually cause the application startup to fail
The Win32 back end now has working TCP socket support. Also, the form and REST interface generators have been improved and Diet templates support arbitrary D expressions for attribute values. Finally, everything compiles now on Win64 using DMD 2.061.
- TCP sockets in the Win32 back end work now
- Added support for struct and array parameters to
registerFormInterface
(by Robert Klotzner aka eskimor) - issue #138, issue #139, issue #140 registerFormInterface
now ignores static methods (by Robert Klotzner aka eskimor) - issue #136- Added support for arbitrary expressions for attributes in Diet templates
- Added
RedisClient.zrangebyscore
and fixed the return type ofRedistClient.ttl
(long
) (by Simon Kerouack aka ekyo) - issue #141 renderCompat()
does not require the parameter values to be wrapped in a Variant anymore- Added a
BsonObjectID.timeStamp
property that extracts the Unix time part - Added a versions of
deserialize(B/J)son
that return the result instead of writing it to an out parameter - The REST interface client now can handle more foreign types by searching for all needed module imports recursively
listenTcp
now returns aTcpListener
object that can be used to stop listening again- Added
vibe.inet.message.decodeEncodedWords
anddecodeEmailAddressHeader
- Added
compileDietFileMixin
usable for directly mixing in Diet templates (they are instantiated in the caller scope) - The SMTP client now prints the last command whenever an error is returned from the server - see issue #126
- Documentation improvements
- All examples now use
shared static this
instead ofstatic this
so that they will behave correctly once multi-threading gets enabled vibe.core
now only depends onvibe.inet
andvibe.utils.memory
and thus is ready to be used as a stand-alone libraryBson.length
is now allowed forBson.Type.Object
and addedBson.EmptyArray
- Setting
HttpFileServerSettings.maxAge
to zero will cause the "Expires" and "Cache-Control" headers to be omitted Url
can now be constructed asUrl(str)
in addition toUrl.parse(str)
- The HTTP server logger now logs the requesting host name instead of the selected configuration's host name
- Using
ParameterIdentifierTuple
now for the REST interface generator, which makes the_dummy
parameter hack unnecessary - Compiles with DMD 2.061 and on Win64
- User and group names are now accepted in addition to UID/GID in /etc/vibe/vibe.conf - issue #133
- Fixed forwarding of non-ASCII Unicode characters in
htmlEscape
- Fixed the Diet template parser to accept underscores in ID and class identifiers
- Fixed HEAD requests properly falling back to GET routes in the
UrlRouter
- Fixed parsing of Unicode escape sequences in the JSON parser - issue #146
- Made
vibe.core.mutex.Mutex
actually pass its unit tests - Fixed compile errors occurring when using the field selector parameter of
MongoDB.find/findOne/findAndModify
- Fixed some cases of
InvalidMemoryOperationError
in ConnectionPool/LockedConnection - possibly issue #117 - Avoid passing
0x8000
(O_BINARY
) on non-Windows systems toopen()
, as this may cause the call to fail (by Martin Nowak) - issue #142 - Fixed creation of HTTP sessions (were not created before at least one key was set)
- Fixed the error detection code (safe mode) for the MongoDB client
int
values are now correctly serialized asBson.Type.Int
instead ofBson.Type.Long
- Fixed handling of the "X-Forwarded-For" header in the reverse proxy server in case of a proxy chain
- During the build, temporary executables are now built in
%TEMP%/.rdmd/source
so they pick up the right DLL versions - Fixed the daytime example (
readLine
was called with a maximum line length of zero) - issue #122, issue #123
The new release contains major improvements to the Win32 back end, as well as to the Diet template compiler. The REST interface has gotten more robust in its type handling and a new HTML form interface generator has been added. The zip file release now also includes HTML API docs.
- Implemented an automated HTML form interface generator in
vibe.http.form
(by Robert Klotzner aka eskimor) - issue #106 - The REST interface now uses fully qualified names and local imports to resolve parameter/return types, making it much more robust (by Михаил Страшун aka mist) - issue #108
- The Diet template compiler now supports includes and recursive extensions/layouts - issue #32,
- Added support for WebSocket binary messages and closing connections (by kyubuns) - issue #118
- Implemented a directory watcher for the Win32 driver
- Removed
vibe.textfilter.ddoc
- now in http://github.com/rejectedsoftware/ddox - Cleaned up command line handling (e.g. application parameters are now separated from vibe parameters by --)
- Dependencies in package.json can now have "~master" as the version field to take the latest master version instead of a tagged version
- Renamed
UrlRouter.addRoute()
toUrlRouter.match()
- Moved Path into its own module (
vibe.inet.path
) - Task local storage is now handled directly by
Task
instead of invibe.core.core
- (de)serialze(To)(Json/Bson) now support type customization using (to/from)(Json/Bson) methods
- (de)serialze(To)(Json/Bson) now strip a trailing underscore in field names, if present - allows to use keywords as field names
Json.opt!()
is now much faster in case of non-existent fields- Added
Bson.toJson()
andBson.fromJson()
and deprecatedBson.get!Json()
andcast(Json)bson
- Implemented
InputStream.readAllUtf8()
- strips BOM and sanitizes or validates the input - Implemented
copyFile()
to supplementmoveFile()
- Added RandomAccessStream interface
- Implemented a GitHub like variant of Markdown more suitable for marking up conversation comments
- The Markdown parser now takes flags to control its behavior
- Made ATX header and automatic link detection in the Markdown parser stricter to avoid false detections
- Added
setPlainLogging()
- avoids output of thread and task id - Avoiding some bogus error messages in the HTTP server (when a peer closes a connection actively)
- Renamed the string variant of
filterHtmlAllEscape()
tohtmlAllEscape()
to match similar functions connectMongoDB()
will now throw if the connection is not possible - this was deferred to the first command up to now- By default a
MongoDB
connection will now have the 'safe' flag set - The default max cache age for the HTTP file server is now 1 day instead of 30 days
- Implemented
MemoryStream
- a random access stream operating on aubyte[]
array. - The form parser in the HTTP server now enforces the maximum input line width
- A lot of documentation improvements
- Fixed a possible endless loop in
ZlibInputStream
- now triggers an assertion instead; Still suffering from DMD bug 8779 - issue #56 - Fixed handling of escaped characters in Diet templates and disallowed use of "##" to escape "#"
- Fixed "undefined" appearing in the stringified version of JSON arrays or objects (they are now filtered out)
- Fixed the error message for failed connection attempts
- Fixed a bug in
PoolAllocator.realloc()
that could cause a range violation or corrupted memory - issue #107 - Fixed '//' comments in the Diet template compiler
- Fixed and optimized
readUntil
- it now also obeys the byte limit, if given - Fixed parsing of floating-point numbers with exponents in the JSON parser
- Fixed some HTML output syntax errors in the Markdown compiler
This release adds support for UDP sockets and contains a rather large list of smaller fixes and improvements.
- Added support for UDP sockets
- The reverse proxy now adds the headers "X-Forwarded-For" and "X-Forwarded-Host"
MongoCollection.findAndModify
returns the resulting object only now instead of the full reply of the protocol- Calling
MongoCollection.find()
without arguments now returns all documents of the collection - Implemented "vibe init" to generate a new app skeleton (by 1100110) - issue #95, issue #99
- The application's main module can now also be named after the package name instead of 'app.d' (by 1100110) - issue #88, issue #89
- The default user/group used on Linux for privilege lowering has been renamed to 'www-vibe' to avoid name clashes with possibly existing users named 'vibe' (by Jordy Sayol) - issue #84
BsonBinData
is now converted to a Base-64 encoded string when the BSON value is converted to a JSON valueBsonDate
now hastoString
/fromString
for an ISO extended representation so that its JSON serialization is now a string- The Diet parser now supports string interpolations inside of style and script tags.
- The Diet parser now enforces proper indentation (i.e. the number of spaces used for an indentation level has to be a multiple of the base indent) - see issue #3
- The Diet parser now supports unescaped string interpolations using !{}
- The JSON de(serializer) now supports pointer types
- Upgraded libevent to v2.0.20 and OpenSSL to v1.0.1c on Windows
- The Win32 driver now has a working Timer implementation
OutputStream
now has an output range interface for the typesubyte
andchar
- The logging functions use 'auto ref' instead of 'lazy' now to avoid errors of the kind "this(this) is not nothrow"
- The markdown text filter now emits XHTML compatible
<br/>
tags instead of<br>
(by cybevnm) - issue #98 - The REST interface generator now uses plain strings instead of JSON for query strings and path parameters, if possible
- The
UrlRouter
now URL-decodes all path parameters
- Fixed a null dereference for certain invalid HTTP requests that caused the application to quit
- Fixed
setTaskStackSize()
to actually do anything (the argument was ignored somewhere along the way to creating the fiber) - Fixed parameter name parsing in the REST interface generator for functions with type modifiers on their return type (will be obsolete once __traits(parameterNames) works)
- Fixed a too strict checking of email addresses and using
std.net.isemail
now to perform proper checking on DMD 2.060 and up - issue #103 - Fixed JSON deserialization of associative arrays with a value type different than 'string'
- Fixed empty peer fields in
HttpServerRequest
when the request failed to parse properly - Fixed
yield()
calls to avoid stack overflows and missing I/O events due to improper recursion - Fixed the Diet parser to allow inline HTML as it should
- Fixed the Diet parser to actually output singular HTML elements as singular elements
- Fixed tight loops with
yield()
not causing I/O to stop in the win32 back end - Fixed code running from within
static this()
not being able to use vibe.d I/O functions - Fixed a "memory leak" (an indefinitely growing array)
- Fixed parsing of one-character JSON strings (by Михаил Страшун aka mist) - issue #96
- Fixed the Diet parser to not HTML escape attributes and to properly escape quotation marks (complying with Jade's behavior)
- Fixed the Diet parser to accept an escaped hash (#) as a way to avoid string interpolations
- Fixed a bug in MongoDB cursor end detection causing spurious exceptions
- Fixed the Markdown parser to now recognize emphasis at the start of a line as an unordered list
- Fixed the form parsing to to not reject a content type with character set specification
- Fixed parsing of Unicode character sequences in JSON strings
- Fixed the 100-continue response to end with an empty line
Brings some general improvements and DMD 2.060 compatibility.
- Compiles with DMD 2.060 - issue #70
- Some considerable improvements and fixes for the REST interface generator - it is now also actually used and tested in another project
- MongoDB supports
mongodb://
URLs for specifying various connection settings instead of just host/port (by David Eagen) - issue #80, issue #81 - Added
RestInterfaceClient.requestFilter
to enable authentication and similar add-on functionality - JSON floating-point numbers are now stringified with higher precision
- Improved const-correctness if the Bson struct (by cybevnm) - issue #77
- Added
setIdleHandler()
to enable tasks that run when all events have been processed - Putting a '{' at the end of a D statement in a Diet template instead of using indentation for nesting will now give an error
- API documentation improvements
- The HTTP server now allows query strings that are not valid forms - issue #73
The most important improvements are easier setup on Linux and Mac and an important bug fix for TCP connections. Additionally, a lot of performance tuning - mostly reduction of memory allocations - has been done.
- A good amount of performance tuning of the HTTP server
- Implemented
vibe.core.core.yield()
. This can be used to break up long computations into smaller parts to reduce latency for other tasks - Added setup-linux.sh and setup-mac.sh scripts that set a symlink in /usr/bin and a config file in /etc/vibe (Thanks to Jordi Sayol)
- Installed VPM modules are now passed as version identifiers "VPM_package_xyz" to the application to allow for optional features
- Improved serialization of structs/classes to JSON/BSON - properties are now serialized and all non-field/property members are now ignored
- Added directory handling functions to
vibe.core.file
(not using asynchronous operations, yet) - Improved the vibe shell script's compatibility
- Fixed
TcpConnection.close()
for the libevent driver - this caused hanging page loads in some browsers - Fixed MongoDB connection handling to avoid secondary assertions being triggered in case of exceptions during the communication
- Fixed JSON (de)serialization of structs and classes (member names were wrong) - issue #72
- Fixed
(filter)urlEncode
for character values < 0x10 - issue #65
This is a maintainance release primaily to make the examples work again and to improve permission issues when vibe is installed in a read-only location.
- Restructured the examples - each example is now a regular vibe.d application (also fixes compilation using run_example)
- The REST interface generator now supports sub interfaces which are mapped to sub paths in the URL
- Added
InjectedParams!()
to access parameters injected using inject!() - The vibe script and VPM now do not write to the application directory anymore if not necessary
- Implement more robust type handling in the REST client generator
- Fixed a possible exception in
ZlibInputStream
at the end of the stream
- Added support for multipart/form-data and file uploads
- Rewrote the Markdown parser - it now does not emit paragraphs inside list elements if no blank lines are present and handles markdown nested in quotes properly
- The SMTP client supports STARTTLS and PLAIN/LOGIN authentication
- The Diet parser now supports generic
:filters
usingregisterDietTextFilter()
-:css
,:javascript
and:markdown
are already built-in - VPM now can automatically updates dependencies and does not query the registry at every run anymore
- Added
vibe.templ.utils.inject
which allows to flexibly stack together request processors and inject variables into the final HTML template (thanks to simendsjo for the kick-off implementation) - Removed
InputStream.readAll()
andreadLine()
and replaced them by UFCS-able global functions + addedreadUntil()
- Added
ConnectionPool
to generically manage reuse of persistent connections (e.g. for databases) - The
HttpClient
(and thus the reverse proxy) now uses a connection pool to avoid continuous reconnects - On *nix now uses pkg-config to find linker dependencies if possible (dawgfoto) - issue #52
- The static HTTP file server now resolves paths with '.' and '..' instead of simply refusing them
- Implemented handling of
HttpServerSettings.maxRequestTime
- Added
setLogFile()
- The vibe.cmd script now works with paths containing spaces
Libevent2TcpConnection
now enforces proper use ofacquire()/release()
- Improved stability in conjunction with TCP connections
- Upgraded libevent to 2.0.19 on Windows
- Hotfix release, fixes a bug that could cause a connection to be dropped immediately after accept
- Added support for timers and
sleep()
- Proper timeout handling for Connection: keep-alive is in place - fixes "Operating on closed connection" errors - issue #20, issue #43
- Setting DFLAGS to change compiler options now actually works
- Implemented
SslStream
, which is now used instead of libevent's SSL code - fixes a hang on Linux/libevent-2.0.16 - issue #29 - The REST interface generator now supports
index()
methods and 'id' parameters to customize the protocol - Changed the type for durations from
int/double
toDuration
- issue #18 - Using Deimos bindings now instead of the custom ones - issue #48
- Performance tuning
- Added
vibe.utils.validation
- Various fixes and improvements
- Initial development release version