diff options
author | Thomas Parslow <tom@almostobsolete.net> | 2012-09-05 23:08:48 +0100 |
---|---|---|
committer | Thomas Parslow <tom@almostobsolete.net> | 2012-09-05 23:08:48 +0100 |
commit | 720a947a3c6e5c0bddaeb6de3906740296bc2870 (patch) | |
tree | 577fa6cd0e62262d429d59a088119ed98cd65111 | |
parent | 11b5fb614bf2a03b6c014cf968a178e3c6f6058f (diff) | |
download | boto-720a947a3c6e5c0bddaeb6de3906740296bc2870.tar.gz |
Added a GlacierResponse object
-rw-r--r-- | boto/glacier/exceptions.py | 2 | ||||
-rw-r--r-- | boto/glacier/layer1.py | 11 | ||||
-rw-r--r-- | boto/glacier/response.py | 47 |
3 files changed, 50 insertions, 10 deletions
diff --git a/boto/glacier/exceptions.py b/boto/glacier/exceptions.py index 459f0f12..0092c62e 100644 --- a/boto/glacier/exceptions.py +++ b/boto/glacier/exceptions.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. # - +import json class UnexpectedHTTPResponseError(Exception): def __init__(self, expected_responses, response): diff --git a/boto/glacier/layer1.py b/boto/glacier/layer1.py index bb7623b9..dca5f06c 100644 --- a/boto/glacier/layer1.py +++ b/boto/glacier/layer1.py @@ -26,6 +26,7 @@ import json import boto.glacier from boto.connection import AWSAuthConnection from .exceptions import UnexpectedHTTPResponseError +from .response import GlacierResponse #boto.set_stream_logger('glacier') @@ -80,15 +81,7 @@ class Layer1(AWSAuthConnection): headers=headers, data=data) if response.status in ok_responses: - if response.getheader('Content-Type') == 'application/json': - body = json.loads(response.read()) - else: - body = {'Response': response} - body[u'RequestId'] = response.getheader('x-amzn-requestid') - if response_headers: - for header_name, item_name in response_headers: - body[item_name] = response.getheader(header_name) - return body + return GlacierResponse(response, response_headers) else: # create glacier-specific exceptions raise UnexpectedHTTPResponseError(ok_responses, response) diff --git a/boto/glacier/response.py b/boto/glacier/response.py new file mode 100644 index 00000000..57bd4e4e --- /dev/null +++ b/boto/glacier/response.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2012 Thomas Parslow http://almostobsolete.net/ +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, dis- +# tribute, sublicense, and/or sell copies of the Software, and to permit +# persons to whom the Software is furnished to do so, subject to the fol- +# lowing conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- +# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +# +import json + +class GlacierResponse(dict): + """ + Represents a response from Glacier layer1. It acts as a dictionary + containing the combined keys received via JSON in the body (if + supplied) and headers. + """ + def __init__(self, http_response, response_headers): + self.http_response = http_response + self.status = http_response.status + self[u'RequestId'] = http_response.getheader('x-amzn-requestid') + if response_headers: + for header_name, item_name in response_headers: + self[item_name] = http_response.getheader(header_name) + if http_response.getheader('Content-Type') == 'application/json': + body = json.loads(http_response.read()) + self.update(body) + size = http_response.getheader('Content-Length', None) + if size is not None: + self.size = size + + def read(self, amt=None): + "Reads and returns the response body, or up to the next amt bytes." + return self.http_response.read(amt) |