BREAKING CHANGE: renamed 'DreamHost' to 'DreamHostService'
BREAKING CHANGE: moved Dream host instantiation methods into a new class called 'DreamHost'
added support for OPTIONS requests
some services table was using case-sensitive comparison for removing services (which lead to services not being removed)
blueprints are stored inside a Dictionary instead of a DirectoryService (avoid duplication of the blueprints documents)
added static 'Create()' method that is used by the console and service hosts to initialize a DreamHost instance
added a connection limit to avoid saturating the host (NOTE: internal requests do not count towards this limit)
changed 'GET:status' to only include a summary and link for <activities>, <aliases>, <services>, and <features>
changed how aliases are memorized; now we only memorize a host alias if we were able to find a matching feature
changed how 'SubmitRequest()' works; all pre-processing is done on the thread which submitted the request; only the feature chain is executed on a new thread
removed support for prologue/epilogue inheritance
allow negative connection limit; corresponds to max threads minus limit
decrease counter for NotFound response and OPTION requests
show connection counter and limit in GET:status
allow <guid> tag in config to set host identity
reduce request handling timeout to 2hrs
added <activities> back to "GET:status"
query param 'dream.in.scheme' used for overriding the scheme used to access dream
count total requests processed
show info messages in GET:status
show request rate in GET:status
log internal requests
give each feature stage the name of its previous stage (for error reporting)
initialize DreamContext with current culture
use async methods for creating and destroying services
use 'WithTimeout(TimeSpan.MaxVaue)' during shutdown instead of overriding timeout value
GET:status added xslt to format XML into HTML
SubmitRequestAsync: avoid using XUri.SchemeHostPort
merged 'dream.exit' epilogue into 'dream.out.*'
fixed IPv6 host bug when enumerating host interfaces
default culture for DreamContext is now InvariantCulture
use 'Result.Catch()' to make coroutine calls fit on one line
don't print password in log
DreamMessage
BREAKING CHANGE: changed 'Headers' type from 'NameValueCollection' to 'DreamHeaders'
BREAKING CHANGE: moved all 'HEADER_*' constants to 'DreamHeaders'
added missing standard HTTP header definitions
DreamResponseException
show http status code in exception string
DreamProcessing
BREAKING CHANGE: class merged into 'DreamHost'
DreamService
BREAKING CHANGE: renamed 'ServiceBase' to 'DreamService'
'DetermineAccess()' now prefers query param "apikey" over the api key cookie
send 'Set-Cookie' to host and owner to clear service-key cookie
added 'uri.log' service config description
removed code to destroy logging service automatically (since it's not created by this instance)
use SysUtil.ChangeType instead of Convert to handle nullable types
added async methods for creating and destroying services
made AutoSave asynchronous
use 'Result.Catch()' to make coroutine calls fit on one line
EventService
use 'Result.Catch()' to make coroutine calls fit on one line
HttpHandler
make call to 'SubmitRequest()' synchronous
made handler synchronous (base on community feedback)
added fix to startup suggested by namxam (thanks!)
better debug info for async operations
update host info for each incoming message; distinguish between internal and external messages
HttpPlugFactory
dispose of http requests more aggressively
show exceptions in log
'HttpWebRequest.Timeout' and 'HttpWebRequest.ReadWriteTimeout' to infinite
abort http connection only if the exception did not contain a valid response
added more detailed information for activity status on outgoing connections for debugging purposes
use same mechanism for adding and removing activity notifications
don't set activity hint after completion
more detailed activity output
added even more activity tracking
don't show activity messages after completion
additional activity update notifications to narrow down what is blocking asynchronous operations
only set the 'User-Agent' header when it's not yet set
make status reporting thread-safe
made the locking for logging activity a bit broader to encompass also the clearing of activities
HttpTransport
added a connection limit; a '503 Service Unavailable' response will be sent when the limited is exceeded
reverted earlier change that added a connection limit
show verb with uri in activity description
additional activity information on response
more detailed activity output
avoid reparsing transport prefix
added more detailed tracking of async activities
join the segments to determine the path prefix (as the .Path property returns a "/" prefix)
make status reporting thread-safe
made the locking for logging activity a bit broader to encompass also the clearing of activities
HttpUtil
BREAKING CHANGE: removed 'FetchCookies()' and 'UpdateCookies()'
use 'Result.Catch()' to make coroutine calls fit on one line
RedirectService
use 'Result.Catch()' to make coroutine calls fit on one line
StorageService
use caching helper functions
use 'Result.Catch()' to make coroutine calls fit on one line
StringUtil
added 'EmptyArray' static field that represents an empty array of strings
added culture invariant methods for Compare, StartsWith, EndsWith, IndexOf, and LastIndexOf
SysUtil
fixed bug in 'ChangeType()' that caused an exception casting to object
optimized 'ChangeType()' function by refactoring slow calls
added methods for setting culture only if needed
Task
removed redundant calls to 'ContainsKey()' when retrieving state
TaskBehavior
BREAKING CHANGE: removed constructor with 'Result' argument (too confusing in behavior)
BREAKING CHANGE: removed simplified constructors; use 'TaskBehavior.NewTaskState()' or 'TaskBehavior.CopyTaskState()'
BREAKING CHANGE: renamed 'NewTaskState()' to 'NoTaskState()' for pedagogic reasons
added support for carrying culture information across tasks
added 'CurrentTaskState()' method to reuse the current task state
TaskTimer
BREAKING CHANGE: removed simplified constructors; use 'TaskTimer.New() instead'
check for TimeSpan.MaxValue when changing timer
'_behavior' was not reset when timer was triggered or cleared causing dangling references
reduced QUEUE_CUTOFF to 30 seconds; added QUEUE_RESCAN at 25 seconds
added 'NextMaintance' property to retrieve when the next timer check will occur
suppess warning when passing a volatile field as a ref parameter
WindowsHost
added Windows Service Host
command line arguments are read from 'mindtouch.dream.startup.xml' which must be in the same directory as 'mindtouch.host.service.exe'
XDoc
BREAKING CHANGE: 'RemoveAll(ICollection)' is now a static method
BREAKING CHANGE: renamed 'Transform()' to 'TransformAsText()'
added 'RemoveAll()' method to remove all object matched by current xpath expression
support 'Parent' operation on attributes
avoid extraneous copies of XmlNodeList by using XPathExpression directly
properly handle '#text' nodes
fixed index error in 'AtPosition()' method
don't rebuild node list in 'Start()' and 'End()' methods (major performance boost)
use SysUtil.ChangeType instead of Convert to handle nullable types
added comparison operation (thx to Brad Langhorst for the code contribution!)
added 'TransformAsXml()'
copy selection list when enumerating an XDoc (eliminates the enumeration bug for XDoc)
documented all public properties and methods
XDocCop
BREAKING CHANGE: rules now use + to mark elements that need padding (before they used #)
added 'AddRules()' to initialize a set of rules at once
XDocDiff
BREAKING CHANGE: removed XDocDiff class (no longer used)
XDocFactory
fixed exception when calling 'ToXPathValuePairs()' on an empty XDoc
return Empty document instead of null when document cannot be parsed
don't log unparsable XML, also consider it a warning, not an error since it's expected to fail from time to time
don't report parsing errors as they are expected by the methods
XDocUtil
added 'Highlight()' method to show addition/deletions between two XDoc documents
refactored 'Tuple<XmlNodeType, string, object>' generic into 'Token' class
XHtmlTextWriter
comment out CDATA sections when they occur within a <script> or <style> tag
XriPlugFactory
use new plug constructor to set timeout value
XUri
BREAKING CHANGE: params is now 'KeyValuePair<string, string>[]' instead of a 'NameValueCollection' (much smaller memory footprint)
BREAKING CHANGE: make class sealed
Fixed bug 'Similarity()' that allowed for partial similarities to succeed
storing encoded username/password to allow special symbols like @ and #
atomize all strings to avoid repeated allocations of the same values over and over again
'Equals()' method was creating a string and then doing a comparison for equality (dumb!); now it compares the relevant elements without allocating new data
'GetHashCode()' was not case-insensitive (but 'Equals()' is!)
'Similarity()' was also potentially concatenating strings
replaces all occurrences of 'new string[0]' with 'StringUtil.EmptyArray'
added 'WithoutLastSegments()' and 'WithoutLastSegment()'
use SysUtil.ChangeType instead of Convert to handle nullable types
displaying original uri that didn't parse
use StringComparer instead of CaseInsensitiveHashCodeProvider (the latter is obsolete)
removed 'IsDefaultPort()'
automatically set 'Port' to have the correct default value based on the scheme used
renamed 'HasDefaultPort' to 'UsesDefaultPort'
removed 'AtEncode()'
renamed 'Truncate()' to 'WithFirstSegments()'
'At()' checks new segments for validity
'GetRalitivePathTo()' avoid using XUri.SchemeHostPort
'ChangePrefix()' re-implemented function to avoid unnecessary re-parsing of the URI
added 'WithScheme()', 'WithHost()', and 'WithPort()'
fixed error in 'GetHashCode()' to make it case-insensitive
optimized 'SchemeHostPortPath' property
optimized 'DeterminePort()'
disabled NameTable memory optimization (compile with XURI_USE_NAMETABLE to re-enable again)
inlined all helper methods/properties for 'ToString()'
fixed a regression that made XUri case-sensitive
added bool parameter to 'ToString()' to suppress printing of passwords