import httplib import re import urllib SF_HOST = "sourceforge.net" FORM_URL = "http://sourceforge.net/account/login.php" test_url = "http://sourceforge.net/bugs/?func=detailbug&group_id=5470&bug_id=112628" class Session: def __init__(self, username, password): self.session_hash = None self._do_login(username, password) if self.session_hash is None: raise ValueError, "invalid username and password" def _do_login(self, username, password): form = {'return_to': '', 'form_loginname': username, 'form_pw': password, 'stay_in_ssl': '1', 'login': 'Login', } query = urllib.urlencode(form) headers = {'Content-Type': 'application/x-www-form-urlencoded', } c = httplib.HTTPConnection(SF_HOST) c.connect() c.request('POST', FORM_URL, query, headers) resp = c.getresponse() cookie = resp.msg.getheader('set-cookie') if cookie is None: raise ValueError, "invalid name/password: %s" % resp.read() self.session_hash = self._get_session_hash(cookie) _rx_sess_hash = re.compile('(session_hash=[a-z0-9]+);') def _get_session_hash(self, cookie): mo = self._rx_sess_hash.search(cookie) if mo: return mo.group(1) raise ValueError, "could not find session_hash in %s" % repr(cookie) def get(self, url, method="GET", headers={}, body=None): c = httplib.HTTPConnection(SF_HOST) c.set_debuglevel(1) c.connect() _headers = {'Cookie': self.session_hash} if headers: _headers.update(headers) if body: c.request(method, url, body, _headers) else: c.request(method, url, headers=_headers) resp = c.getresponse() return resp def Login(username, password): return Session(username, password)