Fixes#3116
* Rework Replacer loop to ignore escaped braces
* Add benchmark tests for replacer
* Optimise handling of escaped braces
* Handle escaped closing braces
* Remove additional check for closing brace
This commit removes the additional check for input in which the closing
brace appears before the opening brace. This check has been removed for
performance reasons as it is deemed an unlikely edge case.
* Check for escaped closing braces in placeholder name
* httpcaddyfile: Begin implementing log directive, and debug mode
For now, debug mode just sets the log level for all logs to DEBUG
(unless a level is specified explicitly).
* httpcaddyfile: Finish 'log' directive
Also rename StringEncoder -> SingleFieldEncoder
* Fix minor bug in replacer (when vals are empty)
* logging: Initial implementation
* logging: More encoder formats, better defaults
* logging: Fix repetition bug with FilterEncoder; add more presets
* logging: DiscardWriter; delete or no-op logs that discard their output
* logging: Add http.handlers.log module; enhance Replacer methods
The Replacer interface has new methods to customize how to handle empty
or unrecognized placeholders. Closes#2815.
* logging: Overhaul HTTP logging, fix bugs, improve filtering, etc.
* logging: General cleanup, begin transitioning to using new loggers
* Fixes after merge conflict
* Tests for Replacer: Replacer.Set and Replacer.Delete
* update replacer test to new implementation
* fix replacer: counted position wrong if placeholder was found
* fix replacer: found placeholder again, if it was a non-existing one
* test with spaces between the placeholders as this could have a different behaviour
* Tests for Replacer.Map
* Tests for Replacer.Set: check also for something like {l{test1}
This should be replaced as {lTEST1REPLACEMENT
* fix replacer: fix multiple occurrence of phOpen sign
* Tests for Replacer: rewrite Set and ReplaceAll tests to use implementation not interface
* Tests for Replacer: rewrite Delete test to use implementation not interface
* Tests for Replacer: rewrite Map tests to use implementation not interface
* Tests for Replacer: add test for NewReplacer
* Tests for Replacer: add test for default replacements
* Tests for Replacer: fixed and refactored tests
* Tests for Replacer: moved default replacement tests to New-test
as new should return a replace with provider which defines global replacements