Example #1
0
    def encode_raw(self, data):
        """ encode complex data for raw output """
        def _rewind(fid):
            if hasattr(fid, 'seek'):
                fid.seek(0)
            return data

        mime_type = getattr(data, 'mime_type', None)
        encoding = getattr(data, 'encoding', None)
        schema = getattr(data, 'schema', None)
        format_ = self.get_format(mime_type, encoding, schema)
        text_encoding = getattr(format_, 'text_encoding', 'utf-8')
        if format_ is None:
            raise ValueError("Invalid format specification! mime_type=%r, "
                             "encoding=%r, schema=%r" %
                             (mime_type, encoding, schema))
        if isinstance(data, CDObject):
            data = data.data
        if format_.is_xml:
            data = FastStringIO(
                etree.tostring(data,
                               pretty_print=False,
                               xml_declaration=True,
                               encoding=text_encoding))
            content_type = "%s; charset=%s" % (format_.mime_type,
                                               text_encoding)
        elif format_.is_json:
            data = FastStringIO(
                json.dumps(data, ensure_ascii=False).encode(text_encoding))
            content_type = "%s; charset=%s" % (format_.mime_type,
                                               text_encoding)
        elif format_.is_text:
            if isinstance(data, (CDTextBuffer, CDAsciiTextBuffer)):
                data.text_encoding = text_encoding
            else:
                data = FastStringIO(_rewind(data).read().encode(text_encoding))
            content_type = "%s; charset=%s" % (format_.mime_type,
                                               text_encoding)
        else:  # generic binary byte-stream
            if format_.encoding is not None:
                data_out = FastStringIO()
                for chunk in format_.encode(_rewind(data)):
                    data_out.write(chunk)
                data = data_out
            content_type = format_.mime_type
        return _rewind(data), content_type
Example #2
0
 def encode_raw(self, data):
     """ encode complex data for raw output """
     def _rewind(fid):
         if hasattr(fid, 'seek'):
             fid.seek(0)
         return data
     mime_type = getattr(data, 'mime_type', None)
     encoding = getattr(data, 'encoding', None)
     schema = getattr(data, 'schema', None)
     format_ = self.get_format(mime_type, encoding, schema)
     text_encoding = getattr(format_, 'text_encoding', 'utf-8')
     if format_ is None:
         raise ValueError(
             "Invalid format specification! mime_type=%r, "
             "encoding=%r, schema=%r" % (mime_type, encoding, schema)
         )
     if isinstance(data, CDObject):
         data = data.data
     if format_.is_xml:
         data = FastStringIO(etree.tostring(
             data, pretty_print=False, xml_declaration=True,
             encoding=text_encoding
         ))
         content_type = "%s; charset=%s" % (format_.mime_type, text_encoding)
     elif format_.is_json:
         data = FastStringIO(
             json.dumps(data, ensure_ascii=False).encode(text_encoding)
         )
         content_type = "%s; charset=%s" % (format_.mime_type, text_encoding)
     elif format_.is_text:
         if isinstance(data, (CDTextBuffer, CDAsciiTextBuffer)):
             data.text_encoding = text_encoding
         else:
             data = FastStringIO(_rewind(data).read().encode(text_encoding))
         content_type = "%s; charset=%s" % (format_.mime_type, text_encoding)
     else: # generic binary byte-stream
         if format_.encoding is not None:
             data_out = FastStringIO()
             for chunk in format_.encode(_rewind(data)):
                 data_out.write(chunk)
             data = data_out
         content_type = format_.mime_type
     return _rewind(data), content_type