<commit_before>﻿Changelog
=========

v0.7.18 - 2013-
--------------------

### Features and improvements ###

 - Compiles using DMD 2.064 (and DMD 2.063.2)
 - `OutgoingWebSocketMessage` is now automatically finalized
 - Added `File.isOpen`
 - `vibe.stream.operations.readAll()` now preallocates if possible
 - Added `BsonDate.fromStdTime` and improve documentation to avoid time zone related bugs
 - Optimized HTML escaping performance (by <NAME>) - [pull #327][issue327]
 - Added a `TaskMutex.this(Object)` constructor to be able to use them as object monitors
 - Added a non-blocking (infinitely buffering) mode for `TaskPipe`
 - Adjusted naming of `Bson.Type` and `Json.Type` members for naming conventions
 - Added (de)serialization support for AAs with string serializable key types (by <NAME>) - [pull #333][issue333]
 - Implemented different deserialization modes (partially [pull #336][issue336])
 - Added `setLogFormat` as a more flexible replacement for `setPlainLogging
 - `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 <NAME>) - [pull #341][issue341]
 - Added a `ConnectionStream` interface from which `TCPConnection` and `TaskPipe` now derive
 - Implemented `vibe.stream.operations.pipeRealtime` for piping stream data with a defined maximum latency
 - Implemented parameter and return value modifier user attributes for the REST interface generator and refactor meta programming facilities (by <NAME> aka Dicebot) - [pull #340][issue340], [pull #344][issue344], [pull #349][issue349]
 - Improved the HTTP reverse proxy by handling HEAD requests correctly, avoiding GC allocations and optionally disabling transfer compression
 - Added `MongoCollection.aggregate()` (by <NAME>) - [pull #348][issue348]
 - Added `WebSocket.request` to enable access to the original HTTP request and add scoped web socket callbacks for avoiding GC allocations
 - Implemented `MongoCursor.sort` to allow sorted queries using the same syntax as other MongoDB drivers (by <NAME>) - [pull #353][issue353]
 - Implemented random number generators suited for cryptographic applications, which is now used for session ID generation (by <NAME>) - [pull #352][issue352], [pull #364][issue364], [issue #350][issue350]
 - Implemented Scalate whitespace stripping syntax for Diet templates (by <NAME>) - [pull #362][issue362]
 - Added `HTTPServerRequest.clientAddress` to get the full remote address including the port - [issue #357][issue357]

### Bug fixes ###

 - Fixed wrongly triggering assertions on Windows when `INVALID_SOCKET` is returned
 - Fixed issues with `vibe.stream.zlib` by reimplementing everything using zlib directly instead of `std.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][issue191]
 - Fixed (de)serialization of BSON/JSON with (to/from)(String/Json) methods (by <NAME>) - [pull #309][issue309]
 - 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][issue321]
 - 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 <NAME>) - [pull #331][issue331]
 - Fixed command line options to have precedence over configuration settings for `getOption`
 - Fixed `Cookie.maxAge` having no effect (by <NAME>) - [pull #334][issue334], [issue #330][issue330]
 - Fixed request/response delays in `Libevent2TCPConnection` (by <NAME>) - [issue #338][issue338]
 - 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 <NAME>) - [pull #343][issue343]
 - 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` and `FileMode.createTrunc` to allow both, reading and writing - [issue #337][issue337], [issue #354][issue354]
 - Fixed documentation of some parameters - [issue #322][issue322]

[issue191]: https://github.com/rejectedsoftware/vibe.d/issues/191
[issue309]: https://github.com/rejectedsoftware/vibe.d/issues/309
[issue321]: https://github.com/rejectedsoftware/vibe.d/issues/321
[issue322]: https://github.com/rejectedsoftware/vibe.d/issues/322
[issue327]: https://github.com/rejectedsoftware/vibe.d/issues/327
[issue330]: https://github.com/rejectedsoftware/vibe.d/issues/330
[issue331]: https://github.com/rejectedsoftware/vibe.d/issues/331
[issue333]: https://github.com/rejectedsoftware/vibe.d/issues/333
[issue334]: https://github.com/rejectedsoftware/vibe.d/issues/334
[issue336]: https://github.com/rejectedsoftware/vibe.d/issues/336
[issue337]: https://github.com/rejectedsoftware/vibe.d/issues/337
[issue338]: https://github.com/rejectedsoftware/vibe.d/issues/338
[issue340]: https://github.com/rejectedsoftware/vibe.d/issues/340
[issue341]: https://github.com/rejectedsoftware/vibe.d/issues/341
[issue343]: https://github.com/rejectedsoftware/vibe.d/issues/343
[issue344]: https://github.com/rejectedsoftware/vibe.d/issues/344
[issue348]: https://github.com/rejectedsoftware/vibe.d/issues/348
[issue349]: https://github.com/rejectedsoftware/vibe.d/issues/349
[issue350]: https://github.com/rejectedsoftware/vibe.d/issues/350
[issue352]: https://github.com/rejectedsoftware/vibe.d/issues/352
[issue353]: https://github.com/rejectedsoftware/vibe.d/issues/353
[issue354]: https://github.com/rejectedsoftware/vibe.d/issues/354
[issue357]: https://github.com/rejectedsoftware/vibe.d/issues/357
[issue362]: https://github.com/rejectedsoftware/vibe.d/issues/362
[issue364]: https://github.com/rejectedsoftware/vibe.d/issues/364


v0.7.17 - 2013-09-09
--------------------

### Features and improvements ###

 - 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 <NAME>) - [pull #294][issue294]
 - Implement support for transferring pre-compressed files in the HTTP file server (by <NAME>) - [pull #270][issue270]
 - Implemented a first version of `writeFormBody` (by <NAME> aka SerialVelocity) - [pull #288][issue288]
 - Implemented `vibe.inet.message.decodeMessage` for decoding an internet message body
 - Implemented a moving `opCast` for `IsolatedRef!T` to allow safe casting to base or derived classes and a boolean `opCast` to allow checking for `null`
 - Implemented a basic version of a WinRT based driver 
 - Added `localAddress` and `remoteAddress` properties to `TCPConnection`
 - Added `localAddress` property and a `connect(NetworkAddress)` overload to `UDPConnection`
 - Added `localAddress` property to `HTTPClientRequest`
 - Added `setTaskEventCallback` to support task level debugging<commit_msg>Update change log.<commit_after>﻿Changelog
=========

v0.7.18 - 2013-
--------------------

### Features and improvements ###

 - 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 in `vibe.data.json` and `vibe.data.bson`)
 - Added range based allocation free (de-)serialization for JSON strings and more efficient BSON serialization
 - `OutgoingWebSocketMessage` is now automatically finalized
 - Added `File.isOpen`
 - `vibe.stream.operations.readAll()` now preallocates if possible
 - Added `BsonDate.fromStdTime` and improve documentation to avoid time zone related bugs
 - Optimized HTML escaping performance (by <NAME>) - [pull #327][issue327]
 - Added a `TaskMutex.this(Object)` constructor to be able to use them as object monitors
 - Added a non-blocking (infinitely buffering) mode for `TaskPipe`
 - Adjusted naming of `Bson.Type` and `Json.Type` members for naming conventions
 - Added (de)serialization support for AAs with string serializable key types (with `toString`/`fromString` methods) (by <NAME>) - [pull #333][issue333]
 - Added (de)serialization support for scalar types as associative array keys
 - Implemented different deserialization modes (partially [pull #336][issue336])
 - Added `setLogFormat` as a more flexible replacement for `setPlainLogging
 - `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 <NAME>) - [pull #341][issue341]
 - Added a `ConnectionStream` interface from which `TCPConnection` and `TaskPipe` now derive
 - Implemented `vibe.stream.operations.pipeRealtime` for piping stream data with a defined maximum latency
 - Implemented parameter and return value modifier user attributes for the REST interface generator and refactor meta programming facilities (by <NAME> aka Dicebot) - [pull #340][issue340], [pull #344][issue344], [pull #349][issue349]
 - Improved the HTTP reverse proxy by handling HEAD requests correctly, avoiding GC allocations and optionally disabling transfer compression
 - Added `MongoCollection.aggregate()` (by <NAME>) - [pull #348][issue348]
 - Added `WebSocket.request` to enable access to the original HTTP request and add scoped web socket callbacks for avoiding GC allocations
 - Implemented `MongoCursor.sort` to allow sorted queries using the same syntax as other MongoDB drivers (by <NAME>) - [pull #353][issue353]
 - Implemented random number generators suited for cryptographic applications, which is now used for session ID generation (by <NAME>) - [pull #352][issue352], [pull #364][issue364], [issue #350][issue350]
 - Implemented Scalate whitespace stripping syntax for Diet templates (by <NAME>) - [pull #362][issue362]
 - Added `HTTPServerRequest.clientAddress` to get the full remote address including the port - [issue #357][issue357]
 - 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 an `InputStream`
 - `HashMap` now moves elements when resizing instead of copying
 - `HTTPServerResponse.startSession` now sets the "HttpOnly" attribute by default to better prevent session theft (by <NAME>) - [issue #368][issue368], [pull #373][issue373]
 - `HTTPServerResponse.startSession` now automatically sets the "Secure" attribute by default when a HTTPS connection was used to initiate the session - [issue #368][issue368]
 - `htmlAttribEscape` and friends now also escape single quotes (') - [issue #377][issue377]
 - 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][issue380]
 - `ThreadedFileStream` now uses `yield()` to avoid stalling the event loop
 - Added `vibe.stream.wrapper.ConnectionProxyStream` that allows wrapping a `ConnectionStream` along with a `Stream` to allow forwarding connection specific functionality together with a wrapped stream
 - `HTTPServerResponse.switchProtocol` now returns a `ConnectionStream` to allow controlling the underlying TCP connection
 - Added a WebSockets example project
 - Added `URL` based overloads for `HTTPServerResponse.redirect` and `staticRedirect`
 - Added `RedisClient.hset` (by <NAME>ée aka moechofe) - [pull #386][issue386]
 - Improved the performance of `yield()` by using a singly linked list instead of a dynamic array to store yielded tasks

### Bug fixes ###

 - Fixed wrongly triggering assertions on Windows when `INVALID_SOCKET` is returned
 - Fixed issues with `vibe.stream.zlib` by reimplementing everything using zlib directly instead of `std.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][issue191]
 - Fixed (de)serialization of BSON/JSON with (to/from)(String/Json) methods (by <NAME>) - [pull #309][issue309]
 - 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][issue321]
 - 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 <NAME>) - [pull #331][issue331]
 - Fixed command line options to have precedence over configuration settings for `getOption`
 - Fixed `Cookie.maxAge` having no effect (by <NAME>) - [pull #334][issue334], [issue #330][issue330]
 - Fixed request/response delays in `Libevent2TCPConnection` (by <NAME>) - [issue #338][issue338]
 - 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 <NAME>) - [pull #343][issue343]
 - 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` and `FileMode.createTrunc` to allow both, reading and writing - [issue #337][issue337], [issue #354][issue354]
 - Fixed documentation of some parameters - [issue #322][issue322]
 - Fixed `HTTPServerRequest.fullURL` to properly set the port - [issue #365][issue365]
 - Fixed `vibe.core.concurrency.send`/`receive` in conjunction with `immutable` 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][issue374]
 - 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][issue385]
 - Fixed a crash in `SSLStream` that occured when the server certificate was rejected by the client - [issue #384][issue384]
 - 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 added `WebSocket.waitForData` - [issue #370][issue370]
 - 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][issue389]

[issue191]: https://github.com/rejectedsoftware/vibe.d/issues/191
[issue309]: https://github.com/rejectedsoftware/vibe.d/issues/309
[issue321]: https://github.com/rejectedsoftware/vibe.d/issues/321
[issue322]: https://github.com/rejectedsoftware/vibe.d/issues/322
[issue327]: https://github.com/rejectedsoftware/vibe.d/issues/327
[issue330]: https://github.com/rejectedsoftware/vibe.d/issues/330
[issue331]: https://github.com/rejectedsoftware/vibe.d/issues/331
[issue333]: https://github.com/rejectedsoftware/vibe.d/issues/333
[issue334]: https://github.com/rejectedsoftware/vibe.d/issues/334
[issue336]: https://github.com/rejectedsoftware/vibe.d/issues/336
[issue337]: https://github.com/rejectedsoftware/vibe.d/issues/337
[issue338]: https://github.com/rejectedsoftware/vibe.d/issues/338
[issue340]: https://github.com/rejectedsoftware/vibe.d/issues/340
[issue341]: https://github.com/rejectedsoftware/vibe.d/issues/341
[issue343]: https://github.com/rejectedsoftware/vibe.d/issues/343
[issue344]: https://github.com/rejectedsoftware/vibe.d/issues/344
[issue348]: https://github.com/rejectedsoftware/vibe.d/issues/348
[issue349]: https://github.com/rejectedsoftware/vibe.d/issues/349
[issue350]: https://github.com/rejectedsoftware/vibe.d/issues/350
[issue352]: https://github.com/rejectedsoftware/vibe.d/issues/352
[issue353]: https://github.com/rejectedsoftware/vibe.d/issues/353
[issue354]: https://github.com/rejectedsoftware/vibe.d/issues/354
[issue357]: https://github.com/rejectedsoftware/vibe.d/issues/357
[issue362]: https://github.com/rejectedsoftware/vibe.d/issues/362
[issue364]: https://github.com/rejectedsoftware/vibe.d/issues/364
[issue365]: https://github.com/rejectedsoftware/vibe.d/issues/365
[issue368]: https://github.com/rejectedsoftware/vibe.d/issues/368
[issue370]: https://github.com/rejectedsoftware/vibe.d/issues/370
[issue373]: https://github.com/rejectedsoftware/vibe.d/issues/373
[issue374]: https://github.com/rejectedsoftware/vibe.d/issues/374
[issue377]: https://github.com/rejectedsoftware/vibe.d/issues/377
[issue380]: https://github.com/rejectedsoftware/vibe.d/issues/380
[issue384]: https://github.com/rejectedsoftware/vibe.d/issues/384
[issue385]: https://github.com/rejectedsoftware/vibe.d/issues/385
[issue386]: https://github.com/rejectedsoftware/vibe.d/issues/386
[issue389]: https://github.com/rejectedsoftware/vibe.d/issues/389


v0.7.17 - 2013-09-09
--------------------

### Features and improvements ###

 - 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 <NAME>) - [pull #294][issue294]
 - Implement support for transferring pre-compressed files in the HTTP file server (by <NAME>) - [pull #270][issue270]
 - Implemented a first version of `writeFormBody` (by <NAME> aka SerialVelocity) - [pull #288][issue288]
 - Implemented `vibe.inet.message.decodeMessage` for decoding an internet message body
 - Implemented a moving `opCast` for `IsolatedRef!T` to allow safe casting to base or derived classes and a boolean `opCast` to allow checking for `null`
 - Implemented a basic version of a WinRT based driver 
 - Added `localAddress` and `remoteAddress` properties to `TCPConnection`
 - Added `localAddress` property and a `connect(NetworkAddress)` overload to `UDPConnection`
 - Added `localAddress` property to `HTTPClientRequest`
 - Added `setTaskEventCallback` to support task level debugging
{'fraction_non_alphanumeric': 0.1046037296037296, 'fraction_numerical': 0.04215229215229215, 'mean_word_length': 4.8619413606604045, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 61, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1396561', 'n_tokens_mistral': 6426, 'n_tokens_neox': 5553, 'n_words': 2149}