Merge pull request #1124 from JackDanger/julienduchesne/handle-max-keys
Rebase #1112 – Handle "max-keys" in list-objects
This commit is contained in:
		
						commit
						6585a4fc78
					
				
							
								
								
									
										30
									
								
								moto/s3/responses.py
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										30
									
								
								moto/s3/responses.py
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@ -276,6 +276,7 @@ class ResponseObject(_TemplateEnvironmentMixin):
 | 
				
			|||||||
        if prefix and isinstance(prefix, six.binary_type):
 | 
					        if prefix and isinstance(prefix, six.binary_type):
 | 
				
			||||||
            prefix = prefix.decode("utf-8")
 | 
					            prefix = prefix.decode("utf-8")
 | 
				
			||||||
        delimiter = querystring.get('delimiter', [None])[0]
 | 
					        delimiter = querystring.get('delimiter', [None])[0]
 | 
				
			||||||
 | 
					        max_keys = int(querystring.get('max-keys', [1000])[0])
 | 
				
			||||||
        marker = querystring.get('marker', [None])[0]
 | 
					        marker = querystring.get('marker', [None])[0]
 | 
				
			||||||
        result_keys, result_folders = self.backend.prefix_query(
 | 
					        result_keys, result_folders = self.backend.prefix_query(
 | 
				
			||||||
            bucket, prefix, delimiter)
 | 
					            bucket, prefix, delimiter)
 | 
				
			||||||
@ -283,13 +284,17 @@ class ResponseObject(_TemplateEnvironmentMixin):
 | 
				
			|||||||
        if marker:
 | 
					        if marker:
 | 
				
			||||||
            result_keys = self._get_results_from_token(result_keys, marker)
 | 
					            result_keys = self._get_results_from_token(result_keys, marker)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        result_keys, is_truncated, _ = self._truncate_result(result_keys, max_keys)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        template = self.response_template(S3_BUCKET_GET_RESPONSE)
 | 
					        template = self.response_template(S3_BUCKET_GET_RESPONSE)
 | 
				
			||||||
        return 200, {}, template.render(
 | 
					        return 200, {}, template.render(
 | 
				
			||||||
            bucket=bucket,
 | 
					            bucket=bucket,
 | 
				
			||||||
            prefix=prefix,
 | 
					            prefix=prefix,
 | 
				
			||||||
            delimiter=delimiter,
 | 
					            delimiter=delimiter,
 | 
				
			||||||
            result_keys=result_keys,
 | 
					            result_keys=result_keys,
 | 
				
			||||||
            result_folders=result_folders
 | 
					            result_folders=result_folders,
 | 
				
			||||||
 | 
					            is_truncated=is_truncated,
 | 
				
			||||||
 | 
					            max_keys=max_keys
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _handle_list_objects_v2(self, bucket_name, querystring):
 | 
					    def _handle_list_objects_v2(self, bucket_name, querystring):
 | 
				
			||||||
@ -312,13 +317,8 @@ class ResponseObject(_TemplateEnvironmentMixin):
 | 
				
			|||||||
            limit = continuation_token or start_after
 | 
					            limit = continuation_token or start_after
 | 
				
			||||||
            result_keys = self._get_results_from_token(result_keys, limit)
 | 
					            result_keys = self._get_results_from_token(result_keys, limit)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if len(result_keys) > max_keys:
 | 
					        result_keys, is_truncated, \
 | 
				
			||||||
            is_truncated = 'true'
 | 
					            next_continuation_token = self._truncate_result(result_keys, max_keys)
 | 
				
			||||||
            result_keys = result_keys[:max_keys]
 | 
					 | 
				
			||||||
            next_continuation_token = result_keys[-1].name
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            is_truncated = 'false'
 | 
					 | 
				
			||||||
            next_continuation_token = None
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return template.render(
 | 
					        return template.render(
 | 
				
			||||||
            bucket=bucket,
 | 
					            bucket=bucket,
 | 
				
			||||||
@ -341,6 +341,16 @@ class ResponseObject(_TemplateEnvironmentMixin):
 | 
				
			|||||||
            continuation_index += 1
 | 
					            continuation_index += 1
 | 
				
			||||||
        return result_keys[continuation_index:]
 | 
					        return result_keys[continuation_index:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _truncate_result(self, result_keys, max_keys):
 | 
				
			||||||
 | 
					        if len(result_keys) > max_keys:
 | 
				
			||||||
 | 
					            is_truncated = 'true'
 | 
				
			||||||
 | 
					            result_keys = result_keys[:max_keys]
 | 
				
			||||||
 | 
					            next_continuation_token = result_keys[-1].name
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            is_truncated = 'false'
 | 
				
			||||||
 | 
					            next_continuation_token = None
 | 
				
			||||||
 | 
					        return result_keys, is_truncated, next_continuation_token
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _bucket_response_put(self, request, body, region_name, bucket_name, querystring, headers):
 | 
					    def _bucket_response_put(self, request, body, region_name, bucket_name, querystring, headers):
 | 
				
			||||||
        if not request.headers.get('Content-Length'):
 | 
					        if not request.headers.get('Content-Length'):
 | 
				
			||||||
            return 411, {}, "Content-Length required"
 | 
					            return 411, {}, "Content-Length required"
 | 
				
			||||||
@ -841,9 +851,9 @@ S3_BUCKET_GET_RESPONSE = """<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			|||||||
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
 | 
					<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
 | 
				
			||||||
  <Name>{{ bucket.name }}</Name>
 | 
					  <Name>{{ bucket.name }}</Name>
 | 
				
			||||||
  <Prefix>{{ prefix }}</Prefix>
 | 
					  <Prefix>{{ prefix }}</Prefix>
 | 
				
			||||||
  <MaxKeys>1000</MaxKeys>
 | 
					  <MaxKeys>{{ max_keys }}</MaxKeys>
 | 
				
			||||||
  <Delimiter>{{ delimiter }}</Delimiter>
 | 
					  <Delimiter>{{ delimiter }}</Delimiter>
 | 
				
			||||||
  <IsTruncated>false</IsTruncated>
 | 
					  <IsTruncated>{{ is_truncated }}</IsTruncated>
 | 
				
			||||||
  {% for key in result_keys %}
 | 
					  {% for key in result_keys %}
 | 
				
			||||||
    <Contents>
 | 
					    <Contents>
 | 
				
			||||||
      <Key>{{ key.name }}</Key>
 | 
					      <Key>{{ key.name }}</Key>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user