Bad char cause parse exception  and how to log the url when request can't be parsed?
Using: sanic 0.5.1  (While I don't see which change with 0.5.4 in changelog)

In our code we using : 

```
@app.exception(Exception)
def server_error_handler(request, exception):
    if request is not None:
        msg = request.url + ' ' + traceback.format_exc()
    elif isinstance(exception, RequestTimeout):
        return response.text('timeout', status=504)
    else:
        msg = str(exception) + ' ' + traceback.format_exc()
    asyncio.ensure_future(fluent.write_debug('error', msg))
``` 
to log exception.  We find error has : 

 
> Bad Request Traceback (most recent call last):
>   File "httptools/parser/parser.pyx", line 247, in httptools.parser.parser.cb_on_header_field (httptools/parser/parser.c:4007)
>   File "httptools/parser/parser.pyx", line 109, in httptools.parser.parser.HttpParser._on_header_field (httptools/parser/parser.c:1893)
>   File "httptools/parser/parser.pyx", line 105, in httptools.parser.parser.HttpParser._maybe_call_on_header (httptools/parser/parser.c:1822)
>   File "/usr/local/lib/python3.5/dist-packages/sanic/server.py", line 157, in on_header
>     self.headers.append((name.decode().casefold(), value.decode()))
> AttributeError: 'NoneType' object has no attribute 'decode'
> 
> During handling of the above exception, another exception occurred:
> 
> Traceback (most recent call last):
>   File "/usr/local/lib/python3.5/dist-packages/sanic/server.py", line 144, in data_received
>     self.parser.feed_data(data)
>   File "httptools/parser/parser.pyx", line 171, in httptools.parser.parser.HttpParser.feed_data (httptools/parser/parser.c:2721)
> httptools.parser.errors.HttpParserCallbackError: the on_header_field callback failed

At this moment the request have not been created. So is there a method can I log the access url ?



diff --git a/sanic/server.py b/sanic/server.py
index f62ba654..4dedc650 100644
--- a/sanic/server.py
+++ b/sanic/server.py
@@ -189,10 +189,12 @@ class HttpProtocol(asyncio.Protocol):
                     and int(value) > self.request_max_size:
                 exception = PayloadTooLarge('Payload Too Large')
                 self.write_error(exception)
-
+            try:
+                value = value.decode()
+            except UnicodeDecodeError:
+                value = value.decode('latin_1')
             self.headers.append(
-                    (self._header_fragment.decode().casefold(),
-                     value.decode()))
+                    (self._header_fragment.decode().casefold(), value))
 
             self._header_fragment = b''
 
['sanic/server.py']