'Use HTTP protocol.'

def open_http(self, url, data=None):

    import httplib
    user_passwd = None
    proxy_passwd = None
    if isinstance(url, str):
        (host, selector) = splithost(url)
        if host:
            (user_passwd, host) = splituser(host)
            host = unquote(host)
        realhost = host
    else:
        (host, selector) = url
        (proxy_passwd, host) = splituser(host)
        (urltype, rest) = splittype(selector)
        url = rest
        user_passwd = None
        if (urltype.lower() != 'http'):
            realhost = None
        else:
            (realhost, rest) = splithost(rest)
            if realhost:
                (user_passwd, realhost) = splituser(realhost)
            if user_passwd:
                selector = ('%s://%s%s' % (urltype, realhost, rest))
            if proxy_bypass(realhost):
                host = realhost
    if (not host):
        raise IOError, ('http    error', 'no    host    given')
    if proxy_passwd:
        import base64
        proxy_auth = base64.b64encode(proxy_passwd).strip()
    else:
        proxy_auth = None
    if user_passwd:
        import base64
        auth = base64.b64encode(user_passwd).strip()
    else:
        auth = None
    h = httplib.HTTP(host)
    if (data is not None):
        h.putrequest('POST', selector)
        h.putheader('Content-Type', 'application/x-www-form-urlencoded')
        h.putheader('Content-Length', ('%d' % len(data)))
    else:
        h.putrequest('GET', selector)
    if proxy_auth:
        h.putheader('Proxy-Authorization', ('Basic    %s' % proxy_auth))
    if auth:
        h.putheader('Authorization', ('Basic    %s' % auth))
    if realhost:
        h.putheader('Host', realhost)
    for args in self.addheaders:
        h.putheader(*args)
    h.endheaders(data)
    (errcode, errmsg, headers) = h.getreply()
    fp = h.getfile()
    if (errcode == (-1)):
        if fp:
            fp.close()
        raise IOError, ('http    protocol    error', 0, 'got    a    bad    status    line', None)
    if (200 <= errcode < 300):
        return addinfourl(fp, headers, ('http:' + url), errcode)
    elif (data is None):
        return self.http_error(url, fp, errcode, errmsg, headers)
    else:
        return self.http_error(url, fp, errcode, errmsg, headers, data)
