Esempio n. 1
0
def _parse_append_block(response):
    '''
    Extracts append block response headers.
    '''
    append_block = AppendBlockProperties()
    append_block.last_modified = parser.parse(
        response.headers.get('last-modified'))
    append_block.etag = response.headers.get('etag')
    append_block.append_offset = _to_int(
        response.headers.get('x-ms-blob-append-offset'))
    append_block.committed_block_count = _to_int(
        response.headers.get('x-ms-blob-committed-block-count'))

    return append_block
Esempio n. 2
0
def _parse_metadata_and_message_count(response):
    '''
    Extracts approximate messages count header.
    '''
    metadata = _parse_metadata(response)
    metadata.approximate_message_count = _to_int(response.headers.get('x-ms-approximate-messages-count'))

    return metadata
Esempio n. 3
0
def _parse_lease(response):
    '''
    Extracts lease time and ID return headers.
    '''
    lease = {'time': response.headers.get('x-ms-lease-time')}
    if lease['time']:
        lease['time'] = _to_int(lease['time'])

    lease['id'] = response.headers.get('x-ms-lease-id')

    return lease
Esempio n. 4
0
def _convert_xml_to_queue_messages(response, decode_function, require_encryption, key_encryption_key, resolver,
                                   content=None):
    '''
    <?xml version="1.0" encoding="utf-8"?>
    <QueueMessagesList>
        <QueueMessage>
          <MessageId>string-message-id</MessageId>
          <InsertionTime>insertion-time</InsertionTime>
          <ExpirationTime>expiration-time</ExpirationTime>
          <PopReceipt>opaque-string-receipt-data</PopReceipt>
          <TimeNextVisible>time-next-visible</TimeNextVisible>
          <DequeueCount>integer</DequeueCount>
          <MessageText>message-body</MessageText>
        </QueueMessage>
    </QueueMessagesList>
    '''
    if response is None or response.body is None:
        return None

    messages = list()
    list_element = ETree.fromstring(response.body)

    for message_element in list_element.findall('QueueMessage'):
        message = QueueMessage()

        message.id = message_element.findtext('MessageId')

        dequeue_count = message_element.findtext('DequeueCount')
        if dequeue_count is not None:
            message.dequeue_count = _to_int(dequeue_count)

        # content is not returned for put_message
        if content is not None:
            message.content = content
        else:
            message.content = message_element.findtext('MessageText')
            if (key_encryption_key is not None) or (resolver is not None):
                message.content = _decrypt_queue_message(message.content, require_encryption,
                                                         key_encryption_key, resolver)
            message.content = decode_function(message.content)

        message.insertion_time = parser.parse(message_element.findtext('InsertionTime'))
        message.expiration_time = parser.parse(message_element.findtext('ExpirationTime'))

        message.pop_receipt = message_element.findtext('PopReceipt')

        time_next_visible = message_element.find('TimeNextVisible')
        if time_next_visible is not None:
            message.time_next_visible = parser.parse(time_next_visible.text)

        # Add message to list
        messages.append(message)

    return messages
Esempio n. 5
0
def _parse_page_properties(response):
    '''
    Extracts page response headers.
    '''
    put_page = PageBlobProperties()
    put_page.last_modified = parser.parse(
        response.headers.get('last-modified'))
    put_page.etag = response.headers.get('etag')
    put_page.sequence_number = _to_int(
        response.headers.get('x-ms-blob-sequence-number'))

    return put_page
Esempio n. 6
0
def _parse_sub_response_to_http_response(sub_response):
    """
    Header: Value (1 or more times)

    HTTP/<version> <statusCode> <statusName>
    Header: Value (1 or more times)

    body (if any)

    :param sub_response:
        The raw bytes of this sub-response.
    :return: An HttpResponse object.
    """

    empty_line = _HTTP_LINE_ENDING.encode('utf-8')
    num_empty_lines = 0
    batch_http_sub_response = HTTPResponse(None, '', dict(), b'')
    try:
        body_stream = BytesIO()
        body_stream.write(sub_response.encode('utf-8'))
        body_stream.seek(0)

        while True:
            line = body_stream.readline()
            if line == b'':
                return batch_http_sub_response

            if line.startswith("HTTP".encode('utf-8')):
                batch_http_sub_response.status = _to_int(
                    line.decode('utf-8').split(" ")[1])
            elif line == empty_line:
                num_empty_lines += 1
            elif line.startswith("x-ms-error-code".encode('utf-8')):
                batch_http_sub_response.message = line.decode('utf-8').split(
                    ": ")[1].rstrip()
            elif num_empty_lines is 2:
                batch_http_sub_response.body += line
            else:
                header = line.decode('utf-8').split(": ")[0]
                value = line.decode('utf-8').split(": ")[1].rstrip()
                batch_http_sub_response.headers[header] = value
    finally:
        body_stream.close()

    return batch_http_sub_response
Esempio n. 7
0
def _ingest_batch_response(batch_response, batch_sub_requests):
    """
    Takes the response to a batch request and parses the response into the separate responses.

    :param :class:`~azure.storage.common._http.HTTPResponse` batch_response:
        batchResponse The response of the HTTP batch request generated by this object.
    :return: sub-responses parsed from batch HTTP response
    :rtype: list of :class:`~azure.storage.common._http.HTTPResponse`
    """
    parsed_batch_sub_response_list = []

    # header value format: `multipart/mixed; boundary=<delimiter>`
    response_delimiter = batch_response.headers.get('content-type').split(
        "=")[1]

    response_body = batch_response.body.decode('utf-8')

    # split byte[] on the "substring" "--<delim>\r\n"
    sub_response_list = response_body.split("--" + response_delimiter +
                                            _HTTP_LINE_ENDING)

    # strip final, slightly different delim "\r\n--<delim>--" off last entry
    sub_response_list[len(sub_response_list) - 1] = \
        sub_response_list[len(sub_response_list) - 1].split(_HTTP_LINE_ENDING + "--" + response_delimiter + "--")[0]

    for sub_response in sub_response_list:
        if len(sub_response) != 0:
            http_response = _parse_sub_response_to_http_response(sub_response)
            is_successful = 200 <= http_response.status < 300
            index_of_sub_request = _to_int(
                http_response.headers.get('Content-ID'))
            batch_sub_request = batch_sub_requests[index_of_sub_request]

            parsed_batch_sub_response_list.append(
                BatchSubResponse(is_successful, http_response,
                                 batch_sub_request))

    return parsed_batch_sub_response_list