better response codes and log information for failed push requests
This commit is contained in:
parent
0c88cbf7c1
commit
860756a0f2
2 changed files with 27 additions and 20 deletions
|
@ -31,13 +31,14 @@ def notify(feed_id):
|
|||
if not feed:
|
||||
current_app.logger.warn(
|
||||
'could not find feed corresponding to %d', feed_id)
|
||||
abort(404)
|
||||
return make_response('no feed with id %d' % feed_id, 400)
|
||||
|
||||
if topic != feed.push_topic:
|
||||
current_app.logger.warn(
|
||||
'feed topic (%s) does not match subscription request (%s)',
|
||||
feed.push_topic, topic)
|
||||
abort(404)
|
||||
return make_response(
|
||||
'topic %s does not match subscription request %s' % (feed.push_topic, topic), 400)
|
||||
|
||||
current_app.logger.debug(
|
||||
'PuSH verify subscribe for feed=%r, topic=%s', feed, topic)
|
||||
|
@ -48,18 +49,28 @@ def notify(feed_id):
|
|||
db.session.commit()
|
||||
return challenge
|
||||
|
||||
elif mode == 'unsubscribe' and (not feed or topic != feed.push_topic):
|
||||
current_app.logger.debug(
|
||||
'PuSH verify unsubscribe for feed=%r, topic=%s', feed, topic)
|
||||
return challenge
|
||||
current_app.logger.debug('PuSH cannot verify %s for feed=%r, topic=%s',
|
||||
mode, feed, topic)
|
||||
abort(404)
|
||||
elif mode == 'unsubscribe':
|
||||
if not feed or topic != feed.push_topic:
|
||||
current_app.logger.debug(
|
||||
'PuSH verify unsubscribe for feed=%r, topic=%s', feed, topic)
|
||||
return challenge
|
||||
else:
|
||||
current_app.logger.debug(
|
||||
'PuSH denying unsubscribe for feed=%r, topic=%s', feed, topic)
|
||||
return make_response('unsubscribe denied', 400)
|
||||
|
||||
elif mode:
|
||||
current_app.logger.debug('PuSH request with unknown mode %s', mode)
|
||||
return make_response('unrecognized hub.mode=%s' % mode, 400)
|
||||
|
||||
else:
|
||||
current_app.logger.debug('PuSH request with no mode')
|
||||
return make_response('missing requred parameter hub.mode', 400)
|
||||
|
||||
if not feed:
|
||||
current_app.logger.warn(
|
||||
'could not find feed corresponding to %d', feed_id)
|
||||
abort(404)
|
||||
return make_response('no feed with id %d' % feed_id, 400)
|
||||
|
||||
# could it be? an actual push notification!?
|
||||
current_app.logger.debug(
|
||||
|
@ -83,7 +94,7 @@ def notify(feed_id):
|
|||
content = request.data.decode('utf-8')
|
||||
|
||||
tasks.q_high.enqueue(tasks.update_feed, feed.id,
|
||||
content=content, content_type=content_type,
|
||||
content=content, content_type=content_type,
|
||||
is_polling=False)
|
||||
feed.last_pinged = datetime.datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from contextlib import contextmanager
|
||||
from flask import current_app
|
||||
from flask import current_app, url_for
|
||||
from redis import StrictRedis
|
||||
from woodwind import util
|
||||
from woodwind.extensions import db
|
||||
|
@ -231,21 +231,17 @@ def update_feed(feed_id, content=None,
|
|||
|
||||
|
||||
def check_push_subscription(feed, response):
|
||||
def build_callback_url():
|
||||
return '{}://{}/_notify/{}'.format(
|
||||
getattr(current_app.config, 'PREFERRED_URL_SCHEME', 'http'),
|
||||
current_app.config['SERVER_NAME'],
|
||||
feed.id)
|
||||
|
||||
def send_request(mode, hub, topic):
|
||||
hub = urllib.parse.urljoin(feed.feed, hub)
|
||||
topic = urllib.parse.urljoin(feed.feed, topic)
|
||||
callback = url_for('push.notify', feed_id=feed.id, _external=True)
|
||||
current_app.logger.debug(
|
||||
'sending %s request for hub=%r, topic=%r', mode, hub, topic)
|
||||
'sending %s request for hub=%r, topic=%r, callback=%r',
|
||||
mode, hub, topic, callback)
|
||||
r = requests.post(hub, data={
|
||||
'hub.mode': mode,
|
||||
'hub.topic': topic,
|
||||
'hub.callback': build_callback_url(),
|
||||
'hub.callback': callback,
|
||||
'hub.secret': feed.get_or_create_push_secret(),
|
||||
'hub.verify': 'sync', # backcompat with 0.3
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue