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)
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)