[Blob][BatchDelete]Add Batch Delete Request
This commit is contained in:
Родитель
814cd0bdd4
Коммит
79ce0217f4
|
@ -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
|
Загрузка…
Ссылка в новой задаче