44import logging
55
66import six
7- from flask import abort , request
8-
7+ from sanic . exceptions import abort
8+ from sanic . response import text
99
1010class Webhook (object ):
1111 """
@@ -17,8 +17,7 @@ class Webhook(object):
1717 """
1818
1919 def __init__ (self , app , endpoint = '/postreceive' , secret = None ):
20- app .add_url_rule (rule = endpoint , endpoint = endpoint , view_func = self ._postreceive ,
21- methods = ['POST' ])
20+ app .add_route (uri = endpoint , handler = self ._postreceive , methods = ['POST' ])
2221
2322 self ._hooks = collections .defaultdict (list )
2423 self ._logger = logging .getLogger ('webhook' )
@@ -40,41 +39,41 @@ def decorator(func):
4039
4140 return decorator
4241
43- def _get_digest (self ):
42+ def _get_digest (self , request ):
4443 """Return message digest if a secret key was provided"""
4544
4645 return hmac .new (
47- self ._secret , request .data , hashlib .sha1 ).hexdigest () if self ._secret else None
46+ self ._secret , request .body , hashlib .sha1 ).hexdigest () if self ._secret else None
4847
49- def _postreceive (self ):
48+ def _postreceive (self , request ):
5049 """Callback from Flask"""
5150
52- digest = self ._get_digest ()
51+ digest = self ._get_digest (request )
5352
5453 if digest is not None :
55- sig_parts = _get_header ('X-Hub-Signature' ).split ('=' , 1 )
54+ sig_parts = _get_header ('X-Hub-Signature' , request ).split ('=' , 1 )
5655 if not isinstance (digest , six .text_type ):
5756 digest = six .text_type (digest )
5857
5958 if (len (sig_parts ) < 2 or sig_parts [0 ] != 'sha1'
6059 or not hmac .compare_digest (sig_parts [1 ], digest )):
6160 abort (400 , 'Invalid signature' )
6261
63- event_type = _get_header ('X-Github-Event' )
64- data = request .get_json ()
62+ event_type = _get_header ('X-Github-Event' , request )
63+ data = request .json
6564
6665 if data is None :
6766 abort (400 , 'Request body must contain json' )
6867
6968 self ._logger .info (
70- '%s (%s)' , _format_event (event_type , data ), _get_header ('X-Github-Delivery' ))
69+ '%s (%s)' , _format_event (event_type , data ), _get_header ('X-Github-Delivery' , request ))
7170
7271 for hook in self ._hooks .get (event_type , []):
7372 hook (data )
7473
75- return '' , 204
74+ return text ( '' , 204 )
7675
77- def _get_header (key ):
76+ def _get_header (key , request ):
7877 """Return message header"""
7978
8079 try :
0 commit comments