summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Parslow <tom@almostobsolete.net>2012-09-05 23:08:48 +0100
committerThomas Parslow <tom@almostobsolete.net>2012-09-05 23:08:48 +0100
commit720a947a3c6e5c0bddaeb6de3906740296bc2870 (patch)
tree577fa6cd0e62262d429d59a088119ed98cd65111
parent11b5fb614bf2a03b6c014cf968a178e3c6f6058f (diff)
downloadboto-720a947a3c6e5c0bddaeb6de3906740296bc2870.tar.gz
Added a GlacierResponse object
-rw-r--r--boto/glacier/exceptions.py2
-rw-r--r--boto/glacier/layer1.py11
-rw-r--r--boto/glacier/response.py47
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)