import socket

class URLLoader(object):
    def __init__(self, config, path, data=None):
        self.config = config
        self.path = path
        self.data = data
        self.socket = None
        self._headers = None

    def initialize(self):
        self.socket = s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(5)
        s.connect((self.config.host, self.config.port))
        for line in self.get_request():
            # print 'sending line', repr(line)
            s.send(line)

    def close(self):
        if self.socket:
            self.socket.close()
            self.socket = None

    def get_request(self):
        method = self.data and 'POST' or 'GET'
        yield '%s %s HTTP/1.0\r\n' % (method, self.path)
        headers = {}
        if self.data:
            headers['Content-Type'] = 'application/x-www-form-urlencoded'
            headers['Content-Length'] = str(len(self.data))
        for k, v in headers.iteritems():
            yield '%s: %s\r\n' % (k, v)
        yield '\r\n'
        if self.data:
            yield self.data

    def next_line(self):
        ret = []
        while 1:
            char = self.socket.recv(1)
            if not char:
                break
            ret.append(char)
            if char == '\n':
                # print 'received line', ''.join(ret)
                return ''.join(ret)

    def headers(self):
        if self._headers:
            return self._headers
        self._headers = headers = []
        while 1:
            line = self.next_line()
            if not line or line == '\n' or line == '\r\n':
                break
            headers.append(line.strip())
        return headers


