| 133 | __all__ = [] |
| 134 | |
| 135 | class S3Request(object): |
| 136 | region_map = {} |
| 137 | ## S3 sometimes sends HTTP-301, HTTP-307 response |
| 138 | redir_map = {} |
| 139 | |
| 140 | def __init__(self, s3, method_string, resource, headers, body, params = None): |
| 141 | self.s3 = s3 |
| 142 | self.headers = SortedDict(headers or {}, ignore_case = True) |
| 143 | if len(self.s3.config.access_token)>0: |
| 144 | self.s3.config.role_refresh() |
| 145 | self.headers['x-amz-security-token']=self.s3.config.access_token |
| 146 | self.resource = resource |
| 147 | self.method_string = method_string |
| 148 | self.params = params or {} |
| 149 | self.body = body |
| 150 | self.requester_pays() |
| 151 | |
| 152 | def requester_pays(self): |
| 153 | if self.s3.config.requester_pays and self.method_string in ("GET", "POST", "PUT", "HEAD"): |
| 154 | self.headers['x-amz-request-payer'] = 'requester' |
| 155 | |
| 156 | def update_timestamp(self): |
| 157 | if "date" in self.headers: |
| 158 | del(self.headers["date"]) |
| 159 | self.headers["x-amz-date"] = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()) |
| 160 | |
| 161 | def use_signature_v2(self): |
| 162 | if self.s3.endpoint_requires_signature_v4: |
| 163 | return False |
| 164 | |
| 165 | if self.s3.config.signature_v2 or self.s3.fallback_to_signature_v2: |
| 166 | return True |
| 167 | |
| 168 | return False |
| 169 | |
| 170 | def sign(self): |
| 171 | bucket_name = self.resource.get('bucket') |
| 172 | |
| 173 | if self.use_signature_v2(): |
| 174 | debug("Using signature v2") |
| 175 | if bucket_name: |
| 176 | resource_uri = "/%s%s" % (bucket_name, self.resource['uri']) |
| 177 | else: |
| 178 | resource_uri = self.resource['uri'] |
| 179 | |
| 180 | self.headers = sign_request_v2(self.method_string, resource_uri, self.params, self.headers) |
| 181 | else: |
| 182 | debug("Using signature v4") |
| 183 | hostname = self.s3.get_hostname(self.resource['bucket']) |
| 184 | |
| 185 | ## Default to bucket part of DNS. |
| 186 | ## If bucket is not part of DNS assume path style to complete the request. |
| 187 | ## Like for format_uri, take care that redirection could be to base path |
| 188 | if bucket_name and ( |
| 189 | (bucket_name in S3Request.redir_map |
| 190 | and not S3Request.redir_map.get(bucket_name, '').startswith("%s."% bucket_name)) |
| 191 | or (bucket_name not in S3Request.redir_map |
| 192 | and not check_bucket_name_dns_support(Config().host_bucket, bucket_name)) |
no outgoing calls
no test coverage detected
searching dependent graphs…