[Blob][BatchDelete]Add Batch Delete Request

This commit is contained in:
Xiaoxi Fu 2019-06-06 14:59:38 -07:00 коммит произвёл Xiaoxi Fu
Родитель 814cd0bdd4
Коммит 79ce0217f4
11 изменённых файлов: 1711 добавлений и 21 удалений

Просмотреть файл

@ -2,6 +2,10 @@
> See [BreakingChanges](BreakingChanges.md) for a detailed list of API breaks.
## Version XX.XX.XX
- Added Batch Delete Blob API
## Version 2.0.1:
- Updated dependency on azure-storage-common.

Просмотреть файл

@ -6,6 +6,8 @@
from azure.common import AzureException
from dateutil import parser
from azure.storage.common._http import HTTPResponse
try:
from xml.etree import cElementTree as ETree
except ImportError:
@ -36,15 +38,16 @@ from .models import (
ResourceProperties,
BlobPrefix,
AccountInformation,
UserDelegationKey,
)
UserDelegationKey, BatchSubResponse)
from ._encryption import _decrypt_blob
from azure.storage.common.models import _list
from azure.storage.common._error import (
_validate_content_match,
_ERROR_DECRYPTION_FAILURE,
)
from io import BytesIO
_HTTP_LINE_ENDING = "\r\n"
def _parse_base_properties(response):
'''
@ -290,7 +293,7 @@ def _convert_xml_to_blob_list(response):
<RemainingRetentionDays>int</RemainingRetentionDays>
<Creation-Time>date-time-value</Creation-Time>
</Properties>
<Metadata>
<Metadata>
<Name>value</Name>
</Metadata>
</Blob>
@ -392,7 +395,7 @@ def _convert_xml_to_blob_name_list(response):
<RemainingRetentionDays>int</RemainingRetentionDays>
<Creation-Time>date-time-value</Creation-Time>
</Properties>
<Metadata>
<Metadata>
<Name>value</Name>
</Metadata>
</Blob>
@ -475,19 +478,19 @@ def _convert_xml_to_page_ranges(response):
'''
<?xml version="1.0" encoding="utf-8"?>
<PageList>
<PageRange>
<Start>Start Byte</Start>
<End>End Byte</End>
</PageRange>
<ClearRange>
<Start>Start Byte</Start>
<End>End Byte</End>
</ClearRange>
<PageRange>
<Start>Start Byte</Start>
<End>End Byte</End>
</PageRange>
</PageList>
<PageRange>
<Start>Start Byte</Start>
<End>End Byte</End>
</PageRange>
<ClearRange>
<Start>Start Byte</Start>
<End>End Byte</End>
</ClearRange>
<PageRange>
<Start>Start Byte</Start>
<End>End Byte</End>
</PageRange>
</PageList>
'''
if response is None or response.body is None:
return None
@ -554,3 +557,83 @@ def _convert_xml_to_user_delegation_key(response):
delegation_key.value = key_element.findtext('Value')
return delegation_key
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 sub_response is not '':
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
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

Просмотреть файл

@ -28,6 +28,9 @@ from ._error import (
)
from io import BytesIO
_REQUEST_DELIMITER_PREFIX = "batch_"
_HTTP1_1_IDENTIFIER = "HTTP/1.1"
_HTTP_LINE_ENDING = "\r\n"
def _get_path(container_name=None, blob_name=None):
'''
@ -151,3 +154,138 @@ def _convert_delegation_key_info_to_xml(start_time, expiry_time):
# return xml value
return output
def _serialize_batch_body(requests, batch_id):
"""
--<delimiter>
<subrequest>
--<delimiter>
<subrequest> (repeated as needed)
--<delimiter>--
Serializes the requests in this batch to a single HTTP mixed/multipart body.
:param list(class:`~azure.storage.common._http.HTTPRequest`) requests:
a list of sub-request for the batch request
:param str batch_id:
to be embedded in batch sub-request delimiter
:return: The body bytes for this batch.
"""
if requests is None or len(requests) is 0:
raise ValueError('Please provide sub-request(s) for this batch request')
delimiter_bytes = (_get_batch_request_delimiter(batch_id, True, False) + _HTTP_LINE_ENDING).encode('utf-8')
newline_bytes = _HTTP_LINE_ENDING.encode('utf-8')
batch_body = list()
for request in requests:
batch_body.append(delimiter_bytes)
batch_body.append(_make_body_from_sub_request(request))
batch_body.append(newline_bytes)
batch_body.append(_get_batch_request_delimiter(batch_id, True, True).encode('utf-8'))
# final line of body MUST have \r\n at the end, or it will not be properly read by the service
batch_body.append(newline_bytes)
return bytes().join(batch_body)
def _get_batch_request_delimiter(batch_id, is_prepend_dashes=False, is_append_dashes=False):
"""
Gets the delimiter used for this batch request's mixed/multipart HTTP format.
:param batch_id Randomly generated id
:param is_prepend_dashes Whether to include the starting dashes. Used in the body, but non on defining the delimiter.
:param is_append_dashes Whether to include the ending dashes. Used in the body on the closing delimiter only.
:return: The delimiter, WITHOUT a trailing newline.
"""
prepend_dashes = '--' if is_prepend_dashes else ''
append_dashes = '--' if is_append_dashes else ''
return prepend_dashes + _REQUEST_DELIMITER_PREFIX + batch_id + append_dashes
def _make_body_from_sub_request(sub_request):
"""
Content-Type: application/http
Content-ID: <sequential int ID>
Content-Transfer-Encoding: <value> (if present)
<verb> <path><query> HTTP/<version>
<header key>: <header value> (repeated as necessary)
Content-Length: <value>
(newline if content length > 0)
<body> (if content length > 0)
Serializes an http request.
:param :class:`~azure.storage.common._http.HTTPRequest` sub_request Request to serialize.
:return: The serialized sub-request in bytes
"""
# put the sub-request's headers into a list for efficient str concatenation
sub_request_body = list()
# get headers for ease of manipulation; remove headers as they are used
headers = sub_request.headers
# append opening headers
sub_request_body.append("Content-Type: application/http")
sub_request_body.append(_HTTP_LINE_ENDING)
sub_request_body.append("Content-ID: ")
sub_request_body.append(headers.pop("Content-ID", ""))
sub_request_body.append(_HTTP_LINE_ENDING)
sub_request_body.append("Content-Transfer-Encoding: ")
sub_request_body.append(headers.pop("Content-Transfer-Encoding", ""))
sub_request_body.append(_HTTP_LINE_ENDING)
# append blank line
sub_request_body.append(_HTTP_LINE_ENDING)
# append HTTP verb and path and query and HTTP version
sub_request_body.append(sub_request.method)
sub_request_body.append(' ')
sub_request_body.append(sub_request.path)
sub_request_body.append("" if sub_request.query is None else '?' + _serialize_query(sub_request.query))
sub_request_body.append(' ')
sub_request_body.append(_HTTP1_1_IDENTIFIER)
sub_request_body.append(_HTTP_LINE_ENDING)
# append remaining headers (this will set the Content-Length, as it was set on `sub-request`)
for header_name, header_value in headers.items():
if header_value is not None:
sub_request_body.append(header_name)
sub_request_body.append(": ")
sub_request_body.append(header_value)
sub_request_body.append(_HTTP_LINE_ENDING)
# finished if no body
if sub_request.body is None:
return sub_request_body.encode('utf-8')
# append blank line
sub_request_body.append(_HTTP_LINE_ENDING)
sub_request_body.append(sub_request.body)
return ''.join(sub_request_body).encode('utf-8')
def _serialize_query(query):
serialized_query = []
for query_key, query_value in query.items():
if query_value is not None:
serialized_query.append(query_key)
serialized_query.append("=")
serialized_query.append(query_value)
serialized_query.append("&")
if len(serialized_query) is not 0:
del serialized_query[-1]
return ''.join(serialized_query)

Просмотреть файл

@ -4,6 +4,7 @@
# license information.
# --------------------------------------------------------------------------
import sys
import uuid
from abc import ABCMeta
from azure.common import AzureHttpError
@ -45,7 +46,7 @@ from azure.storage.common._serialization import (
_convert_signed_identifiers_to_xml,
_convert_service_properties_to_xml,
_add_metadata_headers,
)
_update_request, _add_date_header)
from azure.storage.common.models import (
Services,
ListGenerator,
@ -67,7 +68,7 @@ from ._deserialization import (
_parse_base_properties,
_parse_account_information,
_convert_xml_to_user_delegation_key,
)
_ingest_batch_response)
from ._download_chunking import _download_blob_chunks
from ._error import (
_ERROR_INVALID_LEASE_DURATION,
@ -77,7 +78,7 @@ from ._serialization import (
_get_path,
_validate_and_format_range_headers,
_convert_delegation_key_info_to_xml,
)
_get_batch_request_delimiter, _serialize_batch_body)
from .models import (
BlobProperties,
_LeaseActions,
@ -3353,6 +3354,106 @@ class BaseBlobService(StorageClient):
:param int timeout:
The timeout parameter is expressed in seconds.
'''
request = self._get_basic_delete_blob_http_request(container_name,
blob_name,
snapshot=snapshot,
lease_id=lease_id,
delete_snapshots=delete_snapshots,
if_modified_since=if_modified_since,
if_unmodified_since=if_unmodified_since,
if_match=if_match,
if_none_match=if_none_match,
timeout=timeout)
self._perform_request(request)
def batch_delete_blobs(self, batch_delete_sub_requests, timeout=None):
'''
Sends a batch of multiple blob delete requests.
The blob delete method deletes the specified blob or snapshot. Note that deleting a blob also deletes all its
snapshots. For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob
:param list(BatchDeleteSubRequest) batch_delete_sub_requests:
The blob delete requests to send as a batch.
:param int timeout:
The timeout parameter is expressed in seconds.
:return: parsed batch delete HTTP response
:rtype: list of :class:`~azure.storage.blob.models.BatchSubResponse`
'''
if batch_delete_sub_requests is None or len(batch_delete_sub_requests) < 1 or len(batch_delete_sub_requests) > 256:
raise ValueError("Batch delete should take 1 to 256 sub-requests")
request = HTTPRequest()
request.method = 'POST'
request.host_locations = self._get_host_locations()
request.path = _get_path()
batch_id = str(uuid.uuid1())
request.headers = {
'Content-Type': "multipart/mixed; boundary=" + _get_batch_request_delimiter(batch_id, False, False),
}
request.query = {
'comp': 'batch',
'timeout': _int_to_str(timeout)
}
batch_http_requests = []
for batch_delete_sub_request in batch_delete_sub_requests:
batch_delete_sub_http_request = self._construct_batch_delete_sub_http_request(len(batch_http_requests),
batch_delete_sub_request)
batch_http_requests.append(batch_delete_sub_http_request)
request.body = _serialize_batch_body(batch_http_requests, batch_id)
return self._perform_request(request, parser=_ingest_batch_response, parser_args=[batch_delete_sub_requests])
def _construct_batch_delete_sub_http_request(self, content_id, batch_delete_sub_request):
"""
Construct an HTTPRequest instance from a batch delete sub-request.
:param int content_id:
the index of sub-request in the list of sub-requests
:param ~azure.storage.blob.models.BatchDeleteSubRequest batch_delete_sub_request:
one of the delete request to be sent in a batch
:return: HTTPRequest parsed from batch delete sub-request
:rtype: :class:`~azure.storage.common._http.HTTPRequest`
"""
request = self._get_basic_delete_blob_http_request(batch_delete_sub_request.container_name,
batch_delete_sub_request.blob_name,
snapshot=batch_delete_sub_request.snapshot,
lease_id=batch_delete_sub_request.lease_id,
delete_snapshots=batch_delete_sub_request.delete_snapshots,
if_modified_since=batch_delete_sub_request.if_modified_since,
if_unmodified_since=batch_delete_sub_request.if_unmodified_since,
if_match=batch_delete_sub_request.if_match,
if_none_match=batch_delete_sub_request.if_none_match)
request.headers.update({
'Content-ID': _int_to_str(content_id),
'Content-Length': _int_to_str(0),
'Content-Transfer-Encoding': 'binary',
})
_update_request(request, None, self._USER_AGENT_STRING)
# sub-request will use the batch request id automatically, no need to generate a separate one
request.headers.pop('x-ms-client-request-id', None)
_add_date_header(request)
self.authentication.sign_request(request)
return request
def _get_basic_delete_blob_http_request(self, container_name, blob_name, snapshot=None, lease_id=None,
delete_snapshots=None, if_modified_since=None, if_unmodified_since=None,
if_match=None, if_none_match=None, timeout=None):
"""
Construct a basic HTTPRequest instance for delete blob
For more information about the parameters please see delete_blob
:return: an HTTPRequest for delete blob
:rtype :class:`~azure.storage.common._http.HTTPRequest`
"""
_validate_not_none('container_name', container_name)
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
@ -3372,7 +3473,7 @@ class BaseBlobService(StorageClient):
'timeout': _int_to_str(timeout)
}
self._perform_request(request)
return request
def undelete_blob(self, container_name, blob_name, timeout=None):
'''

Просмотреть файл

@ -823,3 +823,77 @@ class UserDelegationKey(object):
self.signed_service = None
self.signed_version = None
self.value = None
class BatchDeleteSubRequest(object):
"""
Represents one request in batch of multiple blob delete requests
Organizes HttpRequest objects together for batch REST operations to a single host endpoint.
:ivar str container_name:
Name of existing container.
:ivar str blob_name:
Name of existing blob.
:ivar str snapshot:
The snapshot parameter is an opaque DateTime value that,
when present, specifies the blob snapshot to delete.
:ivar str lease_id:
Required if the blob has an active lease.
:ivar ~azure.storage.blob.models.DeleteSnapshot delete_snapshots:
Required if the blob has associated snapshots.
:ivar datetime if_modified_since:
A DateTime value. Azure expects the date value passed in to be UTC.
If timezone is included, any non-UTC datetimes will be converted to UTC.
If a date is passed in without timezone info, it is assumed to be UTC.
Specify this header to perform the operation only
if the resource has been modified since the specified time.
:ivardatetime if_unmodified_since:
A DateTime value. Azure expects the date value passed in to be UTC.
If timezone is included, any non-UTC datetimes will be converted to UTC.
If a date is passed in without timezone info, it is assumed to be UTC.
Specify this header to perform the operation only if
the resource has not been modified since the specified date/time.
:ivar str if_match:
An ETag value, or the wildcard character (*). Specify this header to perform
the operation only if the resource's ETag matches the value specified.
:ivar str if_none_match:
An ETag value, or the wildcard character (*). Specify this header
to perform the operation only if the resource's ETag does not match
the value specified. Specify the wildcard character (*) to perform
the operation only if the resource does not exist, and fail the
operation if it does exist.
"""
def __init__(self, container_name, blob_name, snapshot=None,
lease_id=None, delete_snapshots=None,
if_modified_since=None, if_unmodified_since=None,
if_match=None, if_none_match=None):
self.container_name = container_name
self.blob_name = blob_name
self.snapshot = snapshot
self.lease_id = lease_id
self.delete_snapshots = delete_snapshots
self.if_modified_since = if_modified_since
self.if_unmodified_since = if_unmodified_since
self.if_match = if_match
self.if_none_match = if_none_match
class BatchSubResponse(object):
"""
Sub response parsed from batch http sub-response
Organizes batch sub-response info and batch sub-request together for easier processing
:ivar bool is_successful:
Represent if the batch sub-request is successful
:ivar :class:`~azure.storage.common._http.HTTPResponse` http_response:
Parsed batch sub-response, in HTTPResponse format
:ivar batch_sub_request:
Represent the batch sub-request corresponding to the batch sub-response.
This could be any type of sub-request. One example is class: ~azure.storage.blob.models.BatchDeleteSubRequest
"""
def __init__(self, is_successful, http_response, batch_sub_request):
self.is_successful = is_successful
self.http_response = http_response
self.batch_sub_request = batch_sub_request

Просмотреть файл

@ -14,6 +14,8 @@ from azure.common import (
AzureMissingResourceHttpError,
AzureException,
)
from azure.storage.blob.models import BatchDeleteSubRequest
from azure.storage.common import (
AccessPolicy,
ResourceTypes,
@ -863,6 +865,131 @@ class StorageCommonBlobTest(StorageTestCase):
finally:
self._disable_soft_delete()
def test_empty_batch_delete(self):
# Arrange
batch_delete_sub_requests = list()
with self.assertRaises(ValueError):
self.bs.batch_delete_blobs(batch_delete_sub_requests)
def test_batch_delete_257_existing_blob(self):
# Arrange
batch_delete_sub_requests = list()
for i in range(0, 257):
batch_delete_sub_requests.append(BatchDeleteSubRequest(self.container_name, i))
with self.assertRaises(ValueError):
self.bs.batch_delete_blobs(batch_delete_sub_requests)
@record
def test_batch_delete_one_existing_blob(self):
# Arrange
blob_name = self._create_block_blob()
batch_delete_sub_requests = list()
batch_delete_sub_requests.append(BatchDeleteSubRequest(self.container_name, blob_name))
# Act
resp = self.bs.batch_delete_blobs(batch_delete_sub_requests)
# Assert
self.assertIsNotNone(resp)
self.assertEquals(len(batch_delete_sub_requests), len(resp))
self.assertTrue(resp[0].is_successful)
@record
def test_batch_delete_one_existing_blob_with_non_askii_name(self):
# Arrange
blob_name = "ööööööööö"
self.bs.create_blob_from_bytes(self.container_name, blob_name, self.byte_data)
batch_delete_sub_requests = list()
batch_delete_sub_requests.append(BatchDeleteSubRequest(self.container_name, blob_name))
# Act
resp = self.bs.batch_delete_blobs(batch_delete_sub_requests)
# Assert
self.assertIsNotNone(resp)
self.assertEquals(len(batch_delete_sub_requests), len(resp))
self.assertTrue(resp[0].is_successful)
@record
def test_batch_delete_two_existing_blob_and_their_snapshot(self):
# Arrange
batch_delete_sub_requests = list()
for i in range(0, 2):
blob_name = self._create_block_blob()
self.bs.snapshot_blob(self.container_name, blob_name)
batch_delete_sub_requests.append(
BatchDeleteSubRequest(self.container_name, blob_name, delete_snapshots=DeleteSnapshot.Include))
# Act
resp = self.bs.batch_delete_blobs(batch_delete_sub_requests)
# Assert
self.assertIsNotNone(resp)
self.assertEquals(len(batch_delete_sub_requests), len(resp))
blobs = list(self.bs.list_blobs(self.container_name, include='snapshots'))
self.assertEqual(len(blobs), 0)
@record
def test_batch_delete_ten_existing_blob_and_their_snapshot(self):
# Arrange
batch_delete_sub_requests = list()
# For even index, create batch delete sub-request for existing blob and their snapshot
# For odd index, create batch delete sub-request for non-existing blob
for i in range(0, 10):
if i % 2 is 0:
blob_name = str(i)
self.bs.create_blob_from_text(self.container_name, blob_name, "abc")
self.bs.snapshot_blob(self.container_name, blob_name)
# self.sleep(20)
# self.sleep(20)
else:
blob_name = str(i)
batch_delete_sub_requests.append(
BatchDeleteSubRequest(self.container_name, blob_name, delete_snapshots=DeleteSnapshot.Include))
# Act
resp = self.bs.batch_delete_blobs(batch_delete_sub_requests)
# Assert
self.assertIsNotNone(resp)
self.assertEquals(len(batch_delete_sub_requests), len(resp))
blobs = list(self.bs.list_blobs(self.container_name, include='snapshots'))
self.assertEqual(len(blobs), 0)
for i in range(0, len(resp)):
is_successful = resp[i].is_successful
# for every even indexed sub-request, the blob should be deleted successfully
if i % 2 is 0:
self.assertEquals(is_successful, True, "sub-request" + str(i) + "should be true")
# For every odd indexed sub-request, there should be a 404 http status code because the blob is non-existing
else:
self.assertEquals(is_successful, False, "sub-request" + str(i) + "should be false")
self.assertEquals(404, resp[i].http_response.status)
@record
def test_batch_delete_two_non_existing_blobs(self):
# Arrange
batch_delete_sub_requests = list()
for i in range(0, 2):
blob_name = str(i)
batch_delete_sub_requests.append(
BatchDeleteSubRequest(self.container_name, blob_name, delete_snapshots=DeleteSnapshot.Include))
# Act
resp = self.bs.batch_delete_blobs(batch_delete_sub_requests)
# Assert
self.assertIsNotNone(resp)
self.assertEquals(len(batch_delete_sub_requests), len(resp))
self.assertFalse(resp[0].is_successful)
self.assertEqual(resp[0].http_response.status, 404)
@record
def test_copy_blob_with_existing_blob(self):
# Arrange

Просмотреть файл

@ -0,0 +1,109 @@
interactions:
- request:
body: !!binary |
HHDlaNlHlzixHQ5NAb2rtlutPhOVxe2KoWOrGSlvI3ppgNz0nR/ATwzWmq9bsePhtsndQcNhzsUl
MwSGP3ihvlmrXExlOG4ByIRlLu8cAy1RfxXtvmr1edJHez8ZeXw0fG6TWp0ba+h4w9vvq8traTJs
J1/8b9lYrzxeEnevk952tJ43yzGV6EzsGXJ2NsGZmKtviuWVcpGMNa0emxHNXiH0Zt49zbLpiVNW
VDg44/B0MESJJF6uNTKFImL98dZS2hLSLl8DXL+LNbhzEort0eQuf4xQKxeIqAkGqd2PuZ0I4gvO
52IzNs9i4XljyPOvQZfYYbzzj+oG3OSPxBH7MumSDl6SYurEFHwWMYgW9ZX11gPECTqc5pNeXY4G
ptUbq0JVxdSYTFSioQBANbE+MA1QFDcGf5mFL0HHharfOCpZR2VZwMDiH9mfcknnute8YV9XKigZ
JYC8xXasrOfc9gVhEcetCMzrpFgdeBo1G9eAIWHlFALfaqm1IGfIMiBCfSdwVlqgLklsOqPuxG14
L52zXtC/+55k0MrUhQJXLSTtrlkxn7eSop7n8JhTt11v4jMyVpxgETjDzS3lfibs61AC5SzzY1F5
OH9Z8pxfeRYBlDFMwJKvf0Sa9/CVrPTsVS6gpJid5k6mLfr3DsEj8LWAO1NpVyXwblSVPRBqDZJ5
6Vvvqsgej9P0SEl8fvDQ27teI/HK9VnlXRKdQ/4S2kpz+yYhq4km3gLATYwzun17MuVdEfSeuDoi
delbjUeJEy8D2wSn4PCNV68NLA9hQ5oNbopGzx7hYT56ScaZuc4fsN1oGJlL0oD3rZ28Ocnyc4Sp
S8EaD8wuhaLoF/jxBqoGpAUHrG0F8xOl1dBfaaiHdTuje5k8y0llTkLuqAF/yfTsL69ngowhMmba
k9GNxtjeiWSKjW2iIKK7061E2p37Wa/0ueZOzHaAlhXmjdD60/Gk2/q17GeJoMW15LTveZWxUugc
c0wNKMLiXF1334nMZK90CJny4foqjbH3RqASxLws9QegfWdUnmnQveJEByH8RpLnq5RK4O+Kl67+
j+XVExfAsb4s2NqHuC9LXXg+EnTQzq8UnC1kcJBaBjKO1CKEJWhXXFg6eW+tzNJ+257bRqs0JmWq
XSYiT2f0mANM3LzmIUL6NQ8UZJnT8dXqYfKzOu8q3D9bgyGL3zCxEEvDEdsji6KX7Ja8TH6Of1w0
Io9vF6FBTgeL8U/3wkq3ODoJDsmBnkKklpZJpTSESnDbLZd1+LsO7xABG9KnLU8HwkiEbvh8ckw5
Rl4hovVWFwglLnQYsEEwvE6VKx7BLEh1W/nmZW2nEHh8A9jchLX9uevtt4KNGJMzWWFCbBJv1w==
headers:
Connection:
- keep-alive
Content-Length:
- '1024'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- cb19bfc6-8c7a-11e9-b224-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:43 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer31e01531/blob31e01531
response:
body:
string: ''
headers:
Content-MD5:
- SsdN/ZBrgVZTXNDcMUtpHw==
Date:
- Tue, 11 Jun 2019 18:57:43 GMT
ETag:
- '"0x8D6EE9EAF68FB65"'
Last-Modified:
- Tue, 11 Jun 2019 18:57:43 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 96878df8-d01e-0000-7987-2061a1000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: "--batch_cb3ff8d8-8c7a-11e9-ad0b-001a7dda7113\r\nContent-Type: application/http\r\nContent-ID:
0\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE /utcontainer31e01531/blob31e01531?
HTTP/1.1\r\nContent-Length: 0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python
CPython 3.7.3; Windows 10)\r\nx-ms-date: Tue, 11 Jun 2019 18:57:43 GMT\r\nAuthorization:
SharedKey blobstoragename:rGvGEt0o2lyikIJPWPovfIxHXZ8BJCgKX9BXUnaDoFY=\r\n\r\n\r\n--batch_cb3ff8d8-8c7a-11e9-ad0b-001a7dda7113--\r\n"
headers:
Connection:
- keep-alive
Content-Length:
- '460'
Content-Type:
- multipart/mixed; boundary=batch_cb3ff8d8-8c7a-11e9-ad0b-001a7dda7113
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- cb3ff8d9-8c7a-11e9-9a08-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:43 GMT
x-ms-version:
- '2018-11-09'
method: POST
uri: https://storagename.blob.core.windows.net/?comp=batch
response:
body:
string: "--batchresponse_01ad187b-2cdf-40ff-897a-bc15f59de554\r\nContent-Type:
application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 96878e02-d01e-0000-0187-2061a11e4949\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_01ad187b-2cdf-40ff-897a-bc15f59de554--"
headers:
Content-Type:
- multipart/mixed; boundary=batchresponse_01ad187b-2cdf-40ff-897a-bc15f59de554
Date:
- Tue, 11 Jun 2019 18:57:43 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 96878e02-d01e-0000-0187-2061a1000000
x-ms-version:
- '2018-11-09'
status:
code: 202
message: Accepted
version: 1

Просмотреть файл

@ -0,0 +1,109 @@
interactions:
- request:
body: !!binary |
jSuP3iBIAKLdP1f2aO78dXP635uHcGUaomCz0jn10pUnm1Z4yUEqrABkTPohPQlxbte+zjSPyAbq
g5IRTcYf782nRl1nzXpoMxKM1T5m25XlU6uIrllxaPn04SUcc0/icUjwbCYFBeK3fVL5L8j9MmvV
iiNlfbk/zPf3KJoozagr+5AAosGyMnqPlHj4Z3c68HoXgsP6ci8syWE2PGlTfMfcJpUXjNg7vQPS
T+uIlJZf9adbMnB/g5jUOIY4B0VNxa91t30LvwULk+62GF0c9GDngZmlOFp5qZtMwApKfmdsRIvC
3dx24adplSE3+FEq2F1aWxf3a1bPbhW7lHaZbiAw/HgyICgi+oMBp4rdukMOy/WYVIhG0inJd3rg
WhgNZkEgWbHMXGVOQzUdw+YnlzTO+J8Z1Vmx7Uhr2Ss2rPkqhF7laPsG2ueJ4g5MhRknvggfAWkw
Wj208qBCRHZ1EeHJMK3+fu/ixro62epUD2sjpzDd9EYgSaH3Snxg+4DQtixpfEN0l+cknf51MvU7
n5MVg7MrrKBexPab1VzSd0ZStVU05mGa3DPQFQXtoZkvhF2tjOYERBs1U4eSODgTWGMXoh+QC2JA
5gLq/ddQN1w06SrjyYI9NOFGaFE/lH+KYADxAFrOChoTvlbtZcoHQX7l6+3Cv0IpXLhX2x012WYc
PfEp/BVd8xvVaaj3N7QnOcwdpaUVN971e44QQ8P3t8oK7cnWJhDllJX3MQt8RnSWyOFkuFaoe51f
qkSXm3GWqMRdDw765EeaLwiAoJIV2KJmndThSJ1WnLxyOCWeC6o+r3ROmA7C+A5yFkgFWGrDiR2K
OrTCuCoJGYfFAJJblGBfshkqletQ4KVqA72pgHUJiSx7bCqmMF65oldjCszBSRCIbelj5TDXWZwO
864GvyXK5ZFQ+qN48Rh9BH+D6ExaGFzw1kWYAN6YuxGZUonU+jKWYqqmyNMYEuHxpcemKQ5uolOv
vMivKGcoTDo6Ritnju9VtSLJ2iEW4DWITFEswaf5lGHAX+X2edrUArV8ISBZHxIhNqoEPxdIkBFV
KkWKOI1cdDhC33U9iVWOYYxqubUWQgq86IdOQJqbGQIflJSf5+HU2PDhAmR4+3pASPBp7nGPbJL+
FTELyASyQkqXxN9uqURdeDc2GoLNBJtWvaY6PMIvYs1wBl2s0JGXgbbE8PFx1FwkzsIAMykouCov
0Zlbebqf2odr9huFEQCzXUK1sJX+3fNS3eTYWgz+LPb5Xs2ws3XkuE8QXR+aOmgNOwabjmM9kYJR
hA8V2dEhgR9YhvNhOBIXkM0+KcNV7i18xnYX+PM2milFrxKIrFurGdqzk62yE9Ql7+H+gYyBYw==
headers:
Connection:
- keep-alive
Content-Length:
- '1024'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- bd08c514-8e3f-11e9-9624-001a7dda7113
x-ms-date:
- Fri, 14 Jun 2019 01:00:01 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer30951d66/%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6
response:
body:
string: ''
headers:
Content-MD5:
- 6vnT5QS6wiHsOD4Zq0GdkQ==
Date:
- Fri, 14 Jun 2019 01:00:01 GMT
ETag:
- '"0x8D6F063A150CC96"'
Last-Modified:
- Fri, 14 Jun 2019 01:00:01 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 96758a08-901e-000c-304c-228f50000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: "--batch_bd219570-8e3f-11e9-8bd0-001a7dda7113\r\nContent-Type: application/http\r\nContent-ID:
0\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE /utcontainer30951d66/%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6%C3%B6?
HTTP/1.1\r\nContent-Length: 0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python
CPython 3.7.3; Windows 10)\r\nx-ms-date: Fri, 14 Jun 2019 01:00:01 GMT\r\nAuthorization:
SharedKey blobstoragename:HdHE1dmDT6FKOdn59h//fefVCm2DiJIky8bW9I+tnW4=\r\n\r\n\r\n--batch_bd219570-8e3f-11e9-8bd0-001a7dda7113--\r\n"
headers:
Connection:
- keep-alive
Content-Length:
- '502'
Content-Type:
- multipart/mixed; boundary=batch_bd219570-8e3f-11e9-8bd0-001a7dda7113
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- bd219572-8e3f-11e9-a24f-001a7dda7113
x-ms-date:
- Fri, 14 Jun 2019 01:00:01 GMT
x-ms-version:
- '2018-11-09'
method: POST
uri: https://storagename.blob.core.windows.net/?comp=batch
response:
body:
string: "--batchresponse_ed06f933-7432-4d4e-ba15-8665e9cd22f6\r\nContent-Type:
application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 96758a12-901e-000c-384c-228f501e8528\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_ed06f933-7432-4d4e-ba15-8665e9cd22f6--"
headers:
Content-Type:
- multipart/mixed; boundary=batchresponse_ed06f933-7432-4d4e-ba15-8665e9cd22f6
Date:
- Fri, 14 Jun 2019 01:00:01 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 96758a12-901e-000c-384c-228f50000000
x-ms-version:
- '2018-11-09'
status:
code: 202
message: Accepted
version: 1

Просмотреть файл

@ -0,0 +1,586 @@
interactions:
- request:
body: abc
headers:
Connection:
- keep-alive
Content-Length:
- '3'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- 6e039280-915b-11e9-bbcf-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:48 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/0
response:
body:
string: ''
headers:
Content-MD5:
- kAFQmDzST7DWlj99KOF/cg==
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F525DD5F4"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:48 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f14-d01e-0000-3468-2561a1000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6e2ec974-915b-11e9-bba5-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:48 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/0?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F525DD5F4"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:48 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f1b-d01e-0000-3968-2561a1000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-17T23:55:48.8621956Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: abc
headers:
Connection:
- keep-alive
Content-Length:
- '3'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- 6e3bdbae-915b-11e9-98bc-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:48 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/2
response:
body:
string: ''
headers:
Content-MD5:
- kAFQmDzST7DWlj99KOF/cg==
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F527755FE"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:48 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f20-d01e-0000-3d68-2561a1000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6e48e286-915b-11e9-884c-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:48 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/2?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F527755FE"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:48 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f26-d01e-0000-4168-2561a1000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-17T23:55:49.0273120Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: abc
headers:
Connection:
- keep-alive
Content-Length:
- '3'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- 6e556d76-915b-11e9-83e7-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/4
response:
body:
string: ''
headers:
Content-MD5:
- kAFQmDzST7DWlj99KOF/cg==
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F529060C2"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f28-d01e-0000-4368-2561a1000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6e616034-915b-11e9-ad19-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/4?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F529060C2"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f2d-d01e-0000-4868-2561a1000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-17T23:55:49.1884251Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: abc
headers:
Connection:
- keep-alive
Content-Length:
- '3'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- 6e6c31ae-915b-11e9-aec2-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/6
response:
body:
string: ''
headers:
Content-MD5:
- kAFQmDzST7DWlj99KOF/cg==
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F52A6D2FB"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f32-d01e-0000-4c68-2561a1000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6e78c4f4-915b-11e9-9cc1-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/6?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F52A6D2FB"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f35-d01e-0000-4f68-2561a1000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-17T23:55:49.3375306Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: abc
headers:
Connection:
- keep-alive
Content-Length:
- '3'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- 6e833fd8-915b-11e9-8852-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/8
response:
body:
string: ''
headers:
Content-MD5:
- kAFQmDzST7DWlj99KOF/cg==
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F52BE2FC6"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f39-d01e-0000-5368-2561a1000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6e8f2b22-915b-11e9-ae56-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12/8?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
ETag:
- '"0x8D6F37F52BE2FC6"'
Last-Modified:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f3e-d01e-0000-5768-2561a1000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-17T23:55:49.4896374Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: "--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type: application/http\r\nContent-ID:
0\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE /utcontainer125a1d12/0?
HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length: 0\r\nUser-Agent:
Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date: Mon,
17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:U4ETkHb6vrInMA/r3r568crgSWsKzMve0mLaX7/luiE=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 1\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/1? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:kVX0c+FuBkS6k7expWpT2AIOlPMW98uWhNndfiAfo2w=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 2\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/2? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:fRvLMx7y1NdFuLw2wi6YQFabbvfnbaAbD2r5/jCKCh0=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 3\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/3? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:g3xz4SBst2SBOX5SqNH53Gnk/Ji3/HrNLc6wHUSxOLE=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 4\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/4? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:NMd5ZBcJeHm2d4bVNdysxkt/JXsNtxvwkw0ZI0uTCBU=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 5\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/5? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:gAHtANjHEwX5zPzEOaszhwSF0v5zCdVEQCpnTqMsG80=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 6\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/6? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:fU5GiMWcsFAym+HK85diTwQtrWjVZoxpxhnWo1jMJwk=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 7\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/7? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:gyWxxbetOQAprA19rAPySin4P+k9J4SD62vVrADrWBs=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 8\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/8? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:Nb4KNOGGykdWA4ePjH9mRgaomZZqjf1/w7akbIiE/ak=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 9\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer125a1d12/9? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Mon, 17 Jun 2019 23:55:49 GMT\r\nAuthorization: SharedKey storagename:SucZValFaZuGSW3k34cCmOxcqDAwvcMYax1JtQUQ3JQ=\r\n\r\n\r\n--batch_6e9a20a4-915b-11e9-982e-001a7dda7113--\r\n"
headers:
Connection:
- keep-alive
Content-Length:
- '4378'
Content-Type:
- multipart/mixed; boundary=batch_6e9a20a4-915b-11e9-982e-001a7dda7113
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6e9a20af-915b-11e9-b56b-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: POST
uri: https://storagename.blob.core.windows.net/?comp=batch
response:
body:
string: "--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d84\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d86\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:2d0a4f42-d01e-0000-5a68-2561a11e4d86\nTime:2019-06-17T23:55:49.5666925Z</Message></Error>\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d87\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 3\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d88\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:2d0a4f42-d01e-0000-5a68-2561a11e4d88\nTime:2019-06-17T23:55:49.5666925Z</Message></Error>\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 4\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d89\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 5\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d8a\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:2d0a4f42-d01e-0000-5a68-2561a11e4d8a\nTime:2019-06-17T23:55:49.5666925Z</Message></Error>\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 6\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d8b\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 7\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d8c\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:2d0a4f42-d01e-0000-5a68-2561a11e4d8c\nTime:2019-06-17T23:55:49.5666925Z</Message></Error>\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 8\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d8d\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c\r\nContent-Type:
application/http\r\nContent-ID: 9\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 2d0a4f42-d01e-0000-5a68-2561a11e4d8e\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:2d0a4f42-d01e-0000-5a68-2561a11e4d8e\nTime:2019-06-17T23:55:49.5676928Z</Message></Error>\r\n--batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c--"
headers:
Content-Type:
- multipart/mixed; boundary=batchresponse_59b081b1-4dcb-46bf-8ca1-2868378b881c
Date:
- Mon, 17 Jun 2019 23:55:48 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f42-d01e-0000-5a68-2561a1000000
x-ms-version:
- '2018-11-09'
status:
code: 202
message: Accepted
- request:
body: null
headers:
Connection:
- keep-alive
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 6ea9044a-915b-11e9-baba-001a7dda7113
x-ms-date:
- Mon, 17 Jun 2019 23:55:49 GMT
x-ms-version:
- '2018-11-09'
method: GET
uri: https://storagename.blob.core.windows.net/utcontainer125a1d12?restype=container&comp=list&include=snapshots
response:
body:
string: "\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?><EnumerationResults
ServiceEndpoint=\"https://storagename.blob.core.windows.net/\" ContainerName=\"utcontainer125a1d12\"><Blobs
/><NextMarker /></EnumerationResults>"
headers:
Content-Type:
- application/xml
Date:
- Mon, 17 Jun 2019 23:55:49 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- 2d0a4f48-d01e-0000-6068-2561a1000000
x-ms-version:
- '2018-11-09'
status:
code: 200
message: OK
version: 1

Просмотреть файл

@ -0,0 +1,301 @@
interactions:
- request:
body: !!binary |
5wSPPakfPqfdV21XKipP5WMEN+dQ/BsxrzQxPnfsgXgAkLwbT++B6H5jbZaRIB4JqTzLVbAQmbYk
V7kfehHw1+K/QQ5Mz7SN6VH2nnZoO9j0AoZlajXMVxCLk1GrWWOV2R9n7bTyq+ntwHDCbkgf4it3
Zyb23I+Lm1YLwuvmLAzxe+lETx28DopVAgExHKMkHh98tX5cXuCTwd+fwwGNh6XGjaBQ/GXA5Q+O
MiivUkGAzGPP5WiH+c8imxAjukgw9CR0he8D8R/FGnE1ojdCTDnxJLQ+QBQVjwy3zPgGcq1qFxoF
h+1irJ4fHtA22rjhqfK1hkKr6U32pP6wZ9Pr8xWwRPiNkQ2AcA9ZaF1JJxJzG1dkp6vLGmlAJCOF
Bfp7SHDxXTmNjfI8GQZtvmo/jhtI085TvvEFzBVf665I4TrP+PMV+MW7q94leyA1Ums8eWq8p24e
7pMlLao3V/RPt6w/87N4dWIpt3NY9lBQxvXQnOcTIyOSQaQGaWn38o+RAHawnVEYgnk8g8FqNhXa
I9PmupcJuWWsjL0cB84bZukn/sJqsJZxhAQZLDBnwOhNN0V9WQQnX3Piil+2HnK5UCx6lXg0duo4
orFzUSDIWt/CAvv0pZrPyfRPN9YmbzFueS/RtYY2MyG23Blj5H+gkuGQzkkFv1+N8kwduqPn9Rcp
/jDeOImQk2owMB76dkdXBT0fJNggcAt9ySrOfeo+73iJ44EXdTr02qgaSveokhGm0LmM+pomaRhz
P8jdP6NqqflDJPSmvs60PHdl9YGed2Qnc3JRJKE+R1hEJLc6dckPJ2vtNC5x88civYfPl2OD9XOH
JG3L+KUHwBPBeHAuCsvlXHlQpNy3RawedbbJJKQln3IUqFmJTeXJkY7WTHJ0KgrZnY6ZK78AqimG
+Vje7tDrFTDAapvHl4yGZdeVgrR/gYhN4SFJAL3aYSG8OVvOWNq67aLVu+XF8gZEoTszTBwP8Qss
gfA2tJ1xFpSsi/dqB2KFwgIquZaRnqYurK53ePH9N97ALgMreqjyb8cfCb9svUoD03kgEaA0uZaX
uBaTpWgCTpXHiZoyNhJWBCpE1D30cuqnpOIvL5rHhMSix3+2cUB2CGlnfbB8lD+axN+kREHtQfcM
hkuGoewW6pQQYhtd0UbcD+aM9TMJlHk5W1UM1/vjnh9pclRzDhVvEDK3zeJITBSwbaPSXVxbPGFG
2558ZgK/y1LqO4hiT88PHwFX2kWiS4Dfwm2TA95aEG1ehnTtbdgIjnC6FlD7otncxiVknYBW4YXs
7gg7eGytxi8tchEh2QtLAkEQsHjDjs5t3h4dVMl+vvow4OOnrYAaSJotXbGE9JBFyyL9bXv1cg==
headers:
Connection:
- keep-alive
Content-Length:
- '1024'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- b4589908-8c7a-11e9-b3f3-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:05 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer14f21d25/blob14f21d25
response:
body:
string: ''
headers:
Content-MD5:
- JOuhSvBwm3EEW6+kepeAnQ==
Date:
- Tue, 11 Jun 2019 18:57:04 GMT
ETag:
- '"0x8D6EE9E989B0112"'
Last-Modified:
- Tue, 11 Jun 2019 18:57:05 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- de09539f-701e-000d-1b87-208ead000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- b46f2ac6-8c7a-11e9-bbab-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:05 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer14f21d25/blob14f21d25?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Tue, 11 Jun 2019 18:57:05 GMT
ETag:
- '"0x8D6EE9E989B0112"'
Last-Modified:
- Tue, 11 Jun 2019 18:57:05 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- de0953a6-701e-000d-2187-208ead000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-11T18:57:05.2913154Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: !!binary |
5wSPPakfPqfdV21XKipP5WMEN+dQ/BsxrzQxPnfsgXgAkLwbT++B6H5jbZaRIB4JqTzLVbAQmbYk
V7kfehHw1+K/QQ5Mz7SN6VH2nnZoO9j0AoZlajXMVxCLk1GrWWOV2R9n7bTyq+ntwHDCbkgf4it3
Zyb23I+Lm1YLwuvmLAzxe+lETx28DopVAgExHKMkHh98tX5cXuCTwd+fwwGNh6XGjaBQ/GXA5Q+O
MiivUkGAzGPP5WiH+c8imxAjukgw9CR0he8D8R/FGnE1ojdCTDnxJLQ+QBQVjwy3zPgGcq1qFxoF
h+1irJ4fHtA22rjhqfK1hkKr6U32pP6wZ9Pr8xWwRPiNkQ2AcA9ZaF1JJxJzG1dkp6vLGmlAJCOF
Bfp7SHDxXTmNjfI8GQZtvmo/jhtI085TvvEFzBVf665I4TrP+PMV+MW7q94leyA1Ums8eWq8p24e
7pMlLao3V/RPt6w/87N4dWIpt3NY9lBQxvXQnOcTIyOSQaQGaWn38o+RAHawnVEYgnk8g8FqNhXa
I9PmupcJuWWsjL0cB84bZukn/sJqsJZxhAQZLDBnwOhNN0V9WQQnX3Piil+2HnK5UCx6lXg0duo4
orFzUSDIWt/CAvv0pZrPyfRPN9YmbzFueS/RtYY2MyG23Blj5H+gkuGQzkkFv1+N8kwduqPn9Rcp
/jDeOImQk2owMB76dkdXBT0fJNggcAt9ySrOfeo+73iJ44EXdTr02qgaSveokhGm0LmM+pomaRhz
P8jdP6NqqflDJPSmvs60PHdl9YGed2Qnc3JRJKE+R1hEJLc6dckPJ2vtNC5x88civYfPl2OD9XOH
JG3L+KUHwBPBeHAuCsvlXHlQpNy3RawedbbJJKQln3IUqFmJTeXJkY7WTHJ0KgrZnY6ZK78AqimG
+Vje7tDrFTDAapvHl4yGZdeVgrR/gYhN4SFJAL3aYSG8OVvOWNq67aLVu+XF8gZEoTszTBwP8Qss
gfA2tJ1xFpSsi/dqB2KFwgIquZaRnqYurK53ePH9N97ALgMreqjyb8cfCb9svUoD03kgEaA0uZaX
uBaTpWgCTpXHiZoyNhJWBCpE1D30cuqnpOIvL5rHhMSix3+2cUB2CGlnfbB8lD+axN+kREHtQfcM
hkuGoewW6pQQYhtd0UbcD+aM9TMJlHk5W1UM1/vjnh9pclRzDhVvEDK3zeJITBSwbaPSXVxbPGFG
2558ZgK/y1LqO4hiT88PHwFX2kWiS4Dfwm2TA95aEG1ehnTtbdgIjnC6FlD7otncxiVknYBW4YXs
7gg7eGytxi8tchEh2QtLAkEQsHjDjs5t3h4dVMl+vvow4OOnrYAaSJotXbGE9JBFyyL9bXv1cg==
headers:
Connection:
- keep-alive
Content-Length:
- '1024'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-blob-type:
- BlockBlob
x-ms-client-request-id:
- b47c02a4-8c7a-11e9-afa2-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:05 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer14f21d25/blob14f21d25
response:
body:
string: ''
headers:
Content-MD5:
- JOuhSvBwm3EEW6+kepeAnQ==
Date:
- Tue, 11 Jun 2019 18:57:05 GMT
ETag:
- '"0x8D6EE9E98B544B7"'
Last-Modified:
- Tue, 11 Jun 2019 18:57:05 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- de0953b4-701e-000d-2b87-208ead000000
x-ms-request-server-encrypted:
- 'true'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: null
headers:
Connection:
- keep-alive
Content-Length:
- '0'
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- b488650c-8c7a-11e9-ad57-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:05 GMT
x-ms-version:
- '2018-11-09'
method: PUT
uri: https://storagename.blob.core.windows.net/utcontainer14f21d25/blob14f21d25?comp=snapshot
response:
body:
string: ''
headers:
Date:
- Tue, 11 Jun 2019 18:57:05 GMT
ETag:
- '"0x8D6EE9E98B544B7"'
Last-Modified:
- Tue, 11 Jun 2019 18:57:05 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- de0953b8-701e-000d-2f87-208ead000000
x-ms-request-server-encrypted:
- 'false'
x-ms-snapshot:
- '2019-06-11T18:57:05.4404240Z'
x-ms-version:
- '2018-11-09'
status:
code: 201
message: Created
- request:
body: "--batch_b491e5f4-8c7a-11e9-b76d-001a7dda7113\r\nContent-Type: application/http\r\nContent-ID:
0\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE /utcontainer14f21d25/blob14f21d25?
HTTP/1.1\r\nContent-Length: 0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python
CPython 3.7.3; Windows 10)\r\nx-ms-delete-snapshots: include\r\nx-ms-date: Tue,
11 Jun 2019 18:57:05 GMT\r\nAuthorization: SharedKey blobstoragename:V5QXXbb5w/GkaYYGg+TQ8NvPg9fy2WyTryK1e6ttBuM=\r\n\r\n\r\n--batch_b491e5f4-8c7a-11e9-b76d-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 1\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainer14f21d25/blob14f21d25? HTTP/1.1\r\nContent-Length: 0\r\nUser-Agent:
Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-delete-snapshots:
include\r\nx-ms-date: Tue, 11 Jun 2019 18:57:05 GMT\r\nAuthorization: SharedKey
blobstoragename:V5QXXbb5w/GkaYYGg+TQ8NvPg9fy2WyTryK1e6ttBuM=\r\n\r\n\r\n--batch_b491e5f4-8c7a-11e9-b76d-001a7dda7113--\r\n"
headers:
Connection:
- keep-alive
Content-Length:
- '936'
Content-Type:
- multipart/mixed; boundary=batch_b491e5f4-8c7a-11e9-b76d-001a7dda7113
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- b491e5f5-8c7a-11e9-a47f-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:05 GMT
x-ms-version:
- '2018-11-09'
method: POST
uri: https://storagename.blob.core.windows.net/?comp=batch
response:
body:
string: "--batchresponse_d0299394-60bc-457b-ac3b-b5ba6e823614\r\nContent-Type:
application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: de0953bf-701e-000d-3687-208ead1e7756\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:de0953bf-701e-000d-3687-208ead1e7756\nTime:2019-06-11T18:57:05.5204401Z</Message></Error>\r\n--batchresponse_d0299394-60bc-457b-ac3b-b5ba6e823614\r\nContent-Type:
application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent:
true\r\nx-ms-request-id: de0953bf-701e-000d-3687-208ead1e7758\r\nx-ms-version:
2018-11-09\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_d0299394-60bc-457b-ac3b-b5ba6e823614--"
headers:
Content-Type:
- multipart/mixed; boundary=batchresponse_d0299394-60bc-457b-ac3b-b5ba6e823614
Date:
- Tue, 11 Jun 2019 18:57:05 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- de0953bf-701e-000d-3687-208ead000000
x-ms-version:
- '2018-11-09'
status:
code: 202
message: Accepted
- request:
body: null
headers:
Connection:
- keep-alive
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- b49d873e-8c7a-11e9-be64-001a7dda7113
x-ms-date:
- Tue, 11 Jun 2019 18:57:05 GMT
x-ms-version:
- '2018-11-09'
method: GET
uri: https://storagename.blob.core.windows.net/utcontainer14f21d25?restype=container&comp=list&include=snapshots
response:
body:
string: "\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?><EnumerationResults
ServiceEndpoint=\"http://blobstoragename.blob.core.windows.net/\"
ContainerName=\"utcontainer14f21d25\"><Blobs /><NextMarker /></EnumerationResults>"
headers:
Content-Type:
- application/xml
Date:
- Tue, 11 Jun 2019 18:57:05 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- de0953ca-701e-000d-3f87-208ead000000
x-ms-version:
- '2018-11-09'
status:
code: 200
message: OK
version: 1

Просмотреть файл

@ -0,0 +1,58 @@
interactions:
- request:
body: "--batch_74db003e-8d61-11e9-a293-001a7dda7113\r\nContent-Type: application/http\r\nContent-ID:
0\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE /utcontainera4231766/0?
HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length: 0\r\nUser-Agent:
Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date: Wed,
12 Jun 2019 22:28:52 GMT\r\nAuthorization: SharedKey blobstoragename:RW6AVaZzP0iUEhmusx95oBsY/lfGvvRQgeZRCy6L9CY=\r\n\r\n\r\n--batch_74db003e-8d61-11e9-a293-001a7dda7113\r\nContent-Type:
application/http\r\nContent-ID: 1\r\nContent-Transfer-Encoding: binary\r\n\r\nDELETE
/utcontainera4231766/1? HTTP/1.1\r\nx-ms-delete-snapshots: include\r\nContent-Length:
0\r\nUser-Agent: Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)\r\nx-ms-date:
Wed, 12 Jun 2019 22:28:52 GMT\r\nAuthorization: SharedKey blobstoragename:dmFjVjFJPkv043vzsAbmOcsW4TpDaHzKEyFUFqMpg0s=\r\n\r\n\r\n--batch_74db003e-8d61-11e9-a293-001a7dda7113--\r\n"
headers:
Connection:
- keep-alive
Content-Length:
- '914'
Content-Type:
- multipart/mixed; boundary=batch_74db003e-8d61-11e9-a293-001a7dda7113
User-Agent:
- Azure-Storage/2.0.0-2.0.1 (Python CPython 3.7.3; Windows 10)
x-ms-client-request-id:
- 74db003f-8d61-11e9-b774-001a7dda7113
x-ms-date:
- Wed, 12 Jun 2019 22:28:52 GMT
x-ms-version:
- '2018-11-09'
method: POST
uri: https://storagename.blob.core.windows.net/?comp=batch
response:
body:
string: "--batchresponse_9f75ed41-ba10-41be-9402-14176ca89611\r\nContent-Type:
application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: da40e8e0-a01e-0004-126e-2194231ec889\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:da40e8e0-a01e-0004-126e-2194231ec889\nTime:2019-06-12T22:28:52.4320159Z</Message></Error>\r\n--batchresponse_9f75ed41-ba10-41be-9402-14176ca89611\r\nContent-Type:
application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 404 The specified blob does
not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: da40e8e0-a01e-0004-126e-2194231ec88b\r\nx-ms-version:
2018-11-09\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer:
Windows-Azure-Blob/1.0\r\n\r\n\uFEFF<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Error><Code>BlobNotFound</Code><Message>The
specified blob does not exist.\nRequestId:da40e8e0-a01e-0004-126e-2194231ec88b\nTime:2019-06-12T22:28:52.4320159Z</Message></Error>\r\n--batchresponse_9f75ed41-ba10-41be-9402-14176ca89611--"
headers:
Content-Type:
- multipart/mixed; boundary=batchresponse_9f75ed41-ba10-41be-9402-14176ca89611
Date:
- Wed, 12 Jun 2019 22:28:51 GMT
Server:
- Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
Transfer-Encoding:
- chunked
x-ms-request-id:
- da40e8e0-a01e-0004-126e-219423000000
x-ms-version:
- '2018-11-09'
status:
code: 202
message: Accepted
version: 1