def test_link_headers(self, get): user = UserFactory.create() url = "foo" get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) path = data_file("no-rel.atom") with open(path, "r") as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=[{"url": "foo", "rel": "self"}]) self.assertEqual(feed.entries.count(), 1)
def test_link_headers(self, get): user = UserFactory.create() url = 'foo' get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) path = data_file('no-rel.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=[{'url': 'foo', 'rel': 'self'}]) self.assertEqual(feed.entries.count(), 1)
def test_link_headers(self, get): user = UserFactory.create(ttl=99999) url = 'http://foo' get.return_value = responses(304) FeedFactory.create(url=url, category__user=user, user=user) path = data_file('no-rel.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=[{'url': 'http://foo', 'rel': 'self'}]) self.assertEqual(es.client.count(es.user_alias(user.pk), doc_type='entries')['count'], 1)
def test_pubsubhubbub_handling(self, get): user = UserFactory.create(ttl=99999) url = 'http://bruno.im/atom/tag/django-community/' get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) get.assert_called_with( url, headers={'User-Agent': USER_AGENT % '1 subscriber', 'Accept': feedparser.ACCEPT_HEADER}, timeout=10) self.assertEqual(feed.entries.count(), 0) path = data_file('bruno.im.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=None) if user.es: entries = self.counts(user, feed={'feed': feed.pk})['feed'] else: entries = feed.entries.count() self.assertEqual(entries, 5) # Check content handling if user.es: entries = es.manager.user(user).filter( feed=feed.pk).fetch()['hits'] else: entries = feed.entries.all() for entry in entries: self.assertTrue(len(entry.subtitle) > 2400) # Check date handling if user.es: eleven = es.manager.user(user).filter( feed=feed.pk, timestamp__gt='2010-12-31', timestamp__lt='2012-01-01' ).fetch() eleven = len(eleven['hits']) twelve = es.manager.user(user).filter( feed=feed.pk, timestamp__gt='2011-12-31', timestamp__lt='2013-01-01' ).fetch() twelve = len(twelve['hits']) else: eleven = feed.entries.filter(date__year=2011).count() twelve = feed.entries.filter(date__year=2012).count() self.assertEqual(eleven, 3) self.assertEqual(twelve, 2)
def test_link_headers(self, get, head): head.side_effect = resolve_url user = UserFactory.create(ttl=99999) url = 'http://foo' get.return_value = responses(304) FeedFactory.create(url=url, category__user=user, user=user) path = data_file('no-rel.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=[{'url': 'http://foo', 'rel': 'self'}]) self.assertEqual(es.client.count(es.user_alias(user.pk), doc_type='entries')['count'], 1)
def test_pubsubhubbub_handling(self, get, head): head.side_effect = resolve_url user = UserFactory.create(ttl=99999) url = 'http://bruno.im/atom/tag/django-community/' get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) get.assert_called_with(url, headers={ 'User-Agent': USER_AGENT % '1 subscriber', 'Accept': feedparser.ACCEPT_HEADER }, timeout=10, auth=None) self.assertEqual(feed.entries.count(), 0) path = data_file('bruno.im.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=None) entries = self.counts(user, feed={'feed': feed.pk})['feed'] self.assertEqual(entries, 5) # Check content handling entries = es.manager.user(user).filter(feed=feed.pk).fetch()['hits'] for entry in entries: self.assertTrue(len(entry.subtitle) > 2400) # Check date handling eleven = es.manager.user(user).filter( feed=feed.pk, timestamp__gt='2010-12-31', timestamp__lt='2012-01-01').fetch() eleven = len(eleven['hits']) twelve = es.manager.user(user).filter( feed=feed.pk, timestamp__gt='2011-12-31', timestamp__lt='2013-01-01').fetch() twelve = len(twelve['hits']) self.assertEqual(eleven, 3) self.assertEqual(twelve, 2)
def test_pubsubhubbub_handling(self, get): url = 'http://bruno.im/atom/tag/django-community/' get.return_value = responses(304) feed = self.cat.feeds.create(url=url, name='Bruno') get.assert_called_with( url, headers={'User-Agent': USER_AGENT % '1 subscriber'}, timeout=10) self.assertEqual(feed.entries.count(), 0) path = os.path.join(ROOT, 'bruno.im.atom') parsed = feedparser.parse(path) updated.send(sender=None, notification=parsed) self.assertEqual(feed.entries.count(), 5) # Check content handling for entry in feed.entries.all(): self.assertTrue(len(entry.subtitle) > 2400) # Check date handling self.assertEqual(feed.entries.filter(date__year=2011).count(), 3) self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
def test_pubsubhubbub_handling(self, get): user = UserFactory.create() url = 'http://bruno.im/atom/tag/django-community/' get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) get.assert_called_with( url, headers={'User-Agent': USER_AGENT % '1 subscriber', 'Accept': feedparser.ACCEPT_HEADER}, timeout=10) self.assertEqual(feed.entries.count(), 0) path = test_file('bruno.im.atom') parsed = feedparser.parse(path) updated.send(sender=None, notification=parsed) self.assertEqual(feed.entries.count(), 5) # Check content handling for entry in feed.entries.all(): self.assertTrue(len(entry.subtitle) > 2400) # Check date handling self.assertEqual(feed.entries.filter(date__year=2011).count(), 3) self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
def test_pubsubhubbub_handling(self, get): user = UserFactory.create() url = "http://bruno.im/atom/tag/django-community/" get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) get.assert_called_with( url, headers={"User-Agent": USER_AGENT % "1 subscriber", "Accept": feedparser.ACCEPT_HEADER}, timeout=10 ) self.assertEqual(feed.entries.count(), 0) path = data_file("bruno.im.atom") with open(path, "r") as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=None) self.assertEqual(feed.entries.count(), 5) # Check content handling for entry in feed.entries.all(): self.assertTrue(len(entry.subtitle) > 2400) # Check date handling self.assertEqual(feed.entries.filter(date__year=2011).count(), 3) self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
def test_pubsubhubbub_handling(self, get): user = UserFactory.create() url = 'http://bruno.im/atom/tag/django-community/' get.return_value = responses(304) feed = FeedFactory.create(url=url, category__user=user, user=user) get.assert_called_with( url, headers={'User-Agent': USER_AGENT % '1 subscriber', 'Accept': feedparser.ACCEPT_HEADER}, timeout=10) self.assertEqual(feed.entries.count(), 0) path = data_file('bruno.im.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=None) self.assertEqual(feed.entries.count(), 5) # Check content handling for entry in feed.entries.all(): self.assertTrue(len(entry.subtitle) > 2400) # Check date handling self.assertEqual(feed.entries.filter(date__year=2011).count(), 3) self.assertEqual(feed.entries.filter(date__year=2012).count(), 2)
def callback(request, pk): subscription = get_object_or_404(Subscription, pk=pk) if request.method == 'GET': mode = request.GET['hub.mode'] topic = request.GET['hub.topic'] challenge = request.GET['hub.challenge'] lease_seconds = request.GET.get('hub.lease_seconds', None) verify_token = request.GET.get('hub.verify_token', None) if mode == 'subscribe': if not verify_token.startswith(mode): raise Http404 invalid_subscription = any(( all(( verify_token is not None, subscription.verify_token != verify_token, )), topic != subscription.topic, )) if invalid_subscription: raise Http404 subscription.verified = True if lease_seconds is not None: subscription.set_expiration(int(lease_seconds)) subscription.save() return HttpResponse(challenge) if mode == 'unsubscribe': subscription.delete() return HttpResponse(challenge) elif request.method == 'POST': signature = request.META.get('HTTP_X_HUB_SIGNATURE', None) if subscription.secret and signature: hasher = hmac.new(str(subscription.secret), request.raw_post_data, hashlib.sha1) digest = 'sha1=%s' % hasher.hexdigest() if signature != digest: return HttpResponse('') parsed = feedparser.parse(request.raw_post_data) links = getattr(parsed.feed, 'links', None) if links: hub_url = subscription.hub topic_url = subscription.topic for link in links: if link['rel'] == 'hub': hub_url = link['href'] elif link['rel'] == 'self': topic_url = link['href'] needs_update = any(( hub_url and subscription.hub != hub_url, topic_url != subscription.topic, )) if needs_update: try: Subscription.objects.subscribe(topic_url, hub=hub_url) except SubscriptionError: pass updated.send(sender=subscription, notification=parsed) return HttpResponse('') return HttpResponse()
def test_missing_links(self, get): path = data_file('no-rel.atom') with open(path, 'r') as f: data = f.read() updated.send(sender=None, notification=data, request=None, links=None)
def callback(request, pk): subscription = get_object_or_404(Subscription, pk=pk) logger.info(u'PuSH callback on subscription %s', subscription) if request.method == 'GET': try: mode = request.GET['hub.mode'] topic = request.GET['hub.topic'] challenge = request.GET['hub.challenge'] except Exception: return HttpResponseBadRequest() lease_seconds = request.GET.get('hub.lease_seconds', None) verify_token = request.GET.get('hub.verify_token', None) if mode == 'subscribe': if not verify_token.startswith(mode): raise Http404 invalid_subscription = any(( all(( verify_token is not None, subscription.verify_token != verify_token, )), topic != subscription.topic, )) if invalid_subscription: raise Http404 subscription.verified = True if lease_seconds is not None: subscription.set_expiration(int(lease_seconds)) subscription.save() return HttpResponse(challenge) if mode == 'unsubscribe': subscription.delete() return HttpResponse(challenge) elif request.method == 'POST': signature = request.META.get('HTTP_X_HUB_SIGNATURE', None) if subscription.secret: if signature is None: # Acknowledging receipt but ignoring the message return HttpResponse('') hasher = hmac.new(str(subscription.secret), request.raw_post_data, hashlib.sha1) digest = 'sha1=%s' % hasher.hexdigest() if signature != digest: return HttpResponse('') logger.info(u'PuSH POST parsing feed data') parsed = feedparser.parse(request.raw_post_data) logger.info(u'PuSH POST raw data %s', parsed) links = getattr(parsed.feed, 'links', None) if links: hub_url = subscription.hub logger.debug(u'\t hub_url: %s', hub_url) topic_url = subscription.topic logger.debug(u'\t topic_url: %s', topic_url) for link in links: logger.debug(u'\t\t link: %s', link) if link['rel'] == 'hub': hub_url = link['href'] elif link['rel'] == 'self': topic_url = link['href'] logger.debug(u'\t hub_url: %s', hub_url) logger.debug(u'\t topic_url: %s', topic_url) if subscription.needs_update(topic=topic_url, hub=hub_url): logger.info(u'PuSH POST needs update %s %s', topic_url, hub_url) try: Subscription.objects.subscribe(topic_url, hub=hub_url) except SubscriptionError: pass updated.send(sender=subscription, notification=parsed) return HttpResponse('') return HttpResponse()
def callback(request, pk): subscription = get_object_or_404(Subscription, pk=pk) if request.method == "GET": mode = request.GET["hub.mode"] topic = request.GET["hub.topic"] challenge = request.GET["hub.challenge"] lease_seconds = request.GET.get("hub.lease_seconds", None) verify_token = request.GET.get("hub.verify_token", None) if mode == "subscribe": if not verify_token.startswith(mode): raise Http404 invalid_subscription = any( ( all((verify_token is not None, subscription.verify_token != verify_token)), topic != subscription.topic, ) ) if invalid_subscription: raise Http404 subscription.verified = True if lease_seconds is not None: subscription.set_expiration(int(lease_seconds)) subscription.save() return HttpResponse(challenge) if mode == "unsubscribe": subscription.delete() return HttpResponse(challenge) elif request.method == "POST": signature = request.META.get("HTTP_X_HUB_SIGNATURE", None) if subscription.secret: if signature is None: # Acknowledging receipt but ignoring the message return HttpResponse("") hasher = hmac.new(str(subscription.secret), request.raw_post_data, hashlib.sha1) digest = "sha1=%s" % hasher.hexdigest() if signature != digest: return HttpResponse("") parsed = feedparser.parse(request.raw_post_data) links = getattr(parsed.feed, "links", None) if links: hub_url = subscription.hub topic_url = subscription.topic for link in links: if link["rel"] == "hub": hub_url = link["href"] elif link["rel"] == "self": topic_url = link["href"] needs_update = any((hub_url and subscription.hub != hub_url, topic_url != subscription.topic)) if needs_update: try: Subscription.objects.subscribe(topic_url, hub=hub_url) except SubscriptionError: pass updated.send(sender=subscription, notification=parsed) return HttpResponse("") return HttpResponse()