def get_response(self):
        '''
        Sends the request and returns an HTTP response object.
        @return: Response
        '''
        if self.method in HTTP_METHODS_WITH_DATA and not self.data:
            raise Exception("%s requests must carry data." %
                            self.method.upper())

        headers = self.__serialize_headers()
        headers.update({
            "Accept": "application/json",
            "User-Agent": "Greendizer Pyzer Library/1.0",
            "Accept-Encoding": "gzip, deflate",
            "Cache-Control": "no-cache"
        })

        #X-HTTP-Method-Override support
        method = self.method.lower()
        if ((HTTP_POST_ONLY and self.method in HTTP_METHODS_WITH_DATA) or
            self.method == "patch"):
            headers["X-HTTP-Method-Override"] = self.method.upper()
            method = "post"

        #Data encoding and compression for POST, PUT and PATCH requests
        data = self.data
        if method in HTTP_METHODS_WITH_DATA:
            headers["Content-Type"] = self.__content_type + "; charset=utf-8"

            #URL encoding
            if self.__content_type == "application/x-www-form-urlencoded":
                data = to_byte_string(urllib.urlencode(data))


            #GZip compression
            if not greendizer.DEBUG and USE_GZIP:
                headers["Content-Encoding"] = COMPRESSION_GZIP
                data = self.__gzip_content(to_byte_string(data))

        request = Request.HttpRequest(self.uri.geturl(),
                                      data=data,
                                      method=method, headers=headers)

        try:
            response = urllib2.urlopen(request)
            return Response(self, 200, response.read(),
                            response.info())

        except(urllib2.HTTPError), e:
            instance = Response(self, e.code, e.read(), e.info())
            if e.code not in [201, 202, 204, 206, 304, 409, 416]:
                raise ApiException(instance)

            return instance
 def __createElementNS(self, root, uri, name, value):
     '''
     Creates and returns an element with a qualified name and a name space
     @param root:Element Parent element
     @param uri:str Namespace URI
     @param tag:str Tag name.
     '''
     tag = root.ownerDocument.createElementNS(to_byte_string(uri),
                                              to_byte_string(name))
     tag.appendChild(root.ownerDocument
                     .createCDATASection(to_byte_string(value)))
     return root.appendChild(tag)
    def _create_text_node(self, root, name, value, cdata=False):
        '''
        Creates and adds a text node
        @param root:Element Root element
        @param name:str Tag name
        @param value:object Text value
        @param cdata:bool A value indicating whether to use CDATA or not.
        @return:Node
        '''
        if is_empty_or_none(value):
            return

        if isinstance(value, date):
            value = date_to_string(value)

        if isinstance(value, datetime):
            value = datetime_to_string(value)

        if isinstance(value, Decimal):
            value = "0" if not value else str(value)

        tag = root.ownerDocument.createElement(name)
        value = to_byte_string(value)
        if cdata:
            tag.appendChild(root.ownerDocument.createCDATASection(value))
        else:
            tag.appendChild(root.ownerDocument.createTextNode(value))

        return root.appendChild(tag)
    def to_xml(self, name):
        '''
        Returns a DOM representation of the line treatment.
        @return: Element
        '''
        for n, v in { "rate_type": self.rate_type,
                     "rate": self.rate,
                     "name": self.name,
                     "description":self.description }.items():
            if is_empty_or_none(v):
                raise ValueError("'%s' attribute cannot be empty or None." % n)

        doc = Document()
        root = doc.createElement(name)
        root.setAttribute("type", self.rate_type)
        root.setAttribute("name", to_byte_string(self.name))
        root.setAttribute("description", to_byte_string(self.description))
        root.setAttribute("base", self.interval) if self.interval else ""
        root.appendChild(doc.createTextNode(to_byte_string(self.rate)))
        return root
    def send(self, xmli, signature=True):
        '''
        Sends an invoice
        @param xmli:str Invoice XML representation.
        @return: InvoiceReport
        '''
        xmli = to_byte_string(xmli)
        if not xmli:
            raise ValueError("Invalid XMLi")

        '''
        XMLdsig: required PyCrypto + lxml
        '''
        private_key, public_key = self.email.client.keys
        if signature and private_key and public_key:
            from greendizer import xmldsig
            xmli = xmldsig.sign(xmli, private_key, public_key)

        size = 0
        try:
            from os import sys
            size = sys.getsizeof(xmli)
        except AttributeError:
            import base64 #2.5 and older...
            size = len(base64.encodestring(xmli)) #1 ASCII = 1 byte

        if size > MAX_CONTENT_LENGTH:
            raise ValueError("XMLi's size is limited to %skb."
                             % MAX_CONTENT_LENGTH / 1024)

        request = Request(self.email.client, method="POST", data=xmli,
                          uri=self._uri, content_type="application/xml")

        response = request.get_response()
        if response.status_code == 202: #Accepted
            return InvoiceReport(self.email,
                                 extract_id_from_uri(response["Location"]))