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)
