def _prepare_metadata_headers(prepared_metadata, meta_type='meta'):
     for meta_key, meta_value in prepared_metadata.items():
         # Encode arrays into JSON strings because Archive.org does not
         # yet support complex metadata structures in
         # <identifier>_meta.xml.
         if isinstance(meta_value, dict):
             meta_value = json.dumps(meta_value)
         # Convert the metadata value into a list if it is not already
         # iterable.
         if (isinstance(meta_value, six.string_types)
                 or not hasattr(meta_value, '__iter__')):
             meta_value = [meta_value]
         # Convert metadata items into HTTP headers and add to
         # ``headers`` dict.
         for i, value in enumerate(meta_value):
             if not value:
                 continue
             header_key = 'x-archive-{0}{1:02d}-{2}'.format(
                 meta_type, i, meta_key)
             if (isinstance(value, six.string_types)
                     and needs_quote(value)):
                 if six.PY2 and isinstance(value, six.text_type):
                     value = value.encode('utf-8')
                 value = 'uri({0})'.format(urllib.parse.quote(value))
             # because rfc822 http headers disallow _ in names, IA-S3 will
             # translate two hyphens in a row (--) into an underscore (_).
             header_key = header_key.replace('_', '--')
             headers[header_key] = value
    def prepare_headers(self, headers, metadata, queue_derive=True):
        """Convert a dictionary of metadata into S3 compatible HTTP
        headers, and append headers to ``headers``.

        :type metadata: dict
        :param metadata: Metadata to be converted into S3 HTTP Headers
                         and appended to ``headers``.

        :type headers: dict
        :param headers: (optional) S3 compatible HTTP headers.

        """
        if not metadata.get('scanner'):
            scanner = 'Internet Archive Python library {0}'.format(__version__)
            metadata['scanner'] = scanner
        prepared_metadata = prepare_metadata(metadata)

        headers['x-archive-auto-make-bucket'] = '1'
        if 'x-archive-queue-derive' not in headers:
            if queue_derive is False:
                headers['x-archive-queue-derive'] = '0'
            else:
                headers['x-archive-queue-derive'] = '1'

        for meta_key, meta_value in prepared_metadata.items():
            # Encode arrays into JSON strings because Archive.org does not
            # yet support complex metadata structures in
            # <identifier>_meta.xml.
            if isinstance(meta_value, dict):
                meta_value = json.dumps(meta_value)
            # Convert the metadata value into a list if it is not already
            # iterable.
            if (isinstance(meta_value, six.string_types)
                    or not hasattr(meta_value, '__iter__')):
                meta_value = [meta_value]
            # Convert metadata items into HTTP headers and add to
            # ``headers`` dict.
            for i, value in enumerate(meta_value):
                if not value:
                    continue
                header_key = 'x-archive-meta{0:02d}-{1}'.format(i, meta_key)
                if (isinstance(value, six.string_types)
                        and needs_quote(value)):
                    if six.PY2 and isinstance(value, six.text_type):
                        value = value.encode('utf-8')
                    value = 'uri({0})'.format(urllib.parse.quote(value))
                # because rfc822 http headers disallow _ in names, IA-S3 will
                # translate two hyphens in a row (--) into an underscore (_).
                header_key = header_key.replace('_', '--')
                headers[header_key] = value
        super(S3PreparedRequest, self).prepare_headers(headers)
Exemple #3
0
    def prepare_headers(self, headers, metadata, queue_derive=True):
        """Convert a dictionary of metadata into S3 compatible HTTP
        headers, and append headers to ``headers``.

        :type metadata: dict
        :param metadata: Metadata to be converted into S3 HTTP Headers
                         and appended to ``headers``.

        :type headers: dict
        :param headers: (optional) S3 compatible HTTP headers.

        """
        if not metadata.get('scanner'):
            scanner = 'Internet Archive Python library {0}'.format(__version__)
            metadata['scanner'] = scanner
        prepared_metadata = prepare_metadata(metadata)

        headers['x-archive-auto-make-bucket'] = 1
        if queue_derive is False:
            headers['x-archive-queue-derive'] = 0
        else:
            headers['x-archive-queue-derive'] = 1

        for meta_key, meta_value in prepared_metadata.items():
            # Encode arrays into JSON strings because Archive.org does not
            # yet support complex metadata structures in
            # <identifier>_meta.xml.
            if isinstance(meta_value, dict):
                meta_value = json.dumps(meta_value)
            # Convert the metadata value into a list if it is not already
            # iterable.
            if (isinstance(meta_value, six.string_types) or
                    not hasattr(meta_value, '__iter__')):
                meta_value = [meta_value]
            # Convert metadata items into HTTP headers and add to
            # ``headers`` dict.
            for i, value in enumerate(meta_value):
                if not value:
                    continue
                header_key = 'x-archive-meta{0:02d}-{1}'.format(i, meta_key)
                if (isinstance(value, six.string_types) and needs_quote(value)):
                    if six.PY2 and isinstance(value, six.text_type):
                        value = value.encode('utf-8')
                    value = 'uri({0})'.format(urllib.parse.quote(value))
                # because rfc822 http headers disallow _ in names, IA-S3 will
                # translate two hyphens in a row (--) into an underscore (_).
                header_key = header_key.replace('_', '--')
                headers[header_key] = value
        super(S3PreparedRequest, self).prepare_headers(headers)