First important change is for all requests sent by ASF. Across those 4 years of development I do not remember a single situation where retrying on 4xx status code brought any improvement, bad request has to be handled by us, access denied and not found won't disappear after retry, all other ones are rather unused. Therefore, it makes sense to skip remaining tries on 4xx errors and do not flood the service with requests that are very unlikely to change anything.
Second change is smaller one and it allows the consumer of WebBrowser to declare that he's interested in handling client error codes himself. This way he can add extra logic and appropriately react to them - ASF uses it in statistics module, where the listing can signal refusal to list due to e.g. outdated ASF version through 403. Previously this was treated on the same level as timeout, which wasn't optimal.
* Add Utilities.MarkdownToText()
* Add GET /Api/WWW/MarkdownToText?text={text} and sort usings alphabetically
* Revert sorting usings
* Sort functions
* Remove Log if the user is at fault
* Rename variable and adjust if for errors
Previously ASF joined out-of-range arguments in string commands (input, nickname, owns) using a normal space, now original whitespace is preserved, which is especially useful for including custom whitespace characters in nickname command.
> The pattern is to take the basest class or interface possible for your arguments and return the most specific class or interface possible for your return types. This gives your callers the most flexibility in passing in types to your methods and the most opportunities to cast/reuse the return values.