예제 #1
0
파일: views.py 프로젝트: voidfiles/pourover
def feed_push_update(feed_key):
    feed = ndb.Key(urlsafe=feed_key).get()
    if not feed:
        return "No feed", 404

    data = request.stream.read()

    if feed.hub_secret:
        server_signature = request.headers.get('X-Hub-Signature', None)
        signature = hmac.new(feed.hub_secret, data).hexdigest()

        if server_signature != signature:
            logger.warn('Got PuSH subscribe POST for feed key=%s w/o valid signature: sent=%s != expected=%s', feed_key,
                        server_signature, signature)
            return ''

    logger.info('Got PuSH body: %s', data)
    logger.info('Got PuSH headers: %s', request.headers)

    Entry.update_for_feed(feed, publish=True, skip_queue=True)

    return ''
예제 #2
0
파일: views.py 프로젝트: voidfiles/pourover
def update_all_feeds(interval_id):
    """Update all feeds for a specific interval"""
    if request.headers.get('X-Appengine-Cron') != 'true':
        return jsonify_error(message='Not a cron call')

    feeds = Feed.for_interval(interval_id)

    for feed in feeds:
        feed.prepare_request()

    errors = 0
    success = 0
    for feed in feeds:
        try:
            Entry.update_for_feed(feed, publish=True)
            success += 1
        except FetchException, e:
            errors += 1
            pass
        except Exception, e:
            errors += 1
            logger.exception('Failed to update feed:%s' % (feed.feed_url, ))
예제 #3
0
파일: views.py 프로젝트: berg/pourover
def tq_feed_poll():
    """Poll some feeds feed"""
    if not request.headers.get('X-AppEngine-QueueName'):
        raise ndb.Return(jsonify_error(message='Not a Task call'))

    keys = request.form.get('keys')
    if not keys:
        logger.info('Task Queue poll no keys')
        raise ndb.Return(jsonify_error(code=500))

    success = 0
    errors = 0
    entries_created = 0
    logger.info('Getting feeds')
    ndb_keys = [ndb.Key(urlsafe=key) for key in keys.split(',')]
    feeds = yield ndb.get_multi_async(ndb_keys)
    logger.info('Got %d feed(s)', len(feeds))
    futures = []

    for i, feed in enumerate(feeds):
        if not feed:
            errors += 1
            logger.info("Couldn't find feed for key: %s", ndb_keys[i])
            continue

        futures.append((i, Entry.update_for_feed(feed)))

    for i, future in futures:
        try:
            parsed_feed, num_new_entries = yield future
            entries_created += num_new_entries
            success += 1
        except:
            errors += 1
            feed = feeds[i]
            logger.exception('Failed to update feed:%s, i=%s' % (feed.feed_url, i))

    logger.info('Polled feeds entries_created: %s success: %s errors: %s', entries_created, success, errors)

    raise ndb.Return(jsonify(status='ok'))