remove print statement in logo.py
[mygpo.git] / mygpo / pubsub / __init__.py
blobd7a1bd9bdfc3c7e4a71135959611ca5aad4ca708
1 # -*- coding: utf-8 -*-
3 # PubSubHubbub subscriber mygpo
7 import urllib
8 import urllib2
9 import logging
11 from couchdbkit.ext.django import *
12 from django.core.urlresolvers import reverse
14 from mygpo.pubsub.models import Subscription, SubscriptionError
15 from mygpo.db.couchdb.pubsub import subscription_for_topic
17 logger = logging.getLogger(__name__)
20 def subscribe(feedurl, huburl, base_url, mode='subscribe'):
21 """ Subscribe to the feed at a Hub """
23 logger.info('subscribing for {feed} at {hub}'.format(feed=feedurl,
24 hub=huburl))
25 verify = 'sync'
27 subscription = subscription_for_topic(feedurl)
28 if subscription is None:
29 subscription = Subscription()
30 subscription.verify_token = random_token()
32 if subscription.mode == mode:
33 if subscription.verified:
34 logger.info('subscription already exists')
35 return
37 else:
38 logger.info('subscription exists but has wrong mode: ' +
39 'old: %(oldmode)s, new: %(newmode)s. Overwriting.' %
40 dict(oldmode=subscription.mode, newmode=mode))
42 subscription.url = feedurl
43 subscription.mode = mode
44 subscription.save()
46 data = {
47 "hub.callback": callback_url(feedurl, base_url),
48 "hub.mode": mode,
49 "hub.topic": feedurl,
50 "hub.verify": verify,
51 "hub.verify_token": subscription.verify_token,
54 data = urllib.urlencode(data.items())
55 logger.debug('sending request: %s' % repr(data))
57 resp = None
59 try:
60 resp = urllib2.urlopen(huburl, data)
61 except urllib2.HTTPError, e:
62 if e.code != 204: # we actually expect a 204 return code
63 msg = 'Could not send subscription to Hub: HTTP Error %d: %s' % (e.code, e.reason)
64 logger.warn(msg)
65 raise SubscriptionError(msg)
66 except Exception, e:
67 raise
68 msg = 'Could not send subscription to Hub: %s' % repr(e)
69 logger.warn(msg)
70 raise SubscriptionError(msg)
72 if resp:
73 status = resp.code
74 if status != 204:
75 logger.error('received incorrect status %d' % status)
76 raise SubscriptionError('Subscription has not been accepted by '
77 'the Hub')
80 def callback_url(feedurl, base_url):
81 callback = reverse('pubsub-subscribe')
82 param = urllib.urlencode([('url', feedurl)])
83 return '{base}{callback}?{param}'.format(base=base_url, callback=callback,
84 param=param)
87 def random_token(length=32):
88 import random
89 import string
90 return "".join(random.sample(string.letters+string.digits, length))