'Open this key for reading
:type headers: dict
:param headers: Headers to pass in the web request
:type query_args: string
:param query_args: Arguments to pass in the query string
(ie, \'torrent\')
:type override_num_retries: int
:param override_num_retries: If not None will override configured
num_retries parameter for underlying GET.
:type response_headers: dict
:param response_headers: A dictionary containing HTTP
headers/values that will override any headers associated
with the stored object in the response.  See
http://goo.gl/EWOPb for details.'

def open_read(self, headers=None, query_args='', override_num_retries=None, response_headers=None):

    if (self.resp is None):
        self.mode = 'r'
        provider = self.bucket.connection.provider
        self.resp = self.bucket.connection.make_request('GET', self.bucket.name, self.name, headers, query_args=query_args, override_num_retries=override_num_retries)
        if ((self.resp.status < 199) or (self.resp.status > 299)):
            body = self.resp.read()
            raise provider.storage_response_error(self.resp.status, self.resp.reason, body)
        response_headers = self.resp.msg
        self.metadata = boto.utils.get_aws_metadata(response_headers, provider)
        for (name, value) in response_headers.items():
            if ((name.lower() == 'content-length') and ('Content-Range' not in response_headers)):
                self.size = int(value)
            elif (name.lower() == 'content-range'):
                end_range = re.sub('.*/(.*)', '\\1', value)
                self.size = int(end_range)
            elif (name.lower() in Key.base_fields):
                self.__dict__[name.lower().replace('-', '_')] = value
        self.handle_version_headers(self.resp)
        self.handle_encryption_headers(self.resp)
        self.handle_restore_headers(self.resp)
        self.handle_addl_headers(self.resp.getheaders())
