
from eventlib.green import socket, ssl, httplib, urllib2
from xcaplib import httpclient
from xcaplib import client
import urllib
import http


class HTTPConnection(httplib.HTTPConnection):
    def connect(self):
        address = httpclient.HostCache.get(self.host)
        self.sock = socket.create_connection((address, self.port), self.timeout)

class HTTPSConnection(httplib.HTTPSConnection):
    def connect(self):
        address = httpclient.HostCache.get(self.host)
        sock = socket.create_connection((address, self.port), self.timeout)
        ssl_sock = ssl.sslwrap_simple(sock, self.key_file, self.cert_file)
        self.sock = httplib.FakeSocket(sock, ssl_sock)

class HTTPHandler(urllib.request.HTTPHandler):
    def http_open(self, req):
        return self.do_open(HTTPConnection, req)

class HTTPSHandler(urllib.request.HTTPSHandler):
    def https_open(self, req):
        return self.do_open(http.client.HTTPSConnection, req)


class HTTPClient(httpclient.HTTPClient):
    def __init__(self, base_url, username, domain, password=None):
        self.base_url = base_url
        if self.base_url[-1:] != '/':
            self.base_url += '/'
        password_manager = urllib.request.HTTPPasswordMgr()
        if username is not None is not password:
            password_manager.add_password(domain, self.base_url, username, password)
        self.opener = urllib.request.build_opener(HTTPHandler, HTTPSHandler, urllib.request.HTTPDigestAuthHandler(password_manager), urllib.request.HTTPBasicAuthHandler(password_manager))


class XCAPClient(client.XCAPClient):
    HTTPClient = HTTPClient

