From 860756a0f2f9977f7635e8a93b1eb569894e812a Mon Sep 17 00:00:00 2001 From: Kyle Mahan Date: Fri, 18 Mar 2016 16:33:20 +0000 Subject: [PATCH] better response codes and log information for failed push requests --- woodwind/push.py | 33 ++++++++++++++++++++++----------- woodwind/tasks.py | 14 +++++--------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/woodwind/push.py b/woodwind/push.py index 2a2c3c0..4645c61 100644 --- a/woodwind/push.py +++ b/woodwind/push.py @@ -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() diff --git a/woodwind/tasks.py b/woodwind/tasks.py index be5de53..3745db3 100644 --- a/woodwind/tasks.py +++ b/woodwind/tasks.py @@ -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 })