From 59262b87e26ad18d4125e664c2115b5681dda571 Mon Sep 17 00:00:00 2001 From: annatisch Date: Mon, 1 Jul 2019 16:31:52 -0700 Subject: [PATCH] Azure Storage Queue Track2 (#6039) * Initial commit for Queues (#5656) * Initial commit * fix build * fix build - 2 * add version * API buildout (#5686) * [Storage Queues] Add autorest layer to storage queues (#5687) * add queue.json in swagger * Add autorest layer * Hooking up Queue client and Queue Service Client (#5817) * Queue client * changes * shared access signature * some fixes * add tests * Delete settings_real.py * Refactored shared code and added tests * Packaging update of azure-storage-queue * Revert "Packaging update of azure-storage-queue" This reverts commit fdc62ab270e1d05184de0303ba21d722ce0c04e4. * Add packaging overwrite * Fixed setup * Fixed dependency * Storage Queues readme (#6073) * queues readme [wip] * small fixes * docstrings for queues (#6066) * Updated user-agent policy * Updated token test * Updated message iterator to pageable * Renamed dequeue to receive * Removed Py3.4 tag * Clean pylint * Code samples for queues (#6088) * adds code samples for queues * fixes to code samples and adds literalincludes for docs * add links for TODO * uses unicode strings for python2 compatibility * fix readme link * Fix CI * [Storage Queue] pylint + mypy pass (#6187) * [storage-queue] Docs updates (#6186) * Docs updates * First round review feedback --- .docsettings.yml | 2 + .gitignore | 5 +- sdk/storage/azure-storage-queue/HISTORY.md | 35 + sdk/storage/azure-storage-queue/LICENSE.txt | 21 + sdk/storage/azure-storage-queue/MANIFEST.in | 4 + sdk/storage/azure-storage-queue/README.md | 192 ++ .../azure-storage-queue/azure/__init__.py | 1 + .../azure/storage/__init__.py | 1 + .../azure/storage/queue/__init__.py | 70 + .../storage/queue/_generated/__init__.py | 16 + .../queue/_generated/_azure_queue_storage.py | 63 + .../queue/_generated/_configuration.py | 51 + .../storage/queue/_generated/aio/__init__.py | 11 + .../aio/_azure_queue_storage_async.py | 64 + .../_generated/aio/_configuration_async.py | 50 + .../aio/operations_async/__init__.py | 19 + .../_message_id_operations_async.py | 181 ++ .../_messages_operations_async.py | 344 +++ .../_queue_operations_async.py | 430 ++++ .../_service_operations_async.py | 345 +++ .../queue/_generated/models/__init__.py | 69 + .../models/_azure_queue_storage_enums.py | 76 + .../queue/_generated/models/_models.py | 631 ++++++ .../queue/_generated/models/_models_py3.py | 628 ++++++ .../queue/_generated/operations/__init__.py | 19 + .../operations/_message_id_operations.py | 181 ++ .../operations/_messages_operations.py | 344 +++ .../operations/_queue_operations.py | 430 ++++ .../operations/_service_operations.py | 345 +++ .../azure/storage/queue/_generated/version.py | 10 + .../azure/storage/queue/_queue_utils.py | 202 ++ .../azure/storage/queue/_shared/__init__.py | 5 + .../storage/queue/_shared/authentication.py | 152 ++ .../azure/storage/queue/_shared/constants.py | 24 + .../queue/_shared/download_chunking.py | 203 ++ .../azure/storage/queue/_shared/encryption.py | 551 +++++ .../azure/storage/queue/_shared/models.py | 426 ++++ .../azure/storage/queue/_shared/policies.py | 638 ++++++ .../queue/_shared/shared_access_signature.py | 468 +++++ .../storage/queue/_shared/upload_chunking.py | 546 +++++ .../azure/storage/queue/_shared/utils.py | 606 ++++++ .../azure/storage/queue/models.py | 398 ++++ .../azure/storage/queue/queue_client.py | 784 +++++++ .../storage/queue/queue_service_client.py | 447 ++++ .../azure/storage/queue/version.py | 12 + .../azure-storage-queue/dev_requirements.txt | 5 + sdk/storage/azure-storage-queue/mypy.ini | 13 + .../azure-storage-queue/sdk_packaging.toml | 2 + sdk/storage/azure-storage-queue/setup.cfg | 2 + sdk/storage/azure-storage-queue/setup.py | 91 + .../azure-storage-queue/swagger/queue.json | 1856 +++++++++++++++++ .../azure-storage-queue/tests/__init__.py | 1 + .../tests/common/__init__.py | 0 .../tests/common/test_client.py | 406 ++++ .../tests/common/test_service_properties.py | 231 ++ .../tests/common/test_service_stats.py | 74 + .../tests/encryption_test_helper.py | 90 + .../tests/queues/__init__.py | 0 .../tests/queues/test_queue.py | 859 ++++++++ .../tests/queues/test_queue_encodings.py | 206 ++ .../tests/queues/test_queue_encryption.py | 486 +++++ ...t.test_request_callback_signed_header.yaml | 490 +++++ .../test_client.test_response_callback.yaml | 178 ++ .../test_client.test_user_agent_append.yaml | 46 + .../test_client.test_user_agent_custom.yaml | 88 + .../test_client.test_user_agent_default.yaml | 45 + .../test_queue.test_clear_messages.yaml | 1230 +++++++++++ .../test_queue.test_create_queue.yaml | 154 ++ ...queue.test_create_queue_fail_on_exist.yaml | 306 +++ ...ueue_fail_on_exist_different_metadata.yaml | 346 +++ ..._queue.test_create_queue_with_options.yaml | 362 ++++ ..._delete_existing_queue_fail_not_exist.yaml | 306 +++ .../test_queue.test_delete_message.yaml | 1442 +++++++++++++ ..._queue.test_delete_non_existing_queue.yaml | 178 ++ .../test_queue.test_get_messages.yaml | 1086 ++++++++++ ..._queue.test_get_messages_with_options.yaml | 1122 ++++++++++ .../test_queue.test_get_queue_acl.yaml | 326 +++ .../test_queue.test_get_queue_acl_iter.yaml | 326 +++ ...get_queue_acl_with_non_existing_queue.yaml | 176 ++ ...test_get_queue_metadata_message_count.yaml | 510 +++++ .../test_queue.test_list_queues.yaml | 178 ++ ..._queue.test_list_queues_with_metadata.yaml | 498 +++++ ...t_queue.test_list_queues_with_options.yaml | 964 +++++++++ .../test_queue.test_peek_messages.yaml | 1082 ++++++++++ ...queue.test_peek_messages_with_options.yaml | 1106 ++++++++++ .../test_queue.test_put_message.yaml | 906 ++++++++ ...est_put_message_infinite_time_to_live.yaml | 518 +++++ ...e.test_put_message_large_time_to_live.yaml | 518 +++++ .../test_queue.test_queue_exists.yaml | 322 +++ .../test_queue.test_queue_not_exists.yaml | 178 ++ .../test_queue.test_set_queue_acl.yaml | 486 +++++ ...queue.test_set_queue_acl_too_many_ids.yaml | 154 ++ ...ueue_acl_with_empty_signed_identifier.yaml | 490 +++++ ...eue_acl_with_empty_signed_identifiers.yaml | 486 +++++ ...set_queue_acl_with_non_existing_queue.yaml | 186 ++ ...set_queue_acl_with_signed_identifiers.yaml | 490 +++++ .../test_queue.test_set_queue_metadata.yaml | 506 +++++ ...est_unicode_create_queue_unicode_name.yaml | 178 ++ ...est_unicode_get_messages_unicode_data.yaml | 522 +++++ ...t_unicode_update_message_unicode_data.yaml | 886 ++++++++ .../test_queue.test_update_message.yaml | 878 ++++++++ ...est_queue.test_update_message_content.yaml | 890 ++++++++ ...ings.test_message_base64_decode_fails.yaml | 336 +++ ...e_encodings.test_message_bytes_base64.yaml | 338 +++ ...ue_encodings.test_message_text_base64.yaml | 338 +++ ...queue_encodings.test_message_text_xml.yaml | 338 +++ ...s.test_message_text_xml_invalid_chars.yaml | 194 ++ ...ings.test_message_text_xml_whitespace.yaml | 338 +++ ..._encryption_add_encrypted_64k_message.yaml | 451 ++++ ...ption.test_encryption_nonmatching_kid.yaml | 457 ++++ ...ption.test_get_messages_encrypted_kek.yaml | 880 ++++++++ ....test_get_messages_encrypted_resolver.yaml | 460 ++++ ..._encryption.test_get_with_strict_mode.yaml | 430 ++++ ...ryption.test_invalid_value_kek_unwrap.yaml | 601 ++++++ ...ncryption.test_invalid_value_kek_wrap.yaml | 154 ++ ...ion.test_missing_attribute_kek_unrwap.yaml | 601 ++++++ ...ption.test_missing_attribute_kek_wrap.yaml | 154 ++ ...tion.test_peek_messages_encrypted_kek.yaml | 457 ++++ ...test_peek_messages_encrypted_resolver.yaml | 457 ++++ ..._encryption.test_put_with_strict_mode.yaml | 307 +++ ....test_update_encrypted_binary_message.yaml | 763 +++++++ ...e_encryption.test_validate_encryption.yaml | 454 ++++ ...ntication.test_auth_connection_string.yaml | 45 + ...s_authentication.test_auth_shared_key.yaml | 45 + ..._create_client_with_connection_string.yaml | 45 + ...world.test_queue_and_messages_example.yaml | 265 +++ ..._queue.test_delete_and_clear_messages.yaml | 434 ++++ ...eue.test_enqueue_and_receive_messages.yaml | 410 ++++ ...ples_message_queue.test_peek_messages.yaml | 409 ++++ ...les_message_queue.test_queue_metadata.yaml | 170 ++ ...les_message_queue.test_update_message.yaml | 217 ++ ...service.test_queue_service_properties.yaml | 88 + ..._queue_service.test_queues_in_account.yaml | 166 ++ ...perties.test_queue_service_properties.yaml | 338 +++ ...ce_properties.test_retention_too_long.yaml | 198 ++ ...test_service_properties.test_set_cors.yaml | 346 +++ ...vice_properties.test_set_hour_metrics.yaml | 342 +++ ...t_service_properties.test_set_logging.yaml | 342 +++ ...ce_properties.test_set_minute_metrics.yaml | 342 +++ ...e_properties.test_too_many_cors_rules.yaml | 222 ++ ...vice_stats.test_queue_service_stats_f.yaml | 170 ++ ..._queue_service_stats_when_unavailable.yaml | 170 ++ .../tests/samples/__init__.py | 0 .../samples/test_samples_authentication.py | 99 + .../tests/samples/test_samples_hello_world.py | 61 + .../samples/test_samples_message_queue.py | 245 +++ .../samples/test_samples_queue_service.py | 99 + .../tests/settings_fake.py | 55 + .../azure-storage-queue/tests/testcase.py | 507 +++++ 149 files changed, 49898 insertions(+), 1 deletion(-) create mode 100644 sdk/storage/azure-storage-queue/HISTORY.md create mode 100644 sdk/storage/azure-storage-queue/LICENSE.txt create mode 100644 sdk/storage/azure-storage-queue/MANIFEST.in create mode 100644 sdk/storage/azure-storage-queue/README.md create mode 100644 sdk/storage/azure-storage-queue/azure/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_azure_queue_storage.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_configuration.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_azure_queue_storage_async.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_configuration_async.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_message_id_operations_async.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_messages_operations_async.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_queue_operations_async.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_service_operations_async.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/models/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/models/_azure_queue_storage_enums.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/models/_models.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/models/_models_py3.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_message_id_operations.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_messages_operations.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_queue_operations.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_service_operations.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_generated/version.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_queue_utils.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/__init__.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/authentication.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/constants.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/download_chunking.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/encryption.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/models.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/policies.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/shared_access_signature.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/upload_chunking.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_shared/utils.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/models.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/queue_client.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/queue_service_client.py create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/version.py create mode 100644 sdk/storage/azure-storage-queue/dev_requirements.txt create mode 100644 sdk/storage/azure-storage-queue/mypy.ini create mode 100644 sdk/storage/azure-storage-queue/sdk_packaging.toml create mode 100644 sdk/storage/azure-storage-queue/setup.cfg create mode 100644 sdk/storage/azure-storage-queue/setup.py create mode 100644 sdk/storage/azure-storage-queue/swagger/queue.json create mode 100644 sdk/storage/azure-storage-queue/tests/__init__.py create mode 100644 sdk/storage/azure-storage-queue/tests/common/__init__.py create mode 100644 sdk/storage/azure-storage-queue/tests/common/test_client.py create mode 100644 sdk/storage/azure-storage-queue/tests/common/test_service_properties.py create mode 100644 sdk/storage/azure-storage-queue/tests/common/test_service_stats.py create mode 100644 sdk/storage/azure-storage-queue/tests/encryption_test_helper.py create mode 100644 sdk/storage/azure-storage-queue/tests/queues/__init__.py create mode 100644 sdk/storage/azure-storage-queue/tests/queues/test_queue.py create mode 100644 sdk/storage/azure-storage-queue/tests/queues/test_queue_encodings.py create mode 100644 sdk/storage/azure-storage-queue/tests/queues/test_queue_encryption.py create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_client.test_request_callback_signed_header.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_client.test_response_callback.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_append.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_custom.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_default.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_clear_messages.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist_different_metadata.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_with_options.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_existing_queue_fail_not_exist.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_message.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_non_existing_queue.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages_with_options.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_iter.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_with_non_existing_queue.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_metadata_message_count.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_metadata.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_options.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages_with_options.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_infinite_time_to_live.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_large_time_to_live.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_exists.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_not_exists.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_too_many_ids.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifier.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifiers.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_non_existing_queue.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_signed_identifiers.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_metadata.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_create_queue_unicode_name.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_get_messages_unicode_data.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_update_message_unicode_data.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message_content.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_base64_decode_fails.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_bytes_base64.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_base64.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_invalid_chars.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_whitespace.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_add_encrypted_64k_message.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_nonmatching_kid.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_kek.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_resolver.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_with_strict_mode.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_unwrap.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_wrap.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_unrwap.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_wrap.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_kek.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_resolver.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_put_with_strict_mode.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_update_encrypted_binary_message.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_validate_encryption.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_connection_string.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_shared_key.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_create_client_with_connection_string.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_queue_and_messages_example.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_delete_and_clear_messages.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_enqueue_and_receive_messages.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_peek_messages.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_queue_metadata.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_update_message.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queue_service_properties.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queues_in_account.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_queue_service_properties.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_retention_too_long.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_cors.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_hour_metrics.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_logging.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_minute_metrics.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_too_many_cors_rules.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_f.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_when_unavailable.yaml create mode 100644 sdk/storage/azure-storage-queue/tests/samples/__init__.py create mode 100644 sdk/storage/azure-storage-queue/tests/samples/test_samples_authentication.py create mode 100644 sdk/storage/azure-storage-queue/tests/samples/test_samples_hello_world.py create mode 100644 sdk/storage/azure-storage-queue/tests/samples/test_samples_message_queue.py create mode 100644 sdk/storage/azure-storage-queue/tests/samples/test_samples_queue_service.py create mode 100644 sdk/storage/azure-storage-queue/tests/settings_fake.py create mode 100644 sdk/storage/azure-storage-queue/tests/testcase.py diff --git a/.docsettings.yml b/.docsettings.yml index cee34f2ccaf2..cef080993d59 100644 --- a/.docsettings.yml +++ b/.docsettings.yml @@ -67,6 +67,8 @@ known_content_issues: - ['doc/dev/mgmt/swagger/single_api/readme.md', 'dev readme'] - ['doc/dev/mgmt/swagger/multi_api/readme.md', 'dev readme'] - ['doc/dev/mgmt/README.md', 'dev readme'] + - ['doc/dev/README.md', dev readme'] + - ['doc/README.md', 'dev readme'] package_indexing_exclusion_list: - 'azure-sdk-tools' - 'azure-template' diff --git a/.gitignore b/.gitignore index 1d6c04b9bc2f..c1e38c76ba66 100644 --- a/.gitignore +++ b/.gitignore @@ -70,4 +70,7 @@ src/build # [begoldsm] ignore virtual env if it exists. adlEnv/ -code_reports \ No newline at end of file +code_reports +sdk/storage/azure-storage-blob/tests/settings_real.py +sdk/storage/azure-storage-queue/tests/settings_real.py +sdk/storage/azure-storage-file/tests/settings_real.py diff --git a/sdk/storage/azure-storage-queue/HISTORY.md b/sdk/storage/azure-storage-queue/HISTORY.md new file mode 100644 index 000000000000..057e7f4febe7 --- /dev/null +++ b/sdk/storage/azure-storage-queue/HISTORY.md @@ -0,0 +1,35 @@ +# Change Log azure-storage-queue + +## Version 12.0.0b1: + +For release notes and more information please visit +https://aka.ms/azure-sdk-preview1-python + +## Version 2.0.1: +- Updated dependency on azure-storage-common. + +## Version 2.0.0: +- Support for 2018-11-09 REST version. + +## Version 1.4.0: + +- azure-storage-nspkg is not installed anymore on Python 3 (PEP420-based namespace package) + +## Version 1.3.0: + +- Support for 2018-03-28 REST version. Please see our REST API documentation and blog for information about the related added features. + +## Version 1.2.0rc1: + +- Support for 2017-11-09 REST version. Please see our REST API documentation and blog for information about the related added features. +- Added support for OAuth authentication for HTTPS requests(Please note that this feature is available in preview). + +## Version 1.1.0: + +- Support for 2017-07-29 REST version. Please see our REST API documentation and blogs for information about the related added features. +- Queue messages can now have an arbitrarily large or infinite time to live. +- Error message now contains the ErrorCode from the x-ms-error-code header value. + +## Version 1.0.0: + +- The package has switched from Apache 2.0 to the MIT license. \ No newline at end of file diff --git a/sdk/storage/azure-storage-queue/LICENSE.txt b/sdk/storage/azure-storage-queue/LICENSE.txt new file mode 100644 index 000000000000..6acfdd593962 --- /dev/null +++ b/sdk/storage/azure-storage-queue/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sdk/storage/azure-storage-queue/MANIFEST.in b/sdk/storage/azure-storage-queue/MANIFEST.in new file mode 100644 index 000000000000..9babac44ebed --- /dev/null +++ b/sdk/storage/azure-storage-queue/MANIFEST.in @@ -0,0 +1,4 @@ +include *.md +include azure/__init__.py +include azure/storage/__init__.py +include LICENSE.txt diff --git a/sdk/storage/azure-storage-queue/README.md b/sdk/storage/azure-storage-queue/README.md new file mode 100644 index 000000000000..7360d9478751 --- /dev/null +++ b/sdk/storage/azure-storage-queue/README.md @@ -0,0 +1,192 @@ +# Azure Storage Queues client library for Python + +Azure Storage Queues is a service for storing large numbers of messages that can be accessed from anywhere in the world via authenticated calls using HTTP or HTTPS. A single queue message can be up to 64 KB in size, and a queue can contain millions of messages, up to the total capacity limit of a storage account. + +Common uses of Queue storage include: + +* Creating a backlog of work to process asynchronously +* Passing messages between different parts of a distributed application + +[Source code](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/azure/storage/queue) | [Package (PyPi)](https://pypi.org/project/azure-storage-queue/) | [API reference documentation](https://docs.microsoft.com/rest/api/storageservices/queue-service-rest-api) | [Product documentation](https://docs.microsoft.com/azure/storage/) | [Samples](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/tests/samples) + +## Getting started + +### Install the package +Install the Azure Storage Queue client library for Python with [pip](https://pypi.org/project/pip/): + +```bash +pip install azure-storage-queue +``` + +**Prerequisites**: You must have an [Azure subscription](https://azure.microsoft.com/free/), and a +[Storage Account](https://docs.microsoft.com/azure/storage/common/storage-account-overview) to use this package. + +To create a Storage Account, you can use the [Azure Portal](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-portal), +[Azure PowerShell](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-powershell) or [Azure CLI](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-cli): + +```bash +az storage account create -n MyStorageAccountName -g MyResourceGroupName +``` + +Requires Python 2.7, 3.5 or later to use this package. + +### Authenticate the client + +Interaction with Storage Queues starts with an instance of the QueueServiceClient class. You need an existing storage account, its URL, and a credential to instantiate the client object. + +#### Get credentials + +To authenticate the client you have a few options: +1. Use a SAS token string +2. Use an account shared access key +3. Use a token credential from [azure.identity](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/identity/azure-identity) + +Alternatively, you can authenticate with a storage connection string using the `from_connection_string` method. See example: [Client creation with a connection string](#create-client-with-conn-string). + +You can omit the credential if your account URL already has a SAS token. + +#### Create client + +Once you have your account URL and credentials ready, you can create the QueueServiceClient: + +```python +from azure.storage.queue import QueueServiceClient + +service = QueueServiceClient(account_url="https://.queue.core.windows.net/", credential=credential) +``` + +## Key concepts + +The Queue service contains the following components: + +* The storage account +* A queue which contains a set of messages +* A message, in any format, of up to 64 KB + +#### Clients + +The Storage Queues SDK provides two different clients to interact with the Queues Service: +1. **QueueServiceClient** - this client interacts with the Queue Service at the account level. + It provides operations to retrieve and configure the account properties + as well as list, create, and delete queues within the account. + For operations relating to a specific queue, a client for that entity + can also be retrieved using the `get_queue_client` function. +2. **QueueClient** - this client represents interaction with a specific + queue, although that queue need not exist yet. It provides operations to create, delete, or + configure queues and includes operations to enqueue, receive, peak, delete, and update messages in the queue. + +#### Messages + +Once you've initialized a Client, you can use the following operations to work with the messages in the queue: +* **Enqueue** - Adds a message to the queue and optionally sets a visibility timeout for the message. +* **Receive** - Retrieves a message from the queue and makes it invisible to other consumers. +* **Peek** - Retrieves a message from the front of the queue, without changing the message visibility. +* **Update** - Updates the visibility timeout of a message and/or the message contents. +* **Delete** - Deletes a specified message from the queue. +* **Clear** - Clears all messages from the queue. + + +## Examples + +The following sections provide several code snippets covering some of the most common Storage Queue tasks, including: + +* [Client creation with a connection string](#client-creation-with-a-connection-string) +* [Create a queue](#create-a-queue) +* [Enqueue messages](#enqueue-messages) +* [Receive messages](#receive-messages) + + +### Client creation with a connection string +Create the QueueServiceClient using the connection string to your Azure Storage account. + +```python +from azure.storage.queue import QueueServiceClient + +service = QueueServiceClient.from_connection_string(conn_str="my_connection_string") +``` + +### Create a queue +Create a queue in your storage account. + +```python +from azure.storage.queue import QueueClient + +queue = QueueClient.from_connection_string(conn_str="my_connection_string", queue="myqueue") +queue.create_queue() +``` +### Enqueue messages +Enqueue a message in your queue. + +```python +from azure.storage.queue import QueueClient + +queue = QueueClient.from_connection_string(conn_str="my_connection_string", queue="myqueue") +queue.enqueue_message("I'm using queues!") +queue.enqueue_message("This is my second message") +``` + +### Receive messages +Receive messages from your queue. + +```python +from azure.storage.queue import QueueClient + +queue = QueueClient.from_connection_string(conn_str="my_connection_string", queue="myqueue") +response = queue.receive_messages() + +for message in response: + print(message.content) + +# Printed messages from the front of the queue +# >>I'm using queues! +# >>This is my second message +``` + +## Troubleshooting +Storage Queue clients raise exceptions defined in [Azure Core](https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/core/azure-core/docs/exceptions.md). + +All Queue service operations will throw a StorageErrorException on failure with helpful [error codes](https://docs.microsoft.com/rest/api/storageservices/queue-service-error-codes). + +## Next steps +### More sample code + +Get started with our [Queue samples](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/tests/samples). + +Several Storage Queues Python SDK samples are available to you in the SDK's GitHub repository. These samples provide example code for additional scenarios commonly encountered while working with Storage Queues: + +* [`test_samples_hello_world.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/tests/samples/test_samples_hello_world.py) - Examples found in this article: + * Client creation + * Create a queue + * Enqueue messages + * Receive messages + +* [`test_samples_authentication.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/tests/samples/test_samples_authentication.py) - Examples for authenticating and creating the client: + * From a connection string + * From a shared access key + * From a shared access signature token + * From active directory + +* [`test_samples_queue_service.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/tests/samples/test_samples_queue_service.py) - Examples for interacting with the queue service: + * Get and set service properties + * List queues in a storage account + * Create and delete a queue from the service + * Get the QueueClient + +* [`test_samples_message_queue.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-queue/tests/samples/test_samples_message_queue.py) - Examples for working with queues and messages: + * Set an access policy + * Get and set queue metadata + * Enqueue and receive messages + * Delete specified messages and clear all messages + * Peek and update messages + +### Additional documentation + +For more extensive documentation on the Azure Storage Queues, see the [Azure Storage Queues documentation](https://docs.microsoft.com/azure/storage/) on docs.microsoft.com. + + +## Contributing +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com. + +When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \ No newline at end of file diff --git a/sdk/storage/azure-storage-queue/azure/__init__.py b/sdk/storage/azure-storage-queue/azure/__init__.py new file mode 100644 index 000000000000..59cb70146572 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: str diff --git a/sdk/storage/azure-storage-queue/azure/storage/__init__.py b/sdk/storage/azure-storage-queue/azure/storage/__init__.py new file mode 100644 index 000000000000..59cb70146572 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/__init__.py @@ -0,0 +1 @@ +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: str diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/__init__.py b/sdk/storage/azure-storage-queue/azure/storage/queue/__init__.py new file mode 100644 index 000000000000..e027028eee3e --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/__init__.py @@ -0,0 +1,70 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from .version import VERSION +from .queue_client import QueueClient +from .queue_service_client import QueueServiceClient +from ._shared.policies import ExponentialRetry, LinearRetry, NoRetry +from ._shared.models import( + LocationMode, + ResourceTypes, + AccountPermissions, + StorageErrorCode +) +from ._queue_utils import ( + TextBase64EncodePolicy, + TextBase64DecodePolicy, + BinaryBase64EncodePolicy, + BinaryBase64DecodePolicy, + TextXMLEncodePolicy, + TextXMLDecodePolicy, + NoEncodePolicy, + NoDecodePolicy +) +from .models import ( + QueueMessage, + QueueProperties, + QueuePropertiesPaged, + QueuePermissions, + AccessPolicy, + Logging, + Metrics, + CorsRule, + RetentionPolicy, + MessagesPaged, +) + +__version__ = VERSION + +__all__ = [ + 'QueueClient', + 'QueueServiceClient', + 'ExponentialRetry', + 'LinearRetry', + 'NoRetry', + 'LocationMode', + 'ResourceTypes', + 'AccountPermissions', + 'StorageErrorCode', + 'QueueMessage', + 'QueueProperties', + 'QueuePropertiesPaged', + 'QueuePermissions', + 'AccessPolicy', + 'TextBase64EncodePolicy', + 'TextBase64DecodePolicy', + 'BinaryBase64EncodePolicy', + 'BinaryBase64DecodePolicy', + 'TextXMLEncodePolicy', + 'TextXMLDecodePolicy', + 'NoEncodePolicy', + 'NoDecodePolicy', + 'Logging', + 'Metrics', + 'CorsRule', + 'RetentionPolicy', + 'MessagesPaged', +] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/__init__.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/__init__.py new file mode 100644 index 000000000000..f3ca950f4944 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/__init__.py @@ -0,0 +1,16 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from ._configuration import AzureQueueStorageConfiguration +from ._azure_queue_storage import AzureQueueStorage +__all__ = ['AzureQueueStorage', 'AzureQueueStorageConfiguration'] + +from .version import VERSION + +__version__ = VERSION + diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_azure_queue_storage.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_azure_queue_storage.py new file mode 100644 index 000000000000..8129624d2c7a --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_azure_queue_storage.py @@ -0,0 +1,63 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from azure.core import PipelineClient +from msrest import Serializer, Deserializer + +from ._configuration import AzureQueueStorageConfiguration +from azure.core.exceptions import map_error +from .operations import ServiceOperations +from .operations import QueueOperations +from .operations import MessagesOperations +from .operations import MessageIdOperations +from . import models + + +class AzureQueueStorage(object): + """AzureQueueStorage + + + :ivar service: Service operations + :vartype service: queue.operations.ServiceOperations + :ivar queue: Queue operations + :vartype queue: queue.operations.QueueOperations + :ivar messages: Messages operations + :vartype messages: queue.operations.MessagesOperations + :ivar message_id: MessageId operations + :vartype message_id: queue.operations.MessageIdOperations + + :param url: The URL of the service account, queue or message that is the + targe of the desired operation. + :type url: str + """ + + def __init__(self, url, config=None, **kwargs): + + base_url = '{url}' + self._config = config or AzureQueueStorageConfiguration(url, **kwargs) + self._client = PipelineClient(base_url=base_url, config=self._config, **kwargs) + + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + self.api_version = '2018-03-28' + self._serialize = Serializer(client_models) + self._deserialize = Deserializer(client_models) + + self.service = ServiceOperations( + self._client, self._config, self._serialize, self._deserialize) + self.queue = QueueOperations( + self._client, self._config, self._serialize, self._deserialize) + self.messages = MessagesOperations( + self._client, self._config, self._serialize, self._deserialize) + self.message_id = MessageIdOperations( + self._client, self._config, self._serialize, self._deserialize) + + def __enter__(self): + self._client.__enter__() + return self + def __exit__(self, *exc_details): + self._client.__exit__(*exc_details) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_configuration.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_configuration.py new file mode 100644 index 000000000000..78e0f1b2e37a --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/_configuration.py @@ -0,0 +1,51 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from azure.core.configuration import Configuration, ConnectionConfiguration +from azure.core.pipeline import policies + +from .version import VERSION + + +class AzureQueueStorageConfiguration(Configuration): + """Configuration for AzureQueueStorage + Note that all parameters used to create this instance are saved as instance + attributes. + + :param url: The URL of the service account, queue or message that is the + targe of the desired operation. + :type url: str + :ivar version: Specifies the version of the operation to use for this + request. + :type version: str + """ + + def __init__(self, url, **kwargs): + + if url is None: + raise ValueError("Parameter 'url' must not be None.") + + super(AzureQueueStorageConfiguration, self).__init__(**kwargs) + self._configure(**kwargs) + + self.user_agent_policy.add_user_agent('azurequeuestorage/{}'.format(VERSION)) + self.generate_client_request_id = True + self.accept_language = None + + self.url = url + self.version = "2018-03-28" + + def _configure(self, **kwargs): + self.connection = ConnectionConfiguration(**kwargs) + self.user_agent_policy = policies.UserAgentPolicy(**kwargs) + self.headers_policy = policies.HeadersPolicy(**kwargs) + self.proxy_policy = policies.ProxyPolicy(**kwargs) + self.logging_policy = policies.NetworkTraceLoggingPolicy(**kwargs) + self.retry_policy = policies.RetryPolicy(**kwargs) + self.custom_hook_policy = policies.CustomHookPolicy(**kwargs) + self.redirect_policy = policies.RedirectPolicy(**kwargs) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/__init__.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/__init__.py new file mode 100644 index 000000000000..6cdb3f3b6528 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/__init__.py @@ -0,0 +1,11 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from ._azure_queue_storage_async import AzureQueueStorage +from ._configuration_async import AzureQueueStorageConfiguration +__all__ = ['AzureQueueStorage', 'AzureQueueStorageConfiguration'] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_azure_queue_storage_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_azure_queue_storage_async.py new file mode 100644 index 000000000000..67bc78c251a7 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_azure_queue_storage_async.py @@ -0,0 +1,64 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from azure.core import AsyncPipelineClient +from msrest import Serializer, Deserializer + +from ._configuration_async import AzureQueueStorageConfiguration +from azure.core.exceptions import map_error +from .operations_async import ServiceOperations +from .operations_async import QueueOperations +from .operations_async import MessagesOperations +from .operations_async import MessageIdOperations +from .. import models + + +class AzureQueueStorage(object): + """AzureQueueStorage + + + :ivar service: Service operations + :vartype service: queue.aio.operations_async.ServiceOperations + :ivar queue: Queue operations + :vartype queue: queue.aio.operations_async.QueueOperations + :ivar messages: Messages operations + :vartype messages: queue.aio.operations_async.MessagesOperations + :ivar message_id: MessageId operations + :vartype message_id: queue.aio.operations_async.MessageIdOperations + + :param url: The URL of the service account, queue or message that is the + targe of the desired operation. + :type url: str + """ + + def __init__( + self, url, config=None, **kwargs): + + base_url = '{url}' + self._config = config or AzureQueueStorageConfiguration(url, **kwargs) + self._client = AsyncPipelineClient(base_url=base_url, config=self._config, **kwargs) + + client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)} + self.api_version = '2018-03-28' + self._serialize = Serializer(client_models) + self._deserialize = Deserializer(client_models) + + self.service = ServiceOperations( + self._client, self._config, self._serialize, self._deserialize) + self.queue = QueueOperations( + self._client, self._config, self._serialize, self._deserialize) + self.messages = MessagesOperations( + self._client, self._config, self._serialize, self._deserialize) + self.message_id = MessageIdOperations( + self._client, self._config, self._serialize, self._deserialize) + + async def __aenter__(self): + await self._client.__aenter__() + return self + async def __aexit__(self, *exc_details): + await self._client.__aexit__(*exc_details) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_configuration_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_configuration_async.py new file mode 100644 index 000000000000..898075e85084 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/_configuration_async.py @@ -0,0 +1,50 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from azure.core.configuration import Configuration, ConnectionConfiguration +from azure.core.pipeline import policies + +from ..version import VERSION + + +class AzureQueueStorageConfiguration(Configuration): + """Configuration for AzureQueueStorage + Note that all parameters used to create this instance are saved as instance + attributes. + + :param url: The URL of the service account, queue or message that is the + targe of the desired operation. + :type url: str + :ivar version: Specifies the version of the operation to use for this + request. + :type version: str + """ + + def __init__(self, url, **kwargs): + + if url is None: + raise ValueError("Parameter 'url' must not be None.") + + super(AzureQueueStorageConfiguration, self).__init__(**kwargs) + self._configure(**kwargs) + + self.user_agent_policy.add_user_agent('azurequeuestorage/{}'.format(VERSION)) + self.generate_client_request_id = True + self.accept_language = None + + self.url = url + self.version = "2018-03-28" + + def _configure(self, **kwargs): + self.connection = ConnectionConfiguration(**kwargs) + self.user_agent_policy = policies.UserAgentPolicy(**kwargs) + self.headers_policy = policies.HeadersPolicy(**kwargs) + self.proxy_policy = policies.ProxyPolicy(**kwargs) + self.logging_policy = policies.NetworkTraceLoggingPolicy(**kwargs) + self.retry_policy = policies.AsyncRetryPolicy(**kwargs) + self.redirect_policy = policies.AsyncRedirectPolicy(**kwargs) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/__init__.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/__init__.py new file mode 100644 index 000000000000..3f0b116c598d --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from ._service_operations_async import ServiceOperations +from ._queue_operations_async import QueueOperations +from ._messages_operations_async import MessagesOperations +from ._message_id_operations_async import MessageIdOperations + +__all__ = [ + 'ServiceOperations', + 'QueueOperations', + 'MessagesOperations', + 'MessageIdOperations', +] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_message_id_operations_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_message_id_operations_async.py new file mode 100644 index 000000000000..dec606a6b13a --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/aio/operations_async/_message_id_operations_async.py @@ -0,0 +1,181 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from azure.core.exceptions import map_error + +from ... import models + + +class MessageIdOperations: + """MessageIdOperations async operations. + + You should not instantiate directly this class, but create a Client instance that will create it for you and attach it as attribute. + + :param client: Client for service requests. + :param config: Configuration of service client. + :param serializer: An object model serializer. + :param deserializer: An object model deserializer. + """ + + models = models + + def __init__(self, client, config, serializer, deserializer) -> None: + + self._client = client + self._serialize = serializer + self._deserialize = deserializer + + self._config = config + + async def update(self, queue_message, pop_receipt, visibilitytimeout, timeout=None, request_id=None, *, cls=None, **kwargs): + """The Update operation was introduced with version 2011-08-18 of the + Queue service API. The Update Message operation updates the visibility + timeout of a message. You can also use this operation to update the + contents of a message. A message must be in a format that can be + included in an XML request with UTF-8 encoding, and the encoded message + can be up to 64KB in size. + + :param queue_message: A Message object which can be stored in a Queue + :type queue_message: ~queue.models.QueueMessage + :param pop_receipt: Required. Specifies the valid pop receipt value + returned from an earlier call to the Get Messages or Update Message + operation. + :type pop_receipt: str + :param visibilitytimeout: Optional. Specifies the new visibility + timeout value, in seconds, relative to server time. The default value + is 30 seconds. A specified value must be larger than or equal to 1 + second, and cannot be larger than 7 days, or larger than 2 hours on + REST protocol versions prior to version 2011-08-18. The visibility + timeout of a message can be set to a value later than the expiry time. + :type visibilitytimeout: int + :param timeout: The The timeout parameter is expressed in seconds. For + more information, see None: + + self._client = client + self._serialize = serializer + self._deserialize = deserializer + + self._config = config + self.peekonly = "true" + + async def dequeue(self, number_of_messages=None, visibilitytimeout=None, timeout=None, request_id=None, *, cls=None, **kwargs): + """The Dequeue operation retrieves one or more messages from the front of + the queue. + + :param number_of_messages: Optional. A nonzero integer value that + specifies the number of messages to retrieve from the queue, up to a + maximum of 32. If fewer are visible, the visible messages are + returned. By default, a single message is retrieved from the queue + with this operation. + :type number_of_messages: int + :param visibilitytimeout: Optional. Specifies the new visibility + timeout value, in seconds, relative to server time. The default value + is 30 seconds. A specified value must be larger than or equal to 1 + second, and cannot be larger than 7 days, or larger than 2 hours on + REST protocol versions prior to version 2011-08-18. The visibility + timeout of a message can be set to a value later than the expiry time. + :type visibilitytimeout: int + :param timeout: The The timeout parameter is expressed in seconds. For + more information, see None: + + self._client = client + self._serialize = serializer + self._deserialize = deserializer + + self._config = config + + async def create(self, timeout=None, metadata=None, request_id=None, *, cls=None, **kwargs): + """creates a new queue under the given account. + + :param timeout: The The timeout parameter is expressed in seconds. For + more information, see None: + + self._client = client + self._serialize = serializer + self._deserialize = deserializer + + self._config = config + self.restype = "service" + + async def set_properties(self, storage_service_properties, timeout=None, request_id=None, *, cls=None, **kwargs): + """Sets properties for a storage account's Queue service endpoint, + including properties for Storage Analytics and CORS (Cross-Origin + Resource Sharing) rules. + + :param storage_service_properties: The StorageService properties. + :type storage_service_properties: + ~queue.models.StorageServiceProperties + :param timeout: The The timeout parameter is expressed in seconds. For + more information, see None: + super(AccessPolicy, self).__init__(**kwargs) + self.start = start + self.expiry = expiry + self.permission = permission + + +class CorsRule(Model): + """CORS is an HTTP feature that enables a web application running under one + domain to access resources in another domain. Web browsers implement a + security restriction known as same-origin policy that prevents a web page + from calling APIs in a different domain; CORS provides a secure way to + allow one domain (the origin domain) to call APIs in another domain. + + All required parameters must be populated in order to send to Azure. + + :param allowed_origins: Required. The origin domains that are permitted to + make a request against the storage service via CORS. The origin domain is + the domain from which the request originates. Note that the origin must be + an exact case-sensitive match with the origin that the user age sends to + the service. You can also use the wildcard character '*' to allow all + origin domains to make requests via CORS. + :type allowed_origins: str + :param allowed_methods: Required. The methods (HTTP request verbs) that + the origin domain may use for a CORS request. (comma separated) + :type allowed_methods: str + :param allowed_headers: Required. the request headers that the origin + domain may specify on the CORS request. + :type allowed_headers: str + :param exposed_headers: Required. The response headers that may be sent in + the response to the CORS request and exposed by the browser to the request + issuer + :type exposed_headers: str + :param max_age_in_seconds: Required. The maximum amount time that a + browser should cache the preflight OPTIONS request. + :type max_age_in_seconds: int + """ + + _validation = { + 'allowed_origins': {'required': True}, + 'allowed_methods': {'required': True}, + 'allowed_headers': {'required': True}, + 'exposed_headers': {'required': True}, + 'max_age_in_seconds': {'required': True, 'minimum': 0}, + } + + _attribute_map = { + 'allowed_origins': {'key': 'AllowedOrigins', 'type': 'str', 'xml': {'name': 'AllowedOrigins'}}, + 'allowed_methods': {'key': 'AllowedMethods', 'type': 'str', 'xml': {'name': 'AllowedMethods'}}, + 'allowed_headers': {'key': 'AllowedHeaders', 'type': 'str', 'xml': {'name': 'AllowedHeaders'}}, + 'exposed_headers': {'key': 'ExposedHeaders', 'type': 'str', 'xml': {'name': 'ExposedHeaders'}}, + 'max_age_in_seconds': {'key': 'MaxAgeInSeconds', 'type': 'int', 'xml': {'name': 'MaxAgeInSeconds'}}, + } + _xml_map = { + } + + def __init__(self, *, allowed_origins: str, allowed_methods: str, allowed_headers: str, exposed_headers: str, max_age_in_seconds: int, **kwargs) -> None: + super(CorsRule, self).__init__(**kwargs) + self.allowed_origins = allowed_origins + self.allowed_methods = allowed_methods + self.allowed_headers = allowed_headers + self.exposed_headers = exposed_headers + self.max_age_in_seconds = max_age_in_seconds + + +class DequeuedMessageItem(Model): + """The object returned in the QueueMessageList array when calling Get Messages + on a Queue. + + All required parameters must be populated in order to send to Azure. + + :param message_id: Required. The Id of the Message. + :type message_id: str + :param insertion_time: Required. The time the Message was inserted into + the Queue. + :type insertion_time: datetime + :param expiration_time: Required. The time that the Message will expire + and be automatically deleted. + :type expiration_time: datetime + :param pop_receipt: Required. This value is required to delete the + Message. If deletion fails using this popreceipt then the message has been + dequeued by another client. + :type pop_receipt: str + :param time_next_visible: Required. The time that the message will again + become visible in the Queue. + :type time_next_visible: datetime + :param dequeue_count: Required. The number of times the message has been + dequeued. + :type dequeue_count: long + :param message_text: Required. The content of the Message. + :type message_text: str + """ + + _validation = { + 'message_id': {'required': True}, + 'insertion_time': {'required': True}, + 'expiration_time': {'required': True}, + 'pop_receipt': {'required': True}, + 'time_next_visible': {'required': True}, + 'dequeue_count': {'required': True}, + 'message_text': {'required': True}, + } + + _attribute_map = { + 'message_id': {'key': 'MessageId', 'type': 'str', 'xml': {'name': 'MessageId'}}, + 'insertion_time': {'key': 'InsertionTime', 'type': 'rfc-1123', 'xml': {'name': 'InsertionTime'}}, + 'expiration_time': {'key': 'ExpirationTime', 'type': 'rfc-1123', 'xml': {'name': 'ExpirationTime'}}, + 'pop_receipt': {'key': 'PopReceipt', 'type': 'str', 'xml': {'name': 'PopReceipt'}}, + 'time_next_visible': {'key': 'TimeNextVisible', 'type': 'rfc-1123', 'xml': {'name': 'TimeNextVisible'}}, + 'dequeue_count': {'key': 'DequeueCount', 'type': 'long', 'xml': {'name': 'DequeueCount'}}, + 'message_text': {'key': 'MessageText', 'type': 'str', 'xml': {'name': 'MessageText'}}, + } + + _xml_map = { + 'name': 'QueueMessage' + } + + def __init__(self, *, message_id: str, insertion_time, expiration_time, pop_receipt: str, time_next_visible, dequeue_count: int, message_text: str, **kwargs) -> None: + super(DequeuedMessageItem, self).__init__(**kwargs) + self.message_id = message_id + self.insertion_time = insertion_time + self.expiration_time = expiration_time + self.pop_receipt = pop_receipt + self.time_next_visible = time_next_visible + self.dequeue_count = dequeue_count + self.message_text = message_text + + +class EnqueuedMessage(Model): + """The object returned in the QueueMessageList array when calling Put Message + on a Queue. + + All required parameters must be populated in order to send to Azure. + + :param message_id: Required. The Id of the Message. + :type message_id: str + :param insertion_time: Required. The time the Message was inserted into + the Queue. + :type insertion_time: datetime + :param expiration_time: Required. The time that the Message will expire + and be automatically deleted. + :type expiration_time: datetime + :param pop_receipt: Required. This value is required to delete the + Message. If deletion fails using this popreceipt then the message has been + dequeued by another client. + :type pop_receipt: str + :param time_next_visible: Required. The time that the message will again + become visible in the Queue. + :type time_next_visible: datetime + """ + + _validation = { + 'message_id': {'required': True}, + 'insertion_time': {'required': True}, + 'expiration_time': {'required': True}, + 'pop_receipt': {'required': True}, + 'time_next_visible': {'required': True}, + } + + _attribute_map = { + 'message_id': {'key': 'MessageId', 'type': 'str', 'xml': {'name': 'MessageId'}}, + 'insertion_time': {'key': 'InsertionTime', 'type': 'rfc-1123', 'xml': {'name': 'InsertionTime'}}, + 'expiration_time': {'key': 'ExpirationTime', 'type': 'rfc-1123', 'xml': {'name': 'ExpirationTime'}}, + 'pop_receipt': {'key': 'PopReceipt', 'type': 'str', 'xml': {'name': 'PopReceipt'}}, + 'time_next_visible': {'key': 'TimeNextVisible', 'type': 'rfc-1123', 'xml': {'name': 'TimeNextVisible'}}, + } + + _xml_map = { + 'name': 'QueueMessage' + } + + def __init__(self, *, message_id: str, insertion_time, expiration_time, pop_receipt: str, time_next_visible, **kwargs) -> None: + super(EnqueuedMessage, self).__init__(**kwargs) + self.message_id = message_id + self.insertion_time = insertion_time + self.expiration_time = expiration_time + self.pop_receipt = pop_receipt + self.time_next_visible = time_next_visible + + +class GeoReplication(Model): + """GeoReplication. + + All required parameters must be populated in order to send to Azure. + + :param status: Required. The status of the secondary location. Possible + values include: 'live', 'bootstrap', 'unavailable' + :type status: str or ~queue.models.GeoReplicationStatusType + :param last_sync_time: Required. A GMT date/time value, to the second. All + primary writes preceding this value are guaranteed to be available for + read operations at the secondary. Primary writes after this point in time + may or may not be available for reads. + :type last_sync_time: datetime + """ + + _validation = { + 'status': {'required': True}, + 'last_sync_time': {'required': True}, + } + + _attribute_map = { + 'status': {'key': 'Status', 'type': 'str', 'xml': {'name': 'Status'}}, + 'last_sync_time': {'key': 'LastSyncTime', 'type': 'rfc-1123', 'xml': {'name': 'LastSyncTime'}}, + } + _xml_map = { + } + + def __init__(self, *, status, last_sync_time, **kwargs) -> None: + super(GeoReplication, self).__init__(**kwargs) + self.status = status + self.last_sync_time = last_sync_time + + +class ListQueuesSegmentResponse(Model): + """The object returned when calling List Queues on a Queue Service. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param prefix: Required. + :type prefix: str + :param marker: + :type marker: str + :param max_results: Required. + :type max_results: int + :param queue_items: + :type queue_items: list[~queue.models.QueueItem] + :param next_marker: Required. + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'prefix': {'required': True}, + 'max_results': {'required': True}, + 'next_marker': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'name': 'ServiceEndpoint', 'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str', 'xml': {'name': 'Prefix'}}, + 'marker': {'key': 'Marker', 'type': 'str', 'xml': {'name': 'Marker'}}, + 'max_results': {'key': 'MaxResults', 'type': 'int', 'xml': {'name': 'MaxResults'}}, + 'queue_items': {'key': 'QueueItems', 'type': '[QueueItem]', 'xml': {'name': 'Queues', 'itemsName': 'Queues', 'wrapped': True}}, + 'next_marker': {'key': 'NextMarker', 'type': 'str', 'xml': {'name': 'NextMarker'}}, + } + + def __init__(self, *, service_endpoint: str, prefix: str, max_results: int, next_marker: str, marker: str=None, queue_items=None, **kwargs) -> None: + super(ListQueuesSegmentResponse, self).__init__(**kwargs) + self.service_endpoint = service_endpoint + self.prefix = prefix + self.marker = marker + self.max_results = max_results + self.queue_items = queue_items + self.next_marker = next_marker + + +class Logging(Model): + """Azure Analytics Logging settings. + + All required parameters must be populated in order to send to Azure. + + :param version: Required. The version of Storage Analytics to configure. + :type version: str + :param delete: Required. Indicates whether all delete requests should be + logged. + :type delete: bool + :param read: Required. Indicates whether all read requests should be + logged. + :type read: bool + :param write: Required. Indicates whether all write requests should be + logged. + :type write: bool + :param retention_policy: Required. + :type retention_policy: ~queue.models.RetentionPolicy + """ + + _validation = { + 'version': {'required': True}, + 'delete': {'required': True}, + 'read': {'required': True}, + 'write': {'required': True}, + 'retention_policy': {'required': True}, + } + + _attribute_map = { + 'version': {'key': 'Version', 'type': 'str', 'xml': {'name': 'Version'}}, + 'delete': {'key': 'Delete', 'type': 'bool', 'xml': {'name': 'Delete'}}, + 'read': {'key': 'Read', 'type': 'bool', 'xml': {'name': 'Read'}}, + 'write': {'key': 'Write', 'type': 'bool', 'xml': {'name': 'Write'}}, + 'retention_policy': {'key': 'RetentionPolicy', 'type': 'RetentionPolicy', 'xml': {'name': 'RetentionPolicy'}}, + } + _xml_map = { + } + + def __init__(self, *, version: str, delete: bool, read: bool, write: bool, retention_policy, **kwargs) -> None: + super(Logging, self).__init__(**kwargs) + self.version = version + self.delete = delete + self.read = read + self.write = write + self.retention_policy = retention_policy + + +class Metrics(Model): + """Metrics. + + All required parameters must be populated in order to send to Azure. + + :param version: The version of Storage Analytics to configure. + :type version: str + :param enabled: Required. Indicates whether metrics are enabled for the + Queue service. + :type enabled: bool + :param include_ap_is: Indicates whether metrics should generate summary + statistics for called API operations. + :type include_ap_is: bool + :param retention_policy: + :type retention_policy: ~queue.models.RetentionPolicy + """ + + _validation = { + 'enabled': {'required': True}, + } + + _attribute_map = { + 'version': {'key': 'Version', 'type': 'str', 'xml': {'name': 'Version'}}, + 'enabled': {'key': 'Enabled', 'type': 'bool', 'xml': {'name': 'Enabled'}}, + 'include_apis': {'key': 'IncludeAPIs', 'type': 'bool', 'xml': {'name': 'IncludeAPIs'}}, + 'retention_policy': {'key': 'RetentionPolicy', 'type': 'RetentionPolicy', 'xml': {'name': 'RetentionPolicy'}}, + } + _xml_map = { + } + + def __init__(self, *, enabled: bool, version: str=None, include_ap_is: bool=None, retention_policy=None, **kwargs) -> None: + super(Metrics, self).__init__(**kwargs) + self.version = version + self.enabled = enabled + self.include_ap_is = include_ap_is + self.retention_policy = retention_policy + + +class PeekedMessageItem(Model): + """The object returned in the QueueMessageList array when calling Peek + Messages on a Queue. + + All required parameters must be populated in order to send to Azure. + + :param message_id: Required. The Id of the Message. + :type message_id: str + :param insertion_time: Required. The time the Message was inserted into + the Queue. + :type insertion_time: datetime + :param expiration_time: Required. The time that the Message will expire + and be automatically deleted. + :type expiration_time: datetime + :param dequeue_count: Required. The number of times the message has been + dequeued. + :type dequeue_count: long + :param message_text: Required. The content of the Message. + :type message_text: str + """ + + _validation = { + 'message_id': {'required': True}, + 'insertion_time': {'required': True}, + 'expiration_time': {'required': True}, + 'dequeue_count': {'required': True}, + 'message_text': {'required': True}, + } + + _attribute_map = { + 'message_id': {'key': 'MessageId', 'type': 'str', 'xml': {'name': 'MessageId'}}, + 'insertion_time': {'key': 'InsertionTime', 'type': 'rfc-1123', 'xml': {'name': 'InsertionTime'}}, + 'expiration_time': {'key': 'ExpirationTime', 'type': 'rfc-1123', 'xml': {'name': 'ExpirationTime'}}, + 'dequeue_count': {'key': 'DequeueCount', 'type': 'long', 'xml': {'name': 'DequeueCount'}}, + 'message_text': {'key': 'MessageText', 'type': 'str', 'xml': {'name': 'MessageText'}}, + } + + _xml_map = { + 'name': 'QueueMessage' + } + + def __init__(self, *, message_id: str, insertion_time, expiration_time, dequeue_count: int, message_text: str, **kwargs) -> None: + super(PeekedMessageItem, self).__init__(**kwargs) + self.message_id = message_id + self.insertion_time = insertion_time + self.expiration_time = expiration_time + self.dequeue_count = dequeue_count + self.message_text = message_text + + +class QueueItem(Model): + """An Azure Storage Queue. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. The name of the Queue. + :type name: str + :param metadata: + :type metadata: dict[str, str] + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str', 'xml': {'name': 'Name'}}, + 'metadata': {'key': 'Metadata', 'type': '{str}', 'xml': {'name': 'Metadata'}}, + } + + def __init__(self, *, name: str, metadata=None, **kwargs) -> None: + super(QueueItem, self).__init__(**kwargs) + self.name = name + self.metadata = metadata + + +class QueueMessage(Model): + """A Message object which can be stored in a Queue. + + All required parameters must be populated in order to send to Azure. + + :param message_text: Required. The content of the message + :type message_text: str + """ + + _validation = { + 'message_text': {'required': True}, + } + + _attribute_map = { + 'message_text': {'key': 'MessageText', 'type': 'str', 'xml': {'name': 'MessageText'}}, + } + + _xml_map = { + 'name': 'QueueMessage' + } + + def __init__(self, *, message_text: str, **kwargs) -> None: + super(QueueMessage, self).__init__(**kwargs) + self.message_text = message_text + + +class RetentionPolicy(Model): + """the retention policy. + + All required parameters must be populated in order to send to Azure. + + :param enabled: Required. Indicates whether a retention policy is enabled + for the storage service + :type enabled: bool + :param days: Indicates the number of days that metrics or logging or + soft-deleted data should be retained. All data older than this value will + be deleted + :type days: int + """ + + _validation = { + 'enabled': {'required': True}, + 'days': {'minimum': 1}, + } + + _attribute_map = { + 'enabled': {'key': 'Enabled', 'type': 'bool', 'xml': {'name': 'Enabled'}}, + 'days': {'key': 'Days', 'type': 'int', 'xml': {'name': 'Days'}}, + } + _xml_map = { + } + + def __init__(self, *, enabled: bool, days: int=None, **kwargs) -> None: + super(RetentionPolicy, self).__init__(**kwargs) + self.enabled = enabled + self.days = days + + +class SignedIdentifier(Model): + """signed identifier. + + All required parameters must be populated in order to send to Azure. + + :param id: Required. a unique id + :type id: str + :param access_policy: Required. The access policy + :type access_policy: ~queue.models.AccessPolicy + """ + + _validation = { + 'id': {'required': True}, + 'access_policy': {'required': True}, + } + + _attribute_map = { + 'id': {'key': 'Id', 'type': 'str', 'xml': {'name': 'Id'}}, + 'access_policy': {'key': 'AccessPolicy', 'type': 'AccessPolicy', 'xml': {'name': 'AccessPolicy'}}, + } + _xml_map = { + } + + def __init__(self, *, id: str, access_policy, **kwargs) -> None: + super(SignedIdentifier, self).__init__(**kwargs) + self.id = id + self.access_policy = access_policy + + +class StorageError(Model): + """StorageError. + + :param message: + :type message: str + """ + + _attribute_map = { + 'message': {'key': 'Message', 'type': 'str', 'xml': {'name': 'Message'}}, + } + _xml_map = { + } + + def __init__(self, *, message: str=None, **kwargs) -> None: + super(StorageError, self).__init__(**kwargs) + self.message = message + + +class StorageErrorException(HttpResponseError): + """Server responsed with exception of type: 'StorageError'. + + :param deserialize: A deserializer + :param response: Server response to be deserialized. + """ + + def __init__(self, response, deserialize, *args): + + model_name = 'StorageError' + self.error = deserialize(model_name, response) + if self.error is None: + self.error = deserialize.dependencies[model_name]() + super(StorageErrorException, self).__init__(response=response) + + +class StorageServiceProperties(Model): + """Storage Service Properties. + + :param logging: Azure Analytics Logging settings + :type logging: ~queue.models.Logging + :param hour_metrics: A summary of request statistics grouped by API in + hourly aggregates for queues + :type hour_metrics: ~queue.models.Metrics + :param minute_metrics: a summary of request statistics grouped by API in + minute aggregates for queues + :type minute_metrics: ~queue.models.Metrics + :param cors: The set of CORS rules. + :type cors: list[~queue.models.CorsRule] + """ + + _attribute_map = { + 'logging': {'key': 'Logging', 'type': 'Logging', 'xml': {'name': 'Logging'}}, + 'hour_metrics': {'key': 'HourMetrics', 'type': 'Metrics', 'xml': {'name': 'HourMetrics'}}, + 'minute_metrics': {'key': 'MinuteMetrics', 'type': 'Metrics', 'xml': {'name': 'MinuteMetrics'}}, + 'cors': {'key': 'Cors', 'type': '[CorsRule]', 'xml': {'name': 'Cors', 'itemsName': 'CorsRule', 'wrapped': True}}, + } + _xml_map = { + } + + def __init__(self, *, logging=None, hour_metrics=None, minute_metrics=None, cors=None, **kwargs) -> None: + super(StorageServiceProperties, self).__init__(**kwargs) + self.logging = logging + self.hour_metrics = hour_metrics + self.minute_metrics = minute_metrics + self.cors = cors + + +class StorageServiceStats(Model): + """Stats for the storage service. + + :param geo_replication: Geo-Replication information for the Secondary + Storage Service + :type geo_replication: ~queue.models.GeoReplication + """ + + _attribute_map = { + 'geo_replication': {'key': 'GeoReplication', 'type': 'GeoReplication', 'xml': {'name': 'GeoReplication'}}, + } + _xml_map = { + } + + def __init__(self, *, geo_replication=None, **kwargs) -> None: + super(StorageServiceStats, self).__init__(**kwargs) + self.geo_replication = geo_replication diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/__init__.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/__init__.py new file mode 100644 index 000000000000..454a7377fa00 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/__init__.py @@ -0,0 +1,19 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from ._service_operations import ServiceOperations +from ._queue_operations import QueueOperations +from ._messages_operations import MessagesOperations +from ._message_id_operations import MessageIdOperations + +__all__ = [ + 'ServiceOperations', + 'QueueOperations', + 'MessagesOperations', + 'MessageIdOperations', +] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_message_id_operations.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_message_id_operations.py new file mode 100644 index 000000000000..0de068c5bc5d --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_generated/operations/_message_id_operations.py @@ -0,0 +1,181 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- +# pylint: skip-file + +from azure.core.exceptions import map_error + +from .. import models + + +class MessageIdOperations(object): + """MessageIdOperations operations. + + You should not instantiate directly this class, but create a Client instance that will create it for you and attach it as attribute. + + :param client: Client for service requests. + :param config: Configuration of service client. + :param serializer: An object model serializer. + :param deserializer: An object model deserializer. + """ + + models = models + + def __init__(self, client, config, serializer, deserializer): + + self._client = client + self._serialize = serializer + self._deserialize = deserializer + + self._config = config + + def update(self, queue_message, pop_receipt, visibilitytimeout=None, timeout=None, request_id=None, cls=None, **kwargs): + """The Update operation was introduced with version 2011-08-18 of the + Queue service API. The Update Message operation updates the visibility + timeout of a message. You can also use this operation to update the + contents of a message. A message must be in a format that can be + included in an XML request with UTF-8 encoding, and the encoded message + can be up to 64KB in size. + + :param queue_message: A Message object which can be stored in a Queue + :type queue_message: ~queue.models.QueueMessage + :param pop_receipt: Required. Specifies the valid pop receipt value + returned from an earlier call to the Get Messages or Update Message + operation. + :type pop_receipt: str + :param visibilitytimeout: Optional. Specifies the new visibility + timeout value, in seconds, relative to server time. The default value + is 30 seconds. A specified value must be larger than or equal to 1 + second, and cannot be larger than 7 days, or larger than 2 hours on + REST protocol versions prior to version 2011-08-18. The visibility + timeout of a message can be set to a value later than the expiry time. + :type visibilitytimeout: int + :param timeout: The The timeout parameter is expressed in seconds. For + more information, see = (3,): + # Automatic chaining in Python 3 means we keep the trace + return desired_type(msg) + # There isn't a good solution in 2 for keeping the stack trace + # in general, or that will not result in an error in 3 + # However, we can keep the previous error type and message + # TODO: In the future we will log the trace + return desired_type('{}: {}'.format(ex.__class__.__name__, msg)) + + +class AzureSigningError(ClientAuthenticationError): + """ + Represents a fatal error when attempting to sign a request. + In general, the cause of this exception is user error. For example, the given account key is not valid. + Please visit https://docs.microsoft.com/en-us/azure/storage/common/storage-create-storage-account for more info. + """ + + +# pylint: disable=no-self-use +class SharedKeyCredentialPolicy(SansIOHTTPPolicy): + + def __init__(self, account_name, account_key): + self.account_name = account_name + self.account_key = account_key + super(SharedKeyCredentialPolicy, self).__init__() + + def _get_headers(self, request, headers_to_sign): + headers = dict((name.lower(), value) for name, value in request.http_request.headers.items() if value) + if 'content-length' in headers and headers['content-length'] == '0': + del headers['content-length'] + return '\n'.join(headers.get(x, '') for x in headers_to_sign) + '\n' + + def _get_verb(self, request): + return request.http_request.method + '\n' + + def _get_canonicalized_resource(self, request): + uri_path = urlparse(request.http_request.url).path + return '/' + self.account_name + uri_path + + def _get_canonicalized_headers(self, request): + string_to_sign = '' + x_ms_headers = [] + for name, value in request.http_request.headers.items(): + if name.startswith('x-ms-'): + x_ms_headers.append((name.lower(), value)) + x_ms_headers.sort() + for name, value in x_ms_headers: + if value is not None: + string_to_sign += ''.join([name, ':', value, '\n']) + return string_to_sign + + def _get_canonicalized_resource_query(self, request): + sorted_queries = [(name, value) for name, value in request.http_request.query.items()] + sorted_queries.sort() + + string_to_sign = '' + for name, value in sorted_queries: + if value is not None: + string_to_sign += '\n' + name.lower() + ':' + unquote(value) + + return string_to_sign + + def _add_authorization_header(self, request, string_to_sign): + try: + signature = _sign_string(self.account_key, string_to_sign) + auth_string = 'SharedKey ' + self.account_name + ':' + signature + request.http_request.headers['Authorization'] = auth_string + except Exception as ex: + # Wrap any error that occurred as signing error + # Doing so will clarify/locate the source of problem + raise _wrap_exception(ex, AzureSigningError) + + def on_request(self, request, **kwargs): + string_to_sign = \ + self._get_verb(request) + \ + self._get_headers( + request, + [ + 'content-encoding', 'content-language', 'content-length', + 'content-md5', 'content-type', 'date', 'if-modified-since', + 'if-match', 'if-none-match', 'if-unmodified-since', 'byte_range' + ] + ) + \ + self._get_canonicalized_headers(request) + \ + self._get_canonicalized_resource(request) + \ + self._get_canonicalized_resource_query(request) + + self._add_authorization_header(request, string_to_sign) + #logger.debug("String_to_sign=%s", string_to_sign) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/constants.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/constants.py new file mode 100644 index 000000000000..62886ccd7a7d --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/constants.py @@ -0,0 +1,24 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import sys + + +X_MS_VERSION = '2018-03-28' + +# Socket timeout in seconds +DEFAULT_SOCKET_TIMEOUT = 20 + +# for python 3.5+, there was a change to the definition of the socket timeout (as far as socket.sendall is concerned) +# The socket timeout is now the maximum total duration to send all data. +if sys.version_info >= (3, 5): + # the timeout to connect is 20 seconds, and the read timeout is 2000 seconds + # the 2000 seconds was calculated with: 100MB (max block size)/ 50KB/s (an arbitrarily chosen minimum upload speed) + DEFAULT_SOCKET_TIMEOUT = (20, 2000) # type: ignore + +STORAGE_OAUTH_SCOPE = "https://storage.azure.com/.default" + +SERVICE_HOST_BASE = 'core.windows.net' diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/download_chunking.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/download_chunking.py new file mode 100644 index 000000000000..41d6fc0dafea --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/download_chunking.py @@ -0,0 +1,203 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import threading + +from azure.core.exceptions import HttpResponseError + +from .models import ModifiedAccessConditions +from .utils import validate_and_format_range_headers, process_storage_error +from .encryption import _decrypt_blob + + +def process_range_and_offset(start_range, end_range, length, key_encryption_key, key_resolver_function): + start_offset, end_offset = 0, 0 + if key_encryption_key is not None or key_resolver_function is not None: + if start_range is not None: + # Align the start of the range along a 16 byte block + start_offset = start_range % 16 + start_range -= start_offset + + # Include an extra 16 bytes for the IV if necessary + # Because of the previous offsetting, start_range will always + # be a multiple of 16. + if start_range > 0: + start_offset += 16 + start_range -= 16 + + if length is not None: + # Align the end of the range along a 16 byte block + end_offset = 15 - (end_range % 16) + end_range += end_offset + + return (start_range, end_range), (start_offset, end_offset) + + +def process_content(blob, start_offset, end_offset, require_encryption, key_encryption_key, key_resolver_function): + if key_encryption_key is not None or key_resolver_function is not None: + try: + return _decrypt_blob( + require_encryption, + key_encryption_key, + key_resolver_function, + blob, + start_offset, + end_offset) + except Exception as error: + raise HttpResponseError( + message="Decryption failed.", + response=blob.response, + error=error) + else: + return b"".join(list(blob)) + + +class _BlobChunkDownloader(object): # pylint: disable=too-many-instance-attributes + + def __init__( + self, blob_service, download_size, chunk_size, progress, start_range, end_range, stream, + validate_content, access_conditions, mod_conditions, timeout, + require_encryption, key_encryption_key, key_resolver_function, **kwargs): + # identifiers for the blob + self.blob_service = blob_service + + # information on the download range/chunk size + self.chunk_size = chunk_size + self.download_size = download_size + self.start_index = start_range + self.blob_end = end_range + + # the destination that we will write to + self.stream = stream + + # download progress so far + self.progress_total = progress + + # encryption + self.require_encryption = require_encryption + self.key_encryption_key = key_encryption_key + self.key_resolver_function = key_resolver_function + + # parameters for each get blob operation + self.timeout = timeout + self.validate_content = validate_content + self.access_conditions = access_conditions + self.mod_conditions = mod_conditions + self.request_options = kwargs + + def _calculate_range(self, chunk_start): + if chunk_start + self.chunk_size > self.blob_end: + chunk_end = self.blob_end + else: + chunk_end = chunk_start + self.chunk_size + return chunk_start, chunk_end + + def get_chunk_offsets(self): + index = self.start_index + while index < self.blob_end: + yield index + index += self.chunk_size + + def process_chunk(self, chunk_start): + chunk_start, chunk_end = self._calculate_range(chunk_start) + chunk_data = self._download_chunk(chunk_start, chunk_end) + length = chunk_end - chunk_start + if length > 0: + self._write_to_stream(chunk_data, chunk_start) + self._update_progress(length) + + def yield_chunk(self, chunk_start): + chunk_start, chunk_end = self._calculate_range(chunk_start) + return self._download_chunk(chunk_start, chunk_end) + + # should be provided by the subclass + def _update_progress(self, length): + pass + + # should be provided by the subclass + def _write_to_stream(self, chunk_data, chunk_start): + pass + + def _download_chunk(self, chunk_start, chunk_end): + download_range, offset = process_range_and_offset( + chunk_start, + chunk_end, + chunk_end, + self.key_encryption_key, + self.key_resolver_function, + ) + range_header, range_validation = validate_and_format_range_headers( + download_range[0], + download_range[1] - 1, + check_content_md5=self.validate_content) + + try: + _, response = self.blob_service.download( + timeout=self.timeout, + range=range_header, + range_get_content_md5=range_validation, + lease_access_conditions=self.access_conditions, + modified_access_conditions=self.mod_conditions, + validate_content=self.validate_content, + data_stream_total=self.download_size, + download_stream_current=self.progress_total, + **self.request_options) + except HttpResponseError as error: + process_storage_error(error) + + chunk_data = process_content( + response, + offset[0], + offset[1], + self.require_encryption, + self.key_encryption_key, + self.key_resolver_function) + + # This makes sure that if_match is set so that we can validate + # that subsequent downloads are to an unmodified blob + if not self.mod_conditions: + self.mod_conditions = ModifiedAccessConditions() + self.mod_conditions.if_match = response.properties.etag + return chunk_data + + +class ParallelBlobChunkDownloader(_BlobChunkDownloader): + def __init__( + self, blob_service, download_size, chunk_size, progress, start_range, end_range, + stream, validate_content, access_conditions, mod_conditions, timeout, + require_encryption, key_encryption_key, key_resolver_function, **kwargs): + + super(ParallelBlobChunkDownloader, self).__init__( + blob_service, download_size, chunk_size, progress, start_range, end_range, + stream, validate_content, access_conditions, mod_conditions, timeout, + require_encryption, key_encryption_key, key_resolver_function, **kwargs) + + # for a parallel download, the stream is always seekable, so we note down the current position + # in order to seek to the right place when out-of-order chunks come in + self.stream_start = stream.tell() + + # since parallel operations are going on + # it is essential to protect the writing and progress reporting operations + self.stream_lock = threading.Lock() + self.progress_lock = threading.Lock() + + def _update_progress(self, length): + with self.progress_lock: + self.progress_total += length + + def _write_to_stream(self, chunk_data, chunk_start): + with self.stream_lock: + self.stream.seek(self.stream_start + (chunk_start - self.start_index)) + self.stream.write(chunk_data) + + +class SequentialBlobChunkDownloader(_BlobChunkDownloader): + + def _update_progress(self, length): + self.progress_total += length + + def _write_to_stream(self, chunk_data, chunk_start): + # chunk_start is ignored in the case of sequential download since we cannot seek the destination stream + self.stream.write(chunk_data) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/encryption.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/encryption.py new file mode 100644 index 000000000000..222e213da627 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/encryption.py @@ -0,0 +1,551 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import os +from os import urandom +from json import ( + dumps, + loads, +) +from collections import OrderedDict + +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.ciphers import Cipher +from cryptography.hazmat.primitives.ciphers.algorithms import AES +from cryptography.hazmat.primitives.ciphers.modes import CBC +from cryptography.hazmat.primitives.padding import PKCS7 + +from azure.core.exceptions import HttpResponseError + +from ..version import VERSION +from .authentication import _encode_base64, _decode_base64_to_bytes + + +_ENCRYPTION_PROTOCOL_V1 = '1.0' +_ERROR_VALUE_NONE = '{0} should not be None.' +_ERROR_OBJECT_INVALID = \ + '{0} does not define a complete interface. Value of {1} is either missing or invalid.' +_ERROR_DATA_NOT_ENCRYPTED = 'Encryption required, but received data does not contain appropriate metatadata.' + \ + 'Data was either not encrypted or metadata has been lost.' +_ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM = \ + 'Specified encryption algorithm is not supported.' + + +def _validate_not_none(param_name, param): + if param is None: + raise ValueError(_ERROR_VALUE_NONE.format(param_name)) + + +def _validate_key_encryption_key_wrap(kek): + # Note that None is not callable and so will fail the second clause of each check. + if not hasattr(kek, 'wrap_key') or not callable(kek.wrap_key): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'wrap_key')) + if not hasattr(kek, 'get_kid') or not callable(kek.get_kid): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'get_kid')) + if not hasattr(kek, 'get_key_wrap_algorithm') or not callable(kek.get_key_wrap_algorithm): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'get_key_wrap_algorithm')) + + +class _EncryptionAlgorithm(object): + ''' + Specifies which client encryption algorithm is used. + ''' + AES_CBC_256 = 'AES_CBC_256' + + +class _WrappedContentKey: + ''' + Represents the envelope key details stored on the service. + ''' + + def __init__(self, algorithm, encrypted_key, key_id): + ''' + :param str algorithm: + The algorithm used for wrapping. + :param bytes encrypted_key: + The encrypted content-encryption-key. + :param str key_id: + The key-encryption-key identifier string. + ''' + + _validate_not_none('algorithm', algorithm) + _validate_not_none('encrypted_key', encrypted_key) + _validate_not_none('key_id', key_id) + + self.algorithm = algorithm + self.encrypted_key = encrypted_key + self.key_id = key_id + + +class _EncryptionAgent: + ''' + Represents the encryption agent stored on the service. + It consists of the encryption protocol version and encryption algorithm used. + ''' + + def __init__(self, encryption_algorithm, protocol): + ''' + :param _EncryptionAlgorithm encryption_algorithm: + The algorithm used for encrypting the message contents. + :param str protocol: + The protocol version used for encryption. + ''' + + _validate_not_none('encryption_algorithm', encryption_algorithm) + _validate_not_none('protocol', protocol) + + self.encryption_algorithm = str(encryption_algorithm) + self.protocol = protocol + + +class _EncryptionData: + ''' + Represents the encryption data that is stored on the service. + ''' + + def __init__(self, content_encryption_IV, encryption_agent, wrapped_content_key, + key_wrapping_metadata): + ''' + :param bytes content_encryption_IV: + The content encryption initialization vector. + :param _EncryptionAgent encryption_agent: + The encryption agent. + :param _WrappedContentKey wrapped_content_key: + An object that stores the wrapping algorithm, the key identifier, + and the encrypted key bytes. + :param dict key_wrapping_metadata: + A dict containing metadata related to the key wrapping. + ''' + + _validate_not_none('content_encryption_IV', content_encryption_IV) + _validate_not_none('encryption_agent', encryption_agent) + _validate_not_none('wrapped_content_key', wrapped_content_key) + + self.content_encryption_IV = content_encryption_IV + self.encryption_agent = encryption_agent + self.wrapped_content_key = wrapped_content_key + self.key_wrapping_metadata = key_wrapping_metadata + + +def _generate_encryption_data_dict(kek, cek, iv): + ''' + Generates and returns the encryption metadata as a dict. + + :param object kek: The key encryption key. See calling functions for more information. + :param bytes cek: The content encryption key. + :param bytes iv: The initialization vector. + :return: A dict containing all the encryption metadata. + :rtype: dict + ''' + # Encrypt the cek. + wrapped_cek = kek.wrap_key(cek) + + # Build the encryption_data dict. + # Use OrderedDict to comply with Java's ordering requirement. + wrapped_content_key = OrderedDict() + wrapped_content_key['KeyId'] = kek.get_kid() + wrapped_content_key['EncryptedKey'] = _encode_base64(wrapped_cek) + wrapped_content_key['Algorithm'] = kek.get_key_wrap_algorithm() + + encryption_agent = OrderedDict() + encryption_agent['Protocol'] = _ENCRYPTION_PROTOCOL_V1 + encryption_agent['EncryptionAlgorithm'] = _EncryptionAlgorithm.AES_CBC_256 + + encryption_data_dict = OrderedDict() + encryption_data_dict['WrappedContentKey'] = wrapped_content_key + encryption_data_dict['EncryptionAgent'] = encryption_agent + encryption_data_dict['ContentEncryptionIV'] = _encode_base64(iv) + encryption_data_dict['KeyWrappingMetadata'] = {'EncryptionLibrary': 'Python ' + VERSION} + + return encryption_data_dict + + +def _dict_to_encryption_data(encryption_data_dict): + ''' + Converts the specified dictionary to an EncryptionData object for + eventual use in decryption. + + :param dict encryption_data_dict: + The dictionary containing the encryption data. + :return: an _EncryptionData object built from the dictionary. + :rtype: _EncryptionData + ''' + try: + if encryption_data_dict['EncryptionAgent']['Protocol'] != _ENCRYPTION_PROTOCOL_V1: + raise ValueError("Unsupported encryption version.") + except KeyError: + raise ValueError("Unsupported encryption version.") + wrapped_content_key = encryption_data_dict['WrappedContentKey'] + wrapped_content_key = _WrappedContentKey(wrapped_content_key['Algorithm'], + _decode_base64_to_bytes(wrapped_content_key['EncryptedKey']), + wrapped_content_key['KeyId']) + + encryption_agent = encryption_data_dict['EncryptionAgent'] + encryption_agent = _EncryptionAgent(encryption_agent['EncryptionAlgorithm'], + encryption_agent['Protocol']) + + if 'KeyWrappingMetadata' in encryption_data_dict: + key_wrapping_metadata = encryption_data_dict['KeyWrappingMetadata'] + else: + key_wrapping_metadata = None + + encryption_data = _EncryptionData(_decode_base64_to_bytes(encryption_data_dict['ContentEncryptionIV']), + encryption_agent, + wrapped_content_key, + key_wrapping_metadata) + + return encryption_data + + +def _generate_AES_CBC_cipher(cek, iv): + ''' + Generates and returns an encryption cipher for AES CBC using the given cek and iv. + + :param bytes[] cek: The content encryption key for the cipher. + :param bytes[] iv: The initialization vector for the cipher. + :return: A cipher for encrypting in AES256 CBC. + :rtype: ~cryptography.hazmat.primitives.ciphers.Cipher + ''' + + backend = default_backend() + algorithm = AES(cek) + mode = CBC(iv) + return Cipher(algorithm, mode, backend) + + +def _validate_and_unwrap_cek(encryption_data, key_encryption_key=None, key_resolver=None): + ''' + Extracts and returns the content_encryption_key stored in the encryption_data object + and performs necessary validation on all parameters. + :param _EncryptionData encryption_data: + The encryption metadata of the retrieved value. + :param obj key_encryption_key: + The key_encryption_key used to unwrap the cek. Please refer to high-level service object + instance variables for more details. + :param func key_resolver: + A function used that, given a key_id, will return a key_encryption_key. Please refer + to high-level service object instance variables for more details. + :return: the content_encryption_key stored in the encryption_data object. + :rtype: bytes[] + ''' + + _validate_not_none('content_encryption_IV', encryption_data.content_encryption_IV) + _validate_not_none('encrypted_key', encryption_data.wrapped_content_key.encrypted_key) + + if _ENCRYPTION_PROTOCOL_V1 != encryption_data.encryption_agent.protocol: + raise ValueError('Encryption version is not supported.') + + content_encryption_key = None + + # If the resolver exists, give priority to the key it finds. + if key_resolver is not None: + key_encryption_key = key_resolver(encryption_data.wrapped_content_key.key_id) + + _validate_not_none('key_encryption_key', key_encryption_key) + if not hasattr(key_encryption_key, 'get_kid') or not callable(key_encryption_key.get_kid): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'get_kid')) + if not hasattr(key_encryption_key, 'unwrap_key') or not callable(key_encryption_key.unwrap_key): + raise AttributeError(_ERROR_OBJECT_INVALID.format('key encryption key', 'unwrap_key')) + if encryption_data.wrapped_content_key.key_id != key_encryption_key.get_kid(): + raise ValueError('Provided or resolved key-encryption-key does not match the id of key used to encrypt.') + # Will throw an exception if the specified algorithm is not supported. + content_encryption_key = key_encryption_key.unwrap_key(encryption_data.wrapped_content_key.encrypted_key, + encryption_data.wrapped_content_key.algorithm) + _validate_not_none('content_encryption_key', content_encryption_key) + + return content_encryption_key + + +def _encrypt_blob(blob, key_encryption_key): + ''' + Encrypts the given blob using AES256 in CBC mode with 128 bit padding. + Wraps the generated content-encryption-key using the user-provided key-encryption-key (kek). + Returns a json-formatted string containing the encryption metadata. This method should + only be used when a blob is small enough for single shot upload. Encrypting larger blobs + is done as a part of the upload_blob_chunks method. + + :param bytes blob: + The blob to be encrypted. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + wrap_key(key)--wraps the specified key using an algorithm of the user's choice. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + :return: A tuple of json-formatted string containing the encryption metadata and the encrypted blob data. + :rtype: (str, bytes) + ''' + + _validate_not_none('blob', blob) + _validate_not_none('key_encryption_key', key_encryption_key) + _validate_key_encryption_key_wrap(key_encryption_key) + + # AES256 uses 256 bit (32 byte) keys and always with 16 byte blocks + content_encryption_key = urandom(32) + initialization_vector = urandom(16) + + cipher = _generate_AES_CBC_cipher(content_encryption_key, initialization_vector) + + # PKCS7 with 16 byte blocks ensures compatibility with AES. + padder = PKCS7(128).padder() + padded_data = padder.update(blob) + padder.finalize() + + # Encrypt the data. + encryptor = cipher.encryptor() + encrypted_data = encryptor.update(padded_data) + encryptor.finalize() + encryption_data = _generate_encryption_data_dict(key_encryption_key, content_encryption_key, + initialization_vector) + encryption_data['EncryptionMode'] = 'FullBlob' + + return dumps(encryption_data), encrypted_data + + +def _generate_blob_encryption_data(key_encryption_key): + ''' + Generates the encryption_metadata for the blob. + + :param bytes key_encryption_key: + The key-encryption-key used to wrap the cek associate with this blob. + :return: A tuple containing the cek and iv for this blob as well as the + serialized encryption metadata for the blob. + :rtype: (bytes, bytes, str) + ''' + encryption_data = None + content_encryption_key = None + initialization_vector = None + if key_encryption_key: + _validate_key_encryption_key_wrap(key_encryption_key) + content_encryption_key = urandom(32) + initialization_vector = urandom(16) + encryption_data = _generate_encryption_data_dict(key_encryption_key, + content_encryption_key, + initialization_vector) + encryption_data['EncryptionMode'] = 'FullBlob' + encryption_data = dumps(encryption_data) + + return content_encryption_key, initialization_vector, encryption_data + + +def _decrypt_blob(require_encryption, key_encryption_key, key_resolver, + response, start_offset, end_offset): + ''' + Decrypts the given blob contents and returns only the requested range. + + :param bool require_encryption: + Whether or not the calling blob service requires objects to be decrypted. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + wrap_key(key)--wraps the specified key using an algorithm of the user's choice. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + :param key_resolver(kid): + The user-provided key resolver. Uses the kid string to return a key-encryption-key + implementing the interface defined above. + :return: The decrypted blob content. + :rtype: bytes + ''' + if response is None: + raise ValueError("Response cannot be None.") + content = b"".join(list(response)) + if not content: + return content + + try: + encryption_data = _dict_to_encryption_data(loads(response.response.headers['x-ms-meta-encryptiondata'])) + except: # pylint: disable=bare-except + if require_encryption: + raise ValueError(_ERROR_DATA_NOT_ENCRYPTED) + + return content + + if encryption_data.encryption_agent.encryption_algorithm != _EncryptionAlgorithm.AES_CBC_256: + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM) + + blob_type = response.response.headers['x-ms-blob-type'] + + iv = None + unpad = False + if 'content-range' in response.response.headers: + content_range = response.response.headers['content-range'] + # Format: 'bytes x-y/size' + + # Ignore the word 'bytes' + content_range = content_range.split(' ') + + content_range = content_range[1].split('-') + content_range = content_range[1].split('/') + end_range = int(content_range[0]) + blob_size = int(content_range[1]) + + if start_offset >= 16: + iv = content[:16] + content = content[16:] + start_offset -= 16 + else: + iv = encryption_data.content_encryption_IV + + if end_range == blob_size - 1: + unpad = True + else: + unpad = True + iv = encryption_data.content_encryption_IV + + if blob_type == 'PageBlob': + unpad = False + + content_encryption_key = _validate_and_unwrap_cek(encryption_data, key_encryption_key, key_resolver) + cipher = _generate_AES_CBC_cipher(content_encryption_key, iv) + decryptor = cipher.decryptor() + + content = decryptor.update(content) + decryptor.finalize() + if unpad: + unpadder = PKCS7(128).unpadder() + content = unpadder.update(content) + unpadder.finalize() + + return content[start_offset: len(content) - end_offset] + + +def _get_blob_encryptor_and_padder(cek, iv, should_pad): + encryptor = None + padder = None + + if cek is not None and iv is not None: + cipher = _generate_AES_CBC_cipher(cek, iv) + encryptor = cipher.encryptor() + padder = PKCS7(128).padder() if should_pad else None + + return encryptor, padder + + +def _encrypt_queue_message(message, key_encryption_key): + ''' + Encrypts the given plain text message using AES256 in CBC mode with 128 bit padding. + Wraps the generated content-encryption-key using the user-provided key-encryption-key (kek). + Returns a json-formatted string containing the encrypted message and the encryption metadata. + + :param object message: + The plain text messge to be encrypted. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + wrap_key(key)--wraps the specified key using an algorithm of the user's choice. + get_key_wrap_algorithm()--returns the algorithm used to wrap the specified symmetric key. + get_kid()--returns a string key id for this key-encryption-key. + :return: A json-formatted string containing the encrypted message and the encryption metadata. + :rtype: str + ''' + + _validate_not_none('message', message) + _validate_not_none('key_encryption_key', key_encryption_key) + _validate_key_encryption_key_wrap(key_encryption_key) + + # AES256 uses 256 bit (32 byte) keys and always with 16 byte blocks + content_encryption_key = os.urandom(32) + initialization_vector = os.urandom(16) + + # Queue encoding functions all return unicode strings, and encryption should + # operate on binary strings. + message = message.encode('utf-8') + + cipher = _generate_AES_CBC_cipher(content_encryption_key, initialization_vector) + + # PKCS7 with 16 byte blocks ensures compatibility with AES. + padder = PKCS7(128).padder() + padded_data = padder.update(message) + padder.finalize() + + # Encrypt the data. + encryptor = cipher.encryptor() + encrypted_data = encryptor.update(padded_data) + encryptor.finalize() + + # Build the dictionary structure. + queue_message = {'EncryptedMessageContents': _encode_base64(encrypted_data), + 'EncryptionData': _generate_encryption_data_dict(key_encryption_key, + content_encryption_key, + initialization_vector)} + + return dumps(queue_message) + + +def _decrypt_queue_message(message, response, require_encryption, key_encryption_key, resolver): + ''' + Returns the decrypted message contents from an EncryptedQueueMessage. + If no encryption metadata is present, will return the unaltered message. + :param str message: + The JSON formatted QueueEncryptedMessage contents with all associated metadata. + :param bool require_encryption: + If set, will enforce that the retrieved messages are encrypted and decrypt them. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + unwrap_key(key, algorithm) + - returns the unwrapped form of the specified symmetric key usingthe string-specified algorithm. + get_kid() + - returns a string key id for this key-encryption-key. + :param function resolver(kid): + The user-provided key resolver. Uses the kid string to return a key-encryption-key + implementing the interface defined above. + :return: The plain text message from the queue message. + :rtype: str + ''' + + try: + message = loads(message) + + encryption_data = _dict_to_encryption_data(message['EncryptionData']) + decoded_data = _decode_base64_to_bytes(message['EncryptedMessageContents']) + except (KeyError, ValueError): + # Message was not json formatted and so was not encrypted + # or the user provided a json formatted message. + if require_encryption: + raise ValueError('Message was not encrypted.') + + return message + try: + return _decrypt(decoded_data, encryption_data, key_encryption_key, resolver).decode('utf-8') + except Exception as error: + raise HttpResponseError( + message="Decryption failed.", + response=response, + error=error) + + +def _decrypt(message, encryption_data, key_encryption_key=None, resolver=None): + ''' + Decrypts the given ciphertext using AES256 in CBC mode with 128 bit padding. + Unwraps the content-encryption-key using the user-provided or resolved key-encryption-key (kek). + Returns the original plaintex. + + :param str message: + The ciphertext to be decrypted. + :param _EncryptionData encryption_data: + The metadata associated with this ciphertext. + :param object key_encryption_key: + The user-provided key-encryption-key. Must implement the following methods: + unwrap_key(key, algorithm) + - returns the unwrapped form of the specified symmetric key using the string-specified algorithm. + get_kid() + - returns a string key id for this key-encryption-key. + :param function resolver(kid): + The user-provided key resolver. Uses the kid string to return a key-encryption-key + implementing the interface defined above. + :return: The decrypted plaintext. + :rtype: str + ''' + _validate_not_none('message', message) + content_encryption_key = _validate_and_unwrap_cek(encryption_data, key_encryption_key, resolver) + + if _EncryptionAlgorithm.AES_CBC_256 != encryption_data.encryption_agent.encryption_algorithm: + raise ValueError(_ERROR_UNSUPPORTED_ENCRYPTION_ALGORITHM) + + cipher = _generate_AES_CBC_cipher(content_encryption_key, encryption_data.content_encryption_IV) + + # decrypt data + decrypted_data = message + decryptor = cipher.decryptor() + decrypted_data = (decryptor.update(decrypted_data) + decryptor.finalize()) + + # unpad data + unpadder = PKCS7(128).unpadder() + decrypted_data = (unpadder.update(decrypted_data) + unpadder.finalize()) + + return decrypted_data diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/models.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/models.py new file mode 100644 index 000000000000..dbad2a1c58c8 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/models.py @@ -0,0 +1,426 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from enum import Enum + + +def get_enum_value(value): + if value is None or value in ["None", ""]: + return None + try: + return value.value + except AttributeError: + return value + + +class StorageErrorCode(str, Enum): + + # Generic storage values + account_already_exists = "AccountAlreadyExists" + account_being_created = "AccountBeingCreated" + account_is_disabled = "AccountIsDisabled" + authentication_failed = "AuthenticationFailed" + authorization_failure = "AuthorizationFailure" + condition_headers_not_supported = "ConditionHeadersNotSupported" + condition_not_met = "ConditionNotMet" + empty_metadata_key = "EmptyMetadataKey" + insufficient_account_permissions = "InsufficientAccountPermissions" + internal_error = "InternalError" + invalid_authentication_info = "InvalidAuthenticationInfo" + invalid_header_value = "InvalidHeaderValue" + invalid_http_verb = "InvalidHttpVerb" + invalid_input = "InvalidInput" + invalid_md5 = "InvalidMd5" + invalid_metadata = "InvalidMetadata" + invalid_query_parameter_value = "InvalidQueryParameterValue" + invalid_range = "InvalidRange" + invalid_resource_name = "InvalidResourceName" + invalid_uri = "InvalidUri" + invalid_xml_document = "InvalidXmlDocument" + invalid_xml_node_value = "InvalidXmlNodeValue" + md5_mismatch = "Md5Mismatch" + metadata_too_large = "MetadataTooLarge" + missing_content_length_header = "MissingContentLengthHeader" + missing_required_query_parameter = "MissingRequiredQueryParameter" + missing_required_header = "MissingRequiredHeader" + missing_required_xml_node = "MissingRequiredXmlNode" + multiple_condition_headers_not_supported = "MultipleConditionHeadersNotSupported" + operation_timed_out = "OperationTimedOut" + out_of_range_input = "OutOfRangeInput" + out_of_range_query_parameter_value = "OutOfRangeQueryParameterValue" + request_body_too_large = "RequestBodyTooLarge" + resource_type_mismatch = "ResourceTypeMismatch" + request_url_failed_to_parse = "RequestUrlFailedToParse" + resource_already_exists = "ResourceAlreadyExists" + resource_not_found = "ResourceNotFound" + server_busy = "ServerBusy" + unsupported_header = "UnsupportedHeader" + unsupported_xml_node = "UnsupportedXmlNode" + unsupported_query_parameter = "UnsupportedQueryParameter" + unsupported_http_verb = "UnsupportedHttpVerb" + + # Blob values + append_position_condition_not_met = "AppendPositionConditionNotMet" + blob_already_exists = "BlobAlreadyExists" + blob_not_found = "BlobNotFound" + blob_overwritten = "BlobOverwritten" + blob_tier_inadequate_for_content_length = "BlobTierInadequateForContentLength" + block_count_exceeds_limit = "BlockCountExceedsLimit" + block_list_too_long = "BlockListTooLong" + cannot_change_to_lower_tier = "CannotChangeToLowerTier" + cannot_verify_copy_source = "CannotVerifyCopySource" + container_already_exists = "ContainerAlreadyExists" + container_being_deleted = "ContainerBeingDeleted" + container_disabled = "ContainerDisabled" + container_not_found = "ContainerNotFound" + content_length_larger_than_tier_limit = "ContentLengthLargerThanTierLimit" + copy_across_accounts_not_supported = "CopyAcrossAccountsNotSupported" + copy_id_mismatch = "CopyIdMismatch" + feature_version_mismatch = "FeatureVersionMismatch" + incremental_copy_blob_mismatch = "IncrementalCopyBlobMismatch" + incremental_copy_of_eralier_version_snapshot_not_allowed = "IncrementalCopyOfEralierVersionSnapshotNotAllowed" + incremental_copy_source_must_be_snapshot = "IncrementalCopySourceMustBeSnapshot" + infinite_lease_duration_required = "InfiniteLeaseDurationRequired" + invalid_blob_or_block = "InvalidBlobOrBlock" + invalid_blob_tier = "InvalidBlobTier" + invalid_blob_type = "InvalidBlobType" + invalid_block_id = "InvalidBlockId" + invalid_block_list = "InvalidBlockList" + invalid_operation = "InvalidOperation" + invalid_page_range = "InvalidPageRange" + invalid_source_blob_type = "InvalidSourceBlobType" + invalid_source_blob_url = "InvalidSourceBlobUrl" + invalid_version_for_page_blob_operation = "InvalidVersionForPageBlobOperation" + lease_already_present = "LeaseAlreadyPresent" + lease_already_broken = "LeaseAlreadyBroken" + lease_id_mismatch_with_blob_operation = "LeaseIdMismatchWithBlobOperation" + lease_id_mismatch_with_container_operation = "LeaseIdMismatchWithContainerOperation" + lease_id_mismatch_with_lease_operation = "LeaseIdMismatchWithLeaseOperation" + lease_id_missing = "LeaseIdMissing" + lease_is_breaking_and_cannot_be_acquired = "LeaseIsBreakingAndCannotBeAcquired" + lease_is_breaking_and_cannot_be_changed = "LeaseIsBreakingAndCannotBeChanged" + lease_is_broken_and_cannot_be_renewed = "LeaseIsBrokenAndCannotBeRenewed" + lease_lost = "LeaseLost" + lease_not_present_with_blob_operation = "LeaseNotPresentWithBlobOperation" + lease_not_present_with_container_operation = "LeaseNotPresentWithContainerOperation" + lease_not_present_with_lease_operation = "LeaseNotPresentWithLeaseOperation" + max_blob_size_condition_not_met = "MaxBlobSizeConditionNotMet" + no_pending_copy_operation = "NoPendingCopyOperation" + operation_not_allowed_on_incremental_copy_blob = "OperationNotAllowedOnIncrementalCopyBlob" + pending_copy_operation = "PendingCopyOperation" + previous_snapshot_cannot_be_newer = "PreviousSnapshotCannotBeNewer" + previous_snapshot_not_found = "PreviousSnapshotNotFound" + previous_snapshot_operation_not_supported = "PreviousSnapshotOperationNotSupported" + sequence_number_condition_not_met = "SequenceNumberConditionNotMet" + sequence_number_increment_too_large = "SequenceNumberIncrementTooLarge" + snapshot_count_exceeded = "SnapshotCountExceeded" + snaphot_operation_rate_exceeded = "SnaphotOperationRateExceeded" + snapshots_present = "SnapshotsPresent" + source_condition_not_met = "SourceConditionNotMet" + system_in_use = "SystemInUse" + target_condition_not_met = "TargetConditionNotMet" + unauthorized_blob_overwrite = "UnauthorizedBlobOverwrite" + blob_being_rehydrated = "BlobBeingRehydrated" + blob_archived = "BlobArchived" + blob_not_archived = "BlobNotArchived" + + # Queue values + invalid_marker = "InvalidMarker" + message_not_found = "MessageNotFound" + message_too_large = "MessageTooLarge" + pop_receipt_mismatch = "PopReceiptMismatch" + queue_already_exists = "QueueAlreadyExists" + queue_being_deleted = "QueueBeingDeleted" + queue_disabled = "QueueDisabled" + queue_not_empty = "QueueNotEmpty" + queue_not_found = "QueueNotFound" + + +class DictMixin(object): + + def __setitem__(self, key, item): + self.__dict__[key] = item + + def __getitem__(self, key): + return self.__dict__[key] + + def __repr__(self): + return str(self) + + def __len__(self): + return len(self.keys()) + + def __delitem__(self, key): + self.__dict__[key] = None + + def __eq__(self, other): + """Compare objects by comparing all attributes.""" + if isinstance(other, self.__class__): + return self.__dict__ == other.__dict__ + return False + + def __ne__(self, other): + """Compare objects by comparing all attributes.""" + return not self.__eq__(other) + + def __str__(self): + return str({k: v for k, v in self.__dict__.items() if not k.startswith('_')}) + + def has_key(self, k): + return k in self.__dict__ + + def update(self, *args, **kwargs): + return self.__dict__.update(*args, **kwargs) + + def keys(self): + return [k for k in self.__dict__ if not k.startswith('_')] + + def values(self): + return [v for k, v in self.__dict__.items() if not k.startswith('_')] + + def items(self): + return [(k, v) for k, v in self.__dict__.items() if not k.startswith('_')] + + def get(self, key, default=None): + if key in self.__dict__: + return self.__dict__[key] + return default + + +class ModifiedAccessConditions(object): + """Additional parameters for a set of operations. + + :param if_modified_since: Specify this header value to operate only on a + blob if it has been modified since the specified date/time. + :type if_modified_since: datetime + :param if_unmodified_since: Specify this header value to operate only on a + blob if it has not been modified since the specified date/time. + :type if_unmodified_since: datetime + :param if_match: Specify an ETag value to operate only on blobs with a + matching value. + :type if_match: str + :param if_none_match: Specify an ETag value to operate only on blobs + without a matching value. + :type if_none_match: str + """ + + def __init__(self, **kwargs): + self.if_modified_since = kwargs.get('if_modified_since', None) + self.if_unmodified_since = kwargs.get('if_unmodified_since', None) + self.if_match = kwargs.get('if_match', None) + self.if_none_match = kwargs.get('if_none_match', None) + + +class LocationMode(object): + """ + Specifies the location the request should be sent to. This mode only applies + for RA-GRS accounts which allow secondary read access. All other account types + must use PRIMARY. + """ + + PRIMARY = 'primary' #: Requests should be sent to the primary location. + SECONDARY = 'secondary' #: Requests should be sent to the secondary location, if possible. + + +class ResourceTypes(object): + """ + Specifies the resource types that are accessible with the account SAS. + + :cvar ResourceTypes ResourceTypes.CONTAINER: + Access to container-level APIs (e.g., Create/Delete Container, + Create/Delete Queue, Create/Delete Share, + List Blobs/Files and Directories) + :cvar ResourceTypes ResourceTypes.OBJECT: + Access to object-level APIs for blobs, queue messages, and + files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.) + :cvar ResourceTypes ResourceTypes.SERVICE: + Access to service-level APIs (e.g., Get/Set Service Properties, + Get Service Stats, List Containers/Queues/Shares) + :param bool service: + Access to service-level APIs (e.g., Get/Set Service Properties, + Get Service Stats, List Containers/Queues/Shares) + :param bool container: + Access to container-level APIs (e.g., Create/Delete Container, + Create/Delete Queue, Create/Delete Share, + List Blobs/Files and Directories) + :param bool object: + Access to object-level APIs for blobs, queue messages, and + files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.) + :param str _str: + A string representing the resource types. + """ + + SERVICE = None # type: ResourceTypes + CONTAINER = None # type: ResourceTypes + OBJECT = None # type: ResourceTypes + + def __init__(self, service=False, container=False, object=False, _str=None): # pylint: disable=redefined-builtin + if not _str: + _str = '' + self.service = service or ('s' in _str) + self.container = container or ('c' in _str) + self.object = object or ('o' in _str) + + def __or__(self, other): + return ResourceTypes(_str=str(self) + str(other)) + + def __add__(self, other): + return ResourceTypes(_str=str(self) + str(other)) + + def __str__(self): + return (('s' if self.service else '') + + ('c' if self.container else '') + + ('o' if self.object else '')) + + +ResourceTypes.SERVICE = ResourceTypes(service=True) +ResourceTypes.CONTAINER = ResourceTypes(container=True) +ResourceTypes.OBJECT = ResourceTypes(object=True) + + +class AccountPermissions(object): + """ + :class:`~ResourceTypes` class to be used with generate_shared_access_signature + method and for the AccessPolicies used with set_*_acl. There are two types of + SAS which may be used to grant resource access. One is to grant access to a + specific resource (resource-specific). Another is to grant access to the + entire service for a specific account and allow certain operations based on + perms found here. + + :cvar AccountPermissions AccountPermissions.ADD: + Valid for the following Object resource types only: queue messages and append blobs. + :cvar AccountPermissions AccountPermissions.CREATE: + Valid for the following Object resource types only: blobs and files. Users + can create new blobs or files, but may not overwrite existing blobs or files. + :cvar AccountPermissions AccountPermissions.DELETE: + Valid for Container and Object resource types, except for queue messages. + :cvar AccountPermissions AccountPermissions.LIST: + Valid for Service and Container resource types only. + :cvar AccountPermissions AccountPermissions.PROCESS: + Valid for the following Object resource type only: queue messages. + :cvar AccountPermissions AccountPermissions.READ: + Valid for all signed resources types (Service, Container, and Object). + Permits read permissions to the specified resource type. + :cvar AccountPermissions AccountPermissions.UPDATE: + Valid for the following Object resource types only: queue messages. + :cvar AccountPermissions AccountPermissions.WRITE: + Valid for all signed resources types (Service, Container, and Object). + Permits write permissions to the specified resource type. + :param bool read: + Valid for all signed resources types (Service, Container, and Object). + Permits read permissions to the specified resource type. + :param bool write: + Valid for all signed resources types (Service, Container, and Object). + Permits write permissions to the specified resource type. + :param bool delete: + Valid for Container and Object resource types, except for queue messages. + :param bool list: + Valid for Service and Container resource types only. + :param bool add: + Valid for the following Object resource types only: queue messages, and append blobs. + :param bool create: + Valid for the following Object resource types only: blobs and files. + Users can create new blobs or files, but may not overwrite existing + blobs or files. + :param bool update: + Valid for the following Object resource types only: queue messages. + :param bool process: + Valid for the following Object resource type only: queue messages. + :param str _str: + A string representing the permissions. + """ + + READ = None # type: AccountPermissions + WRITE = None # type: AccountPermissions + DELETE = None # type: AccountPermissions + LIST = None # type: AccountPermissions + ADD = None # type: AccountPermissions + CREATE = None # type: AccountPermissions + UPDATE = None # type: AccountPermissions + PROCESS = None # type: AccountPermissions + + def __init__(self, read=False, write=False, delete=False, list=False, # pylint: disable=redefined-builtin + add=False, create=False, update=False, process=False, _str=None): + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.write = write or ('w' in _str) + self.delete = delete or ('d' in _str) + self.list = list or ('l' in _str) + self.add = add or ('a' in _str) + self.create = create or ('c' in _str) + self.update = update or ('u' in _str) + self.process = process or ('p' in _str) + + def __or__(self, other): + return AccountPermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return AccountPermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('w' if self.write else '') + + ('d' if self.delete else '') + + ('l' if self.list else '') + + ('a' if self.add else '') + + ('c' if self.create else '') + + ('u' if self.update else '') + + ('p' if self.process else '')) + + +AccountPermissions.READ = AccountPermissions(read=True) +AccountPermissions.WRITE = AccountPermissions(write=True) +AccountPermissions.DELETE = AccountPermissions(delete=True) +AccountPermissions.LIST = AccountPermissions(list=True) +AccountPermissions.ADD = AccountPermissions(add=True) +AccountPermissions.CREATE = AccountPermissions(create=True) +AccountPermissions.UPDATE = AccountPermissions(update=True) +AccountPermissions.PROCESS = AccountPermissions(process=True) + + +class Services(object): + """Specifies the services accessible with the account SAS. + + :cvar Services Services.BLOB: The blob service. + :cvar Services Services.FILE: The file service + :cvar Services Services.QUEUE: The queue service. + :param bool blob: + Access for the `~azure.storage.blob.blob_service_client.BlobServiceClient` + :param bool queue: + Access for the `~azure.storage.queue.queue_service_client.QueueServiceClient` + :param bool file: + Access for the `~azure.storage.file.file_service_client.FileServiceClient` + :param str _str: + A string representing the services. + """ + + BLOB = None # type: Services + QUEUE = None # type: Services + FILE = None # type: Services + + def __init__(self, blob=False, queue=False, file=False, _str=None): + if not _str: + _str = '' + self.blob = blob or ('b' in _str) + self.queue = queue or ('q' in _str) + self.file = file or ('f' in _str) + + def __or__(self, other): + return Services(_str=str(self) + str(other)) + + def __add__(self, other): + return Services(_str=str(self) + str(other)) + + def __str__(self): + return (('b' if self.blob else '') + + ('q' if self.queue else '') + + ('f' if self.file else '')) + + +Services.BLOB = Services(blob=True) +Services.QUEUE = Services(queue=True) +Services.FILE = Services(file=True) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/policies.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/policies.py new file mode 100644 index 000000000000..f7736256bc4b --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/policies.py @@ -0,0 +1,638 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import base64 +import hashlib +import re +import random +from time import time +from io import SEEK_SET, UnsupportedOperation +import logging +import uuid +import types +import platform +from typing import Any, TYPE_CHECKING +from wsgiref.handlers import format_date_time +try: + from urllib.parse import ( + urlparse, + parse_qsl, + urlunparse, + urlencode, + ) +except ImportError: + from urllib import urlencode # type: ignore + from urlparse import ( # type: ignore + urlparse, + parse_qsl, + urlunparse, + ) + +from azure.core.pipeline.policies import ( + HeadersPolicy, + SansIOHTTPPolicy, + NetworkTraceLoggingPolicy, + HTTPPolicy) +from azure.core.pipeline.policies.base import RequestHistory +from azure.core.exceptions import AzureError, ServiceRequestError, ServiceResponseError + +from ..version import VERSION +from .models import LocationMode + +try: + _unicode_type = unicode # type: ignore +except NameError: + _unicode_type = str + + +_LOGGER = logging.getLogger(__name__) +if TYPE_CHECKING: + from azure.core.pipeline import PipelineRequest, PipelineResponse + +def encode_base64(data): + if isinstance(data, _unicode_type): + data = data.encode('utf-8') + encoded = base64.b64encode(data) + return encoded.decode('utf-8') + + +def is_retry(response, mode): + """Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + status = response.http_response.status_code + if 300 <= status < 500: + # An exception occured, but in most cases it was expected. Examples could + # include a 309 Conflict or 412 Precondition Failed. + if status == 404 and mode == LocationMode.SECONDARY: + # Response code 404 should be retried if secondary was used. + return True + if status == 408: + # Response code 408 is a timeout and should be retried. + return True + return False + if status >= 500: + # Response codes above 500 with the exception of 501 Not Implemented and + # 505 Version Not Supported indicate a server issue and should be retried. + if status in [501, 505]: + return False + return True + return False + + +def urljoin(base_url, stub_url): + parsed = urlparse(base_url) + parsed = parsed._replace(path=parsed.path + '/' + stub_url) + return parsed.geturl() + + +class QueueMessagePolicy(SansIOHTTPPolicy): + + def on_request(self, request, **kwargs): + message_id = request.context.options.pop('queue_message_id', None) + if message_id: + request.http_request.url = urljoin( + request.http_request.url, + message_id) + + +class StorageBlobSettings(object): + + def __init__(self, **kwargs): + self.max_single_put_size = kwargs.get('max_single_put_size', 64 * 1024 * 1024) + self.copy_polling_interval = 15 + + # Block blob uploads + self.max_block_size = kwargs.get('max_block_size', 4 * 1024 * 1024) + self.min_large_block_upload_threshold = kwargs.get('min_large_block_upload_threshold', 4 * 1024 * 1024 + 1) + self.use_byte_buffer = kwargs.get('use_byte_buffer', False) + + # Page blob uploads + self.max_page_size = kwargs.get('max_page_size', 4 * 1024 * 1024) + + # Blob downloads + self.max_single_get_size = kwargs.get('max_single_get_size', 32 * 1024 * 1024) + self.max_chunk_get_size = kwargs.get('max_chunk_get_size', 4 * 1024 * 1024) + + +class StorageHeadersPolicy(HeadersPolicy): + + def on_request(self, request, **kwargs): + # type: (PipelineRequest, Any) -> None + super(StorageHeadersPolicy, self).on_request(request) + current_time = format_date_time(time()) + request.http_request.headers['x-ms-date'] = current_time + + custom_id = request.context.options.pop('client_request_id', None) + request.http_request.headers['x-ms-client-request-id'] = custom_id or str(uuid.uuid1()) + + +class StorageHosts(SansIOHTTPPolicy): + + def __init__(self, hosts=None, **kwargs): # pylint: disable=unused-argument + self.hosts = hosts + super(StorageHosts, self).__init__() + + def on_request(self, request, **kwargs): + # type: (PipelineRequest, Any) -> None + request.context.options['hosts'] = self.hosts + parsed_url = urlparse(request.http_request.url) + + # Detect what location mode we're currently requesting with + location_mode = LocationMode.PRIMARY + for key, value in self.hosts.items(): + if parsed_url.netloc == value: + location_mode = key + + # See if a specific location mode has been specified, and if so, redirect + use_location = request.context.options.pop('use_location', None) + if use_location: + # Lock retries to the specific location + request.context.options['retry_to_secondary'] = False + if use_location not in self.hosts: + raise ValueError("Attempting to use undefined host location {}".format(use_location)) + if use_location != location_mode: + # Update request URL to use the specified location + updated = parsed_url._replace(netloc=self.hosts[use_location]) + request.http_request.url = updated.geturl() + location_mode = use_location + + request.context.options['location_mode'] = location_mode + + +class StorageLoggingPolicy(NetworkTraceLoggingPolicy): + """A policy that logs HTTP request and response to the DEBUG logger. + + This accepts both global configuration, and per-request level with "enable_http_logger" + """ + + def on_request(self, request, **kwargs): + # type: (PipelineRequest, Any) -> None + http_request = request.http_request + options = request.context.options + if options.pop("logging_enable", self.enable_http_logger): + request.context["logging_enable"] = True + if not _LOGGER.isEnabledFor(logging.DEBUG): + return + + try: + log_url = http_request.url + query_params = http_request.query + if 'sig' in query_params: + log_url = log_url.replace(query_params['sig'], "sig=*****") + _LOGGER.debug("Request URL: %r", log_url) + _LOGGER.debug("Request method: %r", http_request.method) + _LOGGER.debug("Request headers:") + for header, value in http_request.headers.items(): + if header.lower() == 'authorization': + value = '*****' + elif header.lower() == 'x-ms-copy-source' and 'sig' in value: + # take the url apart and scrub away the signed signature + scheme, netloc, path, params, query, fragment = urlparse(value) + parsed_qs = dict(parse_qsl(query)) + parsed_qs['sig'] = '*****' + + # the SAS needs to be put back together + value = urlunparse((scheme, netloc, path, params, urlencode(parsed_qs), fragment)) + + _LOGGER.debug(" %r: %r", header, value) + _LOGGER.debug("Request body:") + + # We don't want to log the binary data of a file upload. + if isinstance(http_request.body, types.GeneratorType): + _LOGGER.debug("File upload") + else: + _LOGGER.debug(str(http_request.body)) + except Exception as err: # pylint: disable=broad-except + _LOGGER.debug("Failed to log request: %r", err) + + def on_response(self, request, response, **kwargs): + # type: (PipelineRequest, PipelineResponse, Any) -> None + if response.context.pop("logging_enable", self.enable_http_logger): + if not _LOGGER.isEnabledFor(logging.DEBUG): + return + + try: + _LOGGER.debug("Response status: %r", response.http_response.status_code) + _LOGGER.debug("Response headers:") + for res_header, value in response.http_response.headers.items(): + _LOGGER.debug(" %r: %r", res_header, value) + + # We don't want to log binary data if the response is a file. + _LOGGER.debug("Response content:") + pattern = re.compile(r'attachment; ?filename=["\w.]+', re.IGNORECASE) + header = response.http_response.headers.get('content-disposition') + + if header and pattern.match(header): + filename = header.partition('=')[2] + _LOGGER.debug("File attachments: %s", filename) + elif response.http_response.headers.get("content-type", "").endswith("octet-stream"): + _LOGGER.debug("Body contains binary data.") + elif response.http_response.headers.get("content-type", "").startswith("image"): + _LOGGER.debug("Body contains image data.") + else: + if response.context.options.get('stream', False): + _LOGGER.debug("Body is streamable") + else: + _LOGGER.debug(response.http_response.text()) + except Exception as err: # pylint: disable=broad-except + _LOGGER.debug("Failed to log response: %s", repr(err)) + + +class StorageUserAgentPolicy(SansIOHTTPPolicy): + + _USERAGENT = "User-Agent" + + def __init__(self, **kwargs): + self._application = kwargs.pop('user_agent', None) + self._user_agent = "azsdk-python-storage-queue/{} Python/{} ({})".format( + VERSION, + platform.python_version(), + platform.platform()) + super(StorageUserAgentPolicy, self).__init__() + + def on_request(self, request, **kwargs): + existing = request.http_request.headers.get(self._USERAGENT, "") + app_string = request.context.options.pop('user_agent', None) or self._application + if app_string: + request.http_request.headers[self._USERAGENT] = "{} {}".format( + app_string, self._user_agent) + else: + request.http_request.headers[self._USERAGENT] = self._user_agent + if existing: + request.http_request.headers[self._USERAGENT] += " " + existing + + +class StorageRequestHook(SansIOHTTPPolicy): + + def __init__(self, **kwargs): # pylint: disable=unused-argument + self._request_callback = kwargs.get('raw_request_hook') + super(StorageRequestHook, self).__init__() + + def on_request(self, request, **kwargs): + # type: (PipelineRequest, **Any) -> PipelineResponse + request_callback = request.context.options.pop('raw_request_hook', self._request_callback) + if request_callback: + request_callback(request) + + +class StorageResponseHook(HTTPPolicy): + + def __init__(self, **kwargs): # pylint: disable=unused-argument + self._response_callback = kwargs.get('raw_response_hook') + super(StorageResponseHook, self).__init__() + + def send(self, request): + # type: (PipelineRequest) -> PipelineResponse + data_stream_total = request.context.get('data_stream_total') or \ + request.context.options.pop('data_stream_total', None) + download_stream_current = request.context.get('download_stream_current') or \ + request.context.options.pop('download_stream_current', None) + upload_stream_current = request.context.get('upload_stream_current') or \ + request.context.options.pop('upload_stream_current', None) + response_callback = request.context.get('response_callback') or \ + request.context.options.pop('raw_response_hook', self._response_callback) + + response = self.next.send(request) + will_retry = is_retry(response, request.context.options.get('mode')) + if not will_retry and download_stream_current is not None: + download_stream_current += int(response.http_response.headers.get('Content-Length', 0)) + if data_stream_total is None: + content_range = response.http_response.headers.get('Content-Range') + if content_range: + data_stream_total = int(content_range.split(' ', 1)[1].split('/', 1)[1]) + else: + data_stream_total = download_stream_current + elif not will_retry and upload_stream_current is not None: + upload_stream_current += int(response.http_request.headers.get('Content-Length', 0)) + for pipeline_obj in [request, response]: + pipeline_obj.context['data_stream_total'] = data_stream_total + pipeline_obj.context['download_stream_current'] = download_stream_current + pipeline_obj.context['upload_stream_current'] = upload_stream_current + if response_callback: + response_callback(response) + request.context['response_callback'] = response_callback + return response + + +class StorageContentValidation(SansIOHTTPPolicy): + """A simple policy that sends the given headers + with the request. + + This will overwrite any headers already defined in the request. + """ + header_name = 'Content-MD5' + + def __init__(self, **kwargs): # pylint: disable=unused-argument + super(StorageContentValidation, self).__init__() + + @staticmethod + def get_content_md5(data): + md5 = hashlib.md5() + if isinstance(data, bytes): + md5.update(data) + elif hasattr(data, 'read'): + pos = 0 + try: + pos = data.tell() + except: # pylint: disable=bare-except + pass + for chunk in iter(lambda: data.read(4096), b""): + md5.update(chunk) + try: + data.seek(pos, SEEK_SET) + except (AttributeError, IOError): + raise ValueError("Data should be bytes or a seekable file-like object.") + else: + raise ValueError("Data should be bytes or a seekable file-like object.") + + return md5.digest() + + def on_request(self, request, **kwargs): + # type: (PipelineRequest, Any) -> None + validate_content = request.context.options.pop('validate_content', False) + if validate_content and request.http_request.method != 'GET': + computed_md5 = encode_base64(StorageContentValidation.get_content_md5(request.http_request.data)) + request.http_request.headers[self.header_name] = computed_md5 + request.context['validate_content_md5'] = computed_md5 + request.context['validate_content'] = validate_content + + def on_response(self, request, response, **kwargs): + if response.context.get('validate_content', False) and response.http_response.headers.get('content-md5'): + computed_md5 = request.context.get('validate_content_md5') or \ + encode_base64(StorageContentValidation.get_content_md5(response.http_response.body())) + if response.http_response.headers['content-md5'] != computed_md5: + raise AzureError( + 'MD5 mismatch. Expected value is \'{0}\', computed value is \'{1}\'.'.format( + response.http_response.headers['content-md5'], computed_md5), + response=response.http_response + ) + + +class StorageRetryPolicy(HTTPPolicy): + """ + The base class for Exponential and Linear retries containing shared code. + """ + + def __init__(self, **kwargs): + self.total_retries = kwargs.pop('retry_total', 10) + self.connect_retries = kwargs.pop('retry_connect', 3) + self.read_retries = kwargs.pop('retry_read', 3) + self.status_retries = kwargs.pop('retry_status', 3) + self.retry_to_secondary = kwargs.pop('retry_to_secondary', False) + super(StorageRetryPolicy, self).__init__() + + def _set_next_host_location(self, settings, request): # pylint: disable=no-self-use + """ + A function which sets the next host location on the request, if applicable. + + :param ~azure.storage.models.RetryContext context: + The retry context containing the previous host location and the request + to evaluate and possibly modify. + """ + if settings['hosts'] and all(settings['hosts'].values()): + url = urlparse(request.url) + # If there's more than one possible location, retry to the alternative + if settings['mode'] == LocationMode.PRIMARY: + settings['mode'] = LocationMode.SECONDARY + else: + settings['mode'] = LocationMode.PRIMARY + updated = url._replace(netloc=settings['hosts'].get(settings['mode'])) + request.url = updated.geturl() + + def configure_retries(self, request): # pylint: disable=no-self-use + body_position = None + if hasattr(request.http_request.body, 'read'): + try: + body_position = request.http_request.body.tell() + except (AttributeError, UnsupportedOperation): + # if body position cannot be obtained, then retries will not work + pass + options = request.context.options + return { + 'total': options.pop("retry_total", self.total_retries), + 'connect': options.pop("retry_connect", self.connect_retries), + 'read': options.pop("retry_read", self.read_retries), + 'status': options.pop("retry_status", self.status_retries), + 'retry_secondary': options.pop("retry_to_secondary", self.retry_to_secondary), + 'mode': options.pop("location_mode", LocationMode.PRIMARY), + 'hosts': options.pop("hosts", None), + 'hook': options.pop("retry_hook", None), + 'body_position': body_position, + 'count': 0, + 'history': [] + } + + def get_backoff_time(self, settings): # pylint: disable=unused-argument,no-self-use + """ Formula for computing the current backoff. + Should be calculated by child class. + + :rtype: float + """ + return 0 + + def sleep(self, settings, transport): + backoff = self.get_backoff_time(settings) + if not backoff or backoff < 0: + return + transport.sleep(backoff) + + def is_exhausted(self, settings): # pylint: disable=no-self-use + """Are we out of retries?""" + retry_counts = (settings['total'], settings['connect'], settings['read'], settings['status']) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, settings, request, response=None, error=None): + """Increment the retry counters. + + :param response: A pipeline response object. + :param error: An error encountered during the request, or + None if the response was received successfully. + + :return: Whether the retry attempts are exhausted. + """ + settings['total'] -= 1 + + if error and isinstance(error, ServiceRequestError): + # Errors when we're fairly sure that the server did not receive the + # request, so it should be safe to retry. + settings['connect'] -= 1 + settings['history'].append(RequestHistory(request, error=error)) + + elif error and isinstance(error, ServiceResponseError): + # Errors that occur after the request has been started, so we should + # assume that the server began processing it. + settings['read'] -= 1 + settings['history'].append(RequestHistory(request, error=error)) + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + if response: + settings['status'] -= 1 + settings['history'].append(RequestHistory(request, http_response=response)) + + if not self.is_exhausted(settings): + if request.method not in ['PUT'] and settings['retry_secondary']: + self._set_next_host_location(settings, request) + + # rewind the request body if it is a stream + if request.body and hasattr(request.body, 'read'): + # no position was saved, then retry would not work + if settings['body_position'] is None: + return False + try: + # attempt to rewind the body to the initial position + request.body.seek(settings['body_position'], SEEK_SET) + except UnsupportedOperation: + # if body is not seekable, then retry would not work + return False + if settings['hook']: + settings['hook']( + request=request, + response=response, + error=error, + retry_count=settings['count'], + location_mode=settings['mode']) + settings['count'] += 1 + return True + return False + + def send(self, request): + retries_remaining = True + response = None + retry_settings = self.configure_retries(request) + while retries_remaining: + try: + response = self.next.send(request) + if is_retry(response, retry_settings['mode']): + retries_remaining = self.increment( + retry_settings, + request=request.http_request, + response=response.http_response) + if retries_remaining: + self.sleep(retry_settings, request.context.transport) + + continue + break + except AzureError as err: + retries_remaining = self.increment( + retry_settings, request=request.http_request, error=err) + if retries_remaining: + self.sleep(retry_settings, request.context.transport) + continue + raise err + if retry_settings['history']: + response.context['history'] = retry_settings['history'] + response.http_response.location_mode = retry_settings['mode'] + return response + + +class NoRetry(StorageRetryPolicy): + + def __init__(self): + super(NoRetry, self).__init__(retry_total=0) + + def increment(self, *args, **kwargs): # pylint: disable=unused-argument,arguments-differ + return False + + +class ExponentialRetry(StorageRetryPolicy): + """Exponential retry.""" + + def __init__(self, initial_backoff=15, increment_base=3, retry_total=3, + retry_to_secondary=False, random_jitter_range=3, **kwargs): + ''' + Constructs an Exponential retry object. The initial_backoff is used for + the first retry. Subsequent retries are retried after initial_backoff + + increment_power^retry_count seconds. For example, by default the first retry + occurs after 15 seconds, the second after (15+3^1) = 18 seconds, and the + third after (15+3^2) = 24 seconds. + + :param int initial_backoff: + The initial backoff interval, in seconds, for the first retry. + :param int increment_base: + The base, in seconds, to increment the initial_backoff by after the + first retry. + :param int max_attempts: + The maximum number of retry attempts. + :param bool retry_to_secondary: + Whether the request should be retried to secondary, if able. This should + only be enabled of RA-GRS accounts are used and potentially stale data + can be handled. + :param int random_jitter_range: + A number in seconds which indicates a range to jitter/randomize for the back-off interval. + For example, a random_jitter_range of 3 results in the back-off interval x to vary between x+3 and x-3. + ''' + self.initial_backoff = initial_backoff + self.increment_base = increment_base + self.random_jitter_range = random_jitter_range + super(ExponentialRetry, self).__init__( + retry_total=retry_total, retry_to_secondary=retry_to_secondary, **kwargs) + + def get_backoff_time(self, settings): + """ + Calculates how long to sleep before retrying. + + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + """ + random_generator = random.Random() + backoff = self.initial_backoff + (0 if settings['count'] == 0 else pow(self.increment_base, settings['count'])) + random_range_start = backoff - self.random_jitter_range if backoff > self.random_jitter_range else 0 + random_range_end = backoff + self.random_jitter_range + return random_generator.uniform(random_range_start, random_range_end) + + +class LinearRetry(StorageRetryPolicy): + """Linear retry.""" + + def __init__(self, backoff=15, retry_total=3, retry_to_secondary=False, random_jitter_range=3, **kwargs): + """ + Constructs a Linear retry object. + + :param int backoff: + The backoff interval, in seconds, between retries. + :param int max_attempts: + The maximum number of retry attempts. + :param bool retry_to_secondary: + Whether the request should be retried to secondary, if able. This should + only be enabled of RA-GRS accounts are used and potentially stale data + can be handled. + :param int random_jitter_range: + A number in seconds which indicates a range to jitter/randomize for the back-off interval. + For example, a random_jitter_range of 3 results in the back-off interval x to vary between x+3 and x-3. + """ + self.backoff = backoff + self.random_jitter_range = random_jitter_range + super(LinearRetry, self).__init__( + retry_total=retry_total, retry_to_secondary=retry_to_secondary, **kwargs) + + def get_backoff_time(self, settings): + """ + Calculates how long to sleep before retrying. + + :return: + An integer indicating how long to wait before retrying the request, + or None to indicate no retry should be performed. + :rtype: int or None + """ + random_generator = random.Random() + # the backoff interval normally does not change, however there is the possibility + # that it was modified by accessing the property directly after initializing the object + random_range_start = self.backoff - self.random_jitter_range \ + if self.backoff > self.random_jitter_range else 0 + random_range_end = self.backoff + self.random_jitter_range + return random_generator.uniform(random_range_start, random_range_end) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/shared_access_signature.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/shared_access_signature.py new file mode 100644 index 000000000000..cad3f270600b --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/shared_access_signature.py @@ -0,0 +1,468 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import sys +from datetime import date + +from .constants import X_MS_VERSION +from .utils import _sign_string, url_quote, _QueryStringConstants + + +if sys.version_info < (3,): + def _str(value): + if isinstance(value, unicode): # pylint: disable=undefined-variable + return value.encode('utf-8') + + return str(value) +else: + _str = str + + +def _to_utc_datetime(value): + return value.strftime('%Y-%m-%dT%H:%M:%SZ') + + +class SharedAccessSignature(object): + ''' + Provides a factory for creating account access + signature tokens with an account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key, x_ms_version=X_MS_VERSION): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + :param str x_ms_version: + The service version used to generate the shared access signatures. + ''' + self.account_name = account_name + self.account_key = account_key + self.x_ms_version = x_ms_version + + def generate_account(self, services, resource_types, permission, expiry, start=None, + ip=None, protocol=None): + ''' + Generates a shared access signature for the account. + Use the returned signature with the sas_token parameter of the service + or to create a new account object. + + :param ResourceTypes resource_types: + Specifies the resource types that are accessible with the account + SAS. You can combine values to provide access to more than one + resource type. + :param AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. You can combine + values to provide more than one permission. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + ''' + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_account(services, resource_types) + sas.add_account_signature(self.account_name, self.account_key) + + return sas.get_token() + + +class _SharedAccessHelper(object): + def __init__(self): + self.query_dict = {} + + def _add_query(self, name, val): + if val: + self.query_dict[name] = _str(val) if val is not None else None + + def add_base(self, permission, expiry, start, ip, protocol, x_ms_version): + if isinstance(start, date): + start = _to_utc_datetime(start) + + if isinstance(expiry, date): + expiry = _to_utc_datetime(expiry) + + self._add_query(_QueryStringConstants.SIGNED_START, start) + self._add_query(_QueryStringConstants.SIGNED_EXPIRY, expiry) + self._add_query(_QueryStringConstants.SIGNED_PERMISSION, permission) + self._add_query(_QueryStringConstants.SIGNED_IP, ip) + self._add_query(_QueryStringConstants.SIGNED_PROTOCOL, protocol) + self._add_query(_QueryStringConstants.SIGNED_VERSION, x_ms_version) + + def add_resource(self, resource): + self._add_query(_QueryStringConstants.SIGNED_RESOURCE, resource) + + def add_id(self, policy_id): + self._add_query(_QueryStringConstants.SIGNED_IDENTIFIER, policy_id) + + def add_account(self, services, resource_types): + self._add_query(_QueryStringConstants.SIGNED_SERVICES, services) + self._add_query(_QueryStringConstants.SIGNED_RESOURCE_TYPES, resource_types) + + def add_override_response_headers(self, cache_control, + content_disposition, + content_encoding, + content_language, + content_type): + self._add_query(_QueryStringConstants.SIGNED_CACHE_CONTROL, cache_control) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_DISPOSITION, content_disposition) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_ENCODING, content_encoding) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_LANGUAGE, content_language) + self._add_query(_QueryStringConstants.SIGNED_CONTENT_TYPE, content_type) + + def add_resource_signature(self, account_name, account_key, service, path): + def get_value_to_append(query): + return_value = self.query_dict.get(query) or '' + return return_value + '\n' + + if path[0] != '/': + path = '/' + path + + canonicalized_resource = '/' + service + '/' + account_name + path + '\n' + + # Form the string to sign from shared_access_policy and canonicalized + # resource. The order of values is important. + string_to_sign = \ + (get_value_to_append(_QueryStringConstants.SIGNED_PERMISSION) + + get_value_to_append(_QueryStringConstants.SIGNED_START) + + get_value_to_append(_QueryStringConstants.SIGNED_EXPIRY) + + canonicalized_resource + + get_value_to_append(_QueryStringConstants.SIGNED_IDENTIFIER) + + get_value_to_append(_QueryStringConstants.SIGNED_IP) + + get_value_to_append(_QueryStringConstants.SIGNED_PROTOCOL) + + get_value_to_append(_QueryStringConstants.SIGNED_VERSION)) + + if service in ['blob', 'file']: + string_to_sign += \ + (get_value_to_append(_QueryStringConstants.SIGNED_CACHE_CONTROL) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_DISPOSITION) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_ENCODING) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_LANGUAGE) + + get_value_to_append(_QueryStringConstants.SIGNED_CONTENT_TYPE)) + + # remove the trailing newline + if string_to_sign[-1] == '\n': + string_to_sign = string_to_sign[:-1] + + self._add_query(_QueryStringConstants.SIGNED_SIGNATURE, + _sign_string(account_key, string_to_sign)) + + def add_account_signature(self, account_name, account_key): + def get_value_to_append(query): + return_value = self.query_dict.get(query) or '' + return return_value + '\n' + + string_to_sign = \ + (account_name + '\n' + + get_value_to_append(_QueryStringConstants.SIGNED_PERMISSION) + + get_value_to_append(_QueryStringConstants.SIGNED_SERVICES) + + get_value_to_append(_QueryStringConstants.SIGNED_RESOURCE_TYPES) + + get_value_to_append(_QueryStringConstants.SIGNED_START) + + get_value_to_append(_QueryStringConstants.SIGNED_EXPIRY) + + get_value_to_append(_QueryStringConstants.SIGNED_IP) + + get_value_to_append(_QueryStringConstants.SIGNED_PROTOCOL) + + get_value_to_append(_QueryStringConstants.SIGNED_VERSION)) + + self._add_query(_QueryStringConstants.SIGNED_SIGNATURE, + _sign_string(account_key, string_to_sign)) + + def get_token(self): + return '&'.join(['{0}={1}'.format(n, url_quote(v)) for n, v in self.query_dict.items() if v is not None]) + + +class BlobSharedAccessSignature(SharedAccessSignature): + ''' + Provides a factory for creating blob and container access + signature tokens with a common account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + ''' + super(BlobSharedAccessSignature, self).__init__(account_name, account_key, x_ms_version=X_MS_VERSION) + + def generate_blob(self, container_name, blob_name, permission=None, + expiry=None, start=None, policy_id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the blob. + Use the returned signature with the sas_token parameter of any BlobService. + + :param str container_name: + Name of container. + :param str blob_name: + Name of blob. + :param BlobPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_blob_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + ''' + resource_path = container_name + '/' + blob_name + + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(policy_id) + sas.add_resource('b') + sas.add_override_response_headers(cache_control, content_disposition, + content_encoding, content_language, + content_type) + sas.add_resource_signature(self.account_name, self.account_key, 'blob', resource_path) + + return sas.get_token() + + def generate_container(self, container_name, permission=None, expiry=None, + start=None, policy_id=None, ip=None, protocol=None, + cache_control=None, content_disposition=None, + content_encoding=None, content_language=None, + content_type=None): + ''' + Generates a shared access signature for the container. + Use the returned signature with the sas_token parameter of any BlobService. + + :param str container_name: + Name of container. + :param ContainerPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, write, delete, list. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str policy_id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use + set_blob_service_properties. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + :param str cache_control: + Response header value for Cache-Control when resource is accessed + using this shared access signature. + :param str content_disposition: + Response header value for Content-Disposition when resource is accessed + using this shared access signature. + :param str content_encoding: + Response header value for Content-Encoding when resource is accessed + using this shared access signature. + :param str content_language: + Response header value for Content-Language when resource is accessed + using this shared access signature. + :param str content_type: + Response header value for Content-Type when resource is accessed + using this shared access signature. + ''' + sas = _SharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(policy_id) + sas.add_resource('c') + sas.add_override_response_headers(cache_control, content_disposition, + content_encoding, content_language, + content_type) + sas.add_resource_signature(self.account_name, self.account_key, 'blob', container_name) + + return sas.get_token() + + +class QueueSharedAccessSignature(SharedAccessSignature): + ''' + Provides a factory for creating queue shares access + signature tokens with a common account name and account key. Users can either + use the factory or can construct the appropriate service and use the + generate_*_shared_access_signature method directly. + ''' + + def __init__(self, account_name, account_key): + ''' + :param str account_name: + The storage account name used to generate the shared access signatures. + :param str account_key: + The access key to generate the shares access signatures. + ''' + super(QueueSharedAccessSignature, self).__init__(account_name, account_key, x_ms_version=X_MS_VERSION) + + def generate_queue(self, queue_name, permission=None, + expiry=None, start=None, policy_id=None, + ip=None, protocol=None): + ''' + Generates a shared access signature for the queue. + Use the returned signature with the sas_token parameter of QueueService. + :param str queue_name: + Name of queue. + :param QueuePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Permissions must be ordered read, add, update, process. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str policy_id: + A unique value up to 64 characters in length that correlates to a + stored access policy. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. See :class:`~azure.storage.common.models.Protocol` for possible values. + ''' + sas = _QueueSharedAccessHelper() + sas.add_base(permission, expiry, start, ip, protocol, self.x_ms_version) + sas.add_id(policy_id) + sas.add_resource_signature(self.account_name, self.account_key, queue_name) + + return sas.get_token() + + +class _QueueSharedAccessHelper(_SharedAccessHelper): + + def add_resource_signature(self, account_name, account_key, path): # pylint: disable=arguments-differ + def get_value_to_append(query): + return_value = self.query_dict.get(query) or '' + return return_value + '\n' + + if path[0] != '/': + path = '/' + path + + canonicalized_resource = '/queue/' + account_name + path + '\n' + + # Form the string to sign from shared_access_policy and canonicalized + # resource. The order of values is important. + string_to_sign = \ + (get_value_to_append(_QueryStringConstants.SIGNED_PERMISSION) + + get_value_to_append(_QueryStringConstants.SIGNED_START) + + get_value_to_append(_QueryStringConstants.SIGNED_EXPIRY) + + canonicalized_resource + + get_value_to_append(_QueryStringConstants.SIGNED_IDENTIFIER) + + get_value_to_append(_QueryStringConstants.SIGNED_IP) + + get_value_to_append(_QueryStringConstants.SIGNED_PROTOCOL) + + get_value_to_append(_QueryStringConstants.SIGNED_VERSION)) + + # remove the trailing newline + if string_to_sign[-1] == '\n': + string_to_sign = string_to_sign[:-1] + + self._add_query(_QueryStringConstants.SIGNED_SIGNATURE, + _sign_string(account_key, string_to_sign)) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/upload_chunking.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/upload_chunking.py new file mode 100644 index 000000000000..775c56853eac --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/upload_chunking.py @@ -0,0 +1,546 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint: disable=no-self-use + +from io import (BytesIO, IOBase, SEEK_CUR, SEEK_END, SEEK_SET, UnsupportedOperation) +from threading import Lock + +from math import ceil + +import six + +from .models import ModifiedAccessConditions +from .utils import ( + encode_base64, + url_quote, + get_length, + return_response_headers) +from .encryption import _get_blob_encryptor_and_padder + + +_LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE = 4 * 1024 * 1024 +_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM = '{0} should be a seekable file-like/io.IOBase type stream object.' + + +def upload_blob_chunks(blob_service, blob_size, block_size, stream, max_connections, validate_content, # pylint: disable=too-many-locals + access_conditions, uploader_class, append_conditions=None, modified_access_conditions=None, + timeout=None, content_encryption_key=None, initialization_vector=None, **kwargs): + + encryptor, padder = _get_blob_encryptor_and_padder( + content_encryption_key, + initialization_vector, + uploader_class is not PageBlobChunkUploader) + + uploader = uploader_class( + blob_service, + blob_size, + block_size, + stream, + max_connections > 1, + validate_content, + access_conditions, + append_conditions, + timeout, + encryptor, + padder, + **kwargs + ) + + # Access conditions do not work with parallelism + if max_connections > 1: + uploader.modified_access_conditions = None + else: + uploader.modified_access_conditions = modified_access_conditions + + if max_connections > 1: + import concurrent.futures + from threading import BoundedSemaphore + + # Ensures we bound the chunking so we only buffer and submit 'max_connections' + # amount of work items to the executor. This is necessary as the executor queue will keep + # accepting submitted work items, which results in buffering all the blocks if + # the max_connections + 1 ensures the next chunk is already buffered and ready for when + # the worker thread is available. + chunk_throttler = BoundedSemaphore(max_connections + 1) + + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + futures = [] + running_futures = [] + + # Check for exceptions and fail fast. + for chunk in uploader.get_chunk_streams(): + for f in running_futures: + if f.done(): + if f.exception(): + raise f.exception() + running_futures.remove(f) + + chunk_throttler.acquire() + future = executor.submit(uploader.process_chunk, chunk) + + # Calls callback upon completion (even if the callback was added after the Future task is done). + future.add_done_callback(lambda x: chunk_throttler.release()) + futures.append(future) + running_futures.append(future) + + # result() will wait until completion and also raise any exceptions that may have been set. + range_ids = [f.result() for f in futures] + else: + range_ids = [uploader.process_chunk(result) for result in uploader.get_chunk_streams()] + + if any(range_ids): + return range_ids + return uploader.response_headers + + +def upload_blob_substream_blocks(blob_service, blob_size, block_size, stream, max_connections, + validate_content, access_conditions, uploader_class, + append_conditions=None, modified_access_conditions=None, timeout=None, **kwargs): + + uploader = uploader_class( + blob_service, + blob_size, + block_size, + stream, + max_connections > 1, + validate_content, + access_conditions, + append_conditions, + timeout, + None, + None, + **kwargs + ) + # ETag matching does not work with parallelism as a ranged upload may start + # before the previous finishes and provides an etag + if max_connections > 1: + uploader.modified_access_conditions = None + else: + uploader.modified_access_conditions = modified_access_conditions + + if max_connections > 1: + import concurrent.futures + executor = concurrent.futures.ThreadPoolExecutor(max_connections) + range_ids = list(executor.map(uploader.process_substream_block, uploader.get_substream_blocks())) + else: + range_ids = [uploader.process_substream_block(result) for result in uploader.get_substream_blocks()] + + return range_ids + + +class _BlobChunkUploader(object): # pylint: disable=too-many-instance-attributes + + def __init__(self, blob_service, blob_size, chunk_size, stream, parallel, validate_content, + access_conditions, append_conditions, timeout, encryptor, padder, **kwargs): + self.blob_service = blob_service + self.blob_size = blob_size + self.chunk_size = chunk_size + self.stream = stream + self.parallel = parallel + self.stream_start = stream.tell() if parallel else None + self.stream_lock = Lock() if parallel else None + self.progress_total = 0 + self.progress_lock = Lock() if parallel else None + self.validate_content = validate_content + self.lease_access_conditions = access_conditions + self.modified_access_conditions = None + self.append_conditions = append_conditions + self.timeout = timeout + self.encryptor = encryptor + self.padder = padder + self.response_headers = None + self.etag = None + self.last_modified = None + self.request_options = kwargs + + def get_chunk_streams(self): + index = 0 + while True: + data = b'' + read_size = self.chunk_size + + # Buffer until we either reach the end of the stream or get a whole chunk. + while True: + if self.blob_size: + read_size = min(self.chunk_size - len(data), self.blob_size - (index + len(data))) + temp = self.stream.read(read_size) + if not isinstance(temp, six.binary_type): + raise TypeError('Blob data should be of type bytes.') + data += temp or b"" + + # We have read an empty string and so are at the end + # of the buffer or we have read a full chunk. + if temp == b'' or len(data) == self.chunk_size: + break + + if len(data) == self.chunk_size: + if self.padder: + data = self.padder.update(data) + if self.encryptor: + data = self.encryptor.update(data) + yield index, data + else: + if self.padder: + data = self.padder.update(data) + self.padder.finalize() + if self.encryptor: + data = self.encryptor.update(data) + self.encryptor.finalize() + if data: + yield index, data + break + index += len(data) + + def process_chunk(self, chunk_data): + chunk_bytes = chunk_data[1] + chunk_offset = chunk_data[0] + return self._upload_chunk_with_progress(chunk_offset, chunk_bytes) + + def _update_progress(self, length): + if self.progress_lock is not None: + with self.progress_lock: + self.progress_total += length + else: + self.progress_total += length + + def _upload_chunk(self, chunk_offset, chunk_data): + raise NotImplementedError("Must be implemented by child class.") + + def _upload_chunk_with_progress(self, chunk_offset, chunk_data): + range_id = self._upload_chunk(chunk_offset, chunk_data) + self._update_progress(len(chunk_data)) + return range_id + + def get_substream_blocks(self): + assert self.chunk_size is not None + lock = self.stream_lock + blob_length = self.blob_size + + if blob_length is None: + blob_length = get_length(self.stream) + if blob_length is None: + raise ValueError("Unable to determine content length of upload data.") + + blocks = int(ceil(blob_length / (self.chunk_size * 1.0))) + last_block_size = self.chunk_size if blob_length % self.chunk_size == 0 else blob_length % self.chunk_size + + for i in range(blocks): + yield ('BlockId{}'.format("%05d" % i), + _SubStream(self.stream, i * self.chunk_size, last_block_size if i == blocks - 1 else self.chunk_size, + lock)) + + def process_substream_block(self, block_data): + return self._upload_substream_block_with_progress(block_data[0], block_data[1]) + + def _upload_substream_block(self, block_id, block_stream): + raise NotImplementedError("Must be implemented by child class.") + + def _upload_substream_block_with_progress(self, block_id, block_stream): + range_id = self._upload_substream_block(block_id, block_stream) + return range_id + + def set_response_properties(self, resp): + self.etag = resp.etag + self.last_modified = resp.last_modified + + +class BlockBlobChunkUploader(_BlobChunkUploader): + + def _upload_chunk(self, chunk_offset, chunk_data): + # TODO: This is incorrect, but works with recording. + block_id = encode_base64(url_quote(encode_base64('{0:032d}'.format(chunk_offset)))) + self.blob_service.stage_block( + block_id, + len(chunk_data), + chunk_data, + timeout=self.timeout, + lease_access_conditions=self.lease_access_conditions, + validate_content=self.validate_content, + data_stream_total=self.blob_size, + upload_stream_current=self.progress_total, + **self.request_options) + return block_id + + def _upload_substream_block(self, block_id, block_stream): + try: + self.blob_service.stage_block( + block_id, + len(block_stream), + block_stream, + validate_content=self.validate_content, + lease_access_conditions=self.lease_access_conditions, + timeout=self.timeout, + data_stream_total=self.blob_size, + upload_stream_current=self.progress_total, + **self.request_options) + finally: + block_stream.close() + return block_id + + +class PageBlobChunkUploader(_BlobChunkUploader): # pylint: disable=abstract-method + + def _is_chunk_empty(self, chunk_data): + # read until non-zero byte is encountered + # if reached the end without returning, then chunk_data is all 0's + for each_byte in chunk_data: + if each_byte not in [0, b'\x00']: + return False + return True + + def _upload_chunk(self, chunk_offset, chunk_data): + # avoid uploading the empty pages + if not self._is_chunk_empty(chunk_data): + chunk_end = chunk_offset + len(chunk_data) - 1 + content_range = 'bytes={0}-{1}'.format(chunk_offset, chunk_end) + computed_md5 = None + self.response_headers = self.blob_service.upload_pages( + chunk_data, + content_length=len(chunk_data), + transactional_content_md5=computed_md5, + timeout=self.timeout, + range=content_range, + lease_access_conditions=self.lease_access_conditions, + modified_access_conditions=self.modified_access_conditions, + validate_content=self.validate_content, + cls=return_response_headers, + data_stream_total=self.blob_size, + upload_stream_current=self.progress_total, + **self.request_options) + + if not self.parallel: + self.modified_access_conditions = ModifiedAccessConditions( + if_match=self.response_headers['etag']) + + +class AppendBlobChunkUploader(_BlobChunkUploader): # pylint: disable=abstract-method + + def __init__(self, *args, **kwargs): + super(AppendBlobChunkUploader, self).__init__(*args, **kwargs) + self.current_length = None + + def _upload_chunk(self, chunk_offset, chunk_data): + if self.current_length is None: + self.response_headers = self.blob_service.append_block( + chunk_data, + content_length=len(chunk_data), + timeout=self.timeout, + lease_access_conditions=self.lease_access_conditions, + modified_access_conditions=self.modified_access_conditions, + validate_content=self.validate_content, + append_position_access_conditions=self.append_conditions, + cls=return_response_headers, + data_stream_total=self.blob_size, + upload_stream_current=self.progress_total, + **self.request_options + ) + self.current_length = int(self.response_headers['blob_append_offset']) + else: + self.append_conditions.append_position = self.current_length + chunk_offset + self.response_headers = self.blob_service.append_block( + chunk_data, + content_length=len(chunk_data), + timeout=self.timeout, + lease_access_conditions=self.lease_access_conditions, + modified_access_conditions=self.modified_access_conditions, + validate_content=self.validate_content, + append_position_access_conditions=self.append_conditions, + cls=return_response_headers, + data_stream_total=self.blob_size, + upload_stream_current=self.progress_total, + **self.request_options + ) + + +class _SubStream(IOBase): + def __init__(self, wrapped_stream, stream_begin_index, length, lockObj): + # Python 2.7: file-like objects created with open() typically support seek(), but are not + # derivations of io.IOBase and thus do not implement seekable(). + # Python > 3.0: file-like objects created with open() are derived from io.IOBase. + try: + # only the main thread runs this, so there's no need grabbing the lock + wrapped_stream.seek(0, SEEK_CUR) + except: + raise ValueError("Wrapped stream must support seek().") + + self._lock = lockObj + self._wrapped_stream = wrapped_stream + self._position = 0 + self._stream_begin_index = stream_begin_index + self._length = length + self._buffer = BytesIO() + + # we must avoid buffering more than necessary, and also not use up too much memory + # so the max buffer size is capped at 4MB + self._max_buffer_size = length if length < _LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE \ + else _LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE + self._current_buffer_start = 0 + self._current_buffer_size = 0 + super(_SubStream, self).__init__() + + def __len__(self): + return self._length + + def close(self): + if self._buffer: + self._buffer.close() + self._wrapped_stream = None + IOBase.close(self) + + def fileno(self): + return self._wrapped_stream.fileno() + + def flush(self): + pass + + def read(self, n): + if self.closed: + raise ValueError("Stream is closed.") + + # adjust if out of bounds + if n + self._position >= self._length: + n = self._length - self._position + + # return fast + if n == 0 or self._buffer.closed: + return b'' + + # attempt first read from the read buffer and update position + read_buffer = self._buffer.read(n) + bytes_read = len(read_buffer) + bytes_remaining = n - bytes_read + self._position += bytes_read + + # repopulate the read buffer from the underlying stream to fulfill the request + # ensure the seek and read operations are done atomically (only if a lock is provided) + if bytes_remaining > 0: + with self._buffer: + # either read in the max buffer size specified on the class + # or read in just enough data for the current block/sub stream + current_max_buffer_size = min(self._max_buffer_size, self._length - self._position) + + # lock is only defined if max_connections > 1 (parallel uploads) + if self._lock: + with self._lock: + # reposition the underlying stream to match the start of the data to read + absolute_position = self._stream_begin_index + self._position + self._wrapped_stream.seek(absolute_position, SEEK_SET) + # If we can't seek to the right location, our read will be corrupted so fail fast. + if self._wrapped_stream.tell() != absolute_position: + raise IOError("Stream failed to seek to the desired location.") + buffer_from_stream = self._wrapped_stream.read(current_max_buffer_size) + else: + buffer_from_stream = self._wrapped_stream.read(current_max_buffer_size) + + if buffer_from_stream: + # update the buffer with new data from the wrapped stream + # we need to note down the start position and size of the buffer, in case seek is performed later + self._buffer = BytesIO(buffer_from_stream) + self._current_buffer_start = self._position + self._current_buffer_size = len(buffer_from_stream) + + # read the remaining bytes from the new buffer and update position + second_read_buffer = self._buffer.read(bytes_remaining) + read_buffer += second_read_buffer + self._position += len(second_read_buffer) + + return read_buffer + + def readable(self): + return True + + def readinto(self, b): + raise UnsupportedOperation + + def seek(self, offset, whence=0): + if whence is SEEK_SET: + start_index = 0 + elif whence is SEEK_CUR: + start_index = self._position + elif whence is SEEK_END: + start_index = self._length + offset = - offset + else: + raise ValueError("Invalid argument for the 'whence' parameter.") + + pos = start_index + offset + + if pos > self._length: + pos = self._length + elif pos < 0: + pos = 0 + + # check if buffer is still valid + # if not, drop buffer + if pos < self._current_buffer_start or pos >= self._current_buffer_start + self._current_buffer_size: + self._buffer.close() + self._buffer = BytesIO() + else: # if yes seek to correct position + delta = pos - self._current_buffer_start + self._buffer.seek(delta, SEEK_SET) + + self._position = pos + return pos + + def seekable(self): + return True + + def tell(self): + return self._position + + def write(self): + raise UnsupportedOperation + + def writelines(self): + raise UnsupportedOperation + + def writeable(self): + return False + + +class IterStreamer(object): + """ + File-like streaming iterator. + """ + def __init__(self, generator, encoding='UTF-8'): + self.generator = generator + self.iterator = iter(generator) + self.leftover = b'' + self.encoding = encoding + + def __len__(self): + return self.generator.__len__() + + def __iter__(self): + return self.iterator + + def seekable(self): + return False + + def next(self): + return next(self.iterator) + + def tell(self, *args, **kwargs): + raise UnsupportedOperation("Data generator does not support tell.") + + def seek(self, *args, **kwargs): + raise UnsupportedOperation("Data generator is unseekable.") + + def read(self, size): + data = self.leftover + count = len(self.leftover) + try: + while count < size: + chunk = self.next() + if isinstance(chunk, six.text_type): + chunk = chunk.encode(self.encoding) + data += chunk + count += len(chunk) + except StopIteration: + pass + + if count > size: + self.leftover = data[size:] + + return data[:size] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/utils.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/utils.py new file mode 100644 index 000000000000..6d980d967891 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/utils.py @@ -0,0 +1,606 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from typing import ( # pylint: disable=unused-import + Union, Optional, Any, Iterable, Dict, List, Type, Tuple, + TYPE_CHECKING +) +import base64 +import hashlib +import hmac +import logging +from os import fstat +from io import (SEEK_END, SEEK_SET, UnsupportedOperation) + +try: + from urllib.parse import quote, unquote, parse_qs +except ImportError: + from urlparse import parse_qs # type: ignore + from urllib2 import quote, unquote # type: ignore + +import six +import isodate + +from azure.core import Configuration +from azure.core.exceptions import raise_with_traceback +from azure.core.pipeline import Pipeline +from azure.core.pipeline.transport import RequestsTransport +from azure.core.pipeline.policies import ( + RedirectPolicy, + ContentDecodePolicy, + BearerTokenCredentialPolicy, + ProxyPolicy) +from azure.core.exceptions import ( + HttpResponseError, + ResourceNotFoundError, + ResourceModifiedError, + ResourceExistsError, + ClientAuthenticationError, + DecodeError) + +from .constants import STORAGE_OAUTH_SCOPE, SERVICE_HOST_BASE, DEFAULT_SOCKET_TIMEOUT +from .models import LocationMode, StorageErrorCode +from .authentication import SharedKeyCredentialPolicy +from .policies import ( + StorageBlobSettings, + StorageHeadersPolicy, + StorageUserAgentPolicy, + StorageContentValidation, + StorageRequestHook, + StorageResponseHook, + StorageLoggingPolicy, + StorageHosts, + QueueMessagePolicy, + ExponentialRetry) + + +if TYPE_CHECKING: + from datetime import datetime + from azure.core.pipeline.transport import HttpTransport + from azure.core.pipeline.policies import HTTPPolicy + from azure.core.exceptions import AzureError + + +_LOGGER = logging.getLogger(__name__) + + +class _QueryStringConstants(object): + SIGNED_SIGNATURE = 'sig' + SIGNED_PERMISSION = 'sp' + SIGNED_START = 'st' + SIGNED_EXPIRY = 'se' + SIGNED_RESOURCE = 'sr' + SIGNED_IDENTIFIER = 'si' + SIGNED_IP = 'sip' + SIGNED_PROTOCOL = 'spr' + SIGNED_VERSION = 'sv' + SIGNED_CACHE_CONTROL = 'rscc' + SIGNED_CONTENT_DISPOSITION = 'rscd' + SIGNED_CONTENT_ENCODING = 'rsce' + SIGNED_CONTENT_LANGUAGE = 'rscl' + SIGNED_CONTENT_TYPE = 'rsct' + START_PK = 'spk' + START_RK = 'srk' + END_PK = 'epk' + END_RK = 'erk' + SIGNED_RESOURCE_TYPES = 'srt' + SIGNED_SERVICES = 'ss' + + @staticmethod + def to_list(): + return [ + _QueryStringConstants.SIGNED_SIGNATURE, + _QueryStringConstants.SIGNED_PERMISSION, + _QueryStringConstants.SIGNED_START, + _QueryStringConstants.SIGNED_EXPIRY, + _QueryStringConstants.SIGNED_RESOURCE, + _QueryStringConstants.SIGNED_IDENTIFIER, + _QueryStringConstants.SIGNED_IP, + _QueryStringConstants.SIGNED_PROTOCOL, + _QueryStringConstants.SIGNED_VERSION, + _QueryStringConstants.SIGNED_CACHE_CONTROL, + _QueryStringConstants.SIGNED_CONTENT_DISPOSITION, + _QueryStringConstants.SIGNED_CONTENT_ENCODING, + _QueryStringConstants.SIGNED_CONTENT_LANGUAGE, + _QueryStringConstants.SIGNED_CONTENT_TYPE, + _QueryStringConstants.START_PK, + _QueryStringConstants.START_RK, + _QueryStringConstants.END_PK, + _QueryStringConstants.END_RK, + _QueryStringConstants.SIGNED_RESOURCE_TYPES, + _QueryStringConstants.SIGNED_SERVICES, + ] + + +class StorageAccountHostsMixin(object): + + def __init__( + self, parsed_url, # type: Any + service, # type: str + credential=None, # type: Optional[Any] + **kwargs # type: Any + ): + # type: (...) -> None + self._location_mode = kwargs.get('_location_mode', LocationMode.PRIMARY) + self._hosts = kwargs.get('_hosts') + self.scheme = parsed_url.scheme + + if service not in ['blob', 'queue', 'file']: + raise ValueError("Invalid service: {}".format(service)) + account = parsed_url.netloc.split(".{}.core.".format(service)) + secondary_hostname = None + self.credential = format_shared_key_credential(account, credential) + if self.scheme.lower() != 'https' and hasattr(self.credential, 'get_token'): + raise ValueError("Token credential is only supported with HTTPS.") + if hasattr(self.credential, 'account_name'): + secondary_hostname = "{}-secondary.{}.{}".format( + self.credential.account_name, service, SERVICE_HOST_BASE) + + if not self._hosts: + if len(account) > 1: + secondary_hostname = parsed_url.netloc.replace( + account[0], + account[0] + '-secondary') + if kwargs.get('secondary_hostname'): + secondary_hostname = kwargs['secondary_hostname'] + self._hosts = { + LocationMode.PRIMARY: parsed_url.netloc, + LocationMode.SECONDARY: secondary_hostname} + + self.require_encryption = kwargs.get('require_encryption', False) + self.key_encryption_key = kwargs.get('key_encryption_key') + self.key_resolver_function = kwargs.get('key_resolver_function') + + self._config, self._pipeline = create_pipeline(self.credential, hosts=self._hosts, **kwargs) + + def __enter__(self): + self._client.__enter__() + return self + + def __exit__(self, *args): + self._client.__exit__(*args) + + @property + def url(self): + return self._format_url(self._hosts[self._location_mode]) + + @property + def primary_endpoint(self): + return self._format_url(self._hosts[LocationMode.PRIMARY]) + + @property + def primary_hostname(self): + return self._hosts[LocationMode.PRIMARY] + + @property + def secondary_endpoint(self): + if not self._hosts[LocationMode.SECONDARY]: + raise ValueError("No secondary host configured.") + return self._format_url(self._hosts[LocationMode.SECONDARY]) + + @property + def secondary_hostname(self): + return self._hosts[LocationMode.SECONDARY] + + @property + def location_mode(self): + return self._location_mode + + @location_mode.setter + def location_mode(self, value): + if self._hosts.get(value): + self._location_mode = value + self._client._config.url = self.url # pylint: disable=protected-access + else: + raise ValueError("No host URL for location mode: {}".format(value)) + + def _format_query_string(self, sas_token, credential, snapshot=None): + query_str = "?" + if snapshot: + query_str += 'snapshot={}&'.format(self.snapshot) + if sas_token and not credential: + query_str += sas_token + elif is_credential_sastoken(credential): + query_str += credential.lstrip('?') + credential = None + return query_str.rstrip('?&'), credential + + +def format_shared_key_credential(account, credential): + if isinstance(credential, six.string_types): + if len(account) < 2: + raise ValueError("Unable to determine account name for shared key credential.") + credential = { + 'account_name': account[0], + 'account_key': credential + } + if isinstance(credential, dict): + if 'account_name' not in credential: + raise ValueError("Shared key credential missing 'account_name") + if 'account_key' not in credential: + raise ValueError("Shared key credential missing 'account_key") + return SharedKeyCredentialPolicy(**credential) + return credential + + +service_connection_params = { + 'blob': {'primary': 'BlobEndpoint', 'secondary': 'BlobSecondaryEndpoint'}, + 'queue': {'primary': 'QueueEndpoint', 'secondary': 'QueueSecondaryEndpoint'}, + 'file': {'primary': 'FileEndpoint', 'secondary': 'FileSecondaryEndpoint'}, +} + + +def parse_connection_str(conn_str, credential, service): + conn_str = conn_str.rstrip(';') + conn_settings = dict([s.split('=', 1) for s in conn_str.split(';')]) # pylint: disable=consider-using-dict-comprehension + endpoints = service_connection_params[service] + primary = None + secondary = None + if not credential: + try: + credential = { + 'account_name': conn_settings['AccountName'], + 'account_key': conn_settings['AccountKey'] + } + except KeyError: + credential = conn_settings.get('SharedAccessSignature') + if endpoints['primary'] in conn_settings: + primary = conn_settings[endpoints['primary']] + if endpoints['secondary'] in conn_settings: + secondary = conn_settings[endpoints['secondary']] + else: + if endpoints['secondary'] in conn_settings: + raise ValueError("Connection string specifies only secondary endpoint.") + try: + primary = "{}://{}.{}.{}".format( + conn_settings['DefaultEndpointsProtocol'], + conn_settings['AccountName'], + service, + conn_settings['EndpointSuffix'] + ) + secondary = "{}-secondary.{}.{}".format( + conn_settings['AccountName'], + service, + conn_settings['EndpointSuffix'] + ) + except KeyError: + pass + + if not primary: + try: + primary = "https://{}.{}.{}".format( + conn_settings['AccountName'], + service, + conn_settings.get('EndpointSuffix', SERVICE_HOST_BASE) + ) + except KeyError: + raise ValueError("Connection string missing required connection details.") + return primary, secondary, credential + + +def url_quote(url): + return quote(url) + + +def url_unquote(url): + return unquote(url) + + +def encode_base64(data): + if isinstance(data, six.text_type): + data = data.encode('utf-8') + encoded = base64.b64encode(data) + return encoded.decode('utf-8') + + +def decode_base64(data): + if isinstance(data, six.text_type): + data = data.encode('utf-8') + decoded = base64.b64decode(data) + return decoded.decode('utf-8') + + +def _decode_base64_to_bytes(data): + if isinstance(data, six.text_type): + data = data.encode('utf-8') + return base64.b64decode(data) + + +def _sign_string(key, string_to_sign, key_is_base64=True): + if key_is_base64: + key = _decode_base64_to_bytes(key) + else: + if isinstance(key, six.text_type): + key = key.encode('utf-8') + if isinstance(string_to_sign, six.text_type): + string_to_sign = string_to_sign.encode('utf-8') + signed_hmac_sha256 = hmac.HMAC(key, string_to_sign, hashlib.sha256) + digest = signed_hmac_sha256.digest() + encoded_digest = encode_base64(digest) + return encoded_digest + + +def serialize_iso(attr): + """Serialize Datetime object into ISO-8601 formatted string. + + :param Datetime attr: Object to be serialized. + :rtype: str + :raises: ValueError if format invalid. + """ + if not attr: + return None + if isinstance(attr, str): + attr = isodate.parse_datetime(attr) + try: + utc = attr.utctimetuple() + if utc.tm_year > 9999 or utc.tm_year < 1: + raise OverflowError("Hit max or min date") + + date = "{:04}-{:02}-{:02}T{:02}:{:02}:{:02}".format( + utc.tm_year, utc.tm_mon, utc.tm_mday, + utc.tm_hour, utc.tm_min, utc.tm_sec) + return date + 'Z' + except (ValueError, OverflowError) as err: + msg = "Unable to serialize datetime object." + raise_with_traceback(ValueError, msg, err) + except AttributeError as err: + msg = "ISO-8601 object must be valid Datetime object." + raise_with_traceback(TypeError, msg, err) + + +def get_length(data): + length = None + # Check if object implements the __len__ method, covers most input cases such as bytearray. + try: + length = len(data) + except: # pylint: disable=bare-except + pass + + if not length: + # Check if the stream is a file-like stream object. + # If so, calculate the size using the file descriptor. + try: + fileno = data.fileno() + except (AttributeError, UnsupportedOperation): + pass + else: + return fstat(fileno).st_size + + # If the stream is seekable and tell() is implemented, calculate the stream size. + try: + current_position = data.tell() + data.seek(0, SEEK_END) + length = data.tell() - current_position + data.seek(current_position, SEEK_SET) + except (AttributeError, UnsupportedOperation): + pass + + return length + + +def read_length(data): + try: + if hasattr(data, 'read'): + read_data = b'' + for chunk in iter(lambda: data.read(4096), b""): + read_data += chunk + return len(read_data), read_data + if hasattr(data, '__iter__'): + read_data = b'' + for chunk in data: + read_data += chunk + return len(read_data), read_data + except: # pylint: disable=bare-except + pass + raise ValueError("Unable to calculate content length, please specify.") + + +def parse_length_from_content_range(content_range): + ''' + Parses the blob length from the content range header: bytes 1-3/65537 + ''' + if content_range is None: + return None + + # First, split in space and take the second half: '1-3/65537' + # Next, split on slash and take the second half: '65537' + # Finally, convert to an int: 65537 + return int(content_range.split(' ', 1)[1].split('/', 1)[1]) + + +def validate_and_format_range_headers( + start_range, end_range, start_range_required=True, + end_range_required=True, check_content_md5=False, align_to_page=False): + # If end range is provided, start range must be provided + if (start_range_required or end_range is not None) and start_range is None: + raise ValueError("start_range value cannot be None.") + if end_range_required and end_range is None: + raise ValueError("end_range value cannot be None.") + + # Page ranges must be 512 aligned + if align_to_page: + if start_range is not None and start_range % 512 != 0: + raise ValueError("Invalid page blob start_range: {0}. " + "The size must be aligned to a 512-byte boundary.".format(start_range)) + if end_range is not None and end_range % 512 != 511: + raise ValueError("Invalid page blob end_range: {0}. " + "The size must be aligned to a 512-byte boundary.".format(end_range)) + + # Format based on whether end_range is present + range_header = None + if end_range is not None: + range_header = 'bytes={0}-{1}'.format(start_range, end_range) + elif start_range is not None: + range_header = "bytes={0}-".format(start_range) + + # Content MD5 can only be provided for a complete range less than 4MB in size + range_validation = None + if check_content_md5: + if start_range is None or end_range is None: + raise ValueError("Both start and end range requied for MD5 content validation.") + if end_range - start_range > 4 * 1024 * 1024: + raise ValueError("Getting content MD5 for a range greater than 4MB is not supported.") + range_validation = 'true' + + return range_header, range_validation + + +def normalize_headers(headers): + normalized = {} + for key, value in headers.items(): + if key.startswith('x-ms-'): + key = key[5:] + normalized[key.lower().replace('-', '_')] = value + return normalized + + +def return_response_headers(response, deserialized, response_headers): # pylint: disable=unused-argument + return normalize_headers(response_headers) + + +def return_headers_and_deserialized(response, deserialized, response_headers): # pylint: disable=unused-argument + return normalize_headers(response_headers), deserialized + + +def return_context_and_deserialized(response, deserialized, response_headers): # pylint: disable=unused-argument + return response.location_mode, deserialized + + +def create_configuration(**kwargs): + # type: (**Any) -> Configuration + if 'connection_timeout' not in kwargs: + kwargs['connection_timeout'] = DEFAULT_SOCKET_TIMEOUT + config = Configuration(**kwargs) + config.headers_policy = StorageHeadersPolicy(**kwargs) + config.user_agent_policy = StorageUserAgentPolicy(**kwargs) + config.retry_policy = kwargs.get('retry_policy') or ExponentialRetry(**kwargs) + config.redirect_policy = RedirectPolicy(**kwargs) + config.logging_policy = StorageLoggingPolicy(**kwargs) + config.proxy_policy = ProxyPolicy(**kwargs) + config.blob_settings = StorageBlobSettings(**kwargs) + return config + + +def create_pipeline(credential, **kwargs): + # type: (Any, **Any) -> Tuple[Configuration, Pipeline] + credential_policy = None + if hasattr(credential, 'get_token'): + credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + elif isinstance(credential, SharedKeyCredentialPolicy): + credential_policy = credential + elif credential is not None: + raise TypeError("Unsupported credential: {}".format(credential)) + + config = kwargs.get('_configuration') or create_configuration(**kwargs) + if kwargs.get('_pipeline'): + return config, kwargs['_pipeline'] + transport = kwargs.get('transport') # type: HttpTransport + if not transport: + transport = RequestsTransport(config) + policies = [ + QueueMessagePolicy(), + config.headers_policy, + config.user_agent_policy, + StorageContentValidation(), + StorageRequestHook(**kwargs), + credential_policy, + ContentDecodePolicy(), + config.redirect_policy, + StorageHosts(**kwargs), + config.retry_policy, + config.logging_policy, + StorageResponseHook(**kwargs), + ] + return config, Pipeline(transport, policies=policies) + + +def parse_query(query_str): + sas_values = _QueryStringConstants.to_list() + parsed_query = {k: v[0] for k, v in parse_qs(query_str).items()} + sas_params = ["{}={}".format(k, v) for k, v in parsed_query.items() if k in sas_values] + sas_token = None + if sas_params: + sas_token = '&'.join(sas_params) + + return parsed_query.get('snapshot'), sas_token + + +def is_credential_sastoken(credential): + if not credential or not isinstance(credential, six.string_types): + return False + + sas_values = _QueryStringConstants.to_list() + parsed_query = parse_qs(credential.lstrip('?')) + if parsed_query and all([k in sas_values for k in parsed_query.keys()]): + return True + return False + + +def add_metadata_headers(metadata): + headers = {} + if metadata: + for key, value in metadata.items(): + headers['x-ms-meta-{}'.format(key)] = value + return headers + + +def process_storage_error(storage_error): + raise_error = HttpResponseError + error_code = storage_error.response.headers.get('x-ms-error-code') + error_message = storage_error.message + additional_data = {} + try: + error_body = ContentDecodePolicy.deserialize_from_http_generics(storage_error.response) + if error_body: + for info in error_body.iter(): + if info.tag.lower() == 'code': + error_code = info.text + elif info.tag.lower() == 'message': + error_message = info.text + else: + additional_data[info.tag] = info.text + except DecodeError: + pass + + try: + if error_code: + error_code = StorageErrorCode(error_code) + if error_code in [StorageErrorCode.condition_not_met, + StorageErrorCode.blob_overwritten]: + raise_error = ResourceModifiedError + if error_code in [StorageErrorCode.invalid_authentication_info, + StorageErrorCode.authentication_failed]: + raise_error = ClientAuthenticationError + if error_code in [StorageErrorCode.resource_not_found, + StorageErrorCode.blob_not_found, + StorageErrorCode.queue_not_found, + StorageErrorCode.container_not_found]: + raise_error = ResourceNotFoundError + if error_code in [StorageErrorCode.account_already_exists, + StorageErrorCode.account_being_created, + StorageErrorCode.resource_already_exists, + StorageErrorCode.resource_type_mismatch, + StorageErrorCode.blob_already_exists, + StorageErrorCode.queue_already_exists, + StorageErrorCode.container_already_exists, + StorageErrorCode.container_being_deleted, + StorageErrorCode.queue_being_deleted]: + raise_error = ResourceExistsError + except ValueError: + # Got an unknown error code + pass + + try: + error_message += "\nErrorCode:{}".format(error_code.value) + except AttributeError: + error_message += "\nErrorCode:{}".format(error_code) + for name, info in additional_data.items(): + error_message += "\n{}:{}".format(name, info) + + error = raise_error(message=error_message, response=storage_error.response) + error.error_code = error_code + error.additional_info = additional_data + raise error diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/models.py b/sdk/storage/azure-storage-queue/azure/storage/queue/models.py new file mode 100644 index 000000000000..224508d959fc --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/models.py @@ -0,0 +1,398 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint: disable=too-few-public-methods, too-many-instance-attributes +# pylint: disable=super-init-not-called + +from typing import List # pylint: disable=unused-import +from azure.core.paging import Paged +from ._shared.utils import ( + return_context_and_deserialized, + process_storage_error) +from ._shared.models import DictMixin +from ._generated.models import StorageErrorException +from ._generated.models import AccessPolicy as GenAccessPolicy +from ._generated.models import Logging as GeneratedLogging +from ._generated.models import Metrics as GeneratedMetrics +from ._generated.models import RetentionPolicy as GeneratedRetentionPolicy +from ._generated.models import CorsRule as GeneratedCorsRule + + +class Logging(GeneratedLogging): + """Azure Analytics Logging settings. + + All required parameters must be populated in order to send to Azure. + + :ivar str version: Required. The version of Storage Analytics to configure. + :ivar bool delete: Required. Indicates whether all delete requests should be logged. + :ivar bool read: Required. Indicates whether all read requests should be logged. + :ivar bool write: Required. Indicates whether all write requests should be logged. + :ivar retention_policy: Required. + The retention policy for the metrics. + :vartype retention_policy: ~azure.storage.queue.models.RetentionPolicy + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.delete = kwargs.get('delete', False) + self.read = kwargs.get('read', False) + self.write = kwargs.get('write', False) + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + +class Metrics(GeneratedMetrics): + """A summary of request statistics grouped by API in hour or minute aggregates. + + All required parameters must be populated in order to send to Azure. + + :ivar str version: The version of Storage Analytics to configure. + :ivar bool enabled: Required. Indicates whether metrics are enabled for the service. + :ivar bool include_ap_is: Indicates whether metrics should generate summary + statistics for called API operations. + :ivar retention_policy: Required. + The retention policy for the metrics. + :vartype retention_policy: ~azure.storage.queue.models.RetentionPolicy + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.enabled = kwargs.get('enabled', False) + self.include_apis = kwargs.get('include_apis') + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + +class RetentionPolicy(GeneratedRetentionPolicy): + """The retention policy which determines how long the associated data should + persist. + + All required parameters must be populated in order to send to Azure. + + :param bool enabled: Required. Indicates whether a retention policy is enabled + for the storage service. + :param int days: Indicates the number of days that metrics or logging or + soft-deleted data should be retained. All data older than this value will + be deleted. + """ + + def __init__(self, enabled=False, days=None): + self.enabled = enabled + self.days = days + if self.enabled and (self.days is None): + raise ValueError("If policy is enabled, 'days' must be specified.") + + +class CorsRule(GeneratedCorsRule): + """CORS is an HTTP feature that enables a web application running under one + domain to access resources in another domain. Web browsers implement a + security restriction known as same-origin policy that prevents a web page + from calling APIs in a different domain; CORS provides a secure way to + allow one domain (the origin domain) to call APIs in another domain. + + All required parameters must be populated in order to send to Azure. + + :param list(str) allowed_origins: + A list of origin domains that will be allowed via CORS, or "*" to allow + all domains. The list of must contain at least one entry. Limited to 64 + origin domains. Each allowed origin can have up to 256 characters. + :param list(str) allowed_methods: + A list of HTTP methods that are allowed to be executed by the origin. + The list of must contain at least one entry. For Azure Storage, + permitted methods are DELETE, GET, HEAD, MERGE, POST, OPTIONS or PUT. + :param int max_age_in_seconds: + The number of seconds that the client/browser should cache a + pre-flight response. + :param list(str) exposed_headers: + Defaults to an empty list. A list of response headers to expose to CORS + clients. Limited to 64 defined headers and two prefixed headers. Each + header can be up to 256 characters. + :param list(str) allowed_headers: + Defaults to an empty list. A list of headers allowed to be part of + the cross-origin request. Limited to 64 defined headers and 2 prefixed + headers. Each header can be up to 256 characters. + """ + + def __init__(self, allowed_origins, allowed_methods, **kwargs): + self.allowed_origins = ','.join(allowed_origins) + self.allowed_methods = ','.join(allowed_methods) + self.allowed_headers = ','.join(kwargs.get('allowed_headers', [])) + self.exposed_headers = ','.join(kwargs.get('exposed_headers', [])) + self.max_age_in_seconds = kwargs.get('max_age_in_seconds', 0) + + +class AccessPolicy(GenAccessPolicy): + """Access Policy class used by the set and get access policy methods. + + A stored access policy can specify the start time, expiry time, and + permissions for the Shared Access Signatures with which it's associated. + Depending on how you want to control access to your resource, you can + specify all of these parameters within the stored access policy, and omit + them from the URL for the Shared Access Signature. Doing so permits you to + modify the associated signature's behavior at any time, as well as to revoke + it. Or you can specify one or more of the access policy parameters within + the stored access policy, and the others on the URL. Finally, you can + specify all of the parameters on the URL. In this case, you can use the + stored access policy to revoke the signature, but not to modify its behavior. + + Together the Shared Access Signature and the stored access policy must + include all fields required to authenticate the signature. If any required + fields are missing, the request will fail. Likewise, if a field is specified + both in the Shared Access Signature URL and in the stored access policy, the + request will fail with status code 400 (Bad Request). + + :param str permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + """ + + def __init__(self, permission=None, expiry=None, start=None): + self.start = start + self.expiry = expiry + self.permission = permission + + +class QueueMessage(DictMixin): + """Queue message class. + + :ivar str id: + A GUID value assigned to the message by the Queue service that + identifies the message in the queue. This value may be used together + with the value of pop_receipt to delete a message from the queue after + it has been retrieved with the receive messages operation. + :ivar date insertion_time: + A UTC date value representing the time the messages was inserted. + :ivar date expiration_time: + A UTC date value representing the time the message expires. + :ivar int dequeue_count: + Begins with a value of 1 the first time the message is received. This + value is incremented each time the message is subsequently received. + :param obj content: + The message content. Type is determined by the decode_function set on + the service. Default is str. + :ivar str pop_receipt: + A receipt str which can be used together with the message_id element to + delete a message from the queue after it has been retrieved with the receive + messages operation. Only returned by receive messages operations. Set to + None for peek messages. + :ivar date time_next_visible: + A UTC date value representing the time the message will next be visible. + Only returned by receive messages operations. Set to None for peek messages. + """ + + def __init__(self, content=None): + self.id = None + self.insertion_time = None + self.expiration_time = None + self.dequeue_count = None + self.content = content + self.pop_receipt = None + self.time_next_visible = None + + @classmethod + def _from_generated(cls, generated): + message = cls(content=generated.message_text) + message.id = generated.message_id + message.insertion_time = generated.insertion_time + message.expiration_time = generated.expiration_time + message.dequeue_count = generated.dequeue_count + if hasattr(generated, 'pop_receipt'): + message.pop_receipt = generated.pop_receipt + message.time_next_visible = generated.time_next_visible + return message + + +class MessagesPaged(Paged): + """An iterable of Queue Messages. + + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.queue.models.QueueMessage) + + :param callable command: Function to retrieve the next page of items. + :param int results_per_page: The maximum number of messages to retrieve per + call. + """ + def __init__(self, command, results_per_page=None): + super(MessagesPaged, self).__init__(command, None) + self.results_per_page = results_per_page + + def _advance_page(self): + """Force moving the cursor to the next azure call. + + This method is for advanced usage, iterator protocol is prefered. + + :raises: StopIteration if no further page + :return: The current page list + :rtype: list + """ + self._current_page_iter_index = 0 + try: + messages = self._get_next(number_of_messages=self.results_per_page) + if not messages: + raise StopIteration() + except StorageErrorException as error: + process_storage_error(error) + self.current_page = [QueueMessage._from_generated(q) for q in messages] # pylint: disable=protected-access + return self.current_page + + +class QueueProperties(DictMixin): + """Queue Properties. + + :ivar str name: The name of the queue. + :ivar metadata: + A dict containing name-value pairs associated with the queue as metadata. + This var is set to None unless the include=metadata param was included + for the list queues operation. If this parameter was specified but the + queue has no metadata, metadata will be set to an empty dictionary. + :vartype metadata: dict(str, str) + """ + + def __init__(self, **kwargs): + self.name = None + self.metadata = kwargs.get('metadata') + self.approximate_message_count = kwargs.get('x-ms-approximate-messages-count') + + @classmethod + def _from_generated(cls, generated): + props = cls() + props.name = generated.name + props.metadata = generated.metadata + return props + + +class QueuePropertiesPaged(Paged): + """An iterable of Queue properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A queue name prefix being used to filter the list. + :ivar str current_marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str next_marker: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.queue.models.QueueProperties) + + :param callable command: Function to retrieve the next page of items. + :param str prefix: Filters the results to return only queues whose names + begin with the specified prefix. + :param int results_per_page: The maximum number of queue names to retrieve per + call. + :param str marker: An opaque continuation token. + """ + def __init__(self, command, prefix=None, results_per_page=None, marker=None): + super(QueuePropertiesPaged, self).__init__(command, None) + self.service_endpoint = None + self.prefix = prefix + self.current_marker = None + self.results_per_page = results_per_page + self.next_marker = marker or "" + self.location_mode = None + + def _advance_page(self): + """Force moving the cursor to the next azure call. + + This method is for advanced usage, iterator protocol is prefered. + + :raises: StopIteration if no further page + :return: The current page list + :rtype: list + """ + if self.next_marker is None: + raise StopIteration("End of paging") + self._current_page_iter_index = 0 + try: + self.location_mode, self._response = self._get_next( + marker=self.next_marker or None, + maxresults=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except StorageErrorException as error: + process_storage_error(error) + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.current_marker = self._response.marker + self.results_per_page = self._response.max_results + self.current_page = [QueueProperties._from_generated(q) for q in self._response.queue_items] # pylint: disable=protected-access + self.next_marker = self._response.next_marker or None + return self.current_page + + +class QueuePermissions(object): + """QueuePermissions class to be used with + :func:`~azure.storage.queue.queue_client.QueueClient.generate_shared_access_signature` + method and for the AccessPolicies used with + :func:`~azure.storage.queue.queue_client.QueueClient.set_queue_access_policy`. + + :ivar QueuePermissions QueuePermissions.READ: + Read metadata and properties, including message count. Peek at messages. + :ivar QueuePermissions QueuePermissions.ADD: + Add messages to the queue. + :ivar QueuePermissions QueuePermissions.UPDATE: + Update messages in the queue. Note: Use the Process permission with + Update so you can first get the message you want to update. + :ivar QueuePermissions QueuePermissions.PROCESS: Delete entities. + Get and delete messages from the queue. + :param bool read: + Read metadata and properties, including message count. Peek at messages. + :param bool add: + Add messages to the queue. + :param bool update: + Update messages in the queue. Note: Use the Process permission with + Update so you can first get the message you want to update. + :param bool process: + Get and delete messages from the queue. + :param str _str: + A string representing the permissions. + """ + + READ = None # type: QueuePermissions + ADD = None # type: QueuePermissions + UPDATE = None # type: QueuePermissions + PROCESS = None # type: QueuePermissions + + def __init__(self, read=False, add=False, update=False, process=False, _str=None): + if not _str: + _str = '' + self.read = read or ('r' in _str) + self.add = add or ('a' in _str) + self.update = update or ('u' in _str) + self.process = process or ('p' in _str) + + def __or__(self, other): + return QueuePermissions(_str=str(self) + str(other)) + + def __add__(self, other): + return QueuePermissions(_str=str(self) + str(other)) + + def __str__(self): + return (('r' if self.read else '') + + ('a' if self.add else '') + + ('u' if self.update else '') + + ('p' if self.process else '')) + + +QueuePermissions.READ = QueuePermissions(read=True) +QueuePermissions.ADD = QueuePermissions(add=True) +QueuePermissions.UPDATE = QueuePermissions(update=True) +QueuePermissions.PROCESS = QueuePermissions(process=True) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/queue_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/queue_client.py new file mode 100644 index 000000000000..72372a209f48 --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/queue_client.py @@ -0,0 +1,784 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import functools +from typing import ( # pylint: disable=unused-import + Union, Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple, + TYPE_CHECKING) +try: + from urllib.parse import urlparse, quote, unquote +except ImportError: + from urlparse import urlparse # type: ignore + from urllib2 import quote, unquote # type: ignore + +import six + +from ._shared.shared_access_signature import QueueSharedAccessSignature +from ._shared.utils import ( + StorageAccountHostsMixin, + add_metadata_headers, + process_storage_error, + return_response_headers, + return_headers_and_deserialized, + parse_query, + serialize_iso, + parse_connection_str +) +from ._queue_utils import ( + TextXMLEncodePolicy, + TextXMLDecodePolicy, + deserialize_queue_properties, + deserialize_queue_creation) +from ._generated import AzureQueueStorage +from ._generated.models import StorageErrorException, SignedIdentifier +from ._generated.models import QueueMessage as GenQueueMessage + +from .models import QueueMessage, AccessPolicy, MessagesPaged + +if TYPE_CHECKING: + from datetime import datetime + from azure.core.pipeline.policies import HTTPPolicy + from .models import QueuePermissions, QueueProperties + + +class QueueClient(StorageAccountHostsMixin): + """A client to interact with a specific Queue. + + :ivar str url: + The full endpoint URL to the Queue, including SAS token if used. This could be + either the primary endpoint, or the secondard endpint depending on the current `location_mode`. + :ivar str primary_endpoint: + The full primary endpoint URL. + :ivar str primary_hostname: + The hostname of the primary endpoint. + :ivar str secondary_endpoint: + The full secondard endpoint URL if configured. If not available + a ValueError will be raised. To explicitly specify a secondary hostname, use the optional + `secondary_hostname` keyword argument on instantiation. + :ivar str secondary_hostname: + The hostname of the secondary endpoint. If not available this + will be None. To explicitly specify a secondary hostname, use the optional + `secondary_hostname` keyword argument on instantiation. + :ivar str location_mode: + The location mode that the client is currently using. By default + this will be "primary". Options include "primary" and "secondary". + :param str queue_url: The full URI to the queue. This can also be a URL to the storage + account, in which case the queue must also be specified. + :param queue: The queue. If specified, this value will override + a queue value specified in the queue URL. + :type queue: str or ~azure.storage.queue.models.QueueProperties + :param credential: + The credentials with which to authenticate. This is optional if the + account URL already has a SAS token. The value can be a SAS token string, and account + shared access key, or an instance of a TokenCredentials class from azure.identity. + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START create_queue_client] + :end-before: [END create_queue_client] + :language: python + :dedent: 12 + :caption: Create the queue client with url and credential. + """ + def __init__( + self, queue_url, # type: str + queue=None, # type: Optional[Union[QueueProperties, str]] + credential=None, # type: Optional[Any] + **kwargs # type: Any + ): + # type: (...) -> None + try: + if not queue_url.lower().startswith('http'): + queue_url = "https://" + queue_url + except AttributeError: + raise ValueError("Queue URL must be a string.") + parsed_url = urlparse(queue_url.rstrip('/')) + if not parsed_url.path and not queue: + raise ValueError("Please specify a queue name.") + if not parsed_url.netloc: + raise ValueError("Invalid URL: {}".format(parsed_url)) + + path_queue = "" + if parsed_url.path: + path_queue = parsed_url.path.lstrip('/').partition('/')[0] + _, sas_token = parse_query(parsed_url.query) + if not sas_token and not credential: + raise ValueError("You need to provide either a SAS token or an account key to authenticate.") + try: + self.queue_name = queue.name # type: ignore + except AttributeError: + self.queue_name = queue or unquote(path_queue) + self._query_str, credential = self._format_query_string(sas_token, credential) + super(QueueClient, self).__init__(parsed_url, 'queue', credential, **kwargs) + + self._config.message_encode_policy = kwargs.get('message_encode_policy') or TextXMLEncodePolicy() + self._config.message_decode_policy = kwargs.get('message_decode_policy') or TextXMLDecodePolicy() + self._client = AzureQueueStorage(self.url, pipeline=self._pipeline) + + def _format_url(self, hostname): + """Format the endpoint URL according to the current location + mode hostname. + """ + queue_name = self.queue_name + if isinstance(queue_name, six.text_type): + queue_name = queue_name.encode('UTF-8') + return "{}://{}/{}{}".format( + self.scheme, + hostname, + quote(queue_name), + self._query_str) + + @classmethod + def from_connection_string( + cls, conn_str, # type: str + queue, # type: Union[str, QueueProperties] + credential=None, # type: Any + **kwargs # type: Any + ): + # type: (...) -> None + """Create QueueClient from a Connection String. + + :param str conn_str: + A connection string to an Azure Storage account. + :param queue: The queue. This can either be the name of the queue, + or an instance of QueueProperties. + :type queue: str or ~azure.storage.queue.models.QueueProperties + :param credential: + The credentials with which to authenticate. This is optional if the + account URL already has a SAS token, or the connection string already has shared + access key values. The value can be a SAS token string, and account shared access + key, or an instance of a TokenCredentials class from azure.identity. + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START create_queue_client_from_connection_string] + :end-before: [END create_queue_client_from_connection_string] + :language: python + :dedent: 8 + :caption: Create the queue client from connection string. + """ + account_url, secondary, credential = parse_connection_str( + conn_str, credential, 'queue') + if 'secondary_hostname' not in kwargs: + kwargs['secondary_hostname'] = secondary + return cls(account_url, queue=queue, credential=credential, **kwargs) # type: ignore + + def generate_shared_access_signature( + self, permission=None, # type: Optional[Union[QueuePermissions, str]] + expiry=None, # type: Optional[Union[datetime, str]] + start=None, # type: Optional[Union[datetime, str]] + policy_id=None, # type: Optional[str] + ip=None, # type: Optional[str] + protocol=None # type: Optional[str] + ): + """Generates a shared access signature for the queue. + + Use the returned signature with the credential parameter of any Queue Service. + + :param ~azure.storage.queue.models.QueuePermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + Required unless a policy_id is given referencing a stored access policy + which contains this field. This field must be omitted if it has been + specified in an associated stored access policy. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless a policy_id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str policy_id: + A unique value up to 64 characters in length that correlates to a + stored access policy. To create a stored access policy, use :func:`~set_queue_access_policy`. + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip='168.1.5.65' or sip='168.1.5.60-168.1.5.70' on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. + :return: A Shared Access Signature (sas) token. + :rtype: str + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START queue_client_sas_token] + :end-before: [END queue_client_sas_token] + :language: python + :dedent: 12 + :caption: Generate a sas token. + """ + if not hasattr(self.credential, 'account_key') and not self.credential.account_key: + raise ValueError("No account SAS key available.") + sas = QueueSharedAccessSignature( + self.credential.account_name, self.credential.account_key) + return sas.generate_queue( + self.queue_name, + permission=permission, + expiry=expiry, + start=start, + policy_id=policy_id, + ip=ip, + protocol=protocol, + ) + + def create_queue(self, metadata=None, timeout=None, **kwargs): + # type: (Optional[Dict[str, Any]], Optional[int], Optional[Any]) -> None + """Creates a new queue in the storage account. + + If a queue with the same name already exists, the operation fails. + + :param metadata: + A dict containing name-value pairs to associate with the queue as + metadata. Note that metadata names preserve the case with which they + were created, but are case-insensitive when set or read. + :type metadata: dict(str, str) + :param int timeout: + The server timeout, expressed in seconds. + :return: None or the result of cls(response) + :rtype: None + :raises: + ~azure.storage.queue._generated.models._models.StorageErrorException + + Example: + .. literalinclude:: ../tests/samples/test_samples_hello_world.py + :start-after: [START create_queue] + :end-before: [END create_queue] + :language: python + :dedent: 8 + :caption: Create a queue. + """ + headers = kwargs.pop('headers', {}) + headers.update(add_metadata_headers(metadata)) # type: ignore + try: + return self._client.queue.create( # type: ignore + metadata=metadata, + timeout=timeout, + headers=headers, + cls=deserialize_queue_creation, + **kwargs) + except StorageErrorException as error: + process_storage_error(error) + + def delete_queue(self, timeout=None, **kwargs): + # type: (Optional[int], Optional[Any]) -> None + """Deletes the specified queue and any messages it contains. + + When a queue is successfully deleted, it is immediately marked for deletion + and is no longer accessible to clients. The queue is later removed from + the Queue service during garbage collection. + + Note that deleting a queue is likely to take at least 40 seconds to complete. + If an operation is attempted against the queue while it was being deleted, + an :class:`HttpResponseError` will be thrown. + + :param int timeout: + The server timeout, expressed in seconds. + :rtype: None + + Example: + .. literalinclude:: ../tests/samples/test_samples_hello_world.py + :start-after: [START delete_queue] + :end-before: [END delete_queue] + :language: python + :dedent: 12 + :caption: Delete a queue. + """ + try: + self._client.queue.delete(timeout=timeout, **kwargs) + except StorageErrorException as error: + process_storage_error(error) + + def get_queue_properties(self, timeout=None, **kwargs): + # type: (Optional[int], Optional[Any]) -> QueueProperties + """Returns all user-defined metadata for the specified queue. + + The data returned does not include the queue's list of messages. + + :param int timeout: + The timeout parameter is expressed in seconds. + :return: Properties for the specified container within a container object. + :rtype: ~azure.storage.queue.models.QueueProperties + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START get_queue_properties] + :end-before: [END get_queue_properties] + :language: python + :dedent: 12 + :caption: Get the properties on the queue. + """ + try: + response = self._client.queue.get_properties( + timeout=timeout, + cls=deserialize_queue_properties, + **kwargs) + except StorageErrorException as error: + process_storage_error(error) + response.name = self.queue_name + return response # type: ignore + + def set_queue_metadata(self, metadata=None, timeout=None, **kwargs): + # type: (Optional[Dict[str, Any]], Optional[int], Optional[Any]) -> None + """Sets user-defined metadata on the specified queue. + + Metadata is associated with the queue as name-value pairs. + + :param metadata: + A dict containing name-value pairs to associate with the + queue as metadata. + :type metadata: dict(str, str) + :param int timeout: + The server timeout, expressed in seconds. + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START set_queue_metadata] + :end-before: [END set_queue_metadata] + :language: python + :dedent: 12 + :caption: Set metadata on the queue. + """ + headers = kwargs.pop('headers', {}) + headers.update(add_metadata_headers(metadata)) # type: ignore + try: + return self._client.queue.set_metadata( # type: ignore + timeout=timeout, + headers=headers, + cls=return_response_headers, + **kwargs) + except StorageErrorException as error: + process_storage_error(error) + + def get_queue_access_policy(self, timeout=None, **kwargs): + # type: (Optional[int], Optional[Any]) -> Dict[str, Any] + """Returns details about any stored access policies specified on the + queue that may be used with Shared Access Signatures. + + :param int timeout: + The server timeout, expressed in seconds. + :return: A dictionary of access policies associated with the queue. + :rtype: dict(str, :class:`~azure.storage.queue.models.AccessPolicy`) + """ + try: + _, identifiers = self._client.queue.get_access_policy( + timeout=timeout, + cls=return_headers_and_deserialized, + **kwargs) + except StorageErrorException as error: + process_storage_error(error) + return {s.id: s.access_policy or AccessPolicy() for s in identifiers} + + def set_queue_access_policy(self, signed_identifiers=None, timeout=None, **kwargs): + # type: (Optional[Dict[str, Optional[AccessPolicy]]], Optional[int], Optional[Any]) -> None + """Sets stored access policies for the queue that may be used with Shared + Access Signatures. + + When you set permissions for a queue, the existing permissions are replaced. + To update the queue's permissions, call :func:`~get_queue_access_policy` to fetch + all access policies associated with the queue, modify the access policy + that you wish to change, and then call this function with the complete + set of data to perform the update. + + When you establish a stored access policy on a queue, it may take up to + 30 seconds to take effect. During this interval, a shared access signature + that is associated with the stored access policy will throw an + :class:`HttpResponseError` until the access policy becomes active. + + :param signed_identifiers: + A list of SignedIdentifier access policies to associate with the queue. + The list may contain up to 5 elements. An empty list + will clear the access policies set on the service. + :type signed_identifiers: dict(str, :class:`~azure.storage.queue.models.AccessPolicy`) + :param int timeout: + The server timeout, expressed in seconds. + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START set_access_policy] + :end-before: [END set_access_policy] + :language: python + :dedent: 12 + :caption: Set an access policy on the queue. + """ + if signed_identifiers: + if len(signed_identifiers) > 15: + raise ValueError( + 'Too many access policies provided. The server does not support setting ' + 'more than 15 access policies on a single resource.') + identifiers = [] + for key, value in signed_identifiers.items(): + if value: + value.start = serialize_iso(value.start) + value.expiry = serialize_iso(value.expiry) + identifiers.append(SignedIdentifier(id=key, access_policy=value)) + signed_identifiers = identifiers # type: ignore + try: + self._client.queue.set_access_policy( + queue_acl=signed_identifiers or None, + timeout=timeout, + **kwargs) + except StorageErrorException as error: + process_storage_error(error) + + def enqueue_message( # type: ignore + self, content, # type: Any + visibility_timeout=None, # type: Optional[int] + time_to_live=None, # type: Optional[int] + timeout=None, # type: Optional[int] + **kwargs # type: Optional[Any] + ): + # type: (...) -> QueueMessage + """Adds a new message to the back of the message queue. + + The visibility timeout specifies the time that the message will be + invisible. After the timeout expires, the message will become visible. + If a visibility timeout is not specified, the default value of 0 is used. + + The message time-to-live specifies how long a message will remain in the + queue. The message will be deleted from the queue when the time-to-live + period expires. + + If the key-encryption-key field is set on the local service object, this method will + encrypt the content before uploading. + + :param obj content: + Message content. Allowed type is determined by the encode_function + set on the service. Default is str. The encoded message can be up to + 64KB in size. + :param int visibility_timeout: + If not specified, the default value is 0. Specifies the + new visibility timeout value, in seconds, relative to server time. + The value must be larger than or equal to 0, and cannot be + larger than 7 days. The visibility timeout of a message cannot be + set to a value later than the expiry time. visibility_timeout + should be set to a value smaller than the time-to-live value. + :param int time_to_live: + Specifies the time-to-live interval for the message, in + seconds. The time-to-live may be any positive number or -1 for infinity. If this + parameter is omitted, the default time-to-live is 7 days. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A :class:`~azure.storage.queue.models.QueueMessage` object. + This object is also populated with the content although it is not + returned from the service. + :rtype: ~azure.storage.queue.models.QueueMessage + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START enqueue_messages] + :end-before: [END enqueue_messages] + :language: python + :dedent: 12 + :caption: Enqueue messages. + """ + self._config.message_encode_policy.configure( + self.require_encryption, + self.key_encryption_key, + self.key_resolver_function) + content = self._config.message_encode_policy(content) + new_message = GenQueueMessage(message_text=content) + + try: + enqueued = self._client.messages.enqueue( + queue_message=new_message, + visibilitytimeout=visibility_timeout, + message_time_to_live=time_to_live, + timeout=timeout, + **kwargs) + queue_message = QueueMessage(content=new_message.message_text) + queue_message.id = enqueued[0].message_id + queue_message.insertion_time = enqueued[0].insertion_time + queue_message.expiration_time = enqueued[0].expiration_time + queue_message.pop_receipt = enqueued[0].pop_receipt + queue_message.time_next_visible = enqueued[0].time_next_visible + return queue_message + except StorageErrorException as error: + process_storage_error(error) + + def receive_messages(self, messages_per_page=None, visibility_timeout=None, timeout=None, **kwargs): # type: ignore + # type: (Optional[int], Optional[int], Optional[int], Optional[Any]) -> QueueMessage + """Removes one or more messages from the front of the queue. + + When a message is retrieved from the queue, the response includes the message + content and a pop_receipt value, which is required to delete the message. + The message is not automatically deleted from the queue, but after it has + been retrieved, it is not visible to other clients for the time interval + specified by the visibility_timeout parameter. + + If the key-encryption-key or resolver field is set on the local service object, the messages will be + decrypted before being returned. + + :param int messages_per_page: + A nonzero integer value that specifies the number of + messages to retrieve from the queue, up to a maximum of 32. If + fewer are visible, the visible messages are returned. By default, + a single message is retrieved from the queue with this operation. + :param int visibility_timeout: + If not specified, the default value is 0. Specifies the + new visibility timeout value, in seconds, relative to server time. + The value must be larger than or equal to 0, and cannot be + larger than 7 days. The visibility timeout of a message cannot be + set to a value later than the expiry time. visibility_timeout + should be set to a value smaller than the time-to-live value. + :param int timeout: + The server timeout, expressed in seconds. + :return: + Returns a message iterator of dict-like Message objects. + :rtype: ~azure.storage.queue.models.MessagesPaged + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START receive_messages] + :end-before: [END receive_messages] + :language: python + :dedent: 12 + :caption: Receive messages from the queue. + """ + self._config.message_decode_policy.configure( + self.require_encryption, + self.key_encryption_key, + self.key_resolver_function) + try: + command = functools.partial( + self._client.messages.dequeue, + visibilitytimeout=visibility_timeout, + timeout=timeout, + cls=self._config.message_decode_policy, + **kwargs + ) + return MessagesPaged(command, results_per_page=messages_per_page) + except StorageErrorException as error: + process_storage_error(error) + + def update_message(self, message, visibility_timeout=None, pop_receipt=None, # type: ignore + content=None, timeout=None, **kwargs): + # type: (Any, int, Optional[str], Optional[Any], Optional[int], Any) -> QueueMessage + """Updates the visibility timeout of a message. You can also use this + operation to update the contents of a message. + + This operation can be used to continually extend the invisibility of a + queue message. This functionality can be useful if you want a worker role + to "lease" a queue message. For example, if a worker role calls :func:`~receive_messages()` + and recognizes that it needs more time to process a message, it can + continually extend the message's invisibility until it is processed. If + the worker role were to fail during processing, eventually the message + would become visible again and another worker role could process it. + + If the key-encryption-key field is set on the local service object, this method will + encrypt the content before uploading. + + :param str message: + The message object or id identifying the message to update. + :param int visibility_timeout: + Specifies the new visibility timeout value, in seconds, + relative to server time. The new value must be larger than or equal + to 0, and cannot be larger than 7 days. The visibility timeout of a + message cannot be set to a value later than the expiry time. A + message can be updated until it has been deleted or has expired. + The message object or message id identifying the message to update. + :param str pop_receipt: + A valid pop receipt value returned from an earlier call + to the :func:`~receive_messages` or :func:`~update_message` operation. + :param obj content: + Message content. Allowed type is determined by the encode_function + set on the service. Default is str. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A :class:`~azure.storage.queue.models.QueueMessage` object. For convenience, + this object is also populated with the content, although it is not returned by the service. + :rtype: ~azure.storage.queue.models.QueueMessage + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START update_message] + :end-before: [END update_message] + :language: python + :dedent: 12 + :caption: Update a message. + """ + try: + message_id = message.id + message_text = content or message.content + receipt = pop_receipt or message.pop_receipt + insertion_time = message.insertion_time + expiration_time = message.expiration_time + dequeue_count = message.dequeue_count + except AttributeError: + message_id = message + message_text = content + receipt = pop_receipt + insertion_time = None + expiration_time = None + dequeue_count = None + + if receipt is None: + raise ValueError("pop_receipt must be present") + if message_text is not None: + self._config.message_encode_policy.configure( + self.require_encryption, + self.key_encryption_key, + self.key_resolver_function) + message_text = self._config.message_encode_policy(message_text) + updated = GenQueueMessage(message_text=message_text) + else: + updated = None # type: ignore + try: + response = self._client.message_id.update( + queue_message=updated, + visibilitytimeout=visibility_timeout or 0, + timeout=timeout, + pop_receipt=receipt, + cls=return_response_headers, + queue_message_id=message_id, + **kwargs) + new_message = QueueMessage(content=message_text) + new_message.id = message_id + new_message.insertion_time = insertion_time + new_message.expiration_time = expiration_time + new_message.dequeue_count = dequeue_count + new_message.pop_receipt = response['popreceipt'] + new_message.time_next_visible = response['time_next_visible'] + return new_message + except StorageErrorException as error: + process_storage_error(error) + + def peek_messages(self, max_messages=None, timeout=None, **kwargs): # type: ignore + # type: (Optional[int], Optional[int], Optional[Any]) -> List[QueueMessage] + """Retrieves one or more messages from the front of the queue, but does + not alter the visibility of the message. + + Only messages that are visible may be retrieved. When a message is retrieved + for the first time with a call to :func:`~receive_messages`, its dequeue_count property + is set to 1. If it is not deleted and is subsequently retrieved again, the + dequeue_count property is incremented. The client may use this value to + determine how many times a message has been retrieved. Note that a call + to peek_messages does not increment the value of DequeueCount, but returns + this value for the client to read. + + If the key-encryption-key or resolver field is set on the local service object, + the messages will be decrypted before being returned. + + :param int max_messages: + A nonzero integer value that specifies the number of + messages to peek from the queue, up to a maximum of 32. By default, + a single message is peeked from the queue with this operation. + :param int timeout: + The server timeout, expressed in seconds. + :return: + A list of :class:`~azure.storage.queue.models.QueueMessage` objects. Note that + time_next_visible and pop_receipt will not be populated as peek does + not pop the message and can only retrieve already visible messages. + :rtype: list(:class:`~azure.storage.queue.models.QueueMessage`) + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START peek_message] + :end-before: [END peek_message] + :language: python + :dedent: 12 + :caption: Peek messages. + """ + if max_messages and not 1 <= max_messages <= 32: + raise ValueError("Number of messages to peek should be between 1 and 32") + self._config.message_decode_policy.configure( + self.require_encryption, + self.key_encryption_key, + self.key_resolver_function) + try: + messages = self._client.messages.peek( + number_of_messages=max_messages, + timeout=timeout, + cls=self._config.message_decode_policy, + **kwargs) + wrapped_messages = [] + for peeked in messages: + wrapped_messages.append(QueueMessage._from_generated(peeked)) # pylint: disable=protected-access + return wrapped_messages + except StorageErrorException as error: + process_storage_error(error) + + def clear_messages(self, timeout=None, **kwargs): + # type: (Optional[int], Optional[Any]) -> None + """Deletes all messages from the specified queue. + + :param int timeout: + The server timeout, expressed in seconds. + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START clear_messages] + :end-before: [END clear_messages] + :language: python + :dedent: 12 + :caption: Clears all messages. + """ + try: + self._client.messages.clear(timeout=timeout, **kwargs) + except StorageErrorException as error: + process_storage_error(error) + + def delete_message(self, message, pop_receipt=None, timeout=None, **kwargs): + # type: (Any, Optional[str], Optional[str], Optional[int]) -> None + """Deletes the specified message. + + Normally after a client retrieves a message with the receive messages operation, + the client is expected to process and delete the message. To delete the + message, you must have the message object itself, or two items of data: id and pop_receipt. + The id is returned from the previous receive_messages operation. The + pop_receipt is returned from the most recent :func:`~receive_messages` or + :func:`~update_message` operation. In order for the delete_message operation + to succeed, the pop_receipt specified on the request must match the + pop_receipt returned from the :func:`~receive_messages` or :func:`~update_message` + operation. + + :param str message: + The message object or id identifying the message to delete. + :param str pop_receipt: + A valid pop receipt value returned from an earlier call + to the :func:`~receive_messages` or :func:`~update_message`. + :param int timeout: + The server timeout, expressed in seconds. + + Example: + .. literalinclude:: ../tests/samples/test_samples_message_queue.py + :start-after: [START delete_message] + :end-before: [END delete_message] + :language: python + :dedent: 12 + :caption: Delete a message. + """ + try: + message_id = message.id + receipt = pop_receipt or message.pop_receipt + except AttributeError: + message_id = message + receipt = pop_receipt + + if receipt is None: + raise ValueError("pop_receipt must be present") + try: + self._client.message_id.delete( + pop_receipt=receipt, + timeout=timeout, + queue_message_id=message_id, + **kwargs + ) + except StorageErrorException as error: + process_storage_error(error) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/queue_service_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/queue_service_client.py new file mode 100644 index 000000000000..0dd7c3a9789b --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/queue_service_client.py @@ -0,0 +1,447 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import functools +from typing import ( # pylint: disable=unused-import + Union, Optional, Any, Iterable, Dict, List, + TYPE_CHECKING) +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse # type: ignore + +from ._shared.shared_access_signature import SharedAccessSignature +from ._shared.models import LocationMode, Services +from ._shared.utils import ( + StorageAccountHostsMixin, + parse_query, + parse_connection_str, + process_storage_error) +from ._generated import AzureQueueStorage +from ._generated.models import StorageServiceProperties, StorageErrorException + +from .models import QueuePropertiesPaged +from .queue_client import QueueClient + +if TYPE_CHECKING: + from datetime import datetime + from azure.core import Configuration + from azure.core.pipeline.policies import HTTPPolicy + from ._shared.models import AccountPermissions, ResourceTypes + from .models import ( + QueueProperties, + Logging, + Metrics, + CorsRule + ) + + +class QueueServiceClient(StorageAccountHostsMixin): + """A client to interact with the Queue Service at the account level. + + This client provides operations to retrieve and configure the account properties + as well as list, create and delete queues within the account. + For operations relating to a specific queue, a client for this entity + can be retrieved using the :func:`~get_queue_client` function. + + :ivar str url: + The full queue service endpoint URL, including SAS token if used. This could be + either the primary endpoint, or the secondard endpint depending on the current `location_mode`. + :ivar str primary_endpoint: + The full primary endpoint URL. + :ivar str primary_hostname: + The hostname of the primary endpoint. + :ivar str secondary_endpoint: + The full secondard endpoint URL if configured. If not available + a ValueError will be raised. To explicitly specify a secondary hostname, use the optional + `secondary_hostname` keyword argument on instantiation. + :ivar str secondary_hostname: + The hostname of the secondary endpoint. If not available this + will be None. To explicitly specify a secondary hostname, use the optional + `secondary_hostname` keyword argument on instantiation. + :ivar str location_mode: + The location mode that the client is currently using. By default + this will be "primary". Options include "primary" and "secondary". + :param str account_url: + The URL to the queue service endpoint. Any other entities included + in the URL path (e.g. queue) will be discarded. This URL can be optionally + authenticated with a SAS token. + :param credential: + The credentials with which to authenticate. This is optional if the + account URL already has a SAS token. The value can be a SAS token string, and account + shared access key, or an instance of a TokenCredentials class from azure.identity. + + Example: + .. literalinclude:: ../tests/samples/test_samples_authentication.py + :start-after: [START create_queue_service_client] + :end-before: [END create_queue_service_client] + :language: python + :dedent: 8 + :caption: Creating the QueueServiceClient with an account url and credential. + """ + + def __init__( + self, account_url, # type: str + credential=None, # type: Optional[Any] + **kwargs # type: Any + ): + # type: (...) -> None + try: + if not account_url.lower().startswith('http'): + account_url = "https://" + account_url + except AttributeError: + raise ValueError("Account URL must be a string.") + parsed_url = urlparse(account_url.rstrip('/')) + if not parsed_url.netloc: + raise ValueError("Invalid URL: {}".format(account_url)) + + _, sas_token = parse_query(parsed_url.query) + if not sas_token and not credential: + raise ValueError("You need to provide either a SAS token or an account key to authenticate.") + self._query_str, credential = self._format_query_string(sas_token, credential) + super(QueueServiceClient, self).__init__(parsed_url, 'queue', credential, **kwargs) + self._client = AzureQueueStorage(self.url, pipeline=self._pipeline) + + def _format_url(self, hostname): + """Format the endpoint URL according to the current location + mode hostname. + """ + return "{}://{}/{}".format(self.scheme, hostname, self._query_str) + + @classmethod + def from_connection_string( + cls, conn_str, # type: str + credential=None, # type: Optional[Any] + **kwargs # type: Any + ): + """Create QueueServiceClient from a Connection String. + + :param str conn_str: + A connection string to an Azure Storage account. + :param credential: + The credentials with which to authenticate. This is optional if the + account URL already has a SAS token, or the connection string already has shared + access key values. The value can be a SAS token string, and account shared access + key, or an instance of a TokenCredentials class from azure.identity. + + Example: + .. literalinclude:: ../tests/samples/test_samples_authentication.py + :start-after: [START auth_from_connection_string] + :end-before: [END auth_from_connection_string] + :language: python + :dedent: 8 + :caption: Creating the QueueServiceClient with a connection string. + """ + account_url, secondary, credential = parse_connection_str( + conn_str, credential, 'queue') + if 'secondary_hostname' not in kwargs: + kwargs['secondary_hostname'] = secondary + return cls(account_url, credential=credential, **kwargs) + + def generate_shared_access_signature( + self, resource_types, # type: Union[ResourceTypes, str] + permission, # type: Union[AccountPermissions, str] + expiry, # type: Optional[Union[datetime, str]] + start=None, # type: Optional[Union[datetime, str]] + ip=None, # type: Optional[str] + protocol=None # type: Optional[str] + ): + """Generates a shared access signature for the queue service. + + Use the returned signature with the credential parameter of any Queue Service. + + :param ~azure.storage.queue._shared.models.ResourceTypes resource_types: + Specifies the resource types that are accessible with the account SAS. + :param ~azure.storage.queue._shared.models.AccountPermissions permission: + The permissions associated with the shared access signature. The + user is restricted to operations allowed by the permissions. + :param expiry: + The time at which the shared access signature becomes invalid. + Required unless an id is given referencing a stored access policy + which contains this field. This field must be omitted if it has + been specified in an associated stored access policy. Azure will always + convert values to UTC. If a date is passed in without timezone info, it + is assumed to be UTC. + :type expiry: datetime or str + :param start: + The time at which the shared access signature becomes valid. If + omitted, start time for this call is assumed to be the time when the + storage service receives the request. Azure will always convert values + to UTC. If a date is passed in without timezone info, it is assumed to + be UTC. + :type start: datetime or str + :param str ip: + Specifies an IP address or a range of IP addresses from which to accept requests. + If the IP address from which the request originates does not match the IP address + or address range specified on the SAS token, the request is not authenticated. + For example, specifying sip=168.1.5.65 or sip=168.1.5.60-168.1.5.70 on the SAS + restricts the request to those IP addresses. + :param str protocol: + Specifies the protocol permitted for a request made. The default value + is https,http. + :return: A Shared Access Signature (sas) token. + :rtype: str + """ + if not hasattr(self.credential, 'account_key') and not self.credential.account_key: + raise ValueError("No account SAS key available.") + + sas = SharedAccessSignature(self.credential.account_name, self.credential.account_key) + return sas.generate_account( + Services.QUEUE, resource_types, permission, expiry, start=start, ip=ip, protocol=protocol) # type: ignore + + def get_service_stats(self, timeout=None, **kwargs): # type: ignore + # type: (Optional[int], Optional[Any]) -> Dict[str, Any] + """Retrieves statistics related to replication for the Queue service. + + It is only available when read-access geo-redundant replication is enabled for + the storage account. + + With geo-redundant replication, Azure Storage maintains your data durable + in two locations. In both locations, Azure Storage constantly maintains + multiple healthy replicas of your data. The location where you read, + create, update, or delete data is the primary storage account location. + The primary location exists in the region you choose at the time you + create an account via the Azure Management Azure classic portal, for + example, North Central US. The location to which your data is replicated + is the secondary location. The secondary location is automatically + determined based on the location of the primary; it is in a second data + center that resides in the same region as the primary location. Read-only + access is available from the secondary location, if read-access geo-redundant + replication is enabled for your storage account. + + :param int timeout: + The timeout parameter is expressed in seconds. + :return: The queue service stats. + :rtype: ~azure.storage.queue._generated.models._models.StorageServiceStats + """ + try: + return self._client.service.get_statistics( # type: ignore + timeout=timeout, use_location=LocationMode.SECONDARY, **kwargs) + except StorageErrorException as error: + process_storage_error(error) + + def get_service_properties(self, timeout=None, **kwargs): # type: ignore + # type: (Optional[int], Optional[Any]) -> Dict[str, Any] + """Gets the properties of a storage account's Queue service, including + Azure Storage Analytics. + + :param int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.queue._generated.models._models.StorageServiceProperties + + Example: + .. literalinclude:: ../tests/samples/test_samples_queue_service.py + :start-after: [START get_queue_service_properties] + :end-before: [END get_queue_service_properties] + :language: python + :dedent: 8 + :caption: Getting queue service properties. + """ + try: + return self._client.service.get_properties(timeout=timeout, **kwargs) # type: ignore + except StorageErrorException as error: + process_storage_error(error) + + def set_service_properties( # type: ignore + self, logging=None, # type: Optional[Logging] + hour_metrics=None, # type: Optional[Metrics] + minute_metrics=None, # type: Optional[Metrics] + cors=None, # type: Optional[List[CorsRule]] + timeout=None, # type: Optional[int] + **kwargs + ): + # type: (...) -> None + """Sets the properties of a storage account's Queue service, including + Azure Storage Analytics. + + If an element (e.g. Logging) is left as None, the + existing settings on the service for that functionality are preserved. + + :param logging: + Groups the Azure Analytics Logging settings. + :type logging: ~azure.storage.queue.models.Logging + :param hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates for queues. + :type hour_metrics: ~azure.storage.queue.models.Metrics + :param minute_metrics: + The minute metrics settings provide request statistics + for each minute for queues. + :type minute_metrics: ~azure.storage.queue.models.Metrics + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list(:class:`~azure.storage.queue.models.CorsRule`) + :param int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + + Example: + .. literalinclude:: ../tests/samples/test_samples_queue_service.py + :start-after: [START set_queue_service_properties] + :end-before: [END set_queue_service_properties] + :language: python + :dedent: 8 + :caption: Setting queue service properties. + """ + props = StorageServiceProperties( + logging=logging, + hour_metrics=hour_metrics, + minute_metrics=minute_metrics, + cors=cors + ) + try: + return self._client.service.set_properties(props, timeout=timeout, **kwargs) # type: ignore + except StorageErrorException as error: + process_storage_error(error) + + def list_queues( + self, name_starts_with=None, # type: Optional[str] + include_metadata=False, # type: Optional[bool] + marker=None, # type: Optional[str] + results_per_page=None, # type: Optional[int] + timeout=None, # type: Optional[int] + **kwargs + ): + # type: (...) -> QueuePropertiesPaged + """Returns a generator to list the queues under the specified account. + + The generator will lazily follow the continuation tokens returned by + the service and stop when all queues have been returned. + + :param str name_starts_with: + Filters the results to return only queues whose names + begin with the specified prefix. + :param bool include_metadata: + Specifies that queue metadata be returned in the response. + :param str marker: + An opaque continuation token. This value can be retrieved from the + next_marker field of a previous generator object. If specified, + this generator will begin returning results from this point. + :param int results_per_page: + The maximum number of queue names to retrieve per API + call. If the request does not specify the server will return up to 5,000 items. + :param int timeout: + The server timeout, expressed in seconds. This function may make multiple + calls to the service in which case the timeout value specified will be + applied to each individual call. + :returns: An iterable (auto-paging) of QueueProperties. + :rtype: ~azure.core.queue.models.QueuePropertiesPaged + + Example: + .. literalinclude:: ../tests/samples/test_samples_queue_service.py + :start-after: [START qsc_list_queues] + :end-before: [END qsc_list_queues] + :language: python + :dedent: 12 + :caption: List queues in the service. + """ + include = ['metadata'] if include_metadata else None + command = functools.partial( + self._client.service.list_queues_segment, + prefix=name_starts_with, + include=include, + timeout=timeout, + **kwargs) + return QueuePropertiesPaged( + command, prefix=name_starts_with, results_per_page=results_per_page, marker=marker) + + def create_queue( + self, name, # type: str + metadata=None, # type: Optional[Dict[str, str]] + timeout=None, # type: Optional[int] + **kwargs + ): + # type: (...) -> QueueClient + """Creates a new queue under the specified account. + + If a queue with the same name already exists, the operation fails. + Returns a client with which to interact with the newly created queue. + + :param str name: The name of the queue to create. + :param metadata: + A dict with name_value pairs to associate with the + queue as metadata. Example: {'Category': 'test'} + :type metadata: dict(str, str) + :param int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.queue.queue_client.QueueClient + + Example: + .. literalinclude:: ../tests/samples/test_samples_queue_service.py + :start-after: [START qsc_create_queue] + :end-before: [END qsc_create_queue] + :language: python + :dedent: 8 + :caption: Create a queue in the service. + """ + queue = self.get_queue_client(name) + queue.create_queue( + metadata=metadata, timeout=timeout, **kwargs) + return queue + + def delete_queue( + self, queue, # type: Union[QueueProperties, str] + timeout=None, # type: Optional[int] + **kwargs + ): + # type: (...) -> None + """Deletes the specified queue and any messages it contains. + + When a queue is successfully deleted, it is immediately marked for deletion + and is no longer accessible to clients. The queue is later removed from + the Queue service during garbage collection. + + Note that deleting a queue is likely to take at least 40 seconds to complete. + If an operation is attempted against the queue while it was being deleted, + an :class:`HttpResponseError` will be thrown. + + :param queue: + The queue to delete. This can either be the name of the queue, + or an instance of QueueProperties. + :type queue: str or ~azure.storage.queue.models.QueueProperties + :param int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + + Example: + .. literalinclude:: ../tests/samples/test_samples_queue_service.py + :start-after: [START qsc_delete_queue] + :end-before: [END qsc_delete_queue] + :language: python + :dedent: 12 + :caption: Delete a queue in the service. + """ + queue_client = self.get_queue_client(queue) + queue_client.delete_queue(timeout=timeout, **kwargs) + + def get_queue_client(self, queue, **kwargs): + # type: (Union[QueueProperties, str], Optional[Any]) -> QueueClient + """Get a client to interact with the specified queue. + + The queue need not already exist. + + :param queue: + The queue. This can either be the name of the queue, + or an instance of QueueProperties. + :type queue: str or ~azure.storage.queue.models.QueueProperties + :returns: A :class:`~azure.core.queue.queue_client.QueueClient` object. + :rtype: ~azure.core.queue.queue_client.QueueClient + + Example: + .. literalinclude:: ../tests/samples/test_samples_queue_service.py + :start-after: [START get_queue_client] + :end-before: [END get_queue_client] + :language: python + :dedent: 8 + :caption: Get the queue client. + """ + return QueueClient( + self.url, queue=queue, credential=self.credential, key_resolver_function=self.key_resolver_function, + require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, + _pipeline=self._pipeline, _configuration=self._config, _location_mode=self._location_mode, + _hosts=self._hosts, **kwargs) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/version.py b/sdk/storage/azure-storage-queue/azure/storage/queue/version.py new file mode 100644 index 000000000000..7e711ce3c0bd --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/version.py @@ -0,0 +1,12 @@ +# coding=utf-8 +# -------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# +# Code generated by Microsoft (R) AutoRest Code Generator. +# Changes may cause incorrect behavior and will be lost if the code is +# regenerated. +# -------------------------------------------------------------------------- + +VERSION = "12.0.0b1" diff --git a/sdk/storage/azure-storage-queue/dev_requirements.txt b/sdk/storage/azure-storage-queue/dev_requirements.txt new file mode 100644 index 000000000000..78ea6cb44052 --- /dev/null +++ b/sdk/storage/azure-storage-queue/dev_requirements.txt @@ -0,0 +1,5 @@ +-e ../../../tools/azure-sdk-tools +-e ../../identity/azure-identity +pylint==2.1.1; python_version >= '3.4' +pylint==1.8.4; python_version < '3.4' +aiohttp>=3.0; python_version >= '3.5' diff --git a/sdk/storage/azure-storage-queue/mypy.ini b/sdk/storage/azure-storage-queue/mypy.ini new file mode 100644 index 000000000000..6bc06bc09d72 --- /dev/null +++ b/sdk/storage/azure-storage-queue/mypy.ini @@ -0,0 +1,13 @@ +[mypy] +python_version = 3.6 +warn_return_any = True +warn_unused_configs = True +ignore_missing_imports = True + +# Per-module options: + +[mypy-azure.storage.queue._generated.*] +ignore_errors = True + +[mypy-azure.core.*] +ignore_errors = True diff --git a/sdk/storage/azure-storage-queue/sdk_packaging.toml b/sdk/storage/azure-storage-queue/sdk_packaging.toml new file mode 100644 index 000000000000..e7687fdae93b --- /dev/null +++ b/sdk/storage/azure-storage-queue/sdk_packaging.toml @@ -0,0 +1,2 @@ +[packaging] +auto_update = false \ No newline at end of file diff --git a/sdk/storage/azure-storage-queue/setup.cfg b/sdk/storage/azure-storage-queue/setup.cfg new file mode 100644 index 000000000000..3c6e79cf31da --- /dev/null +++ b/sdk/storage/azure-storage-queue/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal=1 diff --git a/sdk/storage/azure-storage-queue/setup.py b/sdk/storage/azure-storage-queue/setup.py new file mode 100644 index 000000000000..072d7bf07f76 --- /dev/null +++ b/sdk/storage/azure-storage-queue/setup.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +#------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +#-------------------------------------------------------------------------- + +import re +import os.path +from io import open +from setuptools import find_packages, setup # type: ignore + +# Change the PACKAGE_NAME only to change folder and different name +PACKAGE_NAME = "azure-storage-queue" +PACKAGE_PPRINT_NAME = "Azure Queue Storage" + +# a-b-c => a/b/c +package_folder_path = PACKAGE_NAME.replace('-', '/') +# a-b-c => a.b.c +namespace_name = PACKAGE_NAME.replace('-', '.') + +# azure v0.x is not compatible with this package +# azure v0.x used to have a __version__ attribute (newer versions don't) +try: + import azure + try: + ver = azure.__version__ # type: ignore + raise Exception( + 'This package is incompatible with azure=={}. '.format(ver) + + 'Uninstall it with "pip uninstall azure".' + ) + except AttributeError: + pass +except ImportError: + pass + +# Version extraction inspired from 'requests' +with open(os.path.join(package_folder_path, 'version.py'), 'r') as fd: + version = re.search(r'^VERSION\s*=\s*[\'"]([^\'"]*)[\'"]', # type: ignore + fd.read(), re.MULTILINE).group(1) + +if not version: + raise RuntimeError('Cannot find version information') + +with open('README.md', encoding='utf-8') as f: + readme = f.read() +with open('HISTORY.md', encoding='utf-8') as f: + history = f.read() + +setup( + name=PACKAGE_NAME, + version=version, + description='Microsoft Azure {} Client Library for Python'.format(PACKAGE_PPRINT_NAME), + long_description=readme + '\n\n' + history, + long_description_content_type='text/markdown', + license='MIT License', + author='Microsoft Corporation', + author_email='ascl@microsoft.com', + url='https://github.com/Azure/azure-sdk-for-python', + classifiers=[ + 'Development Status :: 4 - Beta', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'License :: OSI Approved :: MIT License', + ], + zip_safe=False, + packages=find_packages(exclude=[ + # Exclude packages that will be covered by PEP420 or nspkg + 'azure', + 'azure.storage', + 'tests', + 'tests.queue', + 'tests.common' + ]), + install_requires=[ + "azure-core<2.0.0,>=1.0.0b1", + "msrest>=0.5.0" + ], + extras_require={ + ":python_version<'3.0'": ['azure-storage-nspkg~=3'], + ":python_version<'3.0'": ['futures'], + ":python_version<'3.4'": ['enum34>=1.0.4'], + ":python_version<'3.5'": ["typing"] + }, +) diff --git a/sdk/storage/azure-storage-queue/swagger/queue.json b/sdk/storage/azure-storage-queue/swagger/queue.json new file mode 100644 index 000000000000..35feb8a083b6 --- /dev/null +++ b/sdk/storage/azure-storage-queue/swagger/queue.json @@ -0,0 +1,1856 @@ +{ + "swagger": "2.0", + "info": { + "title": "Azure Queue Storage", + "version": "2018-03-28", + "x-ms-code-generation-settings": { + "header": "MIT", + "strictSpecAdherence": false + } + }, + "x-ms-parameterized-host": { + "hostTemplate": "{url}", + "useSchemePrefix": false, + "positionInOperation": "first", + "parameters": [ + { + "$ref": "#/parameters/Url" + } + ] + }, + "securityDefinitions": { + "queue_shared_key": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + }, + "schemes": [ + "https" + ], + "consumes": [ + "application/xml" + ], + "produces": [ + "application/xml" + ], + "paths": {}, + "x-ms-paths": { + "/?restype=service&comp=properties": { + "put": { + "tags": [ + "service" + ], + "operationId": "Service_SetProperties", + "description": "Sets properties for a storage account's Queue service endpoint, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules", + "parameters": [ + { + "$ref": "#/parameters/StorageServiceProperties" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "202": { + "description": "Success (Accepted)", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetProperties", + "description": "gets the properties of a storage account's Queue service, including properties for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + } + }, + "schema": { + "$ref": "#/definitions/StorageServiceProperties" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "properties" + ] + } + ] + }, + "/?restype=service&comp=stats": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_GetStatistics", + "description": "Retrieves statistics related to replication for the Queue service. It is only available on the secondary location endpoint when read-access geo-redundant replication is enabled for the storage account.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/StorageServiceStats" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "restype", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "service" + ] + }, + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "stats" + ] + } + ] + }, + "/?comp=list": { + "get": { + "tags": [ + "service" + ], + "operationId": "Service_ListQueuesSegment", + "description": "The List Queues Segment operation returns a list of the queues under the specified account", + "parameters": [ + { + "$ref": "#/parameters/Prefix" + }, + { + "$ref": "#/parameters/Marker" + }, + { + "$ref": "#/parameters/MaxResults" + }, + { + "$ref": "#/parameters/ListQueuesInclude" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/ListQueuesSegmentResponse" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + }, + "x-ms-pageable": { + "nextLinkName": "NextMarker" + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "list" + ] + } + ] + }, + "/{queueName}": { + "put": { + "tags": [ + "service" + ], + "operationId": "Queue_Create", + "description": "creates a new queue under the given account.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "Success, queue created.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "204": { + "description": "Success, queue created.", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "queue" + ], + "operationId": "Queue_Delete", + "description": "operation permanently deletes the specified queue", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "No Content", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [] + }, + "/{queueName}?comp=metadata": { + "get": { + "tags": [ + "queue" + ], + "operationId": "Queue_GetProperties", + "description": "Retrieves user-defined metadata and queue properties on the specified queue. Metadata is associated with the queue as name-values pairs.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "x-ms-meta": { + "type": "string", + "x-ms-client-name": "Metadata", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "x-ms-approximate-messages-count": { + "type": "integer", + "x-ms-client-name": "ApproximateMessagesCount", + "description": "The approximate number of messages in the queue. This number is not lower than the actual number of messages in the queue, but could be higher." + }, + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "put": { + "tags": [ + "queue" + ], + "operationId": "Queue_SetMetadata", + "description": "sets user-defined metadata on the specified queue. Metadata is associated with the queue as name-value pairs.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/Metadata" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "No Content", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "metadata" + ] + } + ] + }, + "/{queueName}?comp=acl": { + "get": { + "tags": [ + "queue" + ], + "operationId": "Queue_GetAccessPolicy", + "description": "returns details about any stored access policies specified on the queue that may be used with Shared Access Signatures.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "Success", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/SignedIdentifiers" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "put": { + "tags": [ + "queue" + ], + "operationId": "Queue_SetAccessPolicy", + "description": "sets stored access policies for the queue that may be used with Shared Access Signatures", + "parameters": [ + { + "$ref": "#/parameters/QueueAcl" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "No Content", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "comp", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "acl" + ] + } + ] + }, + "/{queueName}/messages": { + "get": { + "tags": [ + "message" + ], + "operationId": "Messages_Dequeue", + "description": "The Dequeue operation retrieves one or more messages from the front of the queue.", + "parameters": [ + { + "$ref": "#/parameters/NumOfMessages" + }, + { + "$ref": "#/parameters/VisibilityTimeout" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "OK", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/DequeuedMessagesList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "delete": { + "tags": [ + "message" + ], + "operationId": "Messages_Clear", + "description": "The Clear operation deletes all messages from the specified queue.", + "parameters": [ + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "No Content", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [] + }, + "/{queueName}/messages?visibilitytimeout={visibilityTimeout}&messagettl={messageTimeToLive}": { + "post": { + "tags": [ + "message" + ], + "operationId": "Messages_Enqueue", + "description": "The Enqueue operation adds a new message to the back of the message queue. A visibility timeout can also be specified to make the message invisible until the visibility timeout expires. A message must be in a format that can be included in an XML request with UTF-8 encoding. The encoded message can be up to 64 KB in size for versions 2011-08-18 and newer, or 8 KB in size for previous versions.", + "parameters": [ + { + "$ref": "#/parameters/QueueMessage" + }, + { + "$ref": "#/parameters/VisibilityTimeout" + }, + { + "$ref": "#/parameters/MessageTTL" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "201": { + "description": "Created", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/EnqueuedMessageList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [] + }, + "/{queueName}/messages?peekonly=true": { + "get": { + "tags": [ + "message" + ], + "operationId": "Messages_Peek", + "description": "The Peek operation retrieves one or more messages from the front of the queue, but does not alter the visibility of the message.", + "parameters": [ + { + "$ref": "#/parameters/NumOfMessages" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "200": { + "description": "OK", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + }, + "schema": { + "$ref": "#/definitions/PeekedMessagesList" + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [ + { + "name": "peekonly", + "in": "query", + "required": true, + "type": "string", + "enum": [ + "true" + ] + } + ] + }, + "/{queueName}/messages/{messageid}?popreceipt={popReceipt}&visibilitytimeout={visibilityTimeout}": { + "put": { + "tags": [ + "messageId" + ], + "operationId": "MessageId_Update", + "description": "The Update operation was introduced with version 2011-08-18 of the Queue service API. The Update Message operation updates the visibility timeout of a message. You can also use this operation to update the contents of a message. A message must be in a format that can be included in an XML request with UTF-8 encoding, and the encoded message can be up to 64KB in size.", + "parameters": [ + { + "$ref": "#/parameters/QueueMessage" + }, + { + "$ref": "#/parameters/PopReceipt" + }, + { + "$ref": "#/parameters/VisibilityTimeoutRequired" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "No Content", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + }, + "x-ms-popreceipt": { + "x-ms-client-name": "PopReceipt", + "type": "string", + "description": "The pop receipt of the queue message." + }, + "x-ms-time-next-visible": { + "x-ms-client-name": "TimeNextVisible", + "type": "string", + "format": "date-time-rfc1123", + "description": "A UTC date/time value that represents when the message will be visible on the queue." + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [] + }, + "/{queueName}/messages/{messageid}?popreceipt={popReceipt}": { + "delete": { + "tags": [ + "messageId" + ], + "operationId": "MessageId_Delete", + "description": "The Delete operation deletes the specified message.", + "parameters": [ + { + "$ref": "#/parameters/PopReceipt" + }, + { + "$ref": "#/parameters/Timeout" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "$ref": "#/parameters/ClientRequestId" + } + ], + "responses": { + "204": { + "description": "No Content", + "headers": { + "x-ms-request-id": { + "x-ms-client-name": "RequestId", + "type": "string", + "description": "This header uniquely identifies the request that was made and can be used for troubleshooting the request." + }, + "x-ms-version": { + "x-ms-client-name": "Version", + "type": "string", + "description": "Indicates the version of the Queue service used to execute the request. This header is returned for requests made against version 2009-09-19 and above." + }, + "Date": { + "type": "string", + "format": "date-time-rfc1123", + "description": "UTC date/time value generated by the service that indicates the time at which the response was initiated" + } + } + }, + "default": { + "description": "Failure", + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + }, + "schema": { + "$ref": "#/definitions/StorageError" + } + } + } + }, + "parameters": [] + } + }, + "definitions": { + "AccessPolicy": { + "type": "object", + "required": [ + "Start", + "Expiry", + "Permission" + ], + "description": "An Access policy", + "properties": { + "Start": { + "description": "the date-time the policy is active", + "type": "string", + "format": "date-time" + }, + "Expiry": { + "description": "the date-time the policy expires", + "type": "string", + "format": "date-time" + }, + "Permission": { + "description": "the permissions for the acl policy", + "type": "string" + } + } + }, + "ListQueuesSegmentResponse": { + "xml": { + "name": "EnumerationResults" + }, + "description": "The object returned when calling List Queues on a Queue Service.", + "type": "object", + "required": [ + "ServiceEndpoint", + "Prefix", + "MaxResults", + "NextMarker" + ], + "properties": { + "ServiceEndpoint": { + "type": "string", + "xml": { + "attribute": true + } + }, + "Prefix": { + "type": "string" + }, + "Marker": { + "type": "string" + }, + "MaxResults": { + "type": "integer" + }, + "QueueItems": { + "xml": { + "wrapped": true, + "name": "Queues" + }, + "type": "array", + "items": { + "$ref": "#/definitions/QueueItem" + } + }, + "NextMarker": { + "type": "string" + } + } + }, + "CorsRule": { + "description": "CORS is an HTTP feature that enables a web application running under one domain to access resources in another domain. Web browsers implement a security restriction known as same-origin policy that prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain (the origin domain) to call APIs in another domain", + "type": "object", + "required": [ + "AllowedOrigins", + "AllowedMethods", + "AllowedHeaders", + "ExposedHeaders", + "MaxAgeInSeconds" + ], + "properties": { + "AllowedOrigins": { + "description": "The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request originates. Note that the origin must be an exact case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains to make requests via CORS.", + "type": "string" + }, + "AllowedMethods": { + "description": "The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated)", + "type": "string" + }, + "AllowedHeaders": { + "description": "the request headers that the origin domain may specify on the CORS request.", + "type": "string" + }, + "ExposedHeaders": { + "description": "The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer", + "type": "string" + }, + "MaxAgeInSeconds": { + "description": "The maximum amount time that a browser should cache the preflight OPTIONS request.", + "type": "integer", + "minimum": 0 + } + } + }, + "ErrorCode": { + "description": "Error codes returned by the service", + "type": "string", + "enum": [ + "AccountAlreadyExists", + "AccountBeingCreated", + "AccountIsDisabled", + "AuthenticationFailed", + "AuthorizationFailure", + "ConditionHeadersNotSupported", + "ConditionNotMet", + "EmptyMetadataKey", + "InsufficientAccountPermissions", + "InternalError", + "InvalidAuthenticationInfo", + "InvalidHeaderValue", + "InvalidHttpVerb", + "InvalidInput", + "InvalidMd5", + "InvalidMetadata", + "InvalidQueryParameterValue", + "InvalidRange", + "InvalidResourceName", + "InvalidUri", + "InvalidXmlDocument", + "InvalidXmlNodeValue", + "Md5Mismatch", + "MetadataTooLarge", + "MissingContentLengthHeader", + "MissingRequiredQueryParameter", + "MissingRequiredHeader", + "MissingRequiredXmlNode", + "MultipleConditionHeadersNotSupported", + "OperationTimedOut", + "OutOfRangeInput", + "OutOfRangeQueryParameterValue", + "RequestBodyTooLarge", + "ResourceTypeMismatch", + "RequestUrlFailedToParse", + "ResourceAlreadyExists", + "ResourceNotFound", + "ServerBusy", + "UnsupportedHeader", + "UnsupportedXmlNode", + "UnsupportedQueryParameter", + "UnsupportedHttpVerb", + "InvalidMarker", + "MessageNotFound", + "MessageTooLarge", + "PopReceiptMismatch", + "QueueAlreadyExists", + "QueueBeingDeleted", + "QueueDisabled", + "QueueNotEmpty", + "QueueNotFound" + ], + "x-ms-enum": { + "name": "StorageErrorCode", + "modelAsString": true + } + }, + "GeoReplication": { + "type": "object", + "required": [ + "Status", + "LastSyncTime" + ], + "properties": { + "Status": { + "description": "The status of the secondary location", + "type": "string", + "enum": [ + "live", + "bootstrap", + "unavailable" + ], + "x-ms-enum": { + "name": "GeoReplicationStatusType", + "modelAsString": true + } + }, + "LastSyncTime": { + "description": "A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary writes after this point in time may or may not be available for reads.", + "type": "string", + "format": "date-time-rfc1123" + } + } + }, + "Logging": { + "description": "Azure Analytics Logging settings.", + "type": "object", + "required": [ + "Version", + "Delete", + "Read", + "Write", + "RetentionPolicy" + ], + "properties": { + "Version": { + "description": "The version of Storage Analytics to configure.", + "type": "string" + }, + "Delete": { + "description": "Indicates whether all delete requests should be logged.", + "type": "boolean" + }, + "Read": { + "description": "Indicates whether all read requests should be logged.", + "type": "boolean" + }, + "Write": { + "description": "Indicates whether all write requests should be logged.", + "type": "boolean" + }, + "RetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + } + } + }, + "Metadata": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "StorageError": { + "type": "object", + "properties": { + "Message": { + "type": "string" + } + } + }, + "Metrics": { + "description": "", + "required": [ + "Enabled" + ], + "properties": { + "Version": { + "description": "The version of Storage Analytics to configure.", + "type": "string" + }, + "Enabled": { + "description": "Indicates whether metrics are enabled for the Queue service.", + "type": "boolean" + }, + "IncludeAPIs": { + "description": "Indicates whether metrics should generate summary statistics for called API operations.", + "type": "boolean" + }, + "RetentionPolicy": { + "$ref": "#/definitions/RetentionPolicy" + } + } + }, + "QueueItem": { + "description": "An Azure Storage Queue.", + "type": "object", + "required": [ + "Name" + ], + "properties": { + "Name": { + "type": "string", + "description": "The name of the Queue." + }, + "Metadata": { + "$ref": "#/definitions/Metadata" + } + }, + "xml": { + "name": "Queue" + } + }, + "QueueMessage": { + "description": "A Message object which can be stored in a Queue", + "type": "object", + "required": [ + "MessageText" + ], + "properties": { + "MessageText": { + "type": "string", + "description": "The content of the message" + } + } + }, + "DequeuedMessageItem": { + "description": "The object returned in the QueueMessageList array when calling Get Messages on a Queue.", + "type": "object", + "required": [ + "MessageId", + "InsertionTime", + "ExpirationTime", + "PopReceipt", + "TimeNextVisible", + "DequeueCount", + "MessageText" + ], + "properties": { + "MessageId": { + "type": "string", + "description": "The Id of the Message." + }, + "InsertionTime": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time the Message was inserted into the Queue." + }, + "ExpirationTime": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time that the Message will expire and be automatically deleted." + }, + "PopReceipt": { + "type": "string", + "description": "This value is required to delete the Message. If deletion fails using this popreceipt then the message has been dequeued by another client." + }, + "TimeNextVisible": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time that the message will again become visible in the Queue." + }, + "DequeueCount": { + "type": "integer", + "format": "int64", + "description": "The number of times the message has been dequeued." + }, + "MessageText": { + "type": "string", + "description": "The content of the Message." + } + }, + "xml": { + "wrapped": true, + "name": "QueueMessage" + } + }, + "PeekedMessageItem": { + "description": "The object returned in the QueueMessageList array when calling Peek Messages on a Queue", + "type": "object", + "required": [ + "MessageId", + "InsertionTime", + "ExpirationTime", + "DequeueCount", + "MessageText" + ], + "properties": { + "MessageId": { + "type": "string", + "description": "The Id of the Message." + }, + "InsertionTime": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time the Message was inserted into the Queue." + }, + "ExpirationTime": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time that the Message will expire and be automatically deleted." + }, + "DequeueCount": { + "type": "integer", + "format": "int64", + "description": "The number of times the message has been dequeued." + }, + "MessageText": { + "type": "string", + "description": "The content of the Message." + } + }, + "xml": { + "wrapped": true, + "name": "QueueMessage" + } + }, + "EnqueuedMessage": { + "description": "The object returned in the QueueMessageList array when calling Put Message on a Queue", + "type": "object", + "required": [ + "MessageId", + "InsertionTime", + "ExpirationTime", + "PopReceipt", + "TimeNextVisible" + ], + "properties": { + "MessageId": { + "type": "string", + "description": "The Id of the Message." + }, + "InsertionTime": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time the Message was inserted into the Queue." + }, + "ExpirationTime": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time that the Message will expire and be automatically deleted." + }, + "PopReceipt": { + "type": "string", + "description": "This value is required to delete the Message. If deletion fails using this popreceipt then the message has been dequeued by another client." + }, + "TimeNextVisible": { + "type": "string", + "format": "date-time-rfc1123", + "description": "The time that the message will again become visible in the Queue." + } + }, + "xml": { + "wrapped": true, + "name": "QueueMessage" + } + }, + "DequeuedMessagesList": { + "description": "The object returned when calling Get Messages on a Queue", + "type": "array", + "items": { + "$ref": "#/definitions/DequeuedMessageItem", + "xml": { + "name": "QueueMessage" + } + }, + "xml": { + "wrapped": true, + "name": "QueueMessagesList" + } + }, + "PeekedMessagesList": { + "description": "The object returned when calling Peek Messages on a Queue", + "type": "array", + "items": { + "$ref": "#/definitions/PeekedMessageItem", + "xml": { + "name": "QueueMessage" + } + }, + "xml": { + "wrapped": true, + "name": "QueueMessagesList" + } + }, + "EnqueuedMessageList": { + "description": "The object returned when calling Put Message on a Queue", + "type": "array", + "items": { + "$ref": "#/definitions/EnqueuedMessage", + "xml": { + "name": "QueueMessage" + } + }, + "xml": { + "wrapped": true, + "name": "QueueMessagesList" + } + }, + "RetentionPolicy": { + "description": "the retention policy", + "type": "object", + "required": [ + "Enabled" + ], + "properties": { + "Enabled": { + "description": "Indicates whether a retention policy is enabled for the storage service", + "type": "boolean" + }, + "Days": { + "description": "Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this value will be deleted", + "type": "integer", + "minimum": 1 + } + } + }, + "SignedIdentifier": { + "description": "signed identifier", + "type": "object", + "required": [ + "Id", + "AccessPolicy" + ], + "properties": { + "Id": { + "type": "string", + "description": "a unique id" + }, + "AccessPolicy": { + "description": "The access policy", + "$ref": "#/definitions/AccessPolicy" + } + } + }, + "SignedIdentifiers": { + "description": "a collection of signed identifiers", + "type": "array", + "items": { + "$ref": "#/definitions/SignedIdentifier", + "xml": { + "name": "SignedIdentifier" + } + }, + "xml": { + "wrapped": true, + "name": "SignedIdentifiers" + } + }, + "StorageServiceProperties": { + "description": "Storage Service Properties.", + "type": "object", + "properties": { + "Logging": { + "description": "Azure Analytics Logging settings", + "$ref": "#/definitions/Logging" + }, + "HourMetrics": { + "description": "A summary of request statistics grouped by API in hourly aggregates for queues", + "$ref": "#/definitions/Metrics" + }, + "MinuteMetrics": { + "description": "a summary of request statistics grouped by API in minute aggregates for queues", + "$ref": "#/definitions/Metrics" + }, + "Cors": { + "description": "The set of CORS rules.", + "type": "array", + "items": { + "$ref": "#/definitions/CorsRule", + "xml": { + "name": "CorsRule" + } + }, + "xml": { + "wrapped": true + } + } + } + }, + "StorageServiceStats": { + "description": "Stats for the storage service.", + "type": "object", + "properties": { + "GeoReplication": { + "description": "Geo-Replication information for the Secondary Storage Service", + "$ref": "#/definitions/GeoReplication" + } + } + } + }, + "parameters": { + "Url": { + "name": "url", + "description": "The URL of the service account, queue or message that is the targe of the desired operation.", + "required": true, + "type": "string", + "in": "path", + "x-ms-skip-url-encoding": true + }, + "ApiVersionParameter": { + "name": "x-ms-version", + "x-ms-client-name": "version", + "in": "header", + "required": true, + "type": "string", + "description": "Specifies the version of the operation to use for this request.", + "enum": [ + "2018-03-28" + ] + }, + "Body": { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "format": "file" + }, + "x-ms-parameter-location": "method", + "description": "Initial data" + }, + "QueueAcl": { + "name": "queueAcl", + "in": "body", + "schema": { + "$ref": "#/definitions/SignedIdentifiers" + }, + "x-ms-parameter-location": "method", + "description": "the acls for the queue" + }, + "ClientRequestId": { + "name": "x-ms-client-request-id", + "x-ms-client-name": "requestId", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled." + }, + "ContentLength": { + "name": "Content-Length", + "in": "header", + "required": true, + "type": "integer", + "format": "int64", + "x-ms-parameter-location": "method", + "description": "The length of the request." + }, + "ListQueuesInclude": { + "name": "include", + "in": "query", + "required": false, + "type": "array", + "collectionFormat": "csv", + "items": { + "type": "string", + "enum": [ + "metadata" + ], + "x-ms-enum": { + "name": "ListQueuesIncludeType", + "modelAsString": false + } + }, + "x-ms-parameter-location": "method", + "description": "Include this parameter to specify that the queues's metadata be returned as part of the response body." + }, + "Marker": { + "name": "marker", + "in": "query", + "required": false, + "type": "string", + "description": "A string value that identifies the portion of the list of queues to be returned with the next listing operation. The operation returns the NextMarker value within the response body if the listing operation did not return all queues remaining to be listed with the current page. The NextMarker value can be used as the value for the marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the client.", + "x-ms-parameter-location": "method" + }, + "MaxResults": { + "name": "maxresults", + "in": "query", + "required": false, + "type": "integer", + "minimum": 1, + "x-ms-parameter-location": "method", + "description": "Specifies the maximum number of queues to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the remainder of the results. For this reason, it is possible that the service will return fewer results than specified by maxresults, or than the default of 5000." + }, + "MessageId": { + "name": "messageid", + "in": "path", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The container name." + }, + "MessageTTL": { + "name": "messagettl", + "x-ms-client-name": "MessageTimeToLive", + "in": "query", + "required": false, + "type": "integer", + "minimum": -1, + "x-ms-parameter-location": "method", + "description": "Optional. Specifies the time-to-live interval for the message, in seconds. Prior to version 2017-07-29, the maximum time-to-live allowed is 7 days. For version 2017-07-29 or later, the maximum time-to-live can be any positive number, as well as -1 indicating that the message does not expire. If this parameter is omitted, the default time-to-live is 7 days." + }, + "Metadata": { + "name": "x-ms-meta", + "x-ms-client-name": "metadata", + "in": "header", + "required": false, + "type": "string", + "x-ms-parameter-location": "method", + "description": "Optional. Include this parameter to specify that the queue's metadata be returned as part of the response body. Note that metadata requested with this parameter must be stored in accordance with the naming restrictions imposed by the 2009-09-19 version of the Queue service. Beginning with this version, all metadata names must adhere to the naming conventions for C# identifiers.", + "x-ms-header-collection-prefix": "x-ms-meta-" + }, + "NumOfMessages": { + "name": "numofmessages", + "x-ms-client-name": "numberOfMessages", + "in": "query", + "required": false, + "type": "integer", + "minimum": 1, + "x-ms-parameter-location": "method", + "description": "Optional. A nonzero integer value that specifies the number of messages to retrieve from the queue, up to a maximum of 32. If fewer are visible, the visible messages are returned. By default, a single message is retrieved from the queue with this operation." + }, + "PopReceipt": { + "name": "popreceipt", + "x-ms-client-name": "popReceipt", + "in": "query", + "required": true, + "x-ms-parameter-location": "method", + "description": "Required. Specifies the valid pop receipt value returned from an earlier call to the Get Messages or Update Message operation.", + "type": "string" + }, + "Prefix": { + "name": "prefix", + "in": "query", + "required": false, + "type": "string", + "description": "Filters the results to return only queues whose name begins with the specified prefix.", + "x-ms-parameter-location": "method" + }, + "QueueMessage": { + "name": "QueueMessage", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/QueueMessage" + }, + "x-ms-parameter-location": "method", + "description": "A Message object which can be stored in a Queue" + }, + "QueueName": { + "name": "queueName", + "in": "path", + "required": true, + "type": "string", + "x-ms-parameter-location": "method", + "description": "The queue name." + }, + "StorageServiceProperties": { + "name": "StorageServiceProperties", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/StorageServiceProperties" + }, + "x-ms-parameter-location": "method", + "description": "The StorageService properties." + }, + "Timeout": { + "name": "timeout", + "in": "query", + "required": false, + "type": "integer", + "minimum": 0, + "x-ms-parameter-location": "method", + "description": "The The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for Queue Service Operations." + }, + "VisibilityTimeout": { + "name": "visibilitytimeout", + "in": "query", + "required": false, + "type": "integer", + "minimum": 0, + "maximum": 604800, + "x-ms-parameter-location": "method", + "description": "Optional. Specifies the new visibility timeout value, in seconds, relative to server time. The default value is 30 seconds. A specified value must be larger than or equal to 1 second, and cannot be larger than 7 days, or larger than 2 hours on REST protocol versions prior to version 2011-08-18. The visibility timeout of a message can be set to a value later than the expiry time." + }, + "VisibilityTimeoutRequired": { + "name": "visibilitytimeout", + "in": "query", + "required": true, + "type": "integer", + "minimum": 0, + "maximum": 604800, + "x-ms-parameter-location": "method", + "description": "Optional. Specifies the new visibility timeout value, in seconds, relative to server time. The default value is 30 seconds. A specified value must be larger than or equal to 1 second, and cannot be larger than 7 days, or larger than 2 hours on REST protocol versions prior to version 2011-08-18. The visibility timeout of a message can be set to a value later than the expiry time." + } + } +} \ No newline at end of file diff --git a/sdk/storage/azure-storage-queue/tests/__init__.py b/sdk/storage/azure-storage-queue/tests/__init__.py new file mode 100644 index 000000000000..de40ea7ca058 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/sdk/storage/azure-storage-queue/tests/common/__init__.py b/sdk/storage/azure-storage-queue/tests/common/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/sdk/storage/azure-storage-queue/tests/common/test_client.py b/sdk/storage/azure-storage-queue/tests/common/test_client.py new file mode 100644 index 000000000000..b11fca6a76ab --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/common/test_client.py @@ -0,0 +1,406 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest +import pytest +import platform + +from azure.storage.queue import ( + QueueServiceClient, + QueueClient, +) +from tests.testcase import ( + StorageTestCase, + record, +) +#from azure.storage.common import TokenCredential + +# ------------------------------------------------------------------------------ +SERVICES = { + QueueServiceClient: 'queue', + QueueClient: 'queue', +} + +_CONNECTION_ENDPOINTS = {'queue': 'QueueEndpoint'} + +_CONNECTION_ENDPOINTS_SECONDARY = {'queue': 'QueueSecondaryEndpoint'} + +class StorageClientTest(StorageTestCase): + def setUp(self): + super(StorageClientTest, self).setUp() + self.account_name = self.settings.STORAGE_ACCOUNT_NAME + self.account_key = self.settings.STORAGE_ACCOUNT_KEY + self.sas_token = '?sv=2015-04-05&st=2015-04-29T22%3A18%3A26Z&se=2015-04-30T02%3A23%3A26Z&sr=b&sp=rw&sip=168.1.5.60-168.1.5.70&spr=https&sig=Z%2FRHIX5Xcg0Mq2rqI3OlWTjEg2tYkboXr1P9ZUXDtkk%3D' + self.token_credential = self.generate_oauth_token() + self.connection_string = self.settings.CONNECTION_STRING + + # --Helpers----------------------------------------------------------------- + def validate_standard_account_endpoints(self, service, url_type): + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue('{}.{}.core.windows.net'.format(self.account_name, url_type) in service.url) + self.assertTrue('{}-secondary.{}.core.windows.net'.format(self.account_name, url_type) in service.secondary_endpoint) + + # --Direct Parameters Test Cases -------------------------------------------- + def test_create_service_with_key(self): + # Arrange + + for client, url in SERVICES.items(): + # Act + service = client( + self._get_queue_url(), credential=self.account_key, queue='foo') + + # Assert + self.validate_standard_account_endpoints(service, url) + self.assertEqual(service.scheme, 'https') + + def test_create_service_with_connection_string(self): + + for service_type in SERVICES.items(): + # Act + service = service_type[0].from_connection_string( + self.connection_string, queue="test") + + # Assert + self.validate_standard_account_endpoints(service, service_type[1]) + self.assertEqual(service.scheme, 'https') + + def test_create_service_with_sas(self): + # Arrange + + for service_type in SERVICES: + # Act + service = service_type( + self._get_queue_url(), credential=self.sas_token, queue='foo') + + # Assert + self.assertIsNotNone(service) + self.assertTrue(service.url.startswith('https://' + self.account_name + '.queue.core.windows.net')) + self.assertTrue(service.url.endswith(self.sas_token)) + self.assertIsNone(service.credential) + + def test_create_service_with_token(self): + for service_type in SERVICES: + # Act + service = service_type( + self._get_queue_url(), credential=self.token_credential, queue='foo') + + # Assert + self.assertIsNotNone(service) + self.assertTrue(service.url.startswith('https://' + self.account_name + '.queue.core.windows.net')) + self.assertEqual(service.credential, self.token_credential) + self.assertFalse(hasattr(service.credential, 'account_key')) + self.assertTrue(hasattr(service.credential, 'get_token')) + + def test_create_service_with_token_and_http(self): + for service_type in SERVICES: + # Act + with self.assertRaises(ValueError): + url = self._get_queue_url().replace('https', 'http') + service_type(url, credential=self.token_credential, queue='foo') + + def test_create_service_china(self): + # Arrange + + for service_type in SERVICES.items(): + # Act + url = self._get_queue_url().replace('core.windows.net', 'core.chinacloudapi.cn') + service = service_type[0]( + url, credential=self.account_key, queue='foo') + + # Assert + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue(service.primary_endpoint.startswith( + 'https://{}.{}.core.chinacloudapi.cn'.format(self.account_name, service_type[1]))) + self.assertTrue(service.secondary_endpoint.startswith( + 'https://{}-secondary.{}.core.chinacloudapi.cn'.format(self.account_name, service_type[1]))) + + def test_create_service_protocol(self): + # Arrange + + for service_type in SERVICES.items(): + # Act + url = self._get_queue_url().replace('https', 'http') + service = service_type[0]( + url, credential=self.account_key, queue='foo') + + # Assert + self.validate_standard_account_endpoints(service, service_type[1]) + self.assertEqual(service.scheme, 'http') + + def test_create_service_empty_key(self): + # Arrange + QUEUE_SERVICES = [QueueServiceClient, QueueClient] + + for service_type in QUEUE_SERVICES: + # Act + with self.assertRaises(ValueError) as e: + test_service = service_type('testaccount', credential='', queue='foo') + + self.assertEqual( + str(e.exception), "You need to provide either a SAS token or an account key to authenticate.") + + def test_create_service_missing_arguments(self): + # Arrange + + for service_type in SERVICES: + # Act + with self.assertRaises(ValueError): + service = service_type(None) + + # Assert + + def test_create_service_with_socket_timeout(self): + # Arrange + + for service_type in SERVICES.items(): + # Act + default_service = service_type[0]( + self._get_queue_url(), credential=self.account_key, queue='foo') + service = service_type[0]( + self._get_queue_url(), credential=self.account_key, + queue='foo', connection_timeout=22) + + # Assert + self.validate_standard_account_endpoints(service, service_type[1]) + self.assertEqual(service._config.connection.timeout, 22) + self.assertTrue(default_service._config.connection.timeout in [20, (20, 2000)]) + + # --Connection String Test Cases -------------------------------------------- + + def test_create_service_with_connection_string_key(self): + # Arrange + conn_string = 'AccountName={};AccountKey={};'.format(self.account_name, self.account_key) + + for service_type in SERVICES.items(): + # Act + service = service_type[0].from_connection_string(conn_string, queue='foo') + + # Assert + self.validate_standard_account_endpoints(service, service_type[1]) + self.assertEqual(service.scheme, 'https') + + def test_create_service_with_connection_string_sas(self): + # Arrange + conn_string = 'AccountName={};SharedAccessSignature={};'.format(self.account_name, self.sas_token) + + for service_type in SERVICES: + # Act + service = service_type.from_connection_string(conn_string, queue='foo') + + # Assert + self.assertIsNotNone(service) + self.assertTrue(service.url.startswith('https://' + self.account_name + '.queue.core.windows.net')) + self.assertTrue(service.url.endswith(self.sas_token)) + self.assertIsNone(service.credential) + + def test_create_service_with_connection_string_endpoint_protocol(self): + # Arrange + conn_string = 'AccountName={};AccountKey={};DefaultEndpointsProtocol=http;EndpointSuffix=core.chinacloudapi.cn;'.format( + self.account_name, self.account_key) + + for service_type in SERVICES.items(): + # Act + service = service_type[0].from_connection_string(conn_string, queue="foo") + + # Assert + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue( + service.primary_endpoint.startswith( + 'http://{}.{}.core.chinacloudapi.cn/'.format(self.account_name, service_type[1]))) + self.assertTrue( + service.secondary_endpoint.startswith( + 'http://{}-secondary.{}.core.chinacloudapi.cn'.format(self.account_name, service_type[1]))) + self.assertEqual(service.scheme, 'http') + + def test_create_service_with_connection_string_emulated(self): + # Arrange + for service_type in SERVICES.items(): + conn_string = 'UseDevelopmentStorage=true;'.format(self.account_name, self.account_key) + + # Act + with self.assertRaises(ValueError): + service = service_type[0].from_connection_string(conn_string, queue="foo") + + def test_create_service_with_connection_string_custom_domain(self): + # Arrange + for service_type in SERVICES.items(): + conn_string = 'AccountName={};AccountKey={};QueueEndpoint=www.mydomain.com;'.format( + self.account_name, self.account_key) + + # Act + service = service_type[0].from_connection_string(conn_string, queue="foo") + + # Assert + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue(service.primary_endpoint.startswith('https://www.mydomain.com/')) + self.assertTrue(service.secondary_endpoint.startswith('https://' + self.account_name + '-secondary.queue.core.windows.net')) + + def test_create_service_with_connection_string_custom_domain_trailing_slash(self): + # Arrange + for service_type in SERVICES.items(): + conn_string = 'AccountName={};AccountKey={};QueueEndpoint=www.mydomain.com/;'.format( + self.account_name, self.account_key) + + # Act + service = service_type[0].from_connection_string(conn_string, queue="foo") + + # Assert + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue(service.primary_endpoint.startswith('https://www.mydomain.com/')) + self.assertTrue(service.secondary_endpoint.startswith('https://' + self.account_name + '-secondary.queue.core.windows.net')) + + + def test_create_service_with_connection_string_custom_domain_secondary_override(self): + # Arrange + for service_type in SERVICES.items(): + conn_string = 'AccountName={};AccountKey={};QueueEndpoint=www.mydomain.com/;'.format( + self.account_name, self.account_key) + + # Act + service = service_type[0].from_connection_string( + conn_string, secondary_hostname="www-sec.mydomain.com", queue="foo") + + # Assert + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue(service.primary_endpoint.startswith('https://www.mydomain.com/')) + self.assertTrue(service.secondary_endpoint.startswith('https://www-sec.mydomain.com/')) + + + def test_create_service_with_connection_string_fails_if_secondary_without_primary(self): + for service_type in SERVICES.items(): + # Arrange + conn_string = 'AccountName={};AccountKey={};{}=www.mydomain.com;'.format( + self.account_name, self.account_key, + _CONNECTION_ENDPOINTS_SECONDARY.get(service_type[1])) + + # Act + + # Fails if primary excluded + with self.assertRaises(ValueError): + service = service_type[0].from_connection_string(conn_string, queue="foo") + + def test_create_service_with_connection_string_succeeds_if_secondary_with_primary(self): + for service_type in SERVICES.items(): + # Arrange + conn_string = 'AccountName={};AccountKey={};{}=www.mydomain.com;{}=www-sec.mydomain.com;'.format( + self.account_name, + self.account_key, + _CONNECTION_ENDPOINTS.get(service_type[1]), + _CONNECTION_ENDPOINTS_SECONDARY.get(service_type[1])) + + # Act + service = service_type[0].from_connection_string(conn_string, queue="foo") + + # Assert + self.assertIsNotNone(service) + self.assertEqual(service.credential.account_name, self.account_name) + self.assertEqual(service.credential.account_key, self.account_key) + self.assertTrue(service.primary_endpoint.startswith('https://www.mydomain.com/')) + self.assertTrue(service.secondary_endpoint.startswith('https://www-sec.mydomain.com/')) + + @record + def test_request_callback_signed_header(self): + # Arrange + service = QueueServiceClient(self._get_queue_url(), credential=self.account_key) + name = self.get_resource_name('cont') + + # Act + try: + headers = {'x-ms-meta-hello': 'world'} + queue = service.create_queue(name, headers=headers) + + # Assert + metadata = queue.get_queue_properties().metadata + self.assertEqual(metadata, {'hello': 'world'}) + finally: + service.delete_queue(name) + + @record + def test_response_callback(self): + # Arrange + service = QueueServiceClient(self._get_queue_url(), credential=self.account_key) + name = self.get_resource_name('cont') + queue = service.get_queue_client(name) + + # Act + def callback(response): + response.http_response.status_code = 200 + response.http_response.headers.clear() + + # Assert + exists = queue.get_queue_properties(raw_response_hook=callback) + self.assertTrue(exists) + + @record + def test_user_agent_default(self): + service = QueueServiceClient(self._get_queue_url(), credential=self.account_key) + + def callback(response): + self.assertTrue('User-Agent' in response.http_request.headers) + self.assertEqual( + response.http_request.headers['User-Agent'], + "azsdk-python-storage-queue/12.0.0b1 Python/{} ({})".format( + platform.python_version(), + platform.platform())) + + service.get_service_properties(raw_response_hook=callback) + + @record + def test_user_agent_custom(self): + custom_app = "TestApp/v1.0" + service = QueueServiceClient( + self._get_queue_url(), credential=self.account_key, user_agent=custom_app) + + def callback(response): + self.assertTrue('User-Agent' in response.http_request.headers) + self.assertEqual( + response.http_request.headers['User-Agent'], + "TestApp/v1.0 azsdk-python-storage-queue/12.0.0b1 Python/{} ({})".format( + platform.python_version(), + platform.platform())) + + service.get_service_properties(raw_response_hook=callback) + + def callback(response): + self.assertTrue('User-Agent' in response.http_request.headers) + self.assertEqual( + response.http_request.headers['User-Agent'], + "TestApp/v2.0 azsdk-python-storage-queue/12.0.0b1 Python/{} ({})".format( + platform.python_version(), + platform.platform())) + + service.get_service_properties(raw_response_hook=callback, user_agent="TestApp/v2.0") + + @record + def test_user_agent_append(self): + service = QueueServiceClient(self._get_queue_url(), credential=self.account_key) + + def callback(response): + self.assertTrue('User-Agent' in response.http_request.headers) + self.assertEqual( + response.http_request.headers['User-Agent'], + "azsdk-python-storage-queue/12.0.0b1 Python/{} ({}) customer_user_agent".format( + platform.python_version(), + platform.platform())) + + custom_headers = {'User-Agent': 'customer_user_agent'} + service.get_service_properties(raw_response_hook=callback, headers=custom_headers) + + +# ------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/common/test_service_properties.py b/sdk/storage/azure-storage-queue/tests/common/test_service_properties.py new file mode 100644 index 000000000000..fc85292fa8a0 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/common/test_service_properties.py @@ -0,0 +1,231 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest + +from msrest.exceptions import ValidationError # TODO This should be an azure-core error. +from azure.core.exceptions import HttpResponseError + +from azure.storage.queue import ( + QueueServiceClient, + QueueClient, + Logging, + Metrics, + CorsRule, + RetentionPolicy, +) + +from tests.testcase import ( + StorageTestCase, + record, + not_for_emulator, +) + + +# ------------------------------------------------------------------------------ + + +class ServicePropertiesTest(StorageTestCase): + def setUp(self): + super(ServicePropertiesTest, self).setUp() + + url = self._get_queue_url() + credential = self._get_shared_key_credential() + self.qsc = QueueServiceClient(url, credential=credential) + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + + self._assert_logging_equal(prop.logging, Logging()) + self._assert_metrics_equal(prop.hour_metrics, Metrics()) + self._assert_metrics_equal(prop.minute_metrics, Metrics()) + self._assert_cors_equal(prop.cors, list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + + @record + def test_queue_service_properties(self): + # Arrange + + # Act + resp = self.qsc.set_service_properties( + logging=Logging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list()) + + # Assert + self.assertIsNone(resp) + self._assert_properties_default(self.qsc.get_service_properties()) + + + # --Test cases per feature --------------------------------------- + + @record + def test_set_logging(self): + # Arrange + logging = Logging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.qsc.set_service_properties(logging=logging) + + # Assert + received_props = self.qsc.get_service_properties() + self._assert_logging_equal(received_props.logging, logging) + + @record + def test_set_hour_metrics(self): + # Arrange + hour_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.qsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = self.qsc.get_service_properties() + self._assert_metrics_equal(received_props.hour_metrics, hour_metrics) + + @record + def test_set_minute_metrics(self): + # Arrange + minute_metrics = Metrics(enabled=True, include_apis=True, + retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.qsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = self.qsc.get_service_properties() + self._assert_metrics_equal(received_props.minute_metrics, minute_metrics) + + @record + def test_set_cors(self): + # Arrange + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + self.qsc.set_service_properties(cors=cors) + + # Assert + received_props = self.qsc.get_service_properties() + self._assert_cors_equal(received_props.cors, cors) + + # --Test cases for errors --------------------------------------- + @record + def test_retention_no_days(self): + # Assert + self.assertRaises(ValueError, + RetentionPolicy, + True, None) + + @record + def test_too_many_cors_rules(self): + # Arrange + cors = [] + for i in range(0, 6): + cors.append(CorsRule(['www.xyz.com'], ['GET'])) + + # Assert + self.assertRaises(HttpResponseError, + self.qsc.set_service_properties, None, None, None, cors) + + @record + def test_retention_too_long(self): + # Arrange + minute_metrics = Metrics(enabled=True, include_apis=True, + retention_policy=RetentionPolicy(enabled=True, days=366)) + + # Assert + self.assertRaises(HttpResponseError, + self.qsc.set_service_properties, + None, None, minute_metrics) + + +# ------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/common/test_service_stats.py b/sdk/storage/azure-storage-queue/tests/common/test_service_stats.py new file mode 100644 index 000000000000..cf0a487cf01b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/common/test_service_stats.py @@ -0,0 +1,74 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest +import pytest + +from azure.storage.queue import QueueServiceClient + +from tests.testcase import ( + StorageTestCase, + record, +) + +SERVICE_UNAVAILABLE_RESP_BODY = 'unavailable ' + + +# --Test Class ----------------------------------------------------------------- +class ServiceStatsTest(StorageTestCase): + # --Helpers----------------------------------------------------------------- + def _assert_stats_default(self, stats): + self.assertIsNotNone(stats) + self.assertIsNotNone(stats.geo_replication) + + self.assertEqual(stats.geo_replication.status, 'live') + self.assertIsNotNone(stats.geo_replication.last_sync_time) + + def _assert_stats_unavailable(self, stats): + self.assertIsNotNone(stats) + self.assertIsNotNone(stats.geo_replication) + + self.assertEqual(stats.geo_replication.status, 'unavailable') + self.assertIsNone(stats.geo_replication.last_sync_time) + + @staticmethod + def override_response_body_with_unavailable_status(response): + response.http_response.text = lambda: SERVICE_UNAVAILABLE_RESP_BODY + + # --Test cases per service --------------------------------------- + + @record + def test_queue_service_stats_f(self): + # Arrange + url = self._get_queue_url() + credential = self._get_shared_key_credential() + qsc = QueueServiceClient(url, credential=credential) + + # Act + stats = qsc.get_service_stats() + + # Assert + self._assert_stats_default(stats) + + @record + def test_queue_service_stats_when_unavailable(self): + # Arrange + url = self._get_queue_url() + credential = self._get_shared_key_credential() + qsc = QueueServiceClient(url, credential=credential) + + # Act + stats = qsc.get_service_stats( + raw_response_hook=self.override_response_body_with_unavailable_status) + + # Assert + self._assert_stats_unavailable(stats) + + +# ------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/encryption_test_helper.py b/sdk/storage/azure-storage-queue/tests/encryption_test_helper.py new file mode 100644 index 000000000000..a7548a549cb8 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/encryption_test_helper.py @@ -0,0 +1,90 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives.asymmetric.padding import ( + OAEP, + MGF1, +) +from cryptography.hazmat.primitives.asymmetric.rsa import generate_private_key +from cryptography.hazmat.primitives.hashes import SHA1 +from cryptography.hazmat.primitives.keywrap import ( + aes_key_wrap, + aes_key_unwrap, +) + + +class KeyWrapper: + def __init__(self, kid='local:key1'): + # Must have constant key value for recorded tests, otherwise we could use a random generator. + self.kek = b'\xbe\xa4\x11K\x9eJ\x07\xdafF\x83\xad+\xadvA C\xe8\xbc\x90\xa4\x11}G\xc3\x0f\xd4\xb4\x19m\x11' + self.backend = default_backend() + self.kid = kid + + def wrap_key(self, key, algorithm='A256KW'): + if algorithm == 'A256KW': + return aes_key_wrap(self.kek, key, self.backend) + + raise ValueError(_ERROR_UNKNOWN_KEY_WRAP_ALGORITHM) + + def unwrap_key(self, key, algorithm): + if algorithm == 'A256KW': + return aes_key_unwrap(self.kek, key, self.backend) + + raise ValueError(_ERROR_UNKNOWN_KEY_WRAP_ALGORITHM) + + def get_key_wrap_algorithm(self): + return 'A256KW' + + def get_kid(self): + return self.kid + + +class KeyResolver: + def __init__(self): + self.keys = {} + + def put_key(self, key): + self.keys[key.get_kid()] = key + + def resolve_key(self, kid): + return self.keys[kid] + + +class RSAKeyWrapper: + def __init__(self, kid='local:key2'): + self.private_key = generate_private_key(public_exponent=65537, + key_size=2048, + backend=default_backend()) + self.public_key = self.private_key.public_key() + self.kid = kid + + def wrap_key(self, key, algorithm='RSA'): + if algorithm == 'RSA': + return self.public_key.encrypt(key, + OAEP( + mgf=MGF1(algorithm=SHA1()), + algorithm=SHA1(), + label=None) + ) + + raise ValueError(_ERROR_UNKNOWN_KEY_WRAP_ALGORITHM) + + def unwrap_key(self, key, algorithm): + if algorithm == 'RSA': + return self.private_key.decrypt(key, + OAEP( + mgf=MGF1(algorithm=SHA1()), + algorithm=SHA1(), + label=None) + ) + + raise ValueError(_ERROR_UNKNOWN_KEY_WRAP_ALGORITHM) + + def get_key_wrap_algorithm(self): + return 'RSA' + + def get_kid(self): + return self.kid diff --git a/sdk/storage/azure-storage-queue/tests/queues/__init__.py b/sdk/storage/azure-storage-queue/tests/queues/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/sdk/storage/azure-storage-queue/tests/queues/test_queue.py b/sdk/storage/azure-storage-queue/tests/queues/test_queue.py new file mode 100644 index 000000000000..d482d4080bfc --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/queues/test_queue.py @@ -0,0 +1,859 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import unittest +import pytest +from dateutil.tz import tzutc +from datetime import ( + datetime, + timedelta, + date, +) + +from azure.core.exceptions import ( + HttpResponseError, + ResourceNotFoundError, + ResourceExistsError) + +from azure.storage.queue import ( + QueueServiceClient, + QueueClient, + QueuePermissions, + AccessPolicy, + ResourceTypes, + AccountPermissions, + #TokenCredential, +) + +from tests.testcase import ( + StorageTestCase, + TestMode, + record, + LogCaptured, +) + +# ------------------------------------------------------------------------------ +TEST_QUEUE_PREFIX = 'pythonqueue' + + +# ------------------------------------------------------------------------------ + + +class StorageQueueTest(StorageTestCase): + def setUp(self): + super(StorageQueueTest, self).setUp() + + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + self.qsc = QueueServiceClient(account_url=queue_url, credential=credentials) + self.test_queues = [] + + def tearDown(self): + if not self.is_playback(): + for queue in self.test_queues: + try: + queue.delete_queue() + except: + pass + return super(StorageQueueTest, self).tearDown() + + # --Helpers----------------------------------------------------------------- + def _get_queue_reference(self, prefix=TEST_QUEUE_PREFIX): + queue_name = self.get_resource_name(prefix) + queue = self.qsc.get_queue_client(queue_name) + self.test_queues.append(queue) + return queue + + def _create_queue(self, prefix=TEST_QUEUE_PREFIX): + queue = self._get_queue_reference(prefix) + created = queue.create_queue() + return queue + + # --Test cases for queues ---------------------------------------------- + @record + def test_create_queue(self): + # Action + queue_client = self._get_queue_reference() + created = queue_client.create_queue() + + # Asserts + self.assertTrue(created) + + @record + def test_create_queue_fail_on_exist(self): + # Action + queue_client = self._get_queue_reference() + created = queue_client.create_queue() + with self.assertRaises(ResourceExistsError): + queue_client.create_queue() + + # Asserts + self.assertTrue(created) + + @record + def test_create_queue_fail_on_exist_different_metadata(self): + # Action + queue_client = self._get_queue_reference() + created = queue_client.create_queue() + with self.assertRaises(ResourceExistsError): + queue_client.create_queue(metadata={"val": "value"}) + + # Asserts + self.assertTrue(created) + + @record + def test_create_queue_with_options(self): + # Action + queue_client = self._get_queue_reference() + queue_client.create_queue( + metadata={'val1': 'test', 'val2': 'blah'}) + props = queue_client.get_queue_properties() + + # Asserts + self.assertEqual(0, props.approximate_message_count) + self.assertEqual(2, len(props.metadata)) + self.assertEqual('test', props.metadata['val1']) + self.assertEqual('blah', props.metadata['val2']) + + @record + def test_delete_non_existing_queue(self): + # Action + queue_client = self._get_queue_reference() + + # Asserts + with self.assertRaises(ResourceNotFoundError): + queue_client.delete_queue() + + @record + def test_delete_existing_queue_fail_not_exist(self): + # Action + queue_client = self._get_queue_reference() + + created = queue_client.create_queue() + deleted = queue_client.delete_queue() + + # Asserts + self.assertIsNone(deleted) + + @record + def test_list_queues(self): + # Action + queues = list(self.qsc.list_queues()) + + # Asserts + self.assertIsNotNone(queues) + self.assertTrue(len(self.test_queues) <= len(queues)) + + @record + def test_list_queues_with_options(self): + # Arrange + prefix = 'listqueue' + for i in range(0, 4): + self._create_queue(prefix + str(i)) + + # Action + generator1 = self.qsc.list_queues( + name_starts_with=prefix, + results_per_page=3) + next(generator1) + queues1 = generator1.current_page + + generator2 = self.qsc.list_queues( + name_starts_with=prefix, + marker=generator1.next_marker, + include_metadata=True) + next(generator2) + queues2 = generator2.current_page + + # Asserts + self.assertIsNotNone(queues1) + self.assertEqual(3, len(queues1)) + self.assertIsNotNone(queues1[0]) + self.assertIsNone(queues1[0].metadata) + self.assertNotEqual('', queues1[0].name) + # Asserts + self.assertIsNotNone(queues2) + self.assertTrue(len(self.test_queues) - 3 <= len(queues2)) + self.assertIsNotNone(queues2[0]) + self.assertNotEqual('', queues2[0].name) + + @record + def test_list_queues_with_metadata(self): + # Action + queue = self._create_queue() + queue.set_queue_metadata(metadata={'val1': 'test', 'val2': 'blah'}) + + listed_queue = list(self.qsc.list_queues( + name_starts_with=queue.queue_name, + results_per_page=1, + include_metadata=True))[0] + + # Asserts + self.assertIsNotNone(listed_queue) + self.assertEqual(queue.queue_name, listed_queue.name) + self.assertIsNotNone(listed_queue.metadata) + self.assertEqual(len(listed_queue.metadata), 2) + self.assertEqual(listed_queue.metadata['val1'], 'test') + + @record + def test_set_queue_metadata(self): + # Action + metadata = {'hello': 'world', 'number': '43'} + queue = self._create_queue() + + # Act + queue.set_queue_metadata(metadata) + metadata_from_response = queue.get_queue_properties().metadata + # Assert + self.assertDictEqual(metadata_from_response, metadata) + + @record + def test_get_queue_metadata_message_count(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + props = queue_client.get_queue_properties() + + # Asserts + self.assertTrue(props.approximate_message_count >= 1) + self.assertEqual(0, len(props.metadata)) + + @record + def test_queue_exists(self): + # Arrange + queue = self._create_queue() + + # Act + exists = queue.get_queue_properties() + + # Assert + self.assertTrue(exists) + + @record + def test_queue_not_exists(self): + # Arrange + queue = self.qsc.get_queue_client(self.get_resource_name('missing')) + # Act + with self.assertRaises(ResourceNotFoundError): + queue.get_queue_properties() + + # Assert + + @record + def test_put_message(self): + # Action. No exception means pass. No asserts needed. + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + message = queue_client.enqueue_message(u'message4') + + # Asserts + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertIsInstance(message.insertion_time, datetime) + self.assertIsInstance(message.expiration_time, datetime) + self.assertNotEqual('', message.pop_receipt) + self.assertEqual(u'message4', message.content) + + @record + def test_put_message_large_time_to_live(self): + # Arrange + queue_client = self._create_queue() + # There should be no upper bound on a queue message's time to live + queue_client.enqueue_message(u'message1', time_to_live=1024*1024*1024) + + # Act + messages = queue_client.peek_messages() + + # Assert + self.assertGreaterEqual( + messages[0].expiration_time, + messages[0].insertion_time + timedelta(seconds=1024 * 1024 * 1024 - 3600)) + + @record + def test_put_message_infinite_time_to_live(self): + # Arrange + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1', time_to_live=-1) + + # Act + messages = queue_client.peek_messages() + + # Assert + self.assertEqual(messages[0].expiration_time.year, date.max.year) + + @record + def test_get_messages(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + queue_client.enqueue_message(u'message4') + message = next(queue_client.receive_messages()) + + # Asserts + self.assertIsNotNone(message) + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertEqual(u'message1', message.content) + self.assertNotEqual('', message.pop_receipt) + self.assertEqual(1, message.dequeue_count) + + self.assertIsInstance(message.insertion_time, datetime) + self.assertIsInstance(message.expiration_time, datetime) + self.assertIsInstance(message.time_next_visible, datetime) + + @record + def test_get_messages_with_options(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + queue_client.enqueue_message(u'message4') + result = queue_client.receive_messages(messages_per_page=4, visibility_timeout=20) + next(result) + + # Asserts + self.assertIsNotNone(result) + self.assertEqual(4, len(result.current_page)) + + for message in result.current_page: + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertNotEqual('', message.content) + self.assertNotEqual('', message.pop_receipt) + self.assertEqual(1, message.dequeue_count) + self.assertNotEqual('', message.insertion_time) + self.assertNotEqual('', message.expiration_time) + self.assertNotEqual('', message.time_next_visible) + + @record + def test_peek_messages(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + queue_client.enqueue_message(u'message4') + result = queue_client.peek_messages() + + # Asserts + self.assertIsNotNone(result) + self.assertEqual(1, len(result)) + message = result[0] + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertNotEqual('', message.content) + self.assertIsNone(message.pop_receipt) + self.assertEqual(0, message.dequeue_count) + self.assertNotEqual('', message.insertion_time) + self.assertNotEqual('', message.expiration_time) + self.assertIsNone(message.time_next_visible) + + @record + def test_peek_messages_with_options(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + queue_client.enqueue_message(u'message4') + result = queue_client.peek_messages(max_messages=4) + + # Asserts + self.assertIsNotNone(result) + self.assertEqual(4, len(result)) + for message in result: + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertNotEqual('', message.content) + self.assertIsNone(message.pop_receipt) + self.assertEqual(0, message.dequeue_count) + self.assertNotEqual('', message.insertion_time) + self.assertNotEqual('', message.expiration_time) + self.assertIsNone(message.time_next_visible) + + @record + def test_clear_messages(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + queue_client.enqueue_message(u'message4') + queue_client.clear_messages() + result = queue_client.peek_messages() + + # Asserts + self.assertIsNotNone(result) + self.assertEqual(0, len(result)) + + @record + def test_delete_message(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + queue_client.enqueue_message(u'message2') + queue_client.enqueue_message(u'message3') + queue_client.enqueue_message(u'message4') + message = next(queue_client.receive_messages()) + queue_client.delete_message(message) + + messages = queue_client.receive_messages(messages_per_page=32) + next(messages) + + # Asserts + self.assertIsNotNone(messages) + self.assertEqual(3, len(messages.current_page)) + + @record + def test_update_message(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + messages = queue_client.receive_messages() + list_result1 = next(messages) + message = queue_client.update_message( + list_result1.id, + pop_receipt=list_result1.pop_receipt, + visibility_timeout=0) + list_result2 = next(messages) + + # Asserts + # Update response + self.assertIsNotNone(message) + self.assertIsNotNone(message.pop_receipt) + self.assertIsNotNone(message.time_next_visible) + self.assertIsInstance(message.time_next_visible, datetime) + + # Get response + self.assertIsNotNone(list_result2) + message = list_result2 + self.assertIsNotNone(message) + self.assertEqual(list_result1.id, message.id) + self.assertEqual(u'message1', message.content) + self.assertEqual(2, message.dequeue_count) + self.assertIsNotNone(message.pop_receipt) + self.assertIsNotNone(message.insertion_time) + self.assertIsNotNone(message.expiration_time) + self.assertIsNotNone(message.time_next_visible) + + @record + def test_update_message_content(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + + messages = queue_client.receive_messages() + list_result1 = next(messages) + message = queue_client.update_message( + list_result1.id, + pop_receipt=list_result1.pop_receipt, + visibility_timeout=0, + content=u'new text') + list_result2 = next(messages) + + # Asserts + # Update response + self.assertIsNotNone(message) + self.assertIsNotNone(message.pop_receipt) + self.assertIsNotNone(message.time_next_visible) + self.assertIsInstance(message.time_next_visible, datetime) + + # Get response + self.assertIsNotNone(list_result2) + message = list_result2 + self.assertIsNotNone(message) + self.assertEqual(list_result1.id, message.id) + self.assertEqual(u'new text', message.content) + self.assertEqual(2, message.dequeue_count) + self.assertIsNotNone(message.pop_receipt) + self.assertIsNotNone(message.insertion_time) + self.assertIsNotNone(message.expiration_time) + self.assertIsNotNone(message.time_next_visible) + + def test_account_sas(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + token = self.qsc.generate_shared_access_signature( + ResourceTypes.OBJECT, + AccountPermissions.READ, + datetime.utcnow() + timedelta(hours=1), + datetime.utcnow() - timedelta(minutes=5) + ) + + # Act + service = QueueServiceClient( + account_url=self.qsc.url, + credential=token, + ) + new_queue_client = service.get_queue_client(queue_client.queue_name) + result = new_queue_client.peek_messages() + + # Assert + self.assertIsNotNone(result) + self.assertEqual(1, len(result)) + message = result[0] + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertEqual(u'message1', message.content) + + @record + def test_token_credential(self): + pytest.skip("") + token_credential = self.generate_oauth_token() + + # Action 1: make sure token works + service = QueueServiceClient(self._get_oauth_queue_url(), credential=token_credential) + queues = service.get_service_properties() + self.assertIsNotNone(queues) + + # Action 2: change token value to make request fail + fake_credential = self.generate_fake_token() + service = QueueServiceClient(self._get_oauth_queue_url(), credential=fake_credential) + with self.assertRaises(ClientAuthenticationError): + list(service.list_queues()) + + # Action 3: update token to make it working again + service = QueueServiceClient(self._get_oauth_queue_url(), credential=token_credential) + queues = list(service.list_queues()) + self.assertIsNotNone(queues) + + def test_sas_read(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + token = queue_client.generate_shared_access_signature( + QueuePermissions.READ, + datetime.utcnow() + timedelta(hours=1), + datetime.utcnow() - timedelta(minutes=5) + ) + + # Act + service = QueueClient( + queue_url=queue_client.url, + credential=token, + ) + result = service.peek_messages() + + # Assert + self.assertIsNotNone(result) + self.assertEqual(1, len(result)) + message = result[0] + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertEqual(u'message1', message.content) + + def test_sas_add(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + queue_client = self._create_queue() + token = queue_client.generate_shared_access_signature( + QueuePermissions.ADD, + datetime.utcnow() + timedelta(hours=1), + ) + + # Act + service = QueueClient( + queue_url=queue_client.url, + credential=token, + ) + result = service.enqueue_message(u'addedmessage') + + # Assert + result = next(queue_client.receive_messages()) + self.assertEqual(u'addedmessage', result.content) + + def test_sas_update(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + token = queue_client.generate_shared_access_signature( + QueuePermissions.UPDATE, + datetime.utcnow() + timedelta(hours=1), + ) + messages = queue_client.receive_messages() + result = next(messages) + + # Act + service = QueueClient( + queue_url=queue_client.url, + credential=token, + ) + service.update_message( + result.id, + pop_receipt=result.pop_receipt, + visibility_timeout=0, + content=u'updatedmessage1', + ) + + # Assert + result = next(messages) + self.assertEqual(u'updatedmessage1', result.content) + + def test_sas_process(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + token = queue_client.generate_shared_access_signature( + QueuePermissions.PROCESS, + datetime.utcnow() + timedelta(hours=1), + ) + + # Act + service = QueueClient( + queue_url=queue_client.url, + credential=token, + ) + message = next(service.receive_messages()) + + # Assert + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertEqual(u'message1', message.content) + + def test_sas_signed_identifier(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + access_policy = AccessPolicy() + access_policy.start = datetime.utcnow() - timedelta(hours=1) + access_policy.expiry = datetime.utcnow() + timedelta(hours=1) + access_policy.permission = QueuePermissions.READ + + identifiers = {'testid': access_policy} + + queue_client = self._create_queue() + resp = queue_client.set_queue_access_policy(identifiers) + + queue_client.enqueue_message(u'message1') + + token = queue_client.generate_shared_access_signature( + policy_id='testid' + ) + + # Act + service = QueueClient( + queue_url=queue_client.url, + credential=token, + ) + result = service.peek_messages() + + # Assert + self.assertIsNotNone(result) + self.assertEqual(1, len(result)) + message = result[0] + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertEqual(u'message1', message.content) + + @record + def test_get_queue_acl(self): + # Arrange + queue_client = self._create_queue() + + # Act + acl = queue_client.get_queue_access_policy() + + # Assert + self.assertIsNotNone(acl) + self.assertEqual(len(acl), 0) + + @record + def test_get_queue_acl_iter(self): + # Arrange + queue_client = self._create_queue() + + # Act + acl = queue_client.get_queue_access_policy() + for signed_identifier in acl: + pass + + # Assert + self.assertIsNotNone(acl) + self.assertEqual(len(acl), 0) + + @record + def test_get_queue_acl_with_non_existing_queue(self): + # Arrange + queue_client = self._get_queue_reference() + + # Act + with self.assertRaises(ResourceNotFoundError): + queue_client.get_queue_access_policy() + + # Assert + + @record + def test_set_queue_acl(self): + # Arrange + queue_client = self._create_queue() + + # Act + resp = queue_client.set_queue_access_policy() + + # Assert + self.assertIsNone(resp) + acl = queue_client.get_queue_access_policy() + self.assertIsNotNone(acl) + + @record + def test_set_queue_acl_with_empty_signed_identifiers(self): + # Arrange + queue_client = self._create_queue() + + # Act + queue_client.set_queue_access_policy(signed_identifiers={}) + + # Assert + acl = queue_client.get_queue_access_policy() + self.assertIsNotNone(acl) + self.assertEqual(len(acl), 0) + + @record + def test_set_queue_acl_with_empty_signed_identifier(self): + # Arrange + queue_client = self._create_queue() + + # Act + queue_client.set_queue_access_policy(signed_identifiers={'empty': AccessPolicy()}) + + # Assert + acl = queue_client.get_queue_access_policy() + self.assertIsNotNone(acl) + self.assertEqual(len(acl), 1) + self.assertIsNotNone(acl['empty']) + self.assertIsNone(acl['empty'].permission) + self.assertIsNone(acl['empty'].expiry) + self.assertIsNone(acl['empty'].start) + + @record + def test_set_queue_acl_with_signed_identifiers(self): + # Arrange + queue_client = self._create_queue() + + # Act + access_policy = AccessPolicy(permission=QueuePermissions.READ, + expiry=datetime.utcnow() + timedelta(hours=1), + start=datetime.utcnow() - timedelta(minutes=5)) + identifiers = {'testid': access_policy} + + resp = queue_client.set_queue_access_policy(signed_identifiers=identifiers) + + # Assert + self.assertIsNone(resp) + acl = queue_client.get_queue_access_policy() + self.assertIsNotNone(acl) + self.assertEqual(len(acl), 1) + self.assertTrue('testid' in acl) + + @record + def test_set_queue_acl_too_many_ids(self): + # Arrange + queue_client = self._create_queue() + + # Act + identifiers = dict() + for i in range(0, 16): + identifiers['id{}'.format(i)] = AccessPolicy() + + # Assert + with self.assertRaises(ValueError): + queue_client.set_queue_access_policy(identifiers) + + @record + def test_set_queue_acl_with_non_existing_queue(self): + # Arrange + queue_client = self._get_queue_reference() + + # Act + with self.assertRaises(ResourceNotFoundError): + queue_client.set_queue_access_policy() + + # Assert + + @record + def test_unicode_create_queue_unicode_name(self): + # Action + queue_name = u'啊齄丂狛狜' + + with self.assertRaises(HttpResponseError): + # not supported - queue name must be alphanumeric, lowercase + client = self.qsc.get_queue_client(queue_name) + client.create_queue() + + # Asserts + + @record + def test_unicode_get_messages_unicode_data(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1㚈') + message = next(queue_client.receive_messages()) + + # Asserts + self.assertIsNotNone(message) + self.assertNotEqual('', message.id) + self.assertEqual(u'message1㚈', message.content) + self.assertNotEqual('', message.pop_receipt) + self.assertEqual(1, message.dequeue_count) + self.assertIsInstance(message.insertion_time, datetime) + self.assertIsInstance(message.expiration_time, datetime) + self.assertIsInstance(message.time_next_visible, datetime) + + @record + def test_unicode_update_message_unicode_data(self): + # Action + queue_client = self._create_queue() + queue_client.enqueue_message(u'message1') + messages = queue_client.receive_messages() + + list_result1 = next(messages) + list_result1.content = u'啊齄丂狛狜' + queue_client.update_message(list_result1, visibility_timeout=0) + + # Asserts + message = next(messages) + self.assertIsNotNone(message) + self.assertEqual(list_result1.id, message.id) + self.assertEqual(u'啊齄丂狛狜', message.content) + self.assertNotEqual('', message.pop_receipt) + self.assertEqual(2, message.dequeue_count) + self.assertIsInstance(message.insertion_time, datetime) + self.assertIsInstance(message.expiration_time, datetime) + self.assertIsInstance(message.time_next_visible, datetime) + + +# ------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/queues/test_queue_encodings.py b/sdk/storage/azure-storage-queue/tests/queues/test_queue_encodings.py new file mode 100644 index 000000000000..c24533586616 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/queues/test_queue_encodings.py @@ -0,0 +1,206 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest + +from azure.core.exceptions import HttpResponseError, DecodeError, ResourceExistsError +from azure.storage.queue import ( + QueueClient, + QueueServiceClient, + TextBase64EncodePolicy, + TextBase64DecodePolicy, + BinaryBase64EncodePolicy, + BinaryBase64DecodePolicy, + TextXMLEncodePolicy, + TextXMLDecodePolicy, + NoEncodePolicy, + NoDecodePolicy) + +from tests.testcase import ( + StorageTestCase, + record, +) + +# ------------------------------------------------------------------------------ +TEST_QUEUE_PREFIX = 'mytestqueue' + + +# ------------------------------------------------------------------------------ + +class StorageQueueEncodingTest(StorageTestCase): + def setUp(self): + super(StorageQueueEncodingTest, self).setUp() + + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + self.qsc = QueueServiceClient(account_url=queue_url, credential=credentials) + self.test_queues = [] + + def tearDown(self): + if not self.is_playback(): + for queue in self.test_queues: + try: + self.qsc.delete_queue(queue.queue_name) + except: + pass + return super(StorageQueueEncodingTest, self).tearDown() + + # --Helpers----------------------------------------------------------------- + def _get_queue_reference(self, prefix=TEST_QUEUE_PREFIX): + queue_name = self.get_resource_name(prefix) + queue = self.qsc.get_queue_client(queue_name) + self.test_queues.append(queue) + return queue + + def _create_queue(self, prefix=TEST_QUEUE_PREFIX): + queue = self._get_queue_reference(prefix) + try: + created = queue.create_queue() + except ResourceExistsError: + pass + return queue + + def _validate_encoding(self, queue, message): + # Arrange + try: + created = queue.create_queue() + except ResourceExistsError: + pass + + # Action. + queue.enqueue_message(message) + + # Asserts + dequeued = next(queue.receive_messages()) + self.assertEqual(message, dequeued.content) + + # -------------------------------------------------------------------------- + + @record + def test_message_text_xml(self): + # Arrange. + message = u'' + queue = self.qsc.get_queue_client(self.get_resource_name(TEST_QUEUE_PREFIX)) + + # Asserts + self._validate_encoding(queue, message) + + @record + def test_message_text_xml_whitespace(self): + # Arrange. + message = u' mess\t age1\n' + queue = self.qsc.get_queue_client(self.get_resource_name(TEST_QUEUE_PREFIX)) + + # Asserts + self._validate_encoding(queue, message) + + @record + def test_message_text_xml_invalid_chars(self): + # Action. + queue = self._get_queue_reference() + message = u'\u0001' + + # Asserts + with self.assertRaises(HttpResponseError): + queue.enqueue_message(message) + + @record + def test_message_text_base64(self): + # Arrange. + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + queue = QueueClient( + queue_url=queue_url, + queue=self.get_resource_name(TEST_QUEUE_PREFIX), + credential=credentials, + message_encode_policy=TextBase64EncodePolicy(), + message_decode_policy=TextBase64DecodePolicy()) + + message = u'\u0001' + + # Asserts + self._validate_encoding(queue, message) + + @record + def test_message_bytes_base64(self): + # Arrange. + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + queue = QueueClient( + queue_url=queue_url, + queue=self.get_resource_name(TEST_QUEUE_PREFIX), + credential=credentials, + message_encode_policy=BinaryBase64EncodePolicy(), + message_decode_policy=BinaryBase64DecodePolicy()) + + message = b'xyz' + + # Asserts + self._validate_encoding(queue, message) + + @record + def test_message_bytes_fails(self): + # Arrange + queue = self._get_queue_reference() + + # Action. + with self.assertRaises(TypeError) as e: + message = b'xyz' + queue.enqueue_message(message) + + # Asserts + self.assertTrue(str(e.exception).startswith('Message content must be text')) + + @record + def test_message_text_fails(self): + # Arrange + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + queue = QueueClient( + queue_url=queue_url, + queue=self.get_resource_name(TEST_QUEUE_PREFIX), + credential=credentials, + message_encode_policy=BinaryBase64EncodePolicy(), + message_decode_policy=BinaryBase64DecodePolicy()) + + # Action. + with self.assertRaises(TypeError) as e: + message = u'xyz' + queue.enqueue_message(message) + + # Asserts + self.assertTrue(str(e.exception).startswith('Message content must be bytes')) + + @record + def test_message_base64_decode_fails(self): + # Arrange + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + queue = QueueClient( + queue_url=queue_url, + queue=self.get_resource_name(TEST_QUEUE_PREFIX), + credential=credentials, + message_encode_policy=TextXMLEncodePolicy(), + message_decode_policy=BinaryBase64DecodePolicy()) + try: + queue.create_queue() + except ResourceExistsError: + pass + message = u'xyz' + queue.enqueue_message(message) + + # Action. + with self.assertRaises(DecodeError) as e: + queue.peek_messages() + + # Asserts + self.assertNotEqual(-1, str(e.exception).find('Message content is not valid base 64')) + + +# ------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/queues/test_queue_encryption.py b/sdk/storage/azure-storage-queue/tests/queues/test_queue_encryption.py new file mode 100644 index 000000000000..253b6a7a266f --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/queues/test_queue_encryption.py @@ -0,0 +1,486 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest +from base64 import ( + b64decode, +) +from json import ( + loads, + dumps, +) + +from cryptography.hazmat import backends +from cryptography.hazmat.primitives.ciphers import Cipher +from cryptography.hazmat.primitives.ciphers.algorithms import AES +from cryptography.hazmat.primitives.ciphers.modes import CBC +from cryptography.hazmat.primitives.padding import PKCS7 + +from azure.core.exceptions import HttpResponseError, ResourceExistsError + +from azure.storage.queue._shared.utils import _decode_base64_to_bytes +from azure.storage.queue._shared.encryption import ( + _ERROR_OBJECT_INVALID, + _WrappedContentKey, + _EncryptionAgent, + _EncryptionData, +) + +from azure.storage.queue import ( + VERSION, + QueueServiceClient, + QueueClient, + BinaryBase64EncodePolicy, + BinaryBase64DecodePolicy, + NoEncodePolicy, + NoDecodePolicy +) +from tests.encryption_test_helper import ( + KeyWrapper, + KeyResolver, + RSAKeyWrapper, +) +from tests.testcase import ( + StorageTestCase, + record, + TestMode, +) + +# ------------------------------------------------------------------------------ +TEST_QUEUE_PREFIX = 'encryptionqueue' + + +# ------------------------------------------------------------------------------ + + +class StorageQueueEncryptionTest(StorageTestCase): + def setUp(self): + super(StorageQueueEncryptionTest, self).setUp() + + queue_url = self._get_queue_url() + credentials = self._get_shared_key_credential() + self.qsc = QueueServiceClient(account_url=queue_url, credential=credentials) + self.test_queues = [] + + def tearDown(self): + if not self.is_playback(): + for queue in self.test_queues: + try: + self.qsc.delete_queue(queue.queue_name) + except: + pass + return super(StorageQueueEncryptionTest, self).tearDown() + + # --Helpers----------------------------------------------------------------- + def _get_queue_reference(self, prefix=TEST_QUEUE_PREFIX): + queue_name = self.get_resource_name(prefix) + queue = self.qsc.get_queue_client(queue_name) + self.test_queues.append(queue) + return queue + + def _create_queue(self, prefix=TEST_QUEUE_PREFIX): + queue = self._get_queue_reference(prefix) + try: + created = queue.create_queue() + except ResourceExistsError: + pass + return queue + + # -------------------------------------------------------------------------- + + @record + def test_get_messages_encrypted_kek(self): + # Arrange + self.qsc.key_encryption_key = KeyWrapper('key1') + queue = self._create_queue() + queue.enqueue_message(u'encrypted_message_2') + + # Act + li = next(queue.receive_messages()) + + # Assert + self.assertEqual(li.content, u'encrypted_message_2') + + @record + def test_get_messages_encrypted_resolver(self): + # Arrange + self.qsc.key_encryption_key = KeyWrapper('key1') + queue = self._create_queue() + queue.enqueue_message(u'encrypted_message_2') + key_resolver = KeyResolver() + key_resolver.put_key(self.qsc.key_encryption_key) + queue.key_resolver_function = key_resolver.resolve_key + queue.key_encryption_key = None # Ensure that the resolver is used + + # Act + li = next(queue.receive_messages()) + + # Assert + self.assertEqual(li.content, u'encrypted_message_2') + + @record + def test_peek_messages_encrypted_kek(self): + # Arrange + self.qsc.key_encryption_key = KeyWrapper('key1') + queue = self._create_queue() + queue.enqueue_message(u'encrypted_message_3') + + # Act + li = queue.peek_messages() + + # Assert + self.assertEqual(li[0].content, u'encrypted_message_3') + + @record + def test_peek_messages_encrypted_resolver(self): + # Arrange + self.qsc.key_encryption_key = KeyWrapper('key1') + queue = self._create_queue() + queue.enqueue_message(u'encrypted_message_4') + key_resolver = KeyResolver() + key_resolver.put_key(self.qsc.key_encryption_key) + queue.key_resolver_function = key_resolver.resolve_key + queue.key_encryption_key = None # Ensure that the resolver is used + + # Act + li = queue.peek_messages() + + # Assert + self.assertEqual(li[0].content, u'encrypted_message_4') + + def test_peek_messages_encrypted_kek_RSA(self): + + # We can only generate random RSA keys, so this must be run live or + # the playback test will fail due to a change in kek values. + if TestMode.need_recording_file(self.test_mode): + return + + # Arrange + self.qsc.key_encryption_key = RSAKeyWrapper('key2') + queue = self._create_queue() + queue.enqueue_message(u'encrypted_message_3') + + # Act + li = queue.peek_messages() + + # Assert + self.assertEqual(li[0].content, u'encrypted_message_3') + + @record + def test_update_encrypted_message(self): + # TODO: Recording doesn't work + if TestMode.need_recording_file(self.test_mode): + return + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue.enqueue_message(u'Update Me') + + messages = queue.receive_messages() + list_result1 = next(messages) + list_result1.content = u'Updated' + + # Act + message = queue.update_message(list_result1) + list_result2 = next(messages) + + # Assert + self.assertEqual(u'Updated', list_result2.content) + + @record + def test_update_encrypted_binary_message(self): + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue._config.message_encode_policy = BinaryBase64EncodePolicy() + queue._config.message_decode_policy = BinaryBase64DecodePolicy() + + binary_message = self.get_random_bytes(100) + queue.enqueue_message(binary_message) + messages = queue.receive_messages() + list_result1 = next(messages) + + # Act + binary_message = self.get_random_bytes(100) + list_result1.content = binary_message + queue.update_message(list_result1) + + list_result2 = next(messages) + + # Assert + self.assertEqual(binary_message, list_result2.content) + + @record + def test_update_encrypted_raw_text_message(self): + # TODO: Recording doesn't work + if TestMode.need_recording_file(self.test_mode): + return + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue._config.message_encode_policy = NoEncodePolicy() + queue._config.message_decode_policy = NoDecodePolicy() + + raw_text = u'Update Me' + queue.enqueue_message(raw_text) + messages = queue.receive_messages() + list_result1 = next(messages) + + # Act + raw_text = u'Updated' + list_result1.content = raw_text + queue.update_message(list_result1) + + list_result2 = next(messages) + + # Assert + self.assertEqual(raw_text, list_result2.content) + + @record + def test_update_encrypted_json_message(self): + # TODO: Recording doesn't work + if TestMode.need_recording_file(self.test_mode): + return + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue._config.message_encode_policy = NoEncodePolicy() + queue._config.message_decode_policy = NoDecodePolicy() + + message_dict = {'val1': 1, 'val2': '2'} + json_text = dumps(message_dict) + queue.enqueue_message(json_text) + messages = queue.receive_messages() + list_result1 = next(messages) + + # Act + message_dict['val1'] = 0 + message_dict['val2'] = 'updated' + json_text = dumps(message_dict) + list_result1.content = json_text + queue.update_message(list_result1) + + list_result2 = next(messages) + + # Assert + self.assertEqual(message_dict, loads(list_result2.content)) + + @record + def test_invalid_value_kek_wrap(self): + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue.key_encryption_key.get_kid = None + + with self.assertRaises(AttributeError) as e: + queue.enqueue_message(u'message') + + self.assertEqual(str(e.exception), _ERROR_OBJECT_INVALID.format('key encryption key', 'get_kid')) + + queue.key_encryption_key = KeyWrapper('key1') + queue.key_encryption_key.get_kid = None + with self.assertRaises(AttributeError): + queue.enqueue_message(u'message') + + queue.key_encryption_key = KeyWrapper('key1') + queue.key_encryption_key.wrap_key = None + with self.assertRaises(AttributeError): + queue.enqueue_message(u'message') + + @record + def test_missing_attribute_kek_wrap(self): + # Arrange + queue = self._create_queue() + + valid_key = KeyWrapper('key1') + + # Act + invalid_key_1 = lambda: None # functions are objects, so this effectively creates an empty object + invalid_key_1.get_key_wrap_algorithm = valid_key.get_key_wrap_algorithm + invalid_key_1.get_kid = valid_key.get_kid + # No attribute wrap_key + queue.key_encryption_key = invalid_key_1 + with self.assertRaises(AttributeError): + queue.enqueue_message(u'message') + + invalid_key_2 = lambda: None # functions are objects, so this effectively creates an empty object + invalid_key_2.wrap_key = valid_key.wrap_key + invalid_key_2.get_kid = valid_key.get_kid + # No attribute get_key_wrap_algorithm + queue.key_encryption_key = invalid_key_2 + with self.assertRaises(AttributeError): + queue.enqueue_message(u'message') + + invalid_key_3 = lambda: None # functions are objects, so this effectively creates an empty object + invalid_key_3.get_key_wrap_algorithm = valid_key.get_key_wrap_algorithm + invalid_key_3.wrap_key = valid_key.wrap_key + # No attribute get_kid + queue.key_encryption_key = invalid_key_3 + with self.assertRaises(AttributeError): + queue.enqueue_message(u'message') + + @record + def test_invalid_value_kek_unwrap(self): + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue.enqueue_message(u'message') + + # Act + queue.key_encryption_key.unwrap_key = None + with self.assertRaises(HttpResponseError): + queue.peek_messages() + + queue.key_encryption_key.get_kid = None + with self.assertRaises(HttpResponseError): + queue.peek_messages() + + @record + def test_missing_attribute_kek_unrwap(self): + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue.enqueue_message(u'message') + + # Act + valid_key = KeyWrapper('key1') + invalid_key_1 = lambda: None # functions are objects, so this effectively creates an empty object + invalid_key_1.unwrap_key = valid_key.unwrap_key + # No attribute get_kid + queue.key_encryption_key = invalid_key_1 + with self.assertRaises(HttpResponseError) as e: + queue.peek_messages() + + self.assertEqual(str(e.exception), "Decryption failed.") + + invalid_key_2 = lambda: None # functions are objects, so this effectively creates an empty object + invalid_key_2.get_kid = valid_key.get_kid + # No attribute unwrap_key + queue.key_encryption_key = invalid_key_2 + with self.assertRaises(HttpResponseError): + queue.peek_messages() + + @record + def test_validate_encryption(self): + # Arrange + queue = self._create_queue() + kek = KeyWrapper('key1') + queue.key_encryption_key = kek + queue.enqueue_message(u'message') + + # Act + queue.key_encryption_key = None # Message will not be decrypted + li = queue.peek_messages() + message = li[0].content + message = loads(message) + + encryption_data = message['EncryptionData'] + + wrapped_content_key = encryption_data['WrappedContentKey'] + wrapped_content_key = _WrappedContentKey( + wrapped_content_key['Algorithm'], + b64decode(wrapped_content_key['EncryptedKey'].encode(encoding='utf-8')), + wrapped_content_key['KeyId']) + + encryption_agent = encryption_data['EncryptionAgent'] + encryption_agent = _EncryptionAgent( + encryption_agent['EncryptionAlgorithm'], + encryption_agent['Protocol']) + + encryption_data = _EncryptionData( + b64decode(encryption_data['ContentEncryptionIV'].encode(encoding='utf-8')), + encryption_agent, + wrapped_content_key, + {'EncryptionLibrary': VERSION}) + + message = message['EncryptedMessageContents'] + content_encryption_key = kek.unwrap_key( + encryption_data.wrapped_content_key.encrypted_key, + encryption_data.wrapped_content_key.algorithm) + + # Create decryption cipher + backend = backends.default_backend() + algorithm = AES(content_encryption_key) + mode = CBC(encryption_data.content_encryption_IV) + cipher = Cipher(algorithm, mode, backend) + + # decode and decrypt data + decrypted_data = _decode_base64_to_bytes(message) + decryptor = cipher.decryptor() + decrypted_data = (decryptor.update(decrypted_data) + decryptor.finalize()) + + # unpad data + unpadder = PKCS7(128).unpadder() + decrypted_data = (unpadder.update(decrypted_data) + unpadder.finalize()) + + decrypted_data = decrypted_data.decode(encoding='utf-8') + + # Assert + self.assertEqual(decrypted_data, u'message') + + @record + def test_put_with_strict_mode(self): + # Arrange + queue = self._create_queue() + kek = KeyWrapper('key1') + queue.key_encryption_key = kek + queue.require_encryption = True + + queue.enqueue_message(u'message') + queue.key_encryption_key = None + + # Assert + with self.assertRaises(ValueError) as e: + queue.enqueue_message(u'message') + + self.assertEqual(str(e.exception), "Encryption required but no key was provided.") + + @record + def test_get_with_strict_mode(self): + # Arrange + queue = self._create_queue() + queue.enqueue_message(u'message') + + queue.require_encryption = True + queue.key_encryption_key = KeyWrapper('key1') + with self.assertRaises(ValueError) as e: + next(queue.receive_messages()) + + self.assertEqual(str(e.exception), 'Message was not encrypted.') + + @record + def test_encryption_add_encrypted_64k_message(self): + # Arrange + queue = self._create_queue() + message = u'a' * 1024 * 64 + + # Act + queue.enqueue_message(message) + + # Assert + queue.key_encryption_key = KeyWrapper('key1') + with self.assertRaises(HttpResponseError): + queue.enqueue_message(message) + + @record + def test_encryption_nonmatching_kid(self): + # Arrange + queue = self._create_queue() + queue.key_encryption_key = KeyWrapper('key1') + queue.enqueue_message(u'message') + + # Act + queue.key_encryption_key.kid = 'Invalid' + + # Assert + with self.assertRaises(HttpResponseError) as e: + next(queue.receive_messages()) + + self.assertEqual(str(e.exception), "Decryption failed.") + + +# ------------------------------------------------------------------------------ +if __name__ == '__main__': + unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_request_callback_signed_header.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_request_callback_signed_header.yaml new file mode 100644 index 000000000000..536f2a160db1 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_request_callback_signed_header.yaml @@ -0,0 +1,490 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0d64f6d8-952a-11e9-8b18-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:25 GMT + x-ms-meta-hello: + - world + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - adc33e53-f003-0036-5f36-29c952000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0daf9030-952a-11e9-9d9c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/contce2f1322?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-request-id: + - adc33e63-f003-0036-6836-29c952000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0db932de-952a-11e9-b0aa-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:26 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://remotestoragename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - adc33e6c-f003-0036-6e36-29c952000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cf5b34d2-952a-11e9-8f4d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:51 GMT + x-ms-meta-hello: + - world + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:17:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2efe1fa1-9003-00a5-7d37-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cfe16c64-952a-11e9-aac2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:52 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/contce2f1322?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:17:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-request-id: + - 2efe1fc4-9003-00a5-1a37-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cff09cf4-952a-11e9-beea-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:52 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:17:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2efe1fc9-9003-00a5-1f37-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 63a36af6-952b-11e9-8ed1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:21:59 GMT + x-ms-meta-hello: + - world + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 742d8ada-4003-00ac-5a38-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 641e386c-952b-11e9-8454-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:00 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/contce2f1322?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-request-id: + - 742d8b5e-4003-00ac-4338-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 64285cc0-952b-11e9-a3f7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:00 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 742d8b69-4003-00ac-4c38-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a119f2d8-952d-11e9-be4e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:02 GMT + x-ms-meta-hello: + - world + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 84e36ac3-7003-004a-0b3a-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a158fc9c-952d-11e9-8858-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:02 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/contce2f1322?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-request-id: + - 84e36acd-7003-004a-133a-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a1644cdc-952d-11e9-93a5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:02 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/contce2f1322 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 84e36ad6-7003-004a-193a-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_response_callback.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_response_callback.yaml new file mode 100644 index 000000000000..dea50d663f2b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_response_callback.yaml @@ -0,0 +1,178 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0dcbc3ae-952a-11e9-80bf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/contf4c30de7?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:b4fd3b60-0003-00c6-7236-29193c000000\n\ + Time:2019-06-22T20:12:26.6260107Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - b4fd3b60-0003-00c6-7236-29193c000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d015228c-952a-11e9-9ab2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:52 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/contf4c30de7?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:c545ec84-9003-00ae-3c37-29476d000000\n\ + Time:2019-06-22T20:17:52.6270410Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:17:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - c545ec84-9003-00ae-3c37-29476d000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 644866a8-952b-11e9-8047-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:01 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/contf4c30de7?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:aea4743a-0003-00cd-7438-290148000000\n\ + Time:2019-06-22T20:22:01.2413285Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - aea4743a-0003-00cd-7438-290148000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a199f046-952d-11e9-af89-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:02 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/contf4c30de7?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:6e6754af-d003-004c-233a-29a31f000000\n\ + Time:2019-06-22T20:38:03.1156230Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 6e6754af-d003-004c-233a-29a31f000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_append.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_append.yaml new file mode 100644 index 000000000000..a538cefc4a20 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_append.yaml @@ -0,0 +1,46 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) + customer_user_agent + x-ms-client-request-id: + - cdf8d066-99a5-11e9-9962-f45c89a7d159 + x-ms-date: + - Fri, 28 Jun 2019 13:08:21 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 13:08:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0f092bcf-d003-0047-33b2-2dbb6b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_custom.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_custom.yaml new file mode 100644 index 000000000000..54d9635ba40b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_custom.yaml @@ -0,0 +1,88 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - TestApp/v1.0 azsdk-python-storage-queue/12.0.0b1 Python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) + x-ms-client-request-id: + - ce4e82b8-99a5-11e9-9f58-f45c89a7d159 + x-ms-date: + - Fri, 28 Jun 2019 13:08:22 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 13:08:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 1ff1041d-a003-00e9-16b2-2d9806000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - TestApp/v2.0 azsdk-python-storage-queue/12.0.0b1 Python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) + x-ms-client-request-id: + - ce7b7162-99a5-11e9-956c-f45c89a7d159 + x-ms-date: + - Fri, 28 Jun 2019 13:08:22 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 13:08:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 1ff10426-a003-00e9-1db2-2d9806000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_default.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_default.yaml new file mode 100644 index 000000000000..609de92d7589 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_client.test_user_agent_default.yaml @@ -0,0 +1,45 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) + x-ms-client-request-id: + - ce904c70-99a5-11e9-85a0-f45c89a7d159 + x-ms-date: + - Fri, 28 Jun 2019 13:08:22 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 13:08:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9c95b1cf-7003-00c9-27b2-2df4ca000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_clear_messages.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_clear_messages.yaml new file mode 100644 index 000000000000..c37df70205c7 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_clear_messages.yaml @@ -0,0 +1,1230 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1931932c-952a-11e9-b5a7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 16b54ee5-6003-005e-2636-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 19521ac0-952a-11e9-8be4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF76b297ff-1aca-439a-952c-c84b470ad97dSat,\ + \ 22 Jun 2019 20:12:45 GMTSat, 29 Jun 2019\ + \ 20:12:45 GMTAgAAAAMAAAAAAAAAyCEY2zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 16b54eea-6003-005e-2936-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 195c92d4-952a-11e9-9c16-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFFcb341fad-37f5-4706-85a5-b06b389f288eSat,\ + \ 22 Jun 2019 20:12:45 GMTSat, 29 Jun 2019\ + \ 20:12:45 GMTAgAAAAMAAAAAAAAANvki2zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 16b54eed-6003-005e-2c36-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 196658be-952a-11e9-a824-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF16e5f553-ffea-4e92-bb44-080985e37504Sat,\ + \ 22 Jun 2019 20:12:45 GMTSat, 29 Jun 2019\ + \ 20:12:45 GMTAgAAAAMAAAAAAAAAoCIs2zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 16b54ef2-6003-005e-3136-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 196f4082-952a-11e9-8124-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF5695f253-b18d-4afb-ab8c-9b5845f49606Sat,\ + \ 22 Jun 2019 20:12:45 GMTSat, 29 Jun 2019\ + \ 20:12:45 GMTAgAAAAMAAAAAAAAAxtY02zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 16b54ef5-6003-005e-3436-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1977eaca-952a-11e9-b18a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 16b54ef9-6003-005e-3736-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 19e2e80c-952a-11e9-8844-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:46 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf740c50/messages?peekonly=true + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 16b54f2a-6003-005e-5d36-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d9fea4b4-952a-11e9-945e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:09 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 742d325b-4003-00ac-7d37-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da224d2e-952a-11e9-b318-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:09 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF0f0e43c8-6991-4ec1-bd29-a20274d1e9eeSat,\ + \ 22 Jun 2019 20:18:09 GMTSat, 29 Jun 2019\ + \ 20:18:09 GMTAgAAAAMAAAAAAAAAcT7pmzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:09 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 742d3268-4003-00ac-0537-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da2b6422-952a-11e9-812e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:09 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF5ff7f13c-afa9-465b-b813-8468663988a7Sat,\ + \ 22 Jun 2019 20:18:09 GMTSat, 29 Jun 2019\ + \ 20:18:09 GMTAgAAAAMAAAAAAAAAm/Lxmzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:09 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 742d3270-4003-00ac-0c37-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da343570-952a-11e9-bbc8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:09 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFFca495d5a-3d91-4138-b335-4505fb6eb9dbSat,\ + \ 22 Jun 2019 20:18:09 GMTSat, 29 Jun 2019\ + \ 20:18:09 GMTAgAAAAMAAAAAAAAABxz7mzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:09 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 742d3276-4003-00ac-1237-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da3d1b90-952a-11e9-97f0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:09 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFFd25cce7b-21fa-4285-b5a9-52b5f8e739c6Sat,\ + \ 22 Jun 2019 20:18:09 GMTSat, 29 Jun 2019\ + \ 20:18:09 GMTAgAAAAMAAAAAAAAAFakDnDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:09 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 742d327e-4003-00ac-1a37-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da45d56e-952a-11e9-94d6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:09 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 742d3282-4003-00ac-1e37-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - daa6b60c-952a-11e9-a3d0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:10 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages?peekonly=true + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 742d32ba-4003-00ac-4d37-294597000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e52f94c-952b-11e9-af5a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a17f4c51-f003-0097-2f38-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e74d3a2-952b-11e9-b0d2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFFb4bab5ab-bfb1-4e85-98ef-a56aba47a13fSat,\ + \ 22 Jun 2019 20:22:18 GMTSat, 29 Jun 2019\ + \ 20:22:18 GMTAgAAAAMAAAAAAAAA+WU8MDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a17f4c59-f003-0097-3238-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e7e4b80-952b-11e9-871c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF1a58e5ec-85ca-4db0-ac72-2d543b0a9b07Sat,\ + \ 22 Jun 2019 20:22:18 GMTSat, 29 Jun 2019\ + \ 20:22:18 GMTAgAAAAMAAAAAAAAAk91FMDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a17f4c5e-f003-0097-3638-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e87caca-952b-11e9-8ca2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF03c8fb0d-24a1-441b-847d-63838d3a9873Sat,\ + \ 22 Jun 2019 20:22:18 GMTSat, 29 Jun 2019\ + \ 20:22:18 GMTAgAAAAMAAAAAAAAA+wZPMDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a17f4c60-f003-0097-3838-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e90ad18-952b-11e9-a129-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF00c84a13-5431-46f3-a809-630d8034acc8Sat,\ + \ 22 Jun 2019 20:22:18 GMTSat, 29 Jun 2019\ + \ 20:22:18 GMTAgAAAAMAAAAAAAAADZRXMDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a17f4c64-f003-0097-3b38-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e99121c-952b-11e9-bb88-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:18 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a17f4c66-f003-0097-3d38-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6f7d8ea6-952b-11e9-aecc-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages?peekonly=true + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a17f4cbb-f003-0097-7c38-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ab944950-952d-11e9-a041-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:19 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 81b14f40-b003-0057-6a3a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - abb4b886-952d-11e9-909a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:19 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF92863ce0-4b17-45d9-80cf-b16f29d77728Sat,\ + \ 22 Jun 2019 20:38:19 GMTSat, 29 Jun 2019\ + \ 20:38:19 GMTAgAAAAMAAAAAAAAAqUF9bTop1QE=Sat,\ + \ 22 Jun 2019 20:38:19 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 81b14f4e-b003-0057-763a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - abbe359e-952d-11e9-a57f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:19 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFFb7cf194c-1949-4bfc-ac61-94b492abe7a3Sat,\ + \ 22 Jun 2019 20:38:19 GMTSat, 29 Jun 2019\ + \ 20:38:19 GMTAgAAAAMAAAAAAAAA5hyGbTop1QE=Sat,\ + \ 22 Jun 2019 20:38:19 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 81b14f5c-b003-0057-043a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - abc702f0-952d-11e9-853e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:19 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF73913a9b-43b1-4f68-b1b4-7c721645e10cSat,\ + \ 22 Jun 2019 20:38:20 GMTSat, 29 Jun 2019\ + \ 20:38:20 GMTAgAAAAMAAAAAAAAAPh+PbTop1QE=Sat,\ + \ 22 Jun 2019 20:38:20 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 81b14f67-b003-0057-0f3a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - abcff5e8-952d-11e9-a13b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:20 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: "\uFEFF349cbae5-a134-40ba-8708-da2dd961d236Sat,\ + \ 22 Jun 2019 20:38:20 GMTSat, 29 Jun 2019\ + \ 20:38:20 GMTAgAAAAMAAAAAAAAAfvqXbTop1QE=Sat,\ + \ 22 Jun 2019 20:38:20 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 81b14f79-b003-0057-203a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - abd8c6c0-952d-11e9-b0d3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:20 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:20 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 81b14f84-b003-0057-2b3a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ac8a6f74-952d-11e9-83df-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:21 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf740c50/messages?peekonly=true + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:20 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 81b15087-b003-0057-0d3a-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue.yaml new file mode 100644 index 000000000000..785c619bdbad --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue.yaml @@ -0,0 +1,154 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1a14782c-952a-11e9-afcc-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7af0b8a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a2742c4e-4003-00a7-1736-295de3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dae7adc6-952a-11e9-bcb6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:10 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea7af0b8a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ab0dc302-d003-00a9-2b37-29b1e8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6fc936e4-952b-11e9-bc00-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:20 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea7af0b8a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 400e3090-8003-0098-2938-29ea3f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ace449d8-952d-11e9-b6a2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:21 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea7af0b8a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f7730fec-1003-005a-4f3a-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist.yaml new file mode 100644 index 000000000000..5b23050d07c1 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist.yaml @@ -0,0 +1,306 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1a569838-952a-11e9-992e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7bd8bbf5-3003-00ce-7236-29024f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1a76a57e-952a-11e9-b98e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7bd8bc03-3003-00ce-7b36-29024f000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - db2d9a70-952a-11e9-a9cf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:10 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7f7a10a7-4003-002f-3b37-29e53a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - db4df1b4-952a-11e9-ae03-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7f7a10aa-4003-002f-3c37-29e53a000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 72209de2-952b-11e9-93aa-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5f7859e6-d003-008b-5e38-29dfde000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 72403f08-952b-11e9-8daa-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5f7859f1-d003-008b-6738-29dfde000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ad36ca8a-952d-11e9-bc2c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:22 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 400f0b1f-8003-0098-513a-29ea3f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ad5a5324-952d-11e9-a6c0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:22 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue736a114d + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 400f0b28-8003-0098-573a-29ea3f000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist_different_metadata.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist_different_metadata.yaml new file mode 100644 index 000000000000..a62e0112092e --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_fail_on_exist_different_metadata.yaml @@ -0,0 +1,346 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1a9e49a8-952a-11e9-b8de-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4a2e3e63-2003-009e-6836-291d47000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1abeef64-952a-11e9-8594-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:48 GMT + x-ms-meta: + - '{''val'': ''value''}' + x-ms-meta-val: + - value + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: "\uFEFFQueueAlreadyExistsThe\ + \ specified queue already exists.\nRequestId:4a2e3e6d-2003-009e-7036-291d47000000\n\ + Time:2019-06-22T20:12:48.2005434Z" + headers: + Content-Length: + - '222' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueAlreadyExists + x-ms-request-id: + - 4a2e3e6d-2003-009e-7036-291d47000000 + x-ms-version: + - '2018-03-28' + status: + code: 409 + message: The specified queue already exists. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - db7d1d8c-952a-11e9-b494-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e7a1cace-d003-00cf-2137-2903b2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - db9e8968-952a-11e9-811d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:11 GMT + x-ms-meta: + - '{''val'': ''value''}' + x-ms-meta-val: + - value + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: "\uFEFFQueueAlreadyExistsThe\ + \ specified queue already exists.\nRequestId:e7a1cae7-d003-00cf-3837-2903b2000000\n\ + Time:2019-06-22T20:18:12.3021037Z" + headers: + Content-Length: + - '222' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueAlreadyExists + x-ms-request-id: + - e7a1cae7-d003-00cf-3837-2903b2000000 + x-ms-version: + - '2018-03-28' + status: + code: 409 + message: The specified queue already exists. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 72782d3a-952b-11e9-86dd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2b8363b6-8003-0032-3b38-293cd0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 729b087a-952b-11e9-b77e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:25 GMT + x-ms-meta: + - '{''val'': ''value''}' + x-ms-meta-val: + - value + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: "\uFEFFQueueAlreadyExistsThe\ + \ specified queue already exists.\nRequestId:2b8363cd-8003-0032-4f38-293cd0000000\n\ + Time:2019-06-22T20:22:25.1056924Z" + headers: + Content-Length: + - '222' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueAlreadyExists + x-ms-request-id: + - 2b8363cd-8003-0032-4f38-293cd0000000 + x-ms-version: + - '2018-03-28' + status: + code: 409 + message: The specified queue already exists. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ad96883a-952d-11e9-82e9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:22 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 69127b5f-f003-001f-1c3a-29bf10000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - adb7a8d0-952d-11e9-b601-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:23 GMT + x-ms-meta: + - '{''val'': ''value''}' + x-ms-meta-val: + - value + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9101903 + response: + body: + string: "\uFEFFQueueAlreadyExistsThe\ + \ specified queue already exists.\nRequestId:69127b65-f003-001f-1e3a-29bf10000000\n\ + Time:2019-06-22T20:38:23.2865921Z" + headers: + Content-Length: + - '222' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueAlreadyExists + x-ms-request-id: + - 69127b65-f003-001f-1e3a-29bf10000000 + x-ms-version: + - '2018-03-28' + status: + code: 409 + message: The specified queue already exists. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_with_options.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_with_options.yaml new file mode 100644 index 000000000000..a4d0a6349f9c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_create_queue_with_options.yaml @@ -0,0 +1,362 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1ae91974-952a-11e9-9970-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:48 GMT + x-ms-meta: + - '{''val1'': ''test'', ''val2'': ''blah''}' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue63ff1110 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d95e0587-d003-00ed-6636-296d84000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1b098614-952a-11e9-95c9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:48 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue63ff1110?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-request-id: + - d95e059b-d003-00ed-7736-296d84000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dc1eabe8-952a-11e9-8d0d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:12 GMT + x-ms-meta: + - '{''val1'': ''test'', ''val2'': ''blah''}' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue63ff1110 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 02b4f8e0-3003-0064-7637-29d4a0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dc400d46-952a-11e9-93d2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:12 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue63ff1110?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-request-id: + - 02b4f8f6-3003-0064-0937-29d4a0000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 72d2e5b0-952b-11e9-987a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:25 GMT + x-ms-meta: + - '{''val1'': ''test'', ''val2'': ''blah''}' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue63ff1110 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - caff802e-6003-00d6-1938-292fda000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 735f2fd4-952b-11e9-bee0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue63ff1110?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-request-id: + - caff8112-6003-00d6-6838-292fda000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - adf9899e-952d-11e9-9321-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:23 GMT + x-ms-meta: + - '{''val1'': ''test'', ''val2'': ''blah''}' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue63ff1110 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f7c27705-8003-0054-3f3a-298e8a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ae1af764-952d-11e9-8c5c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:23 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue63ff1110?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-request-id: + - f7c27718-8003-0054-4f3a-298e8a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_existing_queue_fail_not_exist.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_existing_queue_fail_not_exist.yaml new file mode 100644 index 000000000000..aaff71f77169 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_existing_queue_fail_not_exist.yaml @@ -0,0 +1,306 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1b314fbe-952a-11e9-a9e0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f08e94f3-e003-00a1-8036-29aa9b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1b51598a-952a-11e9-b996-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://remotestoragename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f08e94f9-e003-00a1-0436-29aa9b000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dc6fd646-952a-11e9-9216-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:13 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e6028d85-9003-0026-3737-29ffb4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dc945f52-952a-11e9-9481-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:13 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e6028d8a-9003-0026-3a37-29ffb4000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7399842c-952b-11e9-bdd6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:26 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 96783a36-b003-009b-4038-29e938000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 73bbe88c-952b-11e9-a5bf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:26 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 96783a4b-b003-009b-5138-29e938000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ae58c152-952d-11e9-8b12-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9df0b0ca-e003-0066-163a-29d65a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ae79ef9e-952d-11e9-972d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:24 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueue38c6158a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9df0b0cd-e003-0066-173a-29d65a000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_message.yaml new file mode 100644 index 000000000000..51d38817ff39 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_message.yaml @@ -0,0 +1,1442 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1b7a7e3a-952a-11e9-bd27-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fd4a8222-9003-00c8-3c36-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1b9a01c6-952a-11e9-8b0c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF442e2d59-b9ee-4fc1-b57f-1eede999ed26Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAAZ71f3TYp1QE=Sat,\ + \ 22 Jun 2019 20:12:49 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - fd4a822e-9003-00c8-4436-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1ba2cc3e-952a-11e9-84a6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF4b1f4b61-a5c0-48fa-8473-231196864687Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAAayNo3TYp1QE=Sat,\ + \ 22 Jun 2019 20:12:49 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - fd4a8238-9003-00c8-4e36-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1bab46ca-952a-11e9-8a40-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFFbc529b8c-9f40-41ef-96f3-354cb25025b7Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAAkNdw3TYp1QE=Sat,\ + \ 22 Jun 2019 20:12:49 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - fd4a8241-9003-00c8-5536-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1bb3e9c6-952a-11e9-b2c0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF635425fc-8557-4a2c-81fb-14a27d8b1c50Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAApmR53TYp1QE=Sat,\ + \ 22 Jun 2019 20:12:49 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - fd4a8249-9003-00c8-5c36-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1bbc4aba-952a-11e9-9d3a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF442e2d59-b9ee-4fc1-b57f-1eede999ed26Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAAhkZj7zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:19 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - fd4a8253-9003-00c8-6536-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1bc4c398-952a-11e9-9d06-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages/442e2d59-b9ee-4fc1-b57f-1eede999ed26?popreceipt=AgAAAAMAAAAAAAAAhkZj7zYp1QE%3D + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fd4a825b-9003-00c8-6c36-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1bcd588c-952a-11e9-895b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:49 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebf910c49/messages?numofmessages=32 + response: + body: + string: "\uFEFF4b1f4b61-a5c0-48fa-8473-231196864687Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAA16507zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:19 GMT1message2bc529b8c-9f40-41ef-96f3-354cb25025b7Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAA16507zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:19 GMT1message3635425fc-8557-4a2c-81fb-14a27d8b1c50Sat,\ + \ 22 Jun 2019 20:12:49 GMTSat, 29 Jun 2019\ + \ 20:12:49 GMTAgAAAAMAAAAAAAAA16507zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:19 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - fd4a8261-9003-00c8-7236-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dcd5898c-952a-11e9-806a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:13 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0b5f410d-2003-0070-7d37-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dcf60022-952a-11e9-954d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:13 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF1208b99d-12bd-4073-a3c8-9b0ad6bfdf33Sat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAASC69njcp1QE=Sat,\ + \ 22 Jun 2019 20:18:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b5f411d-2003-0070-0a37-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dcff4f9c-952a-11e9-83d3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF3de1106c-a4cf-4a5f-a7dc-d5f70ad5c8b0Sat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAAzn7Gnjcp1QE=Sat,\ + \ 22 Jun 2019 20:18:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b5f412a-2003-0070-1637-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dd08b014-952a-11e9-aee4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF4ec3ee4b-b0f3-48e9-a5d1-8b7fc1e2180aSat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAA+DLPnjcp1QE=Sat,\ + \ 22 Jun 2019 20:18:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b5f4137-2003-0070-1f37-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dd11436e-952a-11e9-8240-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFFea4ee1a4-2c09-42d5-bad1-210be95e91c7Sat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAATzXYnjcp1QE=Sat,\ + \ 22 Jun 2019 20:18:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b5f4149-2003-0070-2e37-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dd1a7bd2-952a-11e9-95d1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF1208b99d-12bd-4073-a3c8-9b0ad6bfdf33Sat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAAkLPCsDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:44 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0b5f4151-2003-0070-3637-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dd23aae8-952a-11e9-b0bf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages/1208b99d-12bd-4073-a3c8-9b0ad6bfdf33?popreceipt=AgAAAAMAAAAAAAAAkLPCsDcp1QE%3D + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0b5f4164-2003-0070-4737-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dd2c7de6-952a-11e9-9262-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages?numofmessages=32 + response: + body: + string: "\uFEFF3de1106c-a4cf-4a5f-a7dc-d5f70ad5c8b0Sat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAAV9/UsDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:44 GMT1message24ec3ee4b-b0f3-48e9-a5d1-8b7fc1e2180aSat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAAV9/UsDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:44 GMT1message3ea4ee1a4-2c09-42d5-bad1-210be95e91c7Sat,\ + \ 22 Jun 2019 20:18:14 GMTSat, 29 Jun 2019\ + \ 20:18:14 GMTAgAAAAMAAAAAAAAAV9/UsDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:44 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0b5f4172-2003-0070-5337-2917c4000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 740b52d2-952b-11e9-9d3a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f5f43da9-6003-0099-3638-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 742c9034-952b-11e9-95de-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF193f415e-aabc-46e0-9209-48d6f7dad682Sat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAxCb0NTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f5f43db1-6003-0099-3a38-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7435d566-952b-11e9-a739-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF5b8f5b8c-25ca-42c2-a759-8feeba150f7cSat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAGyn9NTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f5f43db7-6003-0099-3f38-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 743eee58-952b-11e9-8745-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFFd867e71b-a641-4b87-b534-4659d5016cfdSat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAcysGNjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f5f43dba-6003-0099-4238-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 74482aa4-952b-11e9-9902-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF1cafa96b-c8b4-41b7-8dcf-407fffd8661cSat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAA+XsPNjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f5f43dbe-6003-0099-4538-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 74515192-952b-11e9-be15-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF193f415e-aabc-46e0-9209-48d6f7dad682Sat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAl5b6Rzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:57 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f5f43dbf-6003-0099-4638-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 745b1524-952b-11e9-b3c4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:27 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages/193f415e-aabc-46e0-9209-48d6f7dad682?popreceipt=AgAAAAMAAAAAAAAAl5b6Rzgp1QE%3D + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f5f43dc3-6003-0099-4a38-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 74643122-952b-11e9-b8fb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages?numofmessages=32 + response: + body: + string: "\uFEFF5b8f5b8c-25ca-42c2-a759-8feeba150f7cSat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAul4NSDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:58 GMT1message2d867e71b-a641-4b87-b534-4659d5016cfdSat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAul4NSDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:58 GMT1message31cafa96b-c8b4-41b7-8dcf-407fffd8661cSat,\ + \ 22 Jun 2019 20:22:27 GMTSat, 29 Jun 2019\ + \ 20:22:27 GMTAgAAAAMAAAAAAAAAul4NSDgp1QE=Sat,\ + \ 22 Jun 2019 20:22:58 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f5f43dc5-6003-0099-4c38-29ebc2000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - aee1db86-952d-11e9-9f94-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 24506b4c-4003-00ca-6e3a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af02a3ac-952d-11e9-bdc7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF914e12cd-da29-4d7f-828a-393828adfbbeSat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAeuTKcDop1QE=Sat,\ + \ 22 Jun 2019 20:38:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 24506b5e-4003-00ca-7e3a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af0bd666-952d-11e9-a81d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFFcd560872-1500-4081-9887-44a67792f515Sat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAzubTcDop1QE=Sat,\ + \ 22 Jun 2019 20:38:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 24506b71-4003-00ca-103a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af14a5f4-952d-11e9-bfa3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFFa047b162-8bd6-4ca3-8393-245d7af6dd90Sat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAA3HPccDop1QE=Sat,\ + \ 22 Jun 2019 20:38:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 24506b7f-4003-00ca-1d3a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af1d518c-952d-11e9-bc94-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFFcb60022d-89e1-4c86-afdb-627d48e3250fSat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAAijlcDop1QE=Sat,\ + \ 22 Jun 2019 20:38:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 24506b9c-4003-00ca-363a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af261bca-952d-11e9-8a6d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages + response: + body: + string: "\uFEFF914e12cd-da29-4d7f-828a-393828adfbbeSat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAVs3Pgjop1QE=Sat,\ + \ 22 Jun 2019 20:38:55 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 24506baa-4003-00ca-443a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af2f5190-952d-11e9-a222-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages/914e12cd-da29-4d7f-828a-393828adfbbe?popreceipt=AgAAAAMAAAAAAAAAVs3Pgjop1QE%3D + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 24506bc9-4003-00ca-5e3a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - af389908-952d-11e9-9591-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:25 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebf910c49/messages?numofmessages=32 + response: + body: + string: "\uFEFFcd560872-1500-4081-9887-44a67792f515Sat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAX27igjop1QE=Sat,\ + \ 22 Jun 2019 20:38:55 GMT1message2a047b162-8bd6-4ca3-8393-245d7af6dd90Sat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAX27igjop1QE=Sat,\ + \ 22 Jun 2019 20:38:55 GMT1message3cb60022d-89e1-4c86-afdb-627d48e3250fSat,\ + \ 22 Jun 2019 20:38:25 GMTSat, 29 Jun 2019\ + \ 20:38:25 GMTAgAAAAMAAAAAAAAAX27igjop1QE=Sat,\ + \ 22 Jun 2019 20:38:55 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 24506bd7-4003-00ca-6b3a-29f7cd000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_non_existing_queue.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_non_existing_queue.yaml new file mode 100644 index 000000000000..06badb54a8de --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_delete_non_existing_queue.yaml @@ -0,0 +1,178 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c028bc6-952a-11e9-8166-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:50 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://remotestoragename.queue.core.windows.net/pythonqueue637410fd + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:1ecb1021-6003-0038-0236-292559000000\n\ + Time:2019-06-22T20:12:50.4701156Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 1ecb1021-6003-0038-0236-292559000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dd73ec6c-952a-11e9-a2be-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:14 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueue637410fd + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:003b1c7a-3003-0046-3837-29ba96000000\n\ + Time:2019-06-22T20:18:15.0360363Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 003b1c7a-3003-0046-3837-29ba96000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 74c34338-952b-11e9-a579-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:28 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueue637410fd + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:762115a2-a003-0025-0438-29fcb3000000\n\ + Time:2019-06-22T20:22:28.8953884Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 762115a2-a003-0025-0438-29fcb3000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - afa695b6-952d-11e9-a5c1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:26 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/pythonqueue637410fd + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:7eec24bd-1003-0037-3a3a-29c8af000000\n\ + Time:2019-06-22T20:38:26.6802231Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 7eec24bd-1003-0037-3a3a-29c8af000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages.yaml new file mode 100644 index 000000000000..76b6524f397c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages.yaml @@ -0,0 +1,1086 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c4117cc-952a-11e9-9bc1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:50 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7c20b89 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31c3690-0003-0067-2e36-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c61d58c-952a-11e9-b12b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:50 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF6a602203-637a-4658-b3ef-d58caa8c9610Sat,\ + \ 22 Jun 2019 20:12:50 GMTSat, 29 Jun 2019\ + \ 20:12:50 GMTAgAAAAMAAAAAAAAAtZ4n3jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:50 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b31c369d-0003-0067-3836-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c6ac34c-952a-11e9-b1fb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:50 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFf674a405-7e8c-4ae8-ae4e-63379f42e093Sat,\ + \ 22 Jun 2019 20:12:50 GMTSat, 29 Jun 2019\ + \ 20:12:50 GMTAgAAAAMAAAAAAAAA9Xkw3jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:50 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b31c36a2-0003-0067-3d36-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c73d96e-952a-11e9-9a7f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF11d3220a-4d9c-4c14-bf37-ca0ee4696530Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAASHw53jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:51 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b31c36a6-0003-0067-3f36-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c7cb750-952a-11e9-9d05-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFe35a9913-6827-4713-9b08-ee5054fcce6fSat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAgldC3jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:51 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b31c36ab-0003-0067-4236-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1c85c322-952a-11e9-abe0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF6a602203-637a-4658-b3ef-d58caa8c9610Sat,\ + \ 22 Jun 2019 20:12:50 GMTSat, 29 Jun 2019\ + \ 20:12:50 GMTAgAAAAMAAAAAAAAAwtUs8DYp1QE=Sat,\ + \ 22 Jun 2019 20:13:21 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b31c36ae-0003-0067-4536-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ddc70028-952a-11e9-b923-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:15 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b1c7ced8-0003-0023-3537-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ddeb685a-952a-11e9-8751-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF3284ac50-0055-45ec-b88d-65800548a26cSat,\ + \ 22 Jun 2019 20:18:15 GMTSat, 29 Jun 2019\ + \ 20:18:15 GMTAgAAAAMAAAAAAAAAemmynzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b1c7cee4-0003-0023-3b37-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ddf48e1c-952a-11e9-93d3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFba8dd6b8-4f7a-4a2b-9f7f-0c13150ca130Sat,\ + \ 22 Jun 2019 20:18:15 GMTSat, 29 Jun 2019\ + \ 20:18:15 GMTAgAAAAMAAAAAAAAAu0S7nzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b1c7ceec-0003-0023-4037-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ddfd8c4c-952a-11e9-8850-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFd9a38b4e-40f1-4cee-a6ac-24522aa680c5Sat,\ + \ 22 Jun 2019 20:18:15 GMTSat, 29 Jun 2019\ + \ 20:18:15 GMTAgAAAAMAAAAAAAAAE0fEnzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b1c7cef1-0003-0023-4437-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de066d62-952a-11e9-8681-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF2d7d87ad-dbe0-4150-a435-4a94271172eaSat,\ + \ 22 Jun 2019 20:18:15 GMTSat, 29 Jun 2019\ + \ 20:18:15 GMTAgAAAAMAAAAAAAAAgnDNnzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b1c7cef4-0003-0023-4737-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de0f9c5c-952a-11e9-a5dd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:15 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF3284ac50-0055-45ec-b88d-65800548a26cSat,\ + \ 22 Jun 2019 20:18:15 GMTSat, 29 Jun 2019\ + \ 20:18:15 GMTAgAAAAMAAAAAAAAA8Ty4sTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:45 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b1c7cef7-0003-0023-4937-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7526d0c6-952b-11e9-8463-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 477ac04a-f003-00d3-5e38-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7547a8e4-952b-11e9-ab00-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:29 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFebb99020-04cf-47f8-af38-fb5e6f0322f0Sat,\ + \ 22 Jun 2019 20:22:29 GMTSat, 29 Jun 2019\ + \ 20:22:29 GMTAgAAAAMAAAAAAAAAcUAPNzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 477ac055-f003-00d3-6738-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7550fd0c-952b-11e9-9ca6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:29 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF7e037ce9-a178-4625-9806-bef0c0a7c3bcSat,\ + \ 22 Jun 2019 20:22:29 GMTSat, 29 Jun 2019\ + \ 20:22:29 GMTAgAAAAMAAAAAAAAArBsYNzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 477ac060-f003-00d3-7038-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7559a758-952b-11e9-9eb2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:29 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFab52b354-c291-4b7d-93f1-d0904e0a3b7eSat,\ + \ 22 Jun 2019 20:22:29 GMTSat, 29 Jun 2019\ + \ 20:22:29 GMTAgAAAAMAAAAAAAAA0c8gNzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 477ac06b-f003-00d3-7b38-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 75628fc6-952b-11e9-bbca-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:29 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF94eff834-bbb0-4a9a-818f-96d8f1d415a2Sat,\ + \ 22 Jun 2019 20:22:29 GMTSat, 29 Jun 2019\ + \ 20:22:29 GMTAgAAAAMAAAAAAAAALdIpNzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 477ac076-f003-00d3-0638-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 756b4006-952b-11e9-8793-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFebb99020-04cf-47f8-af38-fb5e6f0322f0Sat,\ + \ 22 Jun 2019 20:22:29 GMTSat, 29 Jun 2019\ + \ 20:22:29 GMTAgAAAAMAAAAAAAAAclAUSTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:59 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 477ac07f-f003-00d3-0f38-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b0150be8-952d-11e9-9203-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54de5478-f003-00be-3e3a-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b035e57a-952d-11e9-b1ed-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF2081d49b-f526-422b-a908-91e5dfe618b9Sat,\ + \ 22 Jun 2019 20:38:27 GMTSat, 29 Jun 2019\ + \ 20:38:27 GMTAgAAAAMAAAAAAAAAbR7+cTop1QE=Sat,\ + \ 22 Jun 2019 20:38:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54de5487-f003-00be-4a3a-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b03f08e6-952d-11e9-813e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF7a6f3677-834e-406b-a31d-daafa6805e86Sat,\ + \ 22 Jun 2019 20:38:27 GMTSat, 29 Jun 2019\ + \ 20:38:27 GMTAgAAAAMAAAAAAAAABpYHcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54de549a-f003-00be-5a3a-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b048a464-952d-11e9-8fe2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFFe8fb6408-13b6-4097-a557-704ec0c4591fSat,\ + \ 22 Jun 2019 20:38:27 GMTSat, 29 Jun 2019\ + \ 20:38:27 GMTAgAAAAMAAAAAAAAAow0Rcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54de54a8-f003-00be-673a-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b053fda8-952d-11e9-b76c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF25c492fc-a0b7-4d2d-98a4-88fb737d5c13Sat,\ + \ 22 Jun 2019 20:38:27 GMTSat, 29 Jun 2019\ + \ 20:38:27 GMTAgAAAAMAAAAAAAAA4UQdcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54de54b7-f003-00be-763a-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b0607062-952d-11e9-947b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:27 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuea7c20b89/messages + response: + body: + string: "\uFEFF2081d49b-f526-422b-a908-91e5dfe618b9Sat,\ + \ 22 Jun 2019 20:38:27 GMTSat, 29 Jun 2019\ + \ 20:38:27 GMTAgAAAAMAAAAAAAAAGx8LhDop1QE=Sat,\ + \ 22 Jun 2019 20:38:57 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 54de54cb-f003-00be-083a-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages_with_options.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages_with_options.yaml new file mode 100644 index 000000000000..4f79ec258033 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_messages_with_options.yaml @@ -0,0 +1,1122 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1cb5f240-952a-11e9-8690-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue6405110f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4ce61f8f-6003-0033-1436-293d2d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1cdbdadc-952a-11e9-908b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFFc07a14fe-0248-49ac-84ef-9183eec8c1f9Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAyXih3jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:51 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4ce61f99-6003-0033-1b36-293d2d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1ce4762e-952a-11e9-9f63-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF8c47bcca-e16f-4b92-92b1-15e94379eb52Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAwd6p3jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:51 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4ce61f9a-6003-0033-1c36-293d2d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1cecec34-952a-11e9-a5e2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFFee5ab552-39a9-40a8-ad63-d94e3b486906Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAtESy3jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:51 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4ce61f9f-6003-0033-2136-293d2d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1cf568ee-952a-11e9-bb36-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFFd1646c72-1aa6-423b-a070-0cfc5d649668Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAmYO63jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:51 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4ce61fab-6003-0033-2c36-293d2d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1cfd9dfa-952a-11e9-896e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:51 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue6405110f/messages?numofmessages=4&visibilitytimeout=20 + response: + body: + string: "\uFEFFc07a14fe-0248-49ac-84ef-9183eec8c1f9Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAkquu6jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:11 GMT1message18c47bcca-e16f-4b92-92b1-15e94379eb52Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAkquu6jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:11 GMT1message2ee5ab552-39a9-40a8-ad63-d94e3b486906Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAkquu6jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:11 GMT1message3d1646c72-1aa6-423b-a070-0cfc5d649668Sat,\ + \ 22 Jun 2019 20:12:51 GMTSat, 29 Jun 2019\ + \ 20:12:51 GMTAgAAAAMAAAAAAAAAkquu6jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:11 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:51 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 4ce61fb4-6003-0033-3536-293d2d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de5c3670-952a-11e9-837b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:16 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:15 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e1a897ac-1003-0073-2a37-2914c3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de7c09d2-952a-11e9-a68c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:16 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF4a3e7e24-0f9b-488d-a93e-8f6c52511bd4Sat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAG91CoDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:16 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e1a897b4-1003-0073-2e37-2914c3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de8504a6-952a-11e9-b42e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:16 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF6382f360-4bb2-4635-bbb0-0a2bdb1bc21bSat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAhwZMoDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:16 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e1a897bc-1003-0073-3337-2914c3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de8e1458-952a-11e9-8ed7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:16 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF4aa83d39-8722-46ab-a654-897fc8ff05b4Sat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAxOFUoDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:16 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e1a897c8-1003-0073-3a37-2914c3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de96f262-952a-11e9-b5f5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:16 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF5425bc84-4683-47e1-bfe0-f38ddb517178Sat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAA6ZVdoDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:16 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e1a897cf-1003-0073-3f37-2914c3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - de9f9886-952a-11e9-bd95-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:16 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages?numofmessages=4&visibilitytimeout=20 + response: + body: + string: "\uFEFF4a3e7e24-0f9b-488d-a93e-8f6c52511bd4Sat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAVYFSrDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:36 GMT1message16382f360-4bb2-4635-bbb0-0a2bdb1bc21bSat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAVYFSrDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:36 GMT1message24aa83d39-8722-46ab-a654-897fc8ff05b4Sat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAVYFSrDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:36 GMT1message35425bc84-4683-47e1-bfe0-f38ddb517178Sat,\ + \ 22 Jun 2019 20:18:16 GMTSat, 29 Jun 2019\ + \ 20:18:16 GMTAgAAAAMAAAAAAAAAVYFSrDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:36 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e1a897d5-1003-0073-4437-2914c3000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 75ccf3fa-952b-11e9-aff5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7df02fa6-3003-00ec-1538-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 75ed5910-952b-11e9-be2b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF75b37bc0-c7e6-48e8-9ce3-94d914932dabSat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAAqu20Nzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7df02faf-3003-00ec-1b38-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 75f69162-952b-11e9-bff9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFFf4e91262-01c6-48ae-bc09-7af40ee60c6bSat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAA58i9Nzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7df02fb3-3003-00ec-1f38-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 75ff663a-952b-11e9-adab-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF7001b035-8d54-406a-82b5-69753b3448e6Sat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAADX3GNzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7df02fba-3003-00ec-2638-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 76087c36-952b-11e9-9eae-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF1ab76e0f-1d96-42d7-999c-3accd5230ee2Sat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAAYX/PNzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7df02fbd-3003-00ec-2938-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 76115afe-952b-11e9-8512-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages?numofmessages=4&visibilitytimeout=20 + response: + body: + string: "\uFEFF75b37bc0-c7e6-48e8-9ce3-94d914932dabSat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAAtUPEQzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:50 GMT1message1f4e91262-01c6-48ae-bc09-7af40ee60c6bSat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAAtUPEQzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:50 GMT1message27001b035-8d54-406a-82b5-69753b3448e6Sat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAAtUPEQzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:50 GMT1message31ab76e0f-1d96-42d7-999c-3accd5230ee2Sat,\ + \ 22 Jun 2019 20:22:30 GMTSat, 29 Jun 2019\ + \ 20:22:30 GMTAgAAAAMAAAAAAAAAtUPEQzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:50 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7df02fc2-3003-00ec-2e38-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b0efd498-952d-11e9-a770-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:28 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - abd1b919-4003-0006-193a-299378000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b11061ac-952d-11e9-b8b8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFFe2a1644d-981b-4c48-8b4c-fc8b539037f3Sat,\ + \ 22 Jun 2019 20:38:28 GMTSat, 29 Jun 2019\ + \ 20:38:28 GMTAgAAAAMAAAAAAAAA2cfYcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:28 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - abd1b924-4003-0006-213a-299378000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b1198976-952d-11e9-a7a0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF26981b56-716f-4f72-af1e-301773a26c92Sat,\ + \ 22 Jun 2019 20:38:28 GMTSat, 29 Jun 2019\ + \ 20:38:28 GMTAgAAAAMAAAAAAAAAAnzhcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:28 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - abd1b929-4003-0006-263a-299378000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b1222c70-952d-11e9-ab5a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFFdebf68ee-14a5-4669-a34b-3e8092fe04a1Sat,\ + \ 22 Jun 2019 20:38:29 GMTSat, 29 Jun 2019\ + \ 20:38:29 GMTAgAAAAMAAAAAAAAAQ1fqcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - abd1b932-4003-0006-2d3a-299378000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b12b1240-952d-11e9-afa4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages + response: + body: + string: "\uFEFF103e9ae6-f20c-4d69-aede-b0d740fba873Sat,\ + \ 22 Jun 2019 20:38:29 GMTSat, 29 Jun 2019\ + \ 20:38:29 GMTAgAAAAMAAAAAAAAA+PXzcjop1QE=Sat,\ + \ 22 Jun 2019 20:38:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - abd1b93b-4003-0006-343a-299378000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b134a7ec-952d-11e9-a776-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue6405110f/messages?numofmessages=4&visibilitytimeout=20 + response: + body: + string: "\uFEFFe2a1644d-981b-4c48-8b4c-fc8b539037f3Sat,\ + \ 22 Jun 2019 20:38:28 GMTSat, 29 Jun 2019\ + \ 20:38:28 GMTAgAAAAMAAAAAAAAAIWzofjop1QE=Sat,\ + \ 22 Jun 2019 20:38:49 GMT1message126981b56-716f-4f72-af1e-301773a26c92Sat,\ + \ 22 Jun 2019 20:38:28 GMTSat, 29 Jun 2019\ + \ 20:38:28 GMTAgAAAAMAAAAAAAAAIWzofjop1QE=Sat,\ + \ 22 Jun 2019 20:38:49 GMT1message2debf68ee-14a5-4669-a34b-3e8092fe04a1Sat,\ + \ 22 Jun 2019 20:38:29 GMTSat, 29 Jun 2019\ + \ 20:38:29 GMTAgAAAAMAAAAAAAAAIWzofjop1QE=Sat,\ + \ 22 Jun 2019 20:38:49 GMT1message3103e9ae6-f20c-4d69-aede-b0d740fba873Sat,\ + \ 22 Jun 2019 20:38:29 GMTSat, 29 Jun 2019\ + \ 20:38:29 GMTAgAAAAMAAAAAAAAAIWzofjop1QE=Sat,\ + \ 22 Jun 2019 20:38:49 GMT1message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - abd1b940-4003-0006-383a-299378000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl.yaml new file mode 100644 index 000000000000..75c9d6a8010b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl.yaml @@ -0,0 +1,326 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1d36c00a-952a-11e9-9728-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:52 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3cd0be5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 645f09bd-8003-0076-7836-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1d56d214-952a-11e9-989a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:52 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3cd0be5?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 645f09c6-8003-0076-7e36-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dee2c81e-952a-11e9-9791-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb3cd0be5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7c4db884-3003-008a-5a37-29de23000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - df03bdbe-952a-11e9-85b2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb3cd0be5?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7c4db88c-3003-008a-5f37-29de23000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7663be34-952b-11e9-b955-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb3cd0be5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b965cc62-f003-00d8-2538-29c3d1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7683f828-952b-11e9-996f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:31 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb3cd0be5?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b965cc77-f003-00d8-3638-29c3d1000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b2d76ea4-952d-11e9-b3d6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb3cd0be5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5de8a820-d003-0065-2f3a-29d55d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b2f7a8d8-952d-11e9-aa09-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:32 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb3cd0be5?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 5de8a833-d003-0065-3f3a-29d55d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_iter.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_iter.yaml new file mode 100644 index 000000000000..b90f920c283d --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_iter.yaml @@ -0,0 +1,326 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1d80263a-952a-11e9-bfb5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:52 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef55d0df8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d0c01d53-f003-0014-1e36-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1da0b14a-952a-11e9-afec-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:52 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef55d0df8?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d0c01d66-f003-0014-2c36-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - df38decc-952a-11e9-8f28-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef55d0df8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 87218c19-8003-005f-2937-2996fe000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - df5b52fe-952a-11e9-b702-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef55d0df8?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 87218c20-8003-005f-2c37-2996fe000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 76b9fc90-952b-11e9-b349-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef55d0df8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 80e6e194-c003-007a-5f38-290e4d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 76d9e62c-952b-11e9-8b95-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:32 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef55d0df8?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 80e6e19c-c003-007a-6438-290e4d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b337c6be-952d-11e9-9c8e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:32 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef55d0df8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d5fe48d9-e003-00ee-5c3a-296e83000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b35979f8-952d-11e9-978f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:32 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef55d0df8?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d5fe48e7-e003-00ee-663a-296e83000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_with_non_existing_queue.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_with_non_existing_queue.yaml new file mode 100644 index 000000000000..4c94648ff1fe --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_acl_with_non_existing_queue.yaml @@ -0,0 +1,176 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1dc9d2b4-952a-11e9-96e7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:53 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue4ef515f8?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:c4a12d48-2003-0034-7a36-29cba8000000\n\ + Time:2019-06-22T20:12:53.4599960Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - c4a12d48-2003-0034-7a36-29cba8000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - df89fd98-952a-11e9-9ffa-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:18 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue4ef515f8?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:27cafb48-c003-0017-5037-29a463000000\n\ + Time:2019-06-22T20:18:18.5209871Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 27cafb48-c003-0017-5037-29a463000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 770d5818-952b-11e9-b0ef-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:32 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue4ef515f8?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:bcf50137-6003-0055-7838-298f77000000\n\ + Time:2019-06-22T20:22:32.7276664Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - bcf50137-6003-0055-7838-298f77000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b3920868-952d-11e9-ac57-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue4ef515f8?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:0169bc96-b003-003a-673a-2927a3000000\n\ + Time:2019-06-22T20:38:33.2564089Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 0169bc96-b003-003a-673a-2927a3000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_metadata_message_count.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_metadata_message_count.yaml new file mode 100644 index 000000000000..e13b434ef71d --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_get_queue_metadata_message_count.yaml @@ -0,0 +1,510 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1e09f448-952a-11e9-b638-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:53 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuee42613c2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4562594d-6003-0077-3836-29e141000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1e2a7e7a-952a-11e9-9396-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:53 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuee42613c2/messages + response: + body: + string: "\uFEFFb058a9d0-ca4e-47fc-9b64-4448b19cbd91Sat,\ + \ 22 Jun 2019 20:12:53 GMTSat, 29 Jun 2019\ + \ 20:12:53 GMTAgAAAAMAAAAAAAAAJi/w3zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:53 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 45625966-6003-0077-4d36-29e141000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1e334318-952a-11e9-a975-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:53 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuee42613c2?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '1' + x-ms-request-id: + - 4562597b-6003-0077-6136-29e141000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dfd250d4-952a-11e9-96af-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:18 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4f91b8c9-0003-00ab-7437-29b312000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dff358d8-952a-11e9-a97e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2/messages + response: + body: + string: "\uFEFFcbb2c1d4-6a3e-48da-b92b-942afff11ea4Sat,\ + \ 22 Jun 2019 20:18:19 GMTSat, 29 Jun 2019\ + \ 20:18:19 GMTAgAAAAMAAAAAAAAAo826oTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:19 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4f91b8e8-0003-00ab-1037-29b312000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - dffd3d3a-952a-11e9-b1ed-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '1' + x-ms-request-id: + - 4f91b8ff-0003-00ab-2637-29b312000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 77663f98-952b-11e9-9091-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:33 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c4a2cd37-2003-0034-2b38-29cba8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 77873e62-952b-11e9-8cbb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2/messages + response: + body: + string: "\uFEFF5a90b641-a749-475a-aea7-9bbc56c2c9bcSat,\ + \ 22 Jun 2019 20:22:33 GMTSat, 29 Jun 2019\ + \ 20:22:33 GMTAgAAAAMAAAAAAAAAI3ZOOTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - c4a2cd41-2003-0034-3338-29cba8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7790a0cc-952b-11e9-b81d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '1' + x-ms-request-id: + - c4a2cd4d-2003-0034-3e38-29cba8000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b616d91a-952d-11e9-b54d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:37 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7df15207-3003-00ec-0e3a-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b637e9c0-952d-11e9-8430-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:37 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2/messages + response: + body: + string: "\uFEFFb3af4067-2145-4930-b996-1ae4d6a17aafSat,\ + \ 22 Jun 2019 20:38:37 GMTSat, 29 Jun 2019\ + \ 20:38:37 GMTAgAAAAMAAAAAAAAAFhUAeDop1QE=Sat,\ + \ 22 Jun 2019 20:38:37 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7df1520e-3003-00ec-113a-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b640d170-952d-11e9-bbc3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:37 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuee42613c2?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '1' + x-ms-request-id: + - 7df15214-3003-00ec-153a-296c79000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues.yaml new file mode 100644 index 000000000000..af38e7373329 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues.yaml @@ -0,0 +1,178 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1e5bf0cc-952a-11e9-9e06-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:54 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?comp=list + response: + body: + string: "\uFEFFencryptionqueue00f571db76014b72a6c75a1bad87b762encryptionqueue01c813482f48463e8561d125608e0e3fencryptionqueue031a126cc154435089868a104a938242encryptionqueue036fcc0f15154cfa9750ce6849c2662dencryptionqueue038581f4daff4e93819f14c78fdc0679encryptionqueue03adb51e81d74bbb89fb5ae9f51cc717encryptionqueue04731f0f012c4207b95a984687221dbcencryptionqueue04b9331765234b26959037a4208823d9encryptionqueue0621951ba8d947f7aee46cae789bd3ffencryptionqueue0691a39f29a44be49175b67df325c643encryptionqueue0a3d69847143433c8aed62df2acae50cencryptionqueue0ac3aa83274c42f6b5a72c2489b70102encryptionqueue0ac3e277ee864e3f8d4a813106a6ea80encryptionqueue0aebd0719e114b3cbe976ec7d710e9b2encryptionqueue0baad9ef7b314e258053347c71955908encryptionqueue0bdd9faba39b4b88afdf0b0013c6eb41encryptionqueue0c1b2f05d0584923b7a7c4390fead6ddencryptionqueue1127c090fd3f4a39b38280423a27f7b1encryptionqueue12831da3db2a4d7bbcf7667fe655db4aencryptionqueue13271c2d36cd454e9b493760fe3c26d7encryptionqueue13c9e021d0d04335984fca6b717279c3encryptionqueue145086b86c93495f9e5e0dff62cfafdfencryptionqueue16fb1372b0b449f6b3c01beb8f68aa2eencryptionqueue1b9615466a5d48bcb5299e0e0e51c07fencryptionqueue1d37c54f6f084a8d897d6473ebc219eeencryptionqueue1f2c142026334947b904f8a01a56a2e8encryptionqueue1f6314e191b94eac8969bd91d086ec57encryptionqueue213a5e3dc51b4265b651761de87d19ebencryptionqueue234359980b3e44ca8e306c20a1c2378bencryptionqueue24af7cd0fec44245a29cac80ef58c42aencryptionqueue250aee46b615431abd40cbff4d01ddfbencryptionqueue2532a57cb39b4a2a81a4aa2cefd544aeencryptionqueue25b893825adf4019917d537be7b9a937encryptionqueue2653bf1b818246d9aad6f868bfdf3cdfencryptionqueue28277b1556aa4fffa6168ddc01f9f5a0encryptionqueue29d9077841994ffc988da6b1473ed101encryptionqueue2ade689325144e40b4189ea3e876bdd5encryptionqueue2afe7885787242ecb14ccfce84ccac09encryptionqueue2f6f0eff5deb43439743ed8620966793encryptionqueue31496fc1df4e426baddd506c2519c9c9encryptionqueue33561ca92c434700b1f2cc085199fc2aencryptionqueue33678fe6b6cc40e4868d0fa926a9e900encryptionqueue389127d37be54e76aa5b61b736e67663encryptionqueue39941e25f3104ba1bbf6075d9eae0617encryptionqueue3a398a31d22040598d605f767b94ac87encryptionqueue3aa2cbfe7ced448aa7589c9e986ef2ddencryptionqueue3b2b6361c2b6418fa45d8e87dc122c01encryptionqueue3be846efd85c4b998c3e54371e90c579encryptionqueue3c7dcb855e7b470783133945bf480165encryptionqueue3ce384bb880d4a7184ceb3a2bfc26695encryptionqueue3db07d1f9ea548339f5294692bb1725fencryptionqueue3df5958fe58d4f38841837387264e928encryptionqueue3ff3e2e865ec4f2296616d242bf3bcbaencryptionqueue417279ce4bc84de6b05c8b8e8e1da146encryptionqueue41c5a354464a4369a95b8e5ea85cd0a7encryptionqueue438e2f480e7340c6bbd99025e6882eaeencryptionqueue4523844416f44a91aedbecd841b17825encryptionqueue457c918033154970bff4620aca946ac7encryptionqueue4736410f2e94487594fd4ef639202544encryptionqueue47c2c792ca724456a3f5d4ae88179e28encryptionqueue484ffac93b584f54b23a4badb476b139encryptionqueue4901870ac1b84836ac9bd1308e648824encryptionqueue49dcd7c29e7041989f83448427af25adencryptionqueue4bbefd5d026a401ab776bbb61089d058encryptionqueue4daf8f96d3b142e386b17b14e003b66bencryptionqueue4e3ef909abac44449eeba45717f210a6encryptionqueue4e63a2316a51442f8442925348637d1aencryptionqueue4e678c94f1b140519cc53c56af064ffcencryptionqueue4f197f93c14b436891b927c8fe1d9141encryptionqueue4f9f9bd03c784e09a0d5b7762817c638encryptionqueue4ff40d03d6314550bea982326a29401dencryptionqueue505b33b035b845f59504ccdec9ab1c11encryptionqueue5151c95ea61f4c5c99c35b541a5f0939encryptionqueue566cd19e11ae46708be465785846092fencryptionqueue59fa82aac1384cb5b9a512f376d27ff9encryptionqueue5ad78db985384556912a24f1aa62f038encryptionqueue5ae5b1f367ca448b8130030d0461fbb1encryptionqueue5b02744e4ff9493d9cd2993895f75d89encryptionqueue5e4db545d97749518cf85d888c45a010encryptionqueue5e7383a701ce4f4aa43ff9a19341a426encryptionqueue5f4c2f6b4e3e4e4d983130c49202c369encryptionqueue6040f22ebc92484486d1013be00bf426encryptionqueue606997a069d44290863aab23d1499836encryptionqueue6350668d06bc4555afe11c8c4f3cca90encryptionqueue639bd2e086524c73becb63bb0777a4dfencryptionqueue6537723b3cf945549615fbca826c83f2encryptionqueue6543218e6c804ba4a762ebcf5a0f0c26encryptionqueue65685218f4f84a468d06003a75b7cc4fencryptionqueue67344e72836840e19b56c39e79de4063encryptionqueue679cfe6fcfd34949a82e71dc97e99e12encryptionqueue67fa5c4e1dc64abeb67c769c53c85c34encryptionqueue685fb5dcee654f54bbd73aaf639f29f2encryptionqueue69d3e31fbc4b406687818eb55275e102encryptionqueue6aa04e44b574454fa920f2eddc947df1encryptionqueue6ae894712a9b43699894efc57afe4301encryptionqueue6b44cb5bf3a04d65bdc7395e19a06e93encryptionqueue6c4007b0fc2f489e9788f205f4aee9e5encryptionqueue6e7490c8837b449fae623d2dc5889b62encryptionqueue6ee9c562f1e24721aca7b97bfb5e41a4encryptionqueue6f6e422e79814d8bba6983c3f0ed5da7encryptionqueue71574f0318b04e7eaea8f845e9cefc61encryptionqueue722864b1fa254ed782659f274e0221d6encryptionqueue726b001c972e44e496751beadd9d2ee7encryptionqueue73423f52d51049eb87e6203f5d3b0684encryptionqueue78537b4db1c348e9bef011129520e33fencryptionqueue7900797cd45641a3b91c12e6ab3a9c73encryptionqueue7a825e8d572d4d2091d1786ff4a0da80encryptionqueue7d73f7ae777d4a938453cfb10bf085fcencryptionqueue7e5f64634bf9477b8cfba578ae7a53d5encryptionqueue7e7c1061742e4ef2adb5168a0b3c8995encryptionqueue80ccc65910364da89e7411164d9fd662encryptionqueue8162db3895c64edc8b1caef46ebedce2encryptionqueue8215a38133f84b5bb78c0d62efdfe85cencryptionqueue82cf17e47a214ed9a09757c96dac282eencryptionqueue830fe85241c34c228d6afcff88454b9cencryptionqueue83a95d261eb0442d9c6dfb68f35e891bencryptionqueue840011245c6f4f0d95780eb4f072201dencryptionqueue843b50932c08404ea01bc23f58125b4eencryptionqueue84de687386a749d088d50f2cbe49faf4encryptionqueue85c8269646824b79981449f806e1d034encryptionqueue88b0c4e6001542579e1e4e54f8c5149fencryptionqueue8a6340e7ce514845896351308e26f1a5encryptionqueue8aea2e0a06bc4a78bb41334e7ceeb31dencryptionqueue8bf4d6844c5e41daaa536e83d0ce20b5encryptionqueue8bf9bfa83b68423582dd8890b5a9b59cencryptionqueue8e9a77c0c08e461a9f116b149af78cf4encryptionqueue913011da3d0748c0b9755bfd03c18d5eencryptionqueue926d112d0c0b48fe906572cb43bbc55fencryptionqueue92d2a1d4735d4e20891eb8a623e92b77encryptionqueue92f0141577244a38874e11688e9a8bc1encryptionqueue94c6cf23d6434704997669945da24e4aencryptionqueue9678ac222c444f6e922c74902f49ba00encryptionqueue9719642150034e1e98cbb44aaeb41a39encryptionqueue973613a055554ee9b46ef74a53690c44encryptionqueue9801d5a190c5415b821a5c35f2f89935encryptionqueue983965dec1ca47f2b92eadd9b1fc6cacencryptionqueue9a32c263dee44048be35df59b87a6d31encryptionqueue9db63deea8bd4370950d21bd84ee4d05encryptionqueue9dd54922e9e74a80b7757aaab4190a17encryptionqueue9e7a60d5828949c3bf73fc1e9abcc58cencryptionqueuea0d3b1db06804b5f9a619bd912e293d0encryptionqueuea2faa42aa8404ebda6618f46855b45e9encryptionqueuea43ffbc1c02d4d1e9d494c42ad891754encryptionqueuea563db7602fa41cfaa8f2d50d60ee396encryptionqueuea73c18833ab34cb4b7fed6991c915b35encryptionqueueaa771e618ab94629a64f0a5af63148a7encryptionqueuead0bd6447b924dec815c956b43c917b7encryptionqueueae116bd7da934598b02886f15be095feencryptionqueueae2d93a4fdb349f4a8c6542dc1b9bebeencryptionqueueaf6ab6bd4ae1465984165c86ea0a2030encryptionqueueb00011fa0643419a83985621a68c3fe7encryptionqueueb0749b04338f4b37bed47b6e7f128c37encryptionqueueb1ee9a1d3b024b0aac527cad50b89ae4encryptionqueueb29db696f2a24b779cf1529909f1d351encryptionqueueb2b37ce25bc64867a2df774508fbca50encryptionqueueb39140fac6d6430ba3030620662e7a90encryptionqueueb9bdd20389024b8bb17d0ec977c92394encryptionqueuebb29fd6e000d4aad86866c1c10bbbb57encryptionqueuebfda000d20e94a69b620156f87c0d179encryptionqueuebff8cd42e66d4515b11718b0f46fbc49encryptionqueuec25b0bb9b85a412d9bb026b53a38b781encryptionqueuec51758c3900d4b45828711af1632efd0encryptionqueuec8308010740f4a74b1b4aa1ebe53bfefencryptionqueueca35d53e302146c3835d8e0ca208e361encryptionqueuecb565eb607794c58a9bf0c44d1f3100eencryptionqueued271533c83d74174b44a675ec991c50bencryptionqueued3d8322c30db4f829de847622bec925dencryptionqueued51d7fb9d2a74482af09164eea6df304encryptionqueued5f8ca965e0e45adb9732b5299599ae5encryptionqueued82ab32a7b6e4986919374ed59976b41encryptionqueued99a917842634d808d5de37b041d6c99encryptionqueuedb062977ecd24c52adc6fd346d564257encryptionqueuedc8ce0bda3a14ff6b58826765a67b4e7encryptionqueuedd7e0c34e33d4e3b97eb6d417f072f19encryptionqueuee164080a6d9c4b49b80c56ed2f78e42fencryptionqueuee365639c552e45ffb47767842d9f9497encryptionqueuee5abfa24c8274b2787110e2577676641encryptionqueuee7d40ae0e26f4a0ba3886ad69693d10fencryptionqueueec0516286a0240f58b44f61fd618f698encryptionqueueef87f6b005704812be731e52e275b0f7encryptionqueueefe415d8b56943e8a403974b9f9ca77bencryptionqueuef065d7b313b247359f553a24b891412dencryptionqueuef5339ec598524170932fa4d479246c84encryptionqueuef7b36961f02b4e36a02eaf6762fe069cencryptionqueuef8e08828d1814069b106fdc553ac30d8encryptionqueuef915efc37cf843b98879d7848af8242eencryptionqueuef9f2b3145eb84ed4b824d05801f1a683encryptionqueuefa0af24f1b8e40ee9eb4cea776333137encryptionqueuefa40fb846d5b4f8ab9efa1af493c10c8encryptionqueuefa9ca7ef34ad4584a9ca8d7e08f8dcd0encryptionqueuefcf3dc00dc1c488aa420d691e4baa42aencryptionqueueff822101630840e0a8d6f3dc7b525a89listqueue0listqueue1listqueue2listqueue3mytestqueue0a2ef6bba4554b628d09bb86015bc842mytestqueue1013601153984f879b98caf8b0374f76mytestqueue10330cbb35ac40beb2b39c7d29f68c3cmytestqueue12b187b97782449e9006247f7fb3613fmytestqueue134d45a65a0044389c70ae9069fdad89mytestqueue15603b4dc47540d0bf8350b521ed31c8mytestqueue1886807877314f77acf680cc02cb76c5mytestqueue193bff9d55f64ed088b34261c9ca9cdfmytestqueue1cd5d2a6a60c47eab8a8feac51f50d5fmytestqueue1d031d8258e445c9b1d8f55b1e53ad18mytestqueue1d77ed688eb243ab952759b462969176mytestqueue1e092b5c395843d49a80fe4a94fe2b63mytestqueue1f39e46303c94fb68264c2977952bec2mytestqueue2189e290d4ed4654a799b5fd3ffcbd18mytestqueue2c72a270beb44ee1bddf46c97d76390bmytestqueue2d1ba08f20c5427786de42a9e6ff3661mytestqueue2e0dcbe5f23e4546b08a157eccba71e0mytestqueue30cea1f0940742b1900ac613dc0ce03emytestqueue36c2151767a94e81b21a06a91810d9c3mytestqueue37faa5540da34814a5c3cbea0a3b4edcmytestqueue39c28496fa6d454eac4abe60e9c012d5mytestqueue4070694a94c5449f8f5ba6ae9e48e62dmytestqueue428c7ffccfe441cb99b33a4cf6be01c3mytestqueue448a292b34f84208869b522d622e8dc6mytestqueue47a96b4e6f0d4b01917950b01d00368dmytestqueue4c34eb08c80048f59341bcb2e91e1831mytestqueue5858d272959d431184dd0bb98dfe0b5cmytestqueue58f68f5e123a44d5bb69bd277533475dmytestqueue68a5eee2272345f1903f28d99b79e111mytestqueue6a13757d27a64700a35afa29daaa3127mytestqueue6d0295e46d214419877333558cee3955mytestqueue72dfe06a4d43462694d647b7cb59fa4emytestqueue75c0a956ab564f049ed29369c7c5f119mytestqueue7668a40070f54cb49f0f8372763dc4a5mytestqueue79fa950888cc4b83856540e4172fc1f8mytestqueue7cc4973995dd4d6f833a3fe222252f26mytestqueue7d06985305c2451b8dd8a84a50b7bd84mytestqueue821a5855f7644a78a895ff29fa76cf42mytestqueue83bf3acfd5634a4495d8cd58a9fc4ad9mytestqueue85b098bf961944e3b3d0629d756b1da3mytestqueue8be406d367b5490a9359641e99f8a389mytestqueue8c14c266ec6f4f19820330513df8a7e5mytestqueue8d2c2996eb0f4d95930f8798e7a3e1dbmytestqueue91b35c21478242b98eeb79c5baeaff4dmytestqueue96364f4607d34ac9a236b4c966289ab4mytestqueue9bf03576a06a4deb818c0d1c769f1652mytestqueue9c41d179c24849a6a4a7d85baa1390f7mytestqueueab021ddf4ffa4c9f9571fd4dc39f8357mytestqueueb201e786962d48649b8211845f623a6emytestqueueb2627aa0225e4099bcca4ad323b72279mytestqueuebd590552c9724821bee7189344003e8bmytestqueuec2a61a972f0146cb902286257d355d89mytestqueuec3a370a2b00e4a38b629f4fe76fa5c45mytestqueuec78f7ccbf7584b63a7dabd5c0aa14140mytestqueuece46ab782aec49929df0ee75e65f4a9bmytestqueued635903262a4446089efc43a149d070dmytestqueuedbb7a293ffc9441e9d8bb26689041622mytestqueuedd0012aba5a24b9284b1277cefc3fdcemytestqueuee59211fca871487e97f3e2ed9b0283e7mytestqueueec4681c4befa4496b1858ffca231fe2bmytestqueueedbcbcb2f61445739996178b5add242emytestqueueedd54a85f0e740d0aca55d75641eb13bmytestqueueee2289f4dc1a44fab3ea67f3e6298604mytestqueuef5b0503136b84fe6b6b35938c7a2aa58mytestqueuef5e71027838a48389e832ec984c83feemytestqueuefd5d053567114146acdcda9538906418mytestqueuefe00bb01b6b1456c96d5139f125a0fefmytestqueuefee8fd4d502e4b65846dbab96921123bpythonq" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 99111f53-e003-0044-6036-29b86c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e035907a-952a-11e9-a871-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?comp=list + response: + body: + string: "\uFEFFencryptionqueue00f571db76014b72a6c75a1bad87b762encryptionqueue01c813482f48463e8561d125608e0e3fencryptionqueue031a126cc154435089868a104a938242encryptionqueue036fcc0f15154cfa9750ce6849c2662dencryptionqueue038581f4daff4e93819f14c78fdc0679encryptionqueue03adb51e81d74bbb89fb5ae9f51cc717encryptionqueue04731f0f012c4207b95a984687221dbcencryptionqueue04b9331765234b26959037a4208823d9encryptionqueue0621951ba8d947f7aee46cae789bd3ffencryptionqueue0691a39f29a44be49175b67df325c643encryptionqueue0a3d69847143433c8aed62df2acae50cencryptionqueue0ac3aa83274c42f6b5a72c2489b70102encryptionqueue0ac3e277ee864e3f8d4a813106a6ea80encryptionqueue0aebd0719e114b3cbe976ec7d710e9b2encryptionqueue0baad9ef7b314e258053347c71955908encryptionqueue0bdd9faba39b4b88afdf0b0013c6eb41encryptionqueue0c1b2f05d0584923b7a7c4390fead6ddencryptionqueue1127c090fd3f4a39b38280423a27f7b1encryptionqueue12831da3db2a4d7bbcf7667fe655db4aencryptionqueue13271c2d36cd454e9b493760fe3c26d7encryptionqueue13c9e021d0d04335984fca6b717279c3encryptionqueue145086b86c93495f9e5e0dff62cfafdfencryptionqueue16fb1372b0b449f6b3c01beb8f68aa2eencryptionqueue1b9615466a5d48bcb5299e0e0e51c07fencryptionqueue1d37c54f6f084a8d897d6473ebc219eeencryptionqueue1f2c142026334947b904f8a01a56a2e8encryptionqueue1f6314e191b94eac8969bd91d086ec57encryptionqueue213a5e3dc51b4265b651761de87d19ebencryptionqueue234359980b3e44ca8e306c20a1c2378bencryptionqueue24af7cd0fec44245a29cac80ef58c42aencryptionqueue250aee46b615431abd40cbff4d01ddfbencryptionqueue2532a57cb39b4a2a81a4aa2cefd544aeencryptionqueue25b893825adf4019917d537be7b9a937encryptionqueue2653bf1b818246d9aad6f868bfdf3cdfencryptionqueue28277b1556aa4fffa6168ddc01f9f5a0encryptionqueue29091535encryptionqueue29d9077841994ffc988da6b1473ed101encryptionqueue29f01530encryptionqueue2ade689325144e40b4189ea3e876bdd5encryptionqueue2afe7885787242ecb14ccfce84ccac09encryptionqueue2f6f0eff5deb43439743ed8620966793encryptionqueue31496fc1df4e426baddd506c2519c9c9encryptionqueue33561ca92c434700b1f2cc085199fc2aencryptionqueue33678fe6b6cc40e4868d0fa926a9e900encryptionqueue389127d37be54e76aa5b61b736e67663encryptionqueue39941e25f3104ba1bbf6075d9eae0617encryptionqueue3a398a31d22040598d605f767b94ac87encryptionqueue3aa2cbfe7ced448aa7589c9e986ef2ddencryptionqueue3b2b6361c2b6418fa45d8e87dc122c01encryptionqueue3be846efd85c4b998c3e54371e90c579encryptionqueue3c7dcb855e7b470783133945bf480165encryptionqueue3ce384bb880d4a7184ceb3a2bfc26695encryptionqueue3db07d1f9ea548339f5294692bb1725fencryptionqueue3df5958fe58d4f38841837387264e928encryptionqueue3ff3e2e865ec4f2296616d242bf3bcbaencryptionqueue417279ce4bc84de6b05c8b8e8e1da146encryptionqueue41c5a354464a4369a95b8e5ea85cd0a7encryptionqueue438e2f480e7340c6bbd99025e6882eaeencryptionqueue446c19b4encryptionqueue4523844416f44a91aedbecd841b17825encryptionqueue457c918033154970bff4620aca946ac7encryptionqueue4736410f2e94487594fd4ef639202544encryptionqueue47c2c792ca724456a3f5d4ae88179e28encryptionqueue484ffac93b584f54b23a4badb476b139encryptionqueue4901870ac1b84836ac9bd1308e648824encryptionqueue49dcd7c29e7041989f83448427af25adencryptionqueue4bbefd5d026a401ab776bbb61089d058encryptionqueue4daf8f96d3b142e386b17b14e003b66bencryptionqueue4e3ef909abac44449eeba45717f210a6encryptionqueue4e63a2316a51442f8442925348637d1aencryptionqueue4e678c94f1b140519cc53c56af064ffcencryptionqueue4f197f93c14b436891b927c8fe1d9141encryptionqueue4f9f9bd03c784e09a0d5b7762817c638encryptionqueue4ff40d03d6314550bea982326a29401dencryptionqueue505b33b035b845f59504ccdec9ab1c11encryptionqueue5151c95ea61f4c5c99c35b541a5f0939encryptionqueue546e15faencryptionqueue566cd19e11ae46708be465785846092fencryptionqueue56cd161cencryptionqueue577f1613encryptionqueue59fa82aac1384cb5b9a512f376d27ff9encryptionqueue5ad78db985384556912a24f1aa62f038encryptionqueue5ae5b1f367ca448b8130030d0461fbb1encryptionqueue5b02744e4ff9493d9cd2993895f75d89encryptionqueue5e4db545d97749518cf85d888c45a010encryptionqueue5e7383a701ce4f4aa43ff9a19341a426encryptionqueue5f4c2f6b4e3e4e4d983130c49202c369encryptionqueue6040f22ebc92484486d1013be00bf426encryptionqueue606997a069d44290863aab23d1499836encryptionqueue6350668d06bc4555afe11c8c4f3cca90encryptionqueue639bd2e086524c73becb63bb0777a4dfencryptionqueue6537723b3cf945549615fbca826c83f2encryptionqueue6543218e6c804ba4a762ebcf5a0f0c26encryptionqueue65685218f4f84a468d06003a75b7cc4fencryptionqueue67344e72836840e19b56c39e79de4063encryptionqueue679cfe6fcfd34949a82e71dc97e99e12encryptionqueue67fa5c4e1dc64abeb67c769c53c85c34encryptionqueue685fb5dcee654f54bbd73aaf639f29f2encryptionqueue69d3e31fbc4b406687818eb55275e102encryptionqueue6a6e165fencryptionqueue6aa04e44b574454fa920f2eddc947df1encryptionqueue6ae894712a9b43699894efc57afe4301encryptionqueue6b44cb5bf3a04d65bdc7395e19a06e93encryptionqueue6c4007b0fc2f489e9788f205f4aee9e5encryptionqueue6e7490c8837b449fae623d2dc5889b62encryptionqueue6ee9c562f1e24721aca7b97bfb5e41a4encryptionqueue6f6e422e79814d8bba6983c3f0ed5da7encryptionqueue71574f0318b04e7eaea8f845e9cefc61encryptionqueue722864b1fa254ed782659f274e0221d6encryptionqueue726b001c972e44e496751beadd9d2ee7encryptionqueue73423f52d51049eb87e6203f5d3b0684encryptionqueue78537b4db1c348e9bef011129520e33fencryptionqueue7900797cd45641a3b91c12e6ab3a9c73encryptionqueue7a825e8d572d4d2091d1786ff4a0da80encryptionqueue7d73f7ae777d4a938453cfb10bf085fcencryptionqueue7e5f64634bf9477b8cfba578ae7a53d5encryptionqueue7e7c1061742e4ef2adb5168a0b3c8995encryptionqueue80ccc65910364da89e7411164d9fd662encryptionqueue8162db3895c64edc8b1caef46ebedce2encryptionqueue8215a38133f84b5bb78c0d62efdfe85cencryptionqueue82cf17e47a214ed9a09757c96dac282eencryptionqueue830fe85241c34c228d6afcff88454b9cencryptionqueue83a95d261eb0442d9c6dfb68f35e891bencryptionqueue840011245c6f4f0d95780eb4f072201dencryptionqueue843b50932c08404ea01bc23f58125b4eencryptionqueue847016ffencryptionqueue84de687386a749d088d50f2cbe49faf4encryptionqueue85c8269646824b79981449f806e1d034encryptionqueue88b0c4e6001542579e1e4e54f8c5149fencryptionqueue8a6340e7ce514845896351308e26f1a5encryptionqueue8aea2e0a06bc4a78bb41334e7ceeb31dencryptionqueue8bf4d6844c5e41daaa536e83d0ce20b5encryptionqueue8bf9bfa83b68423582dd8890b5a9b59cencryptionqueue8e9a77c0c08e461a9f116b149af78cf4encryptionqueue913011da3d0748c0b9755bfd03c18d5eencryptionqueue926d112d0c0b48fe906572cb43bbc55fencryptionqueue92d2a1d4735d4e20891eb8a623e92b77encryptionqueue92f0141577244a38874e11688e9a8bc1encryptionqueue94c6cf23d6434704997669945da24e4aencryptionqueue9678ac222c444f6e922c74902f49ba00encryptionqueue9719642150034e1e98cbb44aaeb41a39encryptionqueue973613a055554ee9b46ef74a53690c44encryptionqueue9801d5a190c5415b821a5c35f2f89935encryptionqueue983965dec1ca47f2b92eadd9b1fc6cacencryptionqueue9a32c263dee44048be35df59b87a6d31encryptionqueue9a7c1749encryptionqueue9db63deea8bd4370950d21bd84ee4d05encryptionqueue9dd54922e9e74a80b7757aaab4190a17encryptionqueue9e7a60d5828949c3bf73fc1e9abcc58cencryptionqueuea0d3b1db06804b5f9a619bd912e293d0encryptionqueuea2faa42aa8404ebda6618f46855b45e9encryptionqueuea43ffbc1c02d4d1e9d494c42ad891754encryptionqueuea563db7602fa41cfaa8f2d50d60ee396encryptionqueuea73c18833ab34cb4b7fed6991c915b35encryptionqueueaa771e618ab94629a64f0a5af63148a7encryptionqueuead0bd6447b924dec815c956b43c917b7encryptionqueueae116bd7da934598b02886f15be095feencryptionqueueae2d93a4fdb349f4a8c6542dc1b9bebeencryptionqueueaf6ab6bd4ae1465984165c86ea0a2030encryptionqueueb00011fa0643419a83985621a68c3fe7encryptionqueueb0749b04338f4b37bed47b6e7f128c37encryptionqueueb1ee9a1d3b024b0aac527cad50b89ae4encryptionqueueb29db696f2a24b779cf1529909f1d351encryptionqueueb2b37ce25bc64867a2df774508fbca50encryptionqueueb39140fac6d6430ba3030620662e7a90encryptionqueueb9bdd20389024b8bb17d0ec977c92394encryptionqueuebb29fd6e000d4aad86866c1c10bbbb57encryptionqueuebfda000d20e94a69b620156f87c0d179encryptionqueuebff8cd42e66d4515b11718b0f46fbc49encryptionqueuec25b0bb9b85a412d9bb026b53a38b781encryptionqueuec34e1330encryptionqueuec51758c3900d4b45828711af1632efd0encryptionqueuec8308010740f4a74b1b4aa1ebe53bfefencryptionqueuec9311831encryptionqueuec9ae1814encryptionqueueca35d53e302146c3835d8e0ca208e361encryptionqueuecb565eb607794c58a9bf0c44d1f3100eencryptionqueued271533c83d74174b44a675ec991c50bencryptionqueued3d8322c30db4f829de847622bec925dencryptionqueued51d7fb9d2a74482af09164eea6df304encryptionqueued5f8ca965e0e45adb9732b5299599ae5encryptionqueued7de1393encryptionqueued82ab32a7b6e4986919374ed59976b41encryptionqueued99a917842634d808d5de37b041d6c99encryptionqueued9c213acencryptionqueuedb062977ecd24c52adc6fd346d564257encryptionqueuedc8ce0bda3a14ff6b58826765a67b4e7encryptionqueuedd7e0c34e33d4e3b97eb6d417f072f19encryptionqueuee12a1896encryptionqueuee164080a6d9c4b49b80c56ed2f78e42fencryptionqueuee365639c552e45ffb47767842d9f9497encryptionqueuee5abfa24c8274b2787110e2577676641encryptionqueuee7d40ae0e26f4a0ba3886ad69693d10fencryptionqueueec0516286a0240f58b44f61fd618f698encryptionqueueef87f6b005704812be731e52e275b0f7encryptionqueueefe415d8b56943e8a403974b9f9ca77bencryptionqueuef065d7b313b247359f553a24b891412dencryptionqueuef5339ec598524170932fa4d479246c84encryptionqueuef7b36961f02b4e36a02eaf6762fe069cencryptionqueuef8e08828d1814069b106fdc553ac30d8encryptionqueuef915efc37cf843b98879d7848af8242eencryptionqueuef9f2b3145eb84ed4b824d05801f1a683encryptionqueuefa0af24f1b8e40ee9eb4cea776333137encryptionqueuefa40fb846d5b4f8ab9efa1af493c10c8encryptionqueuefa9ca7ef34ad4584a9ca8d7e08f8dcd0encryptionqueuefc3a18fdencryptionqueuefcf3dc00dc1c488aa420d691e4baa42aencryptionqueuefee61452encryptionqueueff822101630840e0a8d6f3dc7b525a89listqueue0listqueue1listqueue2listqueue3mytestqueue0a2ef6bba4554b628d09bb86015bc842mytestqueue1013601153984f879b98caf8b0374f76mytestqueue10330cbb35ac40beb2b39c7d29f68c3cmytestqueue12b187b97782449e9006247f7fb3613fmytestqueue134d45a65a0044389c70ae9069fdad89mytestqueue15603b4dc47540d0bf8350b521ed31c8mytestqueue1886807877314f77acf680cc02cb76c5mytestqueue193bff9d55f64ed088b34261c9ca9cdfmytestqueue1cd5d2a6a60c47eab8a8feac51f50d5fmytestqueue1d031d8258e445c9b1d8f55b1e53ad18mytestqueue1d77ed688eb243ab952759b462969176mytestqueue1e092b5c395843d49a80fe4a94fe2b63mytestqueue1f39e46303c94fb68264c2977952bec2mytestqueue2189e290d4ed4654a799b5fd3ffcbd18mytestqueue2c72a270beb44ee1bddf46c97d76390bmytestqueue2d1ba08f20c5427786de42a9e6ff3661mytestqueue2e0dcbe5f23e4546b08a157eccba71e0mytestqueue30cea1f0940742b1900ac613dc0ce03emytestqueue36c2151767a94e81b21a06a91810d9c3mytestqueue37faa5540da34814a5c3cbea0a3b4edcmytestqueue39c28496fa6d454eac4abe60e9c012d5mytestqueue4070694a94c5449f8f5ba6ae9e48e62dmytestqueue428c7ffccfe441cb99b33a4cf6be01c3mytestqueue448a292b34f84208869b522d622e8dc6mytestqueue453d1525mytestqueue47a96b4e6f0d4b01917950b01d00368dmytestqueue4c34eb08c80048f59341bcb2e91e1831mytestqueue509615f0mytestqueue5858d272959d431184dd0bb98dfe0b5cmytestqueue58f68f5e123a44d5bb69bd277533475dmytestqueue68a5eee2272345f1903f28d99b79e111mytestqueue6a13757d27a64700a35afa29daaa3127mytestqueue6d0295e46d214419877333558cee3955mytestqueue72dfe06a4d43462694d647b7cb59fa4emytestqueue75b91164mytestqueue75c0a956ab564f049ed29369c7c5f119mytestqueue7668a40070f54cb49f0f8372763dc4a5mytestqueue79fa950888cc4b83856540e4172fc1f8mytestqueue7cc4973995dd4d6f833a3fe222252f26mytestqueue7d06985305c2451b8dd8a84a50b7bd84mytestqueue821a5855f7644a78a895ff29fa76cf42mytestqueue83bf3acfd5634a4495d8cd58a9fc4ad9mytestqueue85b098bf961944e3b3d0629d756b1da3mytestqueue8be406d367b5490a9359641e99f8a389mytestqueue8c14c266ec6f4f19820330513df8a7e5mytestqueue8d2c2996eb0f4d95930f8798e7a3e1dbmytestqueue91b35c21478242b98eeb79c5baeaff4dmytestqueue96364f4607d34ac9a236b4c966289ab4mytestqueue9bf03576a06a4deb818c0d1c769f1652mytestqueue9c41d179c24849a6a4a7d85baa1390f7mytestqueueab021ddf4ffa4c9f9571fd4dc39f8357mytestqueueab101218mytestqueueb201e786962d48649b8211845f623a6emytestqueueb2627aa0225e4099bcca4ad323b72279mytestqueuebd590552c9724821bee7189344003e8bmytestqueuebdb1127amytestqueuec2a61a972f0146cb902286257d355d89mytestqueuec3a370a2b00e4a38b629f4fe76fa5c45mytestqueuec78f7ccbf7584b63a7dabd5c0aa14140mytestqueuece46ab782aec49929df0ee75e65f4a9bmytestqueued635903262a4446089efc43a149d070dmytestqueuedbb7a293ffc9441e9d8bb26689041622mytestqueuedd0012aba5a24b9284b1277cefc3fdcemytestqueuee59211fca871487e97f3e2ed9b0283e7mytestqueueec4681c4befa4496b1858ffca231fe2bmytestqueueedbcbcb2f61445739996178b5add242emytestqueueedd54a85f0e740d0aca55d75641eb13bmytestqueueee2289f4dc1a44fab3ea67f3e6298604mytestqueuef5b0503136b84fe6b6b35938c7a2aa58mytestqueuef5e71027838a48389e832ec984c83feemytestqueuefd5d053567114146acdcda9538906418mytestqueuefe00bb01b6b1456c96d5139f125a0fefmytestqueuefee8fd4d502e4b65846dbab96921123bpythonq" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9911b91b-e003-0044-2337-29b86c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 77dc7922-952b-11e9-b4a3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?comp=list + response: + body: + string: "\uFEFFencryptionqueue00f571db76014b72a6c75a1bad87b762encryptionqueue01c813482f48463e8561d125608e0e3fencryptionqueue031a126cc154435089868a104a938242encryptionqueue036fcc0f15154cfa9750ce6849c2662dencryptionqueue038581f4daff4e93819f14c78fdc0679encryptionqueue03adb51e81d74bbb89fb5ae9f51cc717encryptionqueue04731f0f012c4207b95a984687221dbcencryptionqueue04b9331765234b26959037a4208823d9encryptionqueue0621951ba8d947f7aee46cae789bd3ffencryptionqueue0691a39f29a44be49175b67df325c643encryptionqueue0a3d69847143433c8aed62df2acae50cencryptionqueue0ac3aa83274c42f6b5a72c2489b70102encryptionqueue0ac3e277ee864e3f8d4a813106a6ea80encryptionqueue0aebd0719e114b3cbe976ec7d710e9b2encryptionqueue0baad9ef7b314e258053347c71955908encryptionqueue0bdd9faba39b4b88afdf0b0013c6eb41encryptionqueue0c1b2f05d0584923b7a7c4390fead6ddencryptionqueue1127c090fd3f4a39b38280423a27f7b1encryptionqueue12831da3db2a4d7bbcf7667fe655db4aencryptionqueue13271c2d36cd454e9b493760fe3c26d7encryptionqueue13c9e021d0d04335984fca6b717279c3encryptionqueue145086b86c93495f9e5e0dff62cfafdfencryptionqueue16fb1372b0b449f6b3c01beb8f68aa2eencryptionqueue1b9615466a5d48bcb5299e0e0e51c07fencryptionqueue1d37c54f6f084a8d897d6473ebc219eeencryptionqueue1f2c142026334947b904f8a01a56a2e8encryptionqueue1f6314e191b94eac8969bd91d086ec57encryptionqueue213a5e3dc51b4265b651761de87d19ebencryptionqueue234359980b3e44ca8e306c20a1c2378bencryptionqueue24af7cd0fec44245a29cac80ef58c42aencryptionqueue250aee46b615431abd40cbff4d01ddfbencryptionqueue2532a57cb39b4a2a81a4aa2cefd544aeencryptionqueue25b893825adf4019917d537be7b9a937encryptionqueue2653bf1b818246d9aad6f868bfdf3cdfencryptionqueue28277b1556aa4fffa6168ddc01f9f5a0encryptionqueue29091535encryptionqueue29d9077841994ffc988da6b1473ed101encryptionqueue29f01530encryptionqueue2ade689325144e40b4189ea3e876bdd5encryptionqueue2afe7885787242ecb14ccfce84ccac09encryptionqueue2f6f0eff5deb43439743ed8620966793encryptionqueue31496fc1df4e426baddd506c2519c9c9encryptionqueue33561ca92c434700b1f2cc085199fc2aencryptionqueue33678fe6b6cc40e4868d0fa926a9e900encryptionqueue389127d37be54e76aa5b61b736e67663encryptionqueue39941e25f3104ba1bbf6075d9eae0617encryptionqueue3a398a31d22040598d605f767b94ac87encryptionqueue3aa2cbfe7ced448aa7589c9e986ef2ddencryptionqueue3b2b6361c2b6418fa45d8e87dc122c01encryptionqueue3be846efd85c4b998c3e54371e90c579encryptionqueue3c7dcb855e7b470783133945bf480165encryptionqueue3ce384bb880d4a7184ceb3a2bfc26695encryptionqueue3db07d1f9ea548339f5294692bb1725fencryptionqueue3df5958fe58d4f38841837387264e928encryptionqueue3ff3e2e865ec4f2296616d242bf3bcbaencryptionqueue417279ce4bc84de6b05c8b8e8e1da146encryptionqueue41c5a354464a4369a95b8e5ea85cd0a7encryptionqueue438e2f480e7340c6bbd99025e6882eaeencryptionqueue446c19b4encryptionqueue4523844416f44a91aedbecd841b17825encryptionqueue457c918033154970bff4620aca946ac7encryptionqueue4736410f2e94487594fd4ef639202544encryptionqueue47c2c792ca724456a3f5d4ae88179e28encryptionqueue484ffac93b584f54b23a4badb476b139encryptionqueue4901870ac1b84836ac9bd1308e648824encryptionqueue49dcd7c29e7041989f83448427af25adencryptionqueue4bbefd5d026a401ab776bbb61089d058encryptionqueue4daf8f96d3b142e386b17b14e003b66bencryptionqueue4e3ef909abac44449eeba45717f210a6encryptionqueue4e63a2316a51442f8442925348637d1aencryptionqueue4e678c94f1b140519cc53c56af064ffcencryptionqueue4f197f93c14b436891b927c8fe1d9141encryptionqueue4f9f9bd03c784e09a0d5b7762817c638encryptionqueue4ff40d03d6314550bea982326a29401dencryptionqueue505b33b035b845f59504ccdec9ab1c11encryptionqueue5151c95ea61f4c5c99c35b541a5f0939encryptionqueue546e15faencryptionqueue566cd19e11ae46708be465785846092fencryptionqueue56cd161cencryptionqueue577f1613encryptionqueue59fa82aac1384cb5b9a512f376d27ff9encryptionqueue5ad78db985384556912a24f1aa62f038encryptionqueue5ae5b1f367ca448b8130030d0461fbb1encryptionqueue5b02744e4ff9493d9cd2993895f75d89encryptionqueue5e4db545d97749518cf85d888c45a010encryptionqueue5e7383a701ce4f4aa43ff9a19341a426encryptionqueue5f4c2f6b4e3e4e4d983130c49202c369encryptionqueue6040f22ebc92484486d1013be00bf426encryptionqueue606997a069d44290863aab23d1499836encryptionqueue6350668d06bc4555afe11c8c4f3cca90encryptionqueue639bd2e086524c73becb63bb0777a4dfencryptionqueue6537723b3cf945549615fbca826c83f2encryptionqueue6543218e6c804ba4a762ebcf5a0f0c26encryptionqueue65685218f4f84a468d06003a75b7cc4fencryptionqueue67344e72836840e19b56c39e79de4063encryptionqueue679cfe6fcfd34949a82e71dc97e99e12encryptionqueue67fa5c4e1dc64abeb67c769c53c85c34encryptionqueue685fb5dcee654f54bbd73aaf639f29f2encryptionqueue69d3e31fbc4b406687818eb55275e102encryptionqueue6a6e165fencryptionqueue6aa04e44b574454fa920f2eddc947df1encryptionqueue6ae894712a9b43699894efc57afe4301encryptionqueue6b44cb5bf3a04d65bdc7395e19a06e93encryptionqueue6c4007b0fc2f489e9788f205f4aee9e5encryptionqueue6e7490c8837b449fae623d2dc5889b62encryptionqueue6ee9c562f1e24721aca7b97bfb5e41a4encryptionqueue6f6e422e79814d8bba6983c3f0ed5da7encryptionqueue71574f0318b04e7eaea8f845e9cefc61encryptionqueue722864b1fa254ed782659f274e0221d6encryptionqueue726b001c972e44e496751beadd9d2ee7encryptionqueue73423f52d51049eb87e6203f5d3b0684encryptionqueue78537b4db1c348e9bef011129520e33fencryptionqueue7900797cd45641a3b91c12e6ab3a9c73encryptionqueue7a825e8d572d4d2091d1786ff4a0da80encryptionqueue7d73f7ae777d4a938453cfb10bf085fcencryptionqueue7e5f64634bf9477b8cfba578ae7a53d5encryptionqueue7e7c1061742e4ef2adb5168a0b3c8995encryptionqueue80ccc65910364da89e7411164d9fd662encryptionqueue8162db3895c64edc8b1caef46ebedce2encryptionqueue8215a38133f84b5bb78c0d62efdfe85cencryptionqueue82cf17e47a214ed9a09757c96dac282eencryptionqueue830fe85241c34c228d6afcff88454b9cencryptionqueue83a95d261eb0442d9c6dfb68f35e891bencryptionqueue840011245c6f4f0d95780eb4f072201dencryptionqueue843b50932c08404ea01bc23f58125b4eencryptionqueue847016ffencryptionqueue84de687386a749d088d50f2cbe49faf4encryptionqueue85c8269646824b79981449f806e1d034encryptionqueue88b0c4e6001542579e1e4e54f8c5149fencryptionqueue8a6340e7ce514845896351308e26f1a5encryptionqueue8aea2e0a06bc4a78bb41334e7ceeb31dencryptionqueue8bf4d6844c5e41daaa536e83d0ce20b5encryptionqueue8bf9bfa83b68423582dd8890b5a9b59cencryptionqueue8e9a77c0c08e461a9f116b149af78cf4encryptionqueue913011da3d0748c0b9755bfd03c18d5eencryptionqueue926d112d0c0b48fe906572cb43bbc55fencryptionqueue92d2a1d4735d4e20891eb8a623e92b77encryptionqueue92f0141577244a38874e11688e9a8bc1encryptionqueue94c6cf23d6434704997669945da24e4aencryptionqueue9678ac222c444f6e922c74902f49ba00encryptionqueue9719642150034e1e98cbb44aaeb41a39encryptionqueue973613a055554ee9b46ef74a53690c44encryptionqueue9801d5a190c5415b821a5c35f2f89935encryptionqueue983965dec1ca47f2b92eadd9b1fc6cacencryptionqueue9a32c263dee44048be35df59b87a6d31encryptionqueue9a7c1749encryptionqueue9db63deea8bd4370950d21bd84ee4d05encryptionqueue9dd54922e9e74a80b7757aaab4190a17encryptionqueue9e7a60d5828949c3bf73fc1e9abcc58cencryptionqueuea0d3b1db06804b5f9a619bd912e293d0encryptionqueuea2faa42aa8404ebda6618f46855b45e9encryptionqueuea43ffbc1c02d4d1e9d494c42ad891754encryptionqueuea563db7602fa41cfaa8f2d50d60ee396encryptionqueuea73c18833ab34cb4b7fed6991c915b35encryptionqueueaa771e618ab94629a64f0a5af63148a7encryptionqueuead0bd6447b924dec815c956b43c917b7encryptionqueueae116bd7da934598b02886f15be095feencryptionqueueae2d93a4fdb349f4a8c6542dc1b9bebeencryptionqueueaf6ab6bd4ae1465984165c86ea0a2030encryptionqueueb00011fa0643419a83985621a68c3fe7encryptionqueueb0749b04338f4b37bed47b6e7f128c37encryptionqueueb1ee9a1d3b024b0aac527cad50b89ae4encryptionqueueb29db696f2a24b779cf1529909f1d351encryptionqueueb2b37ce25bc64867a2df774508fbca50encryptionqueueb39140fac6d6430ba3030620662e7a90encryptionqueueb9bdd20389024b8bb17d0ec977c92394encryptionqueuebb29fd6e000d4aad86866c1c10bbbb57encryptionqueuebfda000d20e94a69b620156f87c0d179encryptionqueuebff8cd42e66d4515b11718b0f46fbc49encryptionqueuec25b0bb9b85a412d9bb026b53a38b781encryptionqueuec34e1330encryptionqueuec51758c3900d4b45828711af1632efd0encryptionqueuec8308010740f4a74b1b4aa1ebe53bfefencryptionqueuec9311831encryptionqueuec9ae1814encryptionqueueca35d53e302146c3835d8e0ca208e361encryptionqueuecb565eb607794c58a9bf0c44d1f3100eencryptionqueued271533c83d74174b44a675ec991c50bencryptionqueued3d8322c30db4f829de847622bec925dencryptionqueued51d7fb9d2a74482af09164eea6df304encryptionqueued5f8ca965e0e45adb9732b5299599ae5encryptionqueued7de1393encryptionqueued82ab32a7b6e4986919374ed59976b41encryptionqueued99a917842634d808d5de37b041d6c99encryptionqueued9c213acencryptionqueuedb062977ecd24c52adc6fd346d564257encryptionqueuedc8ce0bda3a14ff6b58826765a67b4e7encryptionqueuedd7e0c34e33d4e3b97eb6d417f072f19encryptionqueuee12a1896encryptionqueuee164080a6d9c4b49b80c56ed2f78e42fencryptionqueuee365639c552e45ffb47767842d9f9497encryptionqueuee5abfa24c8274b2787110e2577676641encryptionqueuee7d40ae0e26f4a0ba3886ad69693d10fencryptionqueueec0516286a0240f58b44f61fd618f698encryptionqueueef87f6b005704812be731e52e275b0f7encryptionqueueefe415d8b56943e8a403974b9f9ca77bencryptionqueuef065d7b313b247359f553a24b891412dencryptionqueuef5339ec598524170932fa4d479246c84encryptionqueuef7b36961f02b4e36a02eaf6762fe069cencryptionqueuef8e08828d1814069b106fdc553ac30d8encryptionqueuef915efc37cf843b98879d7848af8242eencryptionqueuef9f2b3145eb84ed4b824d05801f1a683encryptionqueuefa0af24f1b8e40ee9eb4cea776333137encryptionqueuefa40fb846d5b4f8ab9efa1af493c10c8encryptionqueuefa9ca7ef34ad4584a9ca8d7e08f8dcd0encryptionqueuefc3a18fdencryptionqueuefcf3dc00dc1c488aa420d691e4baa42aencryptionqueuefee61452encryptionqueueff822101630840e0a8d6f3dc7b525a89listqueue0listqueue1listqueue2listqueue3mytestqueue0a2ef6bba4554b628d09bb86015bc842mytestqueue1013601153984f879b98caf8b0374f76mytestqueue10330cbb35ac40beb2b39c7d29f68c3cmytestqueue12b187b97782449e9006247f7fb3613fmytestqueue134d45a65a0044389c70ae9069fdad89mytestqueue15603b4dc47540d0bf8350b521ed31c8mytestqueue1886807877314f77acf680cc02cb76c5mytestqueue193bff9d55f64ed088b34261c9ca9cdfmytestqueue1cd5d2a6a60c47eab8a8feac51f50d5fmytestqueue1d031d8258e445c9b1d8f55b1e53ad18mytestqueue1d77ed688eb243ab952759b462969176mytestqueue1e092b5c395843d49a80fe4a94fe2b63mytestqueue1f39e46303c94fb68264c2977952bec2mytestqueue2189e290d4ed4654a799b5fd3ffcbd18mytestqueue2c72a270beb44ee1bddf46c97d76390bmytestqueue2d1ba08f20c5427786de42a9e6ff3661mytestqueue2e0dcbe5f23e4546b08a157eccba71e0mytestqueue30cea1f0940742b1900ac613dc0ce03emytestqueue36c2151767a94e81b21a06a91810d9c3mytestqueue37faa5540da34814a5c3cbea0a3b4edcmytestqueue39c28496fa6d454eac4abe60e9c012d5mytestqueue4070694a94c5449f8f5ba6ae9e48e62dmytestqueue428c7ffccfe441cb99b33a4cf6be01c3mytestqueue448a292b34f84208869b522d622e8dc6mytestqueue453d1525mytestqueue47a96b4e6f0d4b01917950b01d00368dmytestqueue4c34eb08c80048f59341bcb2e91e1831mytestqueue509615f0mytestqueue5858d272959d431184dd0bb98dfe0b5cmytestqueue58f68f5e123a44d5bb69bd277533475dmytestqueue68a5eee2272345f1903f28d99b79e111mytestqueue6a13757d27a64700a35afa29daaa3127mytestqueue6d0295e46d214419877333558cee3955mytestqueue72dfe06a4d43462694d647b7cb59fa4emytestqueue75b91164mytestqueue75c0a956ab564f049ed29369c7c5f119mytestqueue7668a40070f54cb49f0f8372763dc4a5mytestqueue79fa950888cc4b83856540e4172fc1f8mytestqueue7cc4973995dd4d6f833a3fe222252f26mytestqueue7d06985305c2451b8dd8a84a50b7bd84mytestqueue821a5855f7644a78a895ff29fa76cf42mytestqueue83bf3acfd5634a4495d8cd58a9fc4ad9mytestqueue85b098bf961944e3b3d0629d756b1da3mytestqueue8be406d367b5490a9359641e99f8a389mytestqueue8c14c266ec6f4f19820330513df8a7e5mytestqueue8d2c2996eb0f4d95930f8798e7a3e1dbmytestqueue91b35c21478242b98eeb79c5baeaff4dmytestqueue96364f4607d34ac9a236b4c966289ab4mytestqueue9bf03576a06a4deb818c0d1c769f1652mytestqueue9c41d179c24849a6a4a7d85baa1390f7mytestqueueab021ddf4ffa4c9f9571fd4dc39f8357mytestqueueab101218mytestqueueb201e786962d48649b8211845f623a6emytestqueueb2627aa0225e4099bcca4ad323b72279mytestqueuebd590552c9724821bee7189344003e8bmytestqueuebdb1127amytestqueuec2a61a972f0146cb902286257d355d89mytestqueuec3a370a2b00e4a38b629f4fe76fa5c45mytestqueuec78f7ccbf7584b63a7dabd5c0aa14140mytestqueuece46ab782aec49929df0ee75e65f4a9bmytestqueued635903262a4446089efc43a149d070dmytestqueuedbb7a293ffc9441e9d8bb26689041622mytestqueuedd0012aba5a24b9284b1277cefc3fdcemytestqueuee59211fca871487e97f3e2ed9b0283e7mytestqueueec4681c4befa4496b1858ffca231fe2bmytestqueueedbcbcb2f61445739996178b5add242emytestqueueedd54a85f0e740d0aca55d75641eb13bmytestqueueee2289f4dc1a44fab3ea67f3e6298604mytestqueuef5b0503136b84fe6b6b35938c7a2aa58mytestqueuef5e71027838a48389e832ec984c83feemytestqueuefd5d053567114146acdcda9538906418mytestqueuefe00bb01b6b1456c96d5139f125a0fefmytestqueuefee8fd4d502e4b65846dbab96921123bpythonq" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a7dc2a7d-c003-009f-4a38-291cba000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b6963a5c-952d-11e9-bab5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:38 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?comp=list + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 13aa3e1d-1003-00bf-533a-297076000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_metadata.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_metadata.yaml new file mode 100644 index 000000000000..b505f9487354 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_metadata.yaml @@ -0,0 +1,498 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1ea6541e-952a-11e9-95a0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:54 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue665a1100 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7f79e1c9-4003-002f-2e36-29e53a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1ec72130-952a-11e9-afc0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:54 GMT + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue665a1100?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7f79e1d0-4003-002f-3236-29e53a000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1ed0fa7a-952a-11e9-86b3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:54 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?prefix=pythonqueue665a1100&maxresults=1&include=metadata&comp=list + response: + body: + string: "\uFEFFpythonqueue665a11001pythonqueue665a1100testblah" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7f79e1d5-4003-002f-3636-29e53a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e09f91b6-952a-11e9-8295-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:20 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue665a1100 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:20 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ba3719dd-3003-00a8-6e37-29b015000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e0bf4fe2-952a-11e9-a655-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:20 GMT + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue665a1100?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:20 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ba3719ec-3003-00a8-7b37-29b015000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e12bf8fe-952a-11e9-bab5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=pythonqueue665a1100&maxresults=1&include=metadata&comp=list + response: + body: + string: "\uFEFFpythonqueue665a11001pythonqueue665a1100testblah" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:20 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ba371a9c-3003-00a8-1037-29b015000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 785a94f6-952b-11e9-b60a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:34 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue665a1100 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 16b5d6d3-6003-005e-1238-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 787bed9a-952b-11e9-af88-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:34 GMT + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue665a1100?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 16b5d6da-6003-005e-1638-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 79993476-952b-11e9-abba-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:36 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=pythonqueue665a1100&maxresults=1&include=metadata&comp=list + response: + body: + string: "\uFEFFpythonqueue665a11001pythonqueue665a1100testblah" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 16b5d73f-6003-005e-5e38-299703000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b71ae3e2-952d-11e9-8fea-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue665a1100 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:39 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2d5a1ca7-4003-0042-2a3a-294f14000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b73b1888-952d-11e9-a041-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:39 GMT + x-ms-meta-val1: + - test + x-ms-meta-val2: + - blah + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue665a1100?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2d5a1cac-4003-0042-2c3a-294f14000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b85bdb62-952d-11e9-beca-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:41 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=pythonqueue665a1100&maxresults=1&include=metadata&comp=list + response: + body: + string: "\uFEFFpythonqueue665a11001pythonqueue665a1100testblah" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2d5a1ccf-4003-0042-423a-294f14000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_options.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_options.yaml new file mode 100644 index 000000000000..59fadae5e57c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_list_queues_with_options.yaml @@ -0,0 +1,964 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1f7ea3d2-952a-11e9-b2f6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/listqueue0560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7fe22b0d-2003-001d-7c36-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1fa0435c-952a-11e9-a563-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/listqueue1560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7fe22b19-2003-001d-0536-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1faa03e2-952a-11e9-b80f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/listqueue2560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7fe22b2f-2003-001d-1836-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1fb3aa34-952a-11e9-81f1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/listqueue3560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7fe22b40-2003-001d-2736-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1fbc6cda-952a-11e9-8b22-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:56 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?prefix=listqueue&maxresults=3&comp=list + response: + body: + string: "\uFEFFlistqueue3listqueue0listqueue0560410cblistqueue1/remotestoragename/listqueue1560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7fe22b53-2003-001d-3636-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1fc57606-952a-11e9-962a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:56 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?prefix=listqueue&marker=%2Fremotestoragename%2Flistqueue1560410cb&include=metadata&comp=list + response: + body: + string: "\uFEFFlistqueue/remotestoragename/listqueue1560410cblistqueue1560410cblistqueue2listqueue2560410cblistqueue3listqueue3560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7fe22b5e-2003-001d-4136-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e167dcca-952a-11e9-ac5e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue0560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31c8b5f-0003-0067-1937-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e188d72c-952a-11e9-9c6a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue1560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31c8b6a-0003-0067-2237-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e1931a18-952a-11e9-ae4a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue2560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31c8b72-0003-0067-2937-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e19d81ae-952a-11e9-b360-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue3560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31c8b76-0003-0067-2c37-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e1a6c412-952a-11e9-baf7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=listqueue&maxresults=3&comp=list + response: + body: + string: "\uFEFFlistqueue3listqueue0listqueue0560410cblistqueue1/storagename/listqueue1560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b31c8b79-0003-0067-2e37-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e1af46d2-952a-11e9-a017-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:21 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=listqueue&marker=%2Fstoragename%2Flistqueue1560410cb&include=metadata&comp=list + response: + body: + string: "\uFEFFlistqueue/storagename/listqueue1560410cblistqueue1560410cblistqueue2listqueue2560410cblistqueue3listqueue3560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:21 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b31c8b82-0003-0067-3637-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7a7b4230-952b-11e9-9fc7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue0560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f77173ce-1003-005a-2738-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7aa09652-952b-11e9-9171-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue1560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f77173d1-1003-005a-2838-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7aaadd1a-952b-11e9-9ac0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue2560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f77173d5-1003-005a-2a38-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ab52680-952b-11e9-bedb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue3560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f77173dd-1003-005a-3038-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7abe67a4-952b-11e9-9a37-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:38 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=listqueue&maxresults=3&comp=list + response: + body: + string: "\uFEFFlistqueue3listqueue0listqueue0560410cblistqueue1/storagename/listqueue1560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f77173e4-1003-005a-3638-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ac7cc2c-952b-11e9-aa4c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:38 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=listqueue&marker=%2Fstoragename%2Flistqueue1560410cb&include=metadata&comp=list + response: + body: + string: "\uFEFFlistqueue/storagename/listqueue1560410cblistqueue1560410cblistqueue2listqueue2560410cblistqueue3listqueue3560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f77173e8-1003-005a-3a38-296281000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b8b75370-952d-11e9-8a79-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue0560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d0c3a746-f003-0014-6e3a-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b8dd20fa-952d-11e9-80db-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue1560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d0c3a751-f003-0014-753a-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b8e87e9e-952d-11e9-aae6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue2560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d0c3a759-f003-0014-7a3a-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b8f3dc98-952d-11e9-9e2b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:42 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/listqueue3560410cb + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d0c3a767-f003-0014-033a-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b8fdb43a-952d-11e9-a6f3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:42 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=listqueue&maxresults=3&comp=list + response: + body: + string: "\uFEFFlistqueue3listqueue0560410cblistqueue1560410cblistqueue2560410cb/storagename/listqueue3" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d0c3a771-f003-0014-0a3a-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b9066d5c-952d-11e9-aa14-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:42 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=listqueue&marker=%2Fstoragename%2Flistqueue3&include=metadata&comp=list + response: + body: + string: "\uFEFFlistqueue/storagename/listqueue3listqueue3560410cb" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d0c3a781-f003-0014-163a-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages.yaml new file mode 100644 index 000000000000..38378df82c8c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages.yaml @@ -0,0 +1,1082 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 200b9aba-952a-11e9-a10e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3920bee + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a24fbde5-9003-0062-7d36-2923d8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2030fc46-952a-11e9-8110-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF245cfd79-1c16-4d04-ba74-8210b5cad3f9Sat,\ + \ 22 Jun 2019 20:12:57 GMTSat, 29 Jun 2019\ + \ 20:12:57 GMTAgAAAAMAAAAAAAAAQKn34TYp1QE=Sat,\ + \ 22 Jun 2019 20:12:57 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a24fbdf7-9003-0062-0b36-2923d8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 203a9558-952a-11e9-9a3f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF18b40ed3-49c7-43f7-8bae-63afc3bba53dSat,\ + \ 22 Jun 2019 20:12:57 GMTSat, 29 Jun 2019\ + \ 20:12:57 GMTAgAAAAMAAAAAAAAAal0A4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:57 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a24fbdff-9003-0062-1236-2923d8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 20437bc6-952a-11e9-9281-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF07026749-7248-4961-8e0f-bb031cec062bSat,\ + \ 22 Jun 2019 20:12:57 GMTSat, 29 Jun 2019\ + \ 20:12:57 GMTAgAAAAMAAAAAAAAAlREJ4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:57 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a24fbe0f-9003-0062-2136-2923d8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 204c46e8-952a-11e9-9f71-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF6dcdd7e0-9148-4a43-a778-d40ae7c148d7Sat,\ + \ 22 Jun 2019 20:12:57 GMTSat, 29 Jun 2019\ + \ 20:12:57 GMTAgAAAAMAAAAAAAAAvcUR4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:57 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a24fbe17-9003-0062-2936-2923d8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2054d7f4-952a-11e9-972b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb3920bee/messages?peekonly=true + response: + body: + string: "\uFEFF245cfd79-1c16-4d04-ba74-8210b5cad3f9Sat,\ + \ 22 Jun 2019 20:12:57 GMTSat, 29 Jun 2019\ + \ 20:12:57 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a24fbe28-9003-0062-3836-2923d8000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2099e28-952a-11e9-8520-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:22 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54d95ff6-f003-00be-0137-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e22d5d62-952a-11e9-831e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:22 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF24e3e2a4-8261-4221-8569-195ef923c058Sat,\ + \ 22 Jun 2019 20:18:22 GMTSat, 29 Jun 2019\ + \ 20:18:22 GMTAgAAAAMAAAAAAAAABIT0ozcp1QE=Sat,\ + \ 22 Jun 2019 20:18:22 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54d96006-f003-00be-0d37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e236b0b8-952a-11e9-8a62-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:22 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF2030c2e1-3e2e-48e3-a230-859627d55cb6Sat,\ + \ 22 Jun 2019 20:18:22 GMTSat, 29 Jun 2019\ + \ 20:18:22 GMTAgAAAAMAAAAAAAAARV/9ozcp1QE=Sat,\ + \ 22 Jun 2019 20:18:22 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54d9600f-f003-00be-1337-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e23f9d0c-952a-11e9-bc6c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:22 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF638cfe9e-a616-46a3-bbe7-4cfc2de6f711Sat,\ + \ 22 Jun 2019 20:18:22 GMTSat, 29 Jun 2019\ + \ 20:18:22 GMTAgAAAAMAAAAAAAAAhjoGpDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:22 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54d96019-f003-00be-1d37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2489b8c-952a-11e9-a715-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:22 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF367d7837-f039-4e48-b17f-f9cd39f2eaadSat,\ + \ 22 Jun 2019 20:18:22 GMTSat, 29 Jun 2019\ + \ 20:18:22 GMTAgAAAAMAAAAAAAAA9WMPpDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:22 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54d96020-f003-00be-2437-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2519c28-952a-11e9-8969-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:22 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages?peekonly=true + response: + body: + string: "\uFEFF24e3e2a4-8261-4221-8569-195ef923c058Sat,\ + \ 22 Jun 2019 20:18:22 GMTSat, 29 Jun 2019\ + \ 20:18:22 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 54d9603c-f003-00be-3d37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7b3b08a4-952b-11e9-8b6e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:39 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 84e21c7e-7003-004a-7a38-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7b5c1062-952b-11e9-857c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:39 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFFa6cfffdf-b378-4ab3-8365-9edbe691fc03Sat,\ + \ 22 Jun 2019 20:22:39 GMTSat, 29 Jun 2019\ + \ 20:22:39 GMTAgAAAAMAAAAAAAAA+jsjPTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:39 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 84e21c8e-7003-004a-0838-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7b64ae66-952b-11e9-8807-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:39 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF260aa482-8393-4a37-956a-670517b5782dSat,\ + \ 22 Jun 2019 20:22:39 GMTSat, 29 Jun 2019\ + \ 20:22:39 GMTAgAAAAMAAAAAAAAAJfArPTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:39 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 84e21c9b-7003-004a-1538-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7b6d8054-952b-11e9-980f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:39 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFFb8e5efb9-653b-4c47-ab81-51eb90a93cc6Sat,\ + \ 22 Jun 2019 20:22:39 GMTSat, 29 Jun 2019\ + \ 20:22:39 GMTAgAAAAMAAAAAAAAARqQ0PTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:39 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 84e21ca7-7003-004a-2138-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7b766994-952b-11e9-acc9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:39 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF5b2fecf6-6b33-4788-aba9-f027b3881d83Sat,\ + \ 22 Jun 2019 20:22:39 GMTSat, 29 Jun 2019\ + \ 20:22:39 GMTAgAAAAMAAAAAAAAAg389PTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:39 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 84e21cb4-7003-004a-2d38-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7b7eeac6-952b-11e9-8d6c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:39 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages?peekonly=true + response: + body: + string: "\uFEFFa6cfffdf-b378-4ab3-8365-9edbe691fc03Sat,\ + \ 22 Jun 2019 20:22:39 GMTSat, 29 Jun 2019\ + \ 20:22:39 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:39 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 84e21cc4-7003-004a-3d38-295467000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - b98c49ae-952d-11e9-a98c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:43 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 93f60396-5003-0030-723a-293e2a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - baeb53da-952d-11e9-898c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF2db280a8-7fa6-4967-bb1b-32bd8361d395Sat,\ + \ 22 Jun 2019 20:38:45 GMTSat, 29 Jun 2019\ + \ 20:38:45 GMTAgAAAAMAAAAAAAAA0XyzfDop1QE=Sat,\ + \ 22 Jun 2019 20:38:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 93f603a2-5003-0030-793a-293e2a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - baf444d8-952d-11e9-a751-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFFca4947b5-2ffd-46aa-ad12-254a152da641Sat,\ + \ 22 Jun 2019 20:38:45 GMTSat, 29 Jun 2019\ + \ 20:38:45 GMTAgAAAAMAAAAAAAAAEVi8fDop1QE=Sat,\ + \ 22 Jun 2019 20:38:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 93f603a3-5003-0030-7a3a-293e2a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bafd5f1c-952d-11e9-9118-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFFa3923134-dad1-42d8-b823-27bb3007989bSat,\ + \ 22 Jun 2019 20:38:45 GMTSat, 29 Jun 2019\ + \ 20:38:45 GMTAgAAAAMAAAAAAAAAUjPFfDop1QE=Sat,\ + \ 22 Jun 2019 20:38:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 93f603a5-5003-0030-7b3a-293e2a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bb0eb302-952d-11e9-a060-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:45 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages + response: + body: + string: "\uFEFF98b2c81a-0093-4dd1-8cc6-eeadd2ecc445Sat,\ + \ 22 Jun 2019 20:38:45 GMTSat, 29 Jun 2019\ + \ 20:38:45 GMTAgAAAAMAAAAAAAAAnZvWfDop1QE=Sat,\ + \ 22 Jun 2019 20:38:45 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 93f603a8-5003-0030-7d3a-293e2a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bb17933a-952d-11e9-b1eb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb3920bee/messages?peekonly=true + response: + body: + string: "\uFEFF2db280a8-7fa6-4967-bb1b-32bd8361d395Sat,\ + \ 22 Jun 2019 20:38:45 GMTSat, 29 Jun 2019\ + \ 20:38:45 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 93f603aa-5003-0030-7e3a-293e2a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages_with_options.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages_with_options.yaml new file mode 100644 index 000000000000..2413ce264ae2 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_peek_messages_with_options.yaml @@ -0,0 +1,1106 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 208a2e5e-952a-11e9-807d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue74f61174 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4925fb1e-c003-0058-7036-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 20ad7e36-952a-11e9-a8a5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF10fd45f4-e5af-4392-8530-638ac421c201Sat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMTAgAAAAMAAAAAAAAAWZF04jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:58 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4925fb26-c003-0058-7536-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 20b7af64-952a-11e9-9e84-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFFf2ab239e-a943-40b8-8eb9-df422467b8f1Sat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMTAgAAAAMAAAAAAAAA8wh+4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:58 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4925fb2e-c003-0058-7b36-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 20c115a4-952a-11e9-a9c0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF2da9f180-9e31-4ca2-82ec-d77b2093d9adSat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMTAgAAAAMAAAAAAAAAYjKH4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:58 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4925fb32-c003-0058-7f36-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 20ca14cc-952a-11e9-99e6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF56b9d093-a0d3-4303-a43e-eaeb2b896f4cSat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMTAgAAAAMAAAAAAAAAvjSQ4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:58 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4925fb3e-c003-0058-0936-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 20d31dba-952a-11e9-8154-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue74f61174/messages?numofmessages=4&peekonly=true + response: + body: + string: "\uFEFF10fd45f4-e5af-4392-8530-638ac421c201Sat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMT0message1f2ab239e-a943-40b8-8eb9-df422467b8f1Sat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMT0message22da9f180-9e31-4ca2-82ec-d77b2093d9adSat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMT0message356b9d093-a0d3-4303-a43e-eaeb2b896f4cSat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMT0message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 4925fb42-c003-0058-0d36-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e29beac8-952a-11e9-aefd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:23 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7043ff5d-0003-00a0-7437-29ab66000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2be69cc-952a-11e9-a559-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:23 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF8eb58466-ecdc-4124-bffd-03a8202a71dfSat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMTAgAAAAMAAAAAAAAAzEWFpDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:23 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7043ff74-0003-00a0-0537-29ab66000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2c77618-952a-11e9-b43e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:23 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF379d2e3d-5b48-4244-ade3-69dee81b4f1eSat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMTAgAAAAMAAAAAAAAANm+OpDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:23 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7043ff8a-0003-00a0-1937-29ab66000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2d07afe-952a-11e9-8f12-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:23 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFFff42fa28-d927-4040-a0e7-e19d4655d9d4Sat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMTAgAAAAMAAAAAAAAARfyWpDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:23 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7043ff9e-0003-00a0-2837-29ab66000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2d8df28-952a-11e9-ba64-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:23 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF0d0e316b-010e-4fdc-97e6-2420190cd5f7Sat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMTAgAAAAMAAAAAAAAAVImfpDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:23 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7043ffb0-0003-00a0-3a37-29ab66000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e2e1910c-952a-11e9-b215-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:23 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages?numofmessages=4&peekonly=true + response: + body: + string: "\uFEFF8eb58466-ecdc-4124-bffd-03a8202a71dfSat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMT0message1379d2e3d-5b48-4244-ade3-69dee81b4f1eSat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMT0message2ff42fa28-d927-4040-a0e7-e19d4655d9d4Sat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMT0message30d0e316b-010e-4fdc-97e6-2420190cd5f7Sat,\ + \ 22 Jun 2019 20:18:23 GMTSat, 29 Jun 2019\ + \ 20:18:23 GMT0message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7043ffbd-0003-00a0-4637-29ab66000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7be346e8-952b-11e9-b980-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:40 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:39 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ee21fef6-5003-0012-0138-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7c040a4c-952b-11e9-94f6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:40 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF1bf73a30-3868-41cd-8a4c-80fb74e695b5Sat,\ + \ 22 Jun 2019 20:22:40 GMTSat, 29 Jun 2019\ + \ 20:22:40 GMTAgAAAAMAAAAAAAAAnajLPTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:40 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:39 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee21ff0a-5003-0012-1238-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7c0d3a36-952b-11e9-a4f6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:40 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFFe9db3957-dd66-42bd-834f-4d026de88b93Sat,\ + \ 22 Jun 2019 20:22:40 GMTSat, 29 Jun 2019\ + \ 20:22:40 GMTAgAAAAMAAAAAAAAA1YPUPTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:40 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee21ff1a-5003-0012-2138-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7c161250-952b-11e9-a420-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:40 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFFc8e34c60-1ad8-446a-a34a-d81414fe6f82Sat,\ + \ 22 Jun 2019 20:22:41 GMTSat, 29 Jun 2019\ + \ 20:22:41 GMTAgAAAAMAAAAAAAAAavvdPTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:41 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee21ff26-5003-0012-2c38-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7c233aa2-952b-11e9-8f74-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:41 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF01a70a5e-c313-429d-b88c-2ff12810b6fdSat,\ + \ 22 Jun 2019 20:22:41 GMTSat, 29 Jun 2019\ + \ 20:22:41 GMTAgAAAAMAAAAAAAAAVi33PTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:41 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee21ff31-5003-0012-3738-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7c393f46-952b-11e9-8fa6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:41 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages?numofmessages=4&peekonly=true + response: + body: + string: "\uFEFF1bf73a30-3868-41cd-8a4c-80fb74e695b5Sat,\ + \ 22 Jun 2019 20:22:40 GMTSat, 29 Jun 2019\ + \ 20:22:40 GMT0message1e9db3957-dd66-42bd-834f-4d026de88b93Sat,\ + \ 22 Jun 2019 20:22:40 GMTSat, 29 Jun 2019\ + \ 20:22:40 GMT0message2c8e34c60-1ad8-446a-a34a-d81414fe6f82Sat,\ + \ 22 Jun 2019 20:22:41 GMTSat, 29 Jun 2019\ + \ 20:22:41 GMT0message301a70a5e-c313-429d-b88c-2ff12810b6fdSat,\ + \ 22 Jun 2019 20:22:41 GMTSat, 29 Jun 2019\ + \ 20:22:41 GMT0message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ee21ff4c-5003-0012-4e38-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bb946826-952d-11e9-a47b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:46 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2f01cdde-0003-004e-4e3a-29a1e5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbb5f7b6-952d-11e9-a73b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:46 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF778f909e-5dde-49d7-8396-cbaf86090322Sat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMTAgAAAAMAAAAAAAAAhX1/fTop1QE=Sat,\ + \ 22 Jun 2019 20:38:46 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2f01cded-0003-004e-593a-29a1e5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbc0bc8c-952d-11e9-8322-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:46 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFFb69c85e8-6be9-4aae-b5f4-e597a530b65bSat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMTAgAAAAMAAAAAAAAAY2qJfTop1QE=Sat,\ + \ 22 Jun 2019 20:38:46 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2f01cdfd-0003-004e-663a-29a1e5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbca9874-952d-11e9-bf6b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:46 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF0f51ca39-5dbb-46a9-ae1b-f0c4cecb406dSat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMTAgAAAAMAAAAAAAAAzEGUfTop1QE=Sat,\ + \ 22 Jun 2019 20:38:46 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2f01ce07-0003-004e-6f3a-29a1e5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbd528ca-952d-11e9-a641-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:46 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages + response: + body: + string: "\uFEFF003ae5e2-fc11-4a91-8e7c-6da4732805c0Sat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMTAgAAAAMAAAAAAAAAPGudfTop1QE=Sat,\ + \ 22 Jun 2019 20:38:46 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2f01ce13-0003-004e-7a3a-29a1e5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbde7394-952d-11e9-8db8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:46 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue74f61174/messages?numofmessages=4&peekonly=true + response: + body: + string: "\uFEFF778f909e-5dde-49d7-8396-cbaf86090322Sat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMT0message1b69c85e8-6be9-4aae-b5f4-e597a530b65bSat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMT0message20f51ca39-5dbb-46a9-ae1b-f0c4cecb406dSat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMT0message3003ae5e2-fc11-4a91-8e7c-6da4732805c0Sat,\ + \ 22 Jun 2019 20:38:46 GMTSat, 29 Jun 2019\ + \ 20:38:46 GMT0message4" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2f01ce1b-0003-004e-013a-29a1e5000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message.yaml new file mode 100644 index 000000000000..2d8914087e22 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message.yaml @@ -0,0 +1,906 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2107f28a-952a-11e9-b40d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9d3c0b2f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ee1fcf1b-5003-0012-4236-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2129dc58-952a-11e9-a075-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFFabaf91c5-4155-400b-b2dc-a8c03b8834c3Sat,\ + \ 22 Jun 2019 20:12:58 GMTSat, 29 Jun 2019\ + \ 20:12:58 GMTAgAAAAMAAAAAAAAAmRnw4jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:58 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee1fcf38-5003-0012-5a36-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2133abb4-952a-11e9-8ff7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:58 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF7550290f-678c-42e4-9449-247dce1741a1Sat,\ + \ 22 Jun 2019 20:12:59 GMTSat, 29 Jun 2019\ + \ 20:12:59 GMTAgAAAAMAAAAAAAAA3FD84jYp1QE=Sat,\ + \ 22 Jun 2019 20:12:59 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee1fcf4e-5003-0012-6f36-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 213fadc6-952a-11e9-a7ec-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:59 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF7c40543d-a757-488c-8465-426cdecaf774Sat,\ + \ 22 Jun 2019 20:12:59 GMTSat, 29 Jun 2019\ + \ 20:12:59 GMTAgAAAAMAAAAAAAAAFNoG4zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:59 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee1fcf66-5003-0012-0536-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2149bc68-952a-11e9-94ec-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:59 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF097857d8-d587-44df-bd4d-e0e1d9dc581aSat,\ + \ 22 Jun 2019 20:12:59 GMTSat, 29 Jun 2019\ + \ 20:12:59 GMTAgAAAAMAAAAAAAAAhwMQ4zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:59 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ee1fcf74-5003-0012-1236-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e3289cac-952a-11e9-8409-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ad53c034-d003-0008-1637-297f73000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e3499f42-952a-11e9-b573-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:24 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF2ded09c8-c27c-4276-b09d-eb0443ce5a2cSat,\ + \ 22 Jun 2019 20:18:24 GMTSat, 29 Jun 2019\ + \ 20:18:24 GMTAgAAAAMAAAAAAAAAEmEQpTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:24 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ad53c048-d003-0008-2737-297f73000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e3528418-952a-11e9-a702-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:24 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF01f8cf5c-f183-445c-95da-b62895f67b30Sat,\ + \ 22 Jun 2019 20:18:24 GMTSat, 29 Jun 2019\ + \ 20:18:24 GMTAgAAAAMAAAAAAAAAIe4YpTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:24 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ad53c056-d003-0008-3537-297f73000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e35b0a66-952a-11e9-946e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:24 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF71ef796e-a33d-45ae-8ba9-331041def4dcSat,\ + \ 22 Jun 2019 20:18:24 GMTSat, 29 Jun 2019\ + \ 20:18:24 GMTAgAAAAMAAAAAAAAAK3shpTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:24 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ad53c062-d003-0008-4137-297f73000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e363aaf4-952a-11e9-8e24-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:24 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF2a0e37fb-252a-4fb0-922d-d5827f244c51Sat,\ + \ 22 Jun 2019 20:18:24 GMTSat, 29 Jun 2019\ + \ 20:18:24 GMTAgAAAAMAAAAAAAAAiH0qpTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:24 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ad53c06e-d003-0008-4c37-297f73000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7cabc746-952b-11e9-ad54-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f18c06bf-f003-0072-2c38-29153e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ccd0406-952b-11e9-9809-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:42 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFFa0e9699e-b836-4be5-b91b-118b52f53847Sat,\ + \ 22 Jun 2019 20:22:42 GMTSat, 29 Jun 2019\ + \ 20:22:42 GMTAgAAAAMAAAAAAAAADV+VPjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:42 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f18c06c8-f003-0072-3238-29153e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7cd762f4-952b-11e9-9172-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:42 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFFa6a4a07b-80b3-4b56-afed-dc938d429ed6Sat,\ + \ 22 Jun 2019 20:22:42 GMTSat, 29 Jun 2019\ + \ 20:22:42 GMTAgAAAAMAAAAAAAAATjqePjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:42 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f18c06cc-f003-0072-3538-29153e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ce0b958-952b-11e9-aa69-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:42 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFFa797d31d-b7ff-45a9-8340-137235ef740cSat,\ + \ 22 Jun 2019 20:22:42 GMTSat, 29 Jun 2019\ + \ 20:22:42 GMTAgAAAAMAAAAAAAAA1IqnPjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:42 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f18c06d7-f003-0072-4038-29153e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ce95886-952b-11e9-afc2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:42 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF08dfa773-d274-4d9d-ad64-572802c31b79Sat,\ + \ 22 Jun 2019 20:22:42 GMTSat, 29 Jun 2019\ + \ 20:22:42 GMTAgAAAAMAAAAAAAAAFmawPjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:42 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f18c06e9-f003-0072-4e38-29153e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bc5d34cc-952d-11e9-9b64-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 873dfa2b-3003-00c5-0c3a-291a3b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bc7df734-952d-11e9-82a7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:47 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF2e92352b-96ec-44a5-aee0-5180d75d3186Sat,\ + \ 22 Jun 2019 20:38:48 GMTSat, 29 Jun 2019\ + \ 20:38:48 GMTAgAAAAMAAAAAAAAAOU1Gfjop1QE=Sat,\ + \ 22 Jun 2019 20:38:48 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 873dfa34-3003-00c5-133a-291a3b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bc8757e8-952d-11e9-89ed-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:48 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFF16aec904-e378-443f-b4f8-1675ab0cc931Sat,\ + \ 22 Jun 2019 20:38:48 GMTSat, 29 Jun 2019\ + \ 20:38:48 GMTAgAAAAMAAAAAAAAApHZPfjop1QE=Sat,\ + \ 22 Jun 2019 20:38:48 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 873dfa37-3003-00c5-163a-291a3b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bc902b8c-952d-11e9-b50a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:48 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFFf27bfde5-aac5-4773-a9c1-fd38c74fb804Sat,\ + \ 22 Jun 2019 20:38:48 GMTSat, 29 Jun 2019\ + \ 20:38:48 GMTAgAAAAMAAAAAAAAAo9xXfjop1QE=Sat,\ + \ 22 Jun 2019 20:38:48 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 873dfa3e-3003-00c5-1b3a-291a3b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bc98cc26-952d-11e9-a963-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:48 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue9d3c0b2f/messages + response: + body: + string: "\uFEFFc36232f9-ee12-4e95-8e21-1e97def5d8c9Sat,\ + \ 22 Jun 2019 20:38:48 GMTSat, 29 Jun 2019\ + \ 20:38:48 GMTAgAAAAMAAAAAAAAA/N5gfjop1QE=Sat,\ + \ 22 Jun 2019 20:38:48 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 873dfa3f-3003-00c5-1c3a-291a3b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_infinite_time_to_live.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_infinite_time_to_live.yaml new file mode 100644 index 000000000000..e634e202cd40 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_infinite_time_to_live.yaml @@ -0,0 +1,518 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 217c161a-952a-11e9-9779-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:59 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuefb421443 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 916308f1-5003-00d5-1436-292cdd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 219d1862-952a-11e9-8e5a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:59 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuefb421443/messages?messagettl=-1 + response: + body: + string: "\uFEFFda424edc-bc9a-475f-9198-fd8d71a56664Sat,\ + \ 22 Jun 2019 20:12:59 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMTAgAAAAMAAAAAAAAAue1i4zYp1QE=Sat,\ + \ 22 Jun 2019 20:12:59 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 916308f9-5003-00d5-1a36-292cdd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 21a60092-952a-11e9-a1cf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:59 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuefb421443/messages?peekonly=true + response: + body: + string: "\uFEFFda424edc-bc9a-475f-9198-fd8d71a56664Sat,\ + \ 22 Jun 2019 20:12:59 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 916308ff-5003-00d5-1f36-292cdd000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e3a4d150-952a-11e9-974f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:25 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7b2fef5f-a003-00cb-6037-29f630000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e3c688fe-952a-11e9-ae3d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443/messages?messagettl=-1 + response: + body: + string: "\uFEFFfceb56c1-298c-4f04-bf9f-21557365351fSat,\ + \ 22 Jun 2019 20:18:25 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMTAgAAAAMAAAAAAAAAJJeNpTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7b2fef6d-a003-00cb-6c37-29f630000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e3cf900c-952a-11e9-abf9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:25 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443/messages?peekonly=true + response: + body: + string: "\uFEFFfceb56c1-298c-4f04-bf9f-21557365351fSat,\ + \ 22 Jun 2019 20:18:25 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7b2fef76-a003-00cb-7537-29f630000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7d3f232e-952b-11e9-b583-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:42 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b2d54ff5-f003-0079-7e38-290d4a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7d620222-952b-11e9-9843-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:43 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443/messages?messagettl=-1 + response: + body: + string: "\uFEFF28ae8cd0-7252-4f21-b3e2-f3240f58fd2eSat,\ + \ 22 Jun 2019 20:22:43 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMTAgAAAAMAAAAAAAAA8MopPzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:43 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b2d55001-f003-0079-0638-290d4a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7d6c7702-952b-11e9-bf42-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:43 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443/messages?peekonly=true + response: + body: + string: "\uFEFF28ae8cd0-7252-4f21-b3e2-f3240f58fd2eSat,\ + \ 22 Jun 2019 20:22:43 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b2d55012-f003-0079-1338-290d4a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bd024e62-952d-11e9-9bf4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 3ab132e0-7003-0068-553a-293a51000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bd2357ba-952d-11e9-ad90-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:49 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443/messages?messagettl=-1 + response: + body: + string: "\uFEFFc82a10bf-fd7a-4632-8b3b-3b980aba1754Sat,\ + \ 22 Jun 2019 20:38:49 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMTAgAAAAMAAAAAAAAA/F3rfjop1QE=Sat,\ + \ 22 Jun 2019 20:38:49 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3ab132e5-7003-0068-593a-293a51000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bd2c45d2-952d-11e9-8e94-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:49 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuefb421443/messages?peekonly=true + response: + body: + string: "\uFEFFc82a10bf-fd7a-4632-8b3b-3b980aba1754Sat,\ + \ 22 Jun 2019 20:38:49 GMTFri, 31 Dec 9999\ + \ 23:59:59 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3ab132eb-7003-0068-5d3a-293a51000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_large_time_to_live.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_large_time_to_live.yaml new file mode 100644 index 000000000000..b5a0f1371d91 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_put_message_large_time_to_live.yaml @@ -0,0 +1,518 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 21d8b818-952a-11e9-a1f9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:00 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebef712f8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 84056f12-3003-006f-3236-29ccd4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2201f7e4-952a-11e9-a843-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:00 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebef712f8/messages?messagettl=1073741824 + response: + body: + string: "\uFEFF69421161-19a0-451e-84b7-88e807ed25ebSat,\ + \ 22 Jun 2019 20:13:00 GMTTue, 01 Jul 2053\ + \ 09:50:04 GMTAgAAAAMAAAAAAAAAvobL4zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:00 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 84056f1f-3003-006f-3c36-29ccd4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 220e7afa-952a-11e9-b5ae-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:00 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuebef712f8/messages?peekonly=true + response: + body: + string: "\uFEFF69421161-19a0-451e-84b7-88e807ed25ebSat,\ + \ 22 Jun 2019 20:13:00 GMTTue, 01 Jul 2053\ + \ 09:50:04 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 84056f26-3003-006f-4236-29ccd4000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e406ed74-952a-11e9-8a60-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:25 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 81ac87e0-b003-0057-4a37-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e42674b4-952a-11e9-8907-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:26 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8/messages?messagettl=1073741824 + response: + body: + string: "\uFEFFc1abbb9d-5939-486e-945d-4edf94acfdb7Sat,\ + \ 22 Jun 2019 20:18:26 GMTTue, 01 Jul 2053\ + \ 09:55:30 GMTAgAAAAMAAAAAAAAAMsrtpTcp1QE=Sat,\ + \ 22 Jun 2019 20:18:26 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 81ac87f1-b003-0057-5737-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e42fda86-952a-11e9-bdc4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8/messages?peekonly=true + response: + body: + string: "\uFEFFc1abbb9d-5939-486e-945d-4edf94acfdb7Sat,\ + \ 22 Jun 2019 20:18:26 GMTTue, 01 Jul 2053\ + \ 09:55:30 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 81ac87f4-b003-0057-5a37-298d8d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7db929ee-952b-11e9-84fd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:43 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b4fe4b18-0003-00c6-1938-29193c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ddaa75e-952b-11e9-a75d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:43 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8/messages?messagettl=1073741824 + response: + body: + string: "\uFEFFcefbfb18-a8e1-4d9d-b23f-23de9d4246e7Sat,\ + \ 22 Jun 2019 20:22:43 GMTTue, 01 Jul 2053\ + \ 09:59:47 GMTAgAAAAMAAAAAAAAASUWiPzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:43 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b4fe4b21-0003-00c6-1f38-29193c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7de4ad1c-952b-11e9-8e36-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:43 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8/messages?peekonly=true + response: + body: + string: "\uFEFFcefbfb18-a8e1-4d9d-b23f-23de9d4246e7Sat,\ + \ 22 Jun 2019 20:22:43 GMTTue, 01 Jul 2053\ + \ 09:59:47 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b4fe4b28-0003-00c6-2638-29193c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bd7b7846-952d-11e9-9d18-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:49 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 44e4ae88-a003-008f-3f3a-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bd9c9274-952d-11e9-bc68-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:49 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8/messages?messagettl=1073741824 + response: + body: + string: "\uFEFF61a6c752-2a0d-472b-bf7f-2634b4e8ca04Sat,\ + \ 22 Jun 2019 20:38:49 GMTTue, 01 Jul 2053\ + \ 10:15:53 GMTAgAAAAMAAAAAAAAAJThlfzop1QE=Sat,\ + \ 22 Jun 2019 20:38:49 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 44e4ae9c-a003-008f-4b3a-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bda639e6-952d-11e9-b4c9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:49 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuebef712f8/messages?peekonly=true + response: + body: + string: "\uFEFF61a6c752-2a0d-472b-bf7f-2634b4e8ca04Sat,\ + \ 22 Jun 2019 20:38:49 GMTTue, 01 Jul 2053\ + \ 10:15:53 GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:49 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 44e4aeac-a003-008f-573a-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_exists.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_exists.yaml new file mode 100644 index 000000000000..b82bf07d5a37 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_exists.yaml @@ -0,0 +1,322 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2244a3c8-952a-11e9-a9a1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:00 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea8d70bb6 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7fe22ede-2003-001d-7736-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 22658f86-952a-11e9-b3b9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:00 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuea8d70bb6?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-request-id: + - 7fe22ef2-2003-001d-0936-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e464faac-952a-11e9-a13a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:26 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea8d70bb6 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54d963da-f003-00be-0e37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e486cac6-952a-11e9-afb2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuea8d70bb6?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-request-id: + - 54d963e6-f003-00be-1837-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7e2a1a00-952b-11e9-add0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:44 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea8d70bb6 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d508afcf-e003-00cc-4138-2900b5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7e4b14ba-952b-11e9-a9a9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:44 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuea8d70bb6?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-request-id: + - d508afdb-e003-00cc-4a38-2900b5000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bded0b9e-952d-11e9-a7ab-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:50 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuea8d70bb6 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4b608423-8003-005f-2c3a-2996fe000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bf57ec6c-952d-11e9-95d8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:52 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuea8d70bb6?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-request-id: + - 4b608491-8003-005f-063a-2996fe000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_not_exists.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_not_exists.yaml new file mode 100644 index 000000000000..62589e7fc5d1 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_queue_not_exists.yaml @@ -0,0 +1,178 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 228e4708-952a-11e9-b1c8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:01 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/missingdb9b0d66?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:b6b62cea-b003-007e-3736-29fbcf000000\n\ + Time:2019-06-22T20:13:01.4519426Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - b6b62cea-b003-007e-3736-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e4b7c51e-952a-11e9-b37b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/missingdb9b0d66?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:a297405a-8003-0093-6b37-29f24b000000\n\ + Time:2019-06-22T20:18:27.2134583Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - a297405a-8003-0093-6b37-29f24b000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7e80a8b6-952b-11e9-91c5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/missingdb9b0d66?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:7fe49810-2003-001d-2838-29bdea000000\n\ + Time:2019-06-22T20:22:45.2359493Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 7fe49810-2003-001d-2838-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bfbb1774-952d-11e9-864d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:53 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/missingdb9b0d66?comp=metadata + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:1e621b54-4003-00e8-683a-2999fb000000\n\ + Time:2019-06-22T20:38:53.6652587Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 1e621b54-4003-00e8-683a-2999fb000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl.yaml new file mode 100644 index 000000000000..89c8a8a87283 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl.yaml @@ -0,0 +1,486 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 22bba3ba-952a-11e9-bc97-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:01 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb4690bf1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 645f0cf4-8003-0076-4436-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 22ddb362-952a-11e9-990f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:01 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 645f0cf8-8003-0076-4736-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 231f0838-952a-11e9-8c2d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:02 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 645f0d0f-8003-0076-5b36-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e4f00408-952a-11e9-917f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 794f8e72-5003-0091-0e37-29f0b1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e5127042-952a-11e9-8b97-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 794f8e89-5003-0091-2037-29f0b1000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e5b8670c-952a-11e9-b0ce-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 794f8f22-5003-0091-2737-29f0b1000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ec2dc86-952b-11e9-929a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2bbb3d8f-e003-000b-0f38-297c74000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ee64a36-952b-11e9-b66f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2bbb3d96-e003-000b-1438-297c74000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7ef4160c-952b-11e9-b249-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2bbb3da0-e003-000b-1b38-297c74000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c003dcc0-952d-11e9-88cb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:53 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31de929-0003-0067-1a3a-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c0246cf6-952d-11e9-a156-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:54 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31de92f-0003-0067-1d3a-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c0ac85dc-952d-11e9-9424-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:55 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueueb4690bf1?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b31de976-0003-0067-523a-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_too_many_ids.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_too_many_ids.yaml new file mode 100644 index 000000000000..fe8e435b1a7b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_too_many_ids.yaml @@ -0,0 +1,154 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2356f4fa-952a-11e9-a6a6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:02 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue755c1155 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0ac250b7-9003-0069-3836-293bac000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e5eac0d2-952a-11e9-927a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue755c1155 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 06a83a19-1003-00d9-5337-29c22c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7f9c7e5a-952b-11e9-885f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:46 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue755c1155 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 3c6d130a-0003-000a-6038-297d89000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c0e8e798-952d-11e9-a339-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:55 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue755c1155 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a2988025-8003-0093-473a-29f24b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifier.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifier.yaml new file mode 100644 index 000000000000..41681a0eddeb --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifier.yaml @@ -0,0 +1,490 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 23bbeb46-952a-11e9-9ca2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:03 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec3a217f5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 882cb3cb-1003-0096-7e36-290634000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + empty' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '145' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 23e6e4ac-952a-11e9-890a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:03 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:03 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 882cb3d1-1003-0096-0236-290634000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 244ed94a-952a-11e9-9688-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:04 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: "\uFEFFempty" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:03 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 882cb3e7-1003-0096-1136-290634000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e632d21e-952a-11e9-a33e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a36ffe82-b003-00b9-1037-29870e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + empty' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '145' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e654dc4c-952a-11e9-ab31-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a36ffe95-b003-00b9-2037-29870e000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e662fa7a-952a-11e9-a9ce-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: "\uFEFFempty" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a36ffea2-b003-00b9-2c37-29870e000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 7fed93c6-952b-11e9-8f61-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 147ee428-0003-00ef-0838-296f7e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + empty' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '145' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 800ed734-952b-11e9-be5c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 147ee43c-0003-00ef-1938-296f7e000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 801c392e-952b-11e9-887a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:47 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: "\uFEFFempty" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 147ee45e-0003-00ef-3b38-296f7e000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c13f9502-952d-11e9-8a9b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:55 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2f0001cf-9003-00a5-5a3a-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + empty' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '145' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c160d0be-952d-11e9-8a9a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2f0001d4-9003-00a5-5c3a-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c207a790-952d-11e9-9ffa-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:57 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec3a217f5?comp=acl + response: + body: + string: "\uFEFFempty" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2f0001f2-9003-00a5-763a-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifiers.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifiers.yaml new file mode 100644 index 000000000000..7f2651cacd66 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_empty_signed_identifiers.yaml @@ -0,0 +1,486 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 24849e2c-952a-11e9-a241-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:04 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuedc0a1868 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:03 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 33560ee0-e003-0083-2c36-29c4ad000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 24a9e286-952a-11e9-8335-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:04 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 33560efe-e003-0083-4536-29c4ad000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 25787d58-952a-11e9-80a9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:06 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 33561085-e003-0083-2a36-29c4ad000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e69fa66e-952a-11e9-897f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54d96753-f003-00be-1e37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e6bf4168-952a-11e9-ad5c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54d96765-f003-00be-2e37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e6ca1048-952a-11e9-ab4f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 54d96772-f003-00be-3937-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 805b1b6c-952b-11e9-9082-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ebcd17aa-4003-0085-7b38-2933d5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 807be9b4-952b-11e9-bee3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ebcd17bf-4003-0085-0b38-2933d5000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 80880708-952b-11e9-b4b2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:48 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ebcd17d0-4003-0085-1938-2933d5000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c2530d70-952d-11e9-bc14-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9e4485f5-a003-00ad-703a-29446a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c273d4d8-952d-11e9-8207-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9e4485fb-a003-00ad-723a-29446a000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c27d5562-952d-11e9-a53e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:58 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuedc0a1868?comp=acl + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9e448601-a003-00ad-763a-29446a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_non_existing_queue.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_non_existing_queue.yaml new file mode 100644 index 000000000000..8e4c95e0fa34 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_non_existing_queue.yaml @@ -0,0 +1,186 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 28096c6c-952a-11e9-9164-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:10 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue50b11604?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:fd4a8b74-9003-00c8-1836-29f537000000\n\ + Time:2019-06-22T20:13:10.6874395Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - fd4a8b74-9003-00c8-1836-29f537000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e6f9a45c-952a-11e9-be22-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue50b11604?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:fea5e16a-b003-00df-6e37-293554000000\n\ + Time:2019-06-22T20:18:31.0076429Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - fea5e16a-b003-00df-6e37-293554000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 80c42bf4-952b-11e9-a3d7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue50b11604?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:5432fbdc-0003-0028-6638-2913bf000000\n\ + Time:2019-06-22T20:22:49.0290644Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 5432fbdc-0003-0028-6638-2913bf000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c2bb6534-952d-11e9-a5ea-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:58 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue50b11604?comp=acl + response: + body: + string: "\uFEFFQueueNotFoundThe\ + \ specified queue does not exist.\nRequestId:4041e616-6003-00dd-613a-2937ae000000\n\ + Time:2019-06-22T20:38:58.7220070Z" + headers: + Content-Length: + - '217' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - QueueNotFound + x-ms-request-id: + - 4041e616-6003-00dd-613a-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 404 + message: The specified queue does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_signed_identifiers.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_signed_identifiers.yaml new file mode 100644 index 000000000000..ce4e169b7f5d --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_acl_with_signed_identifiers.yaml @@ -0,0 +1,490 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2852b390-952a-11e9-9759-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:10 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue4ea015da + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b9634b3e-f003-00d8-6036-29c3d1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + testid2019-06-22T20:08:11Z2019-06-22T21:13:11Zr' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '257' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 28784902-952a-11e9-8fee-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b9634b4d-f003-00d8-6a36-29c3d1000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2886e930-952a-11e9-835a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:11 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: "\uFEFFtestid2019-06-22T20:08:11.0000000Z2019-06-22T21:13:11.0000000Zr" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b9634b60-f003-00d8-7c36-29c3d1000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e7448b3e-952a-11e9-abcf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c6bebdda-e003-006d-3537-29ce2e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + testid2019-06-22T20:13:31Z2019-06-22T21:18:31Zr' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '257' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e76499a6-952a-11e9-8f68-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c6bebde5-e003-006d-3b37-29ce2e000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e772b5f4-952a-11e9-b20f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:31 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: "\uFEFFtestid2019-06-22T20:13:31.0000000Z2019-06-22T21:18:31.0000000Zr" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - c6bebdef-e003-006d-4137-29ce2e000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 81161458-952b-11e9-8409-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:49 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 73ce985c-2003-0095-0738-290533000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + testid2019-06-22T20:17:49Z2019-06-22T21:22:49Zr' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '257' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8139d1ae-952b-11e9-9858-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:49 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 73ce986a-2003-0095-0f38-290533000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 81fb960c-952b-11e9-8c3b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:50 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: "\uFEFFtestid2019-06-22T20:17:49.0000000Z2019-06-22T21:22:49.0000000Zr" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 73ce98ec-2003-0095-0638-290533000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c3198f54-952d-11e9-9a0f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:59 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fcfe1d9c-1003-001e-283a-29beed000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + testid2019-06-22T20:33:59Z2019-06-22T21:38:59Zr' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '257' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c33ac9d0-952d-11e9-adc3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:59 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fcfe1da2-1003-001e-2b3a-29beed000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c3a0d8cc-952d-11e9-b08f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:59 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue4ea015da?comp=acl + response: + body: + string: "\uFEFFtestid2019-06-22T20:33:59.0000000Z2019-06-22T21:38:59.0000000Zr" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - fcfe1de7-1003-001e-643a-29beed000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_metadata.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_metadata.yaml new file mode 100644 index 000000000000..88989640a2ae --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_set_queue_metadata.yaml @@ -0,0 +1,506 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 28ba59dc-952a-11e9-9eb7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef69d0e02 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0632d208-6003-0092-3936-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 28df5fac-952a-11e9-8531-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:11 GMT + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:12 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0632d215-6003-0092-4136-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 29f957da-952a-11e9-9dca-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:13 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:12 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-request-id: + - 0632d2d7-6003-0092-7036-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e7ad37b0-952a-11e9-b00d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f7bcebf7-8003-0054-0b37-298e8a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e7cd44cc-952a-11e9-9834-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:32 GMT + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f7bcec0d-8003-0054-1d37-298e8a000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e7d61dd8-952a-11e9-9e2d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:32 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-request-id: + - f7bcec22-8003-0054-3137-298e8a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 82c414da-952b-11e9-ae32-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:52 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0633ce95-6003-0092-1238-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8313f234-952b-11e9-afda-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:52 GMT + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0633cee0-6003-0092-5a38-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 831d2e3a-952b-11e9-adea-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:52 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:52 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-request-id: + - 0633cee7-6003-0092-6138-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c4d19d78-952d-11e9-92f0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:01 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 3c6eb239-0003-000a-5c3a-297d89000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c4f36228-952d-11e9-a26b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:02 GMT + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 3c6eb23e-0003-000a-5f3a-297d89000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c5b6ebc6-952d-11e9-bd26-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:03 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef69d0e02?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-hello: + - world + x-ms-meta-number: + - '43' + x-ms-request-id: + - 3c6eb2a3-0003-000a-353a-297d89000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_create_queue_unicode_name.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_create_queue_unicode_name.yaml new file mode 100644 index 000000000000..941f1ace95cf --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_create_queue_unicode_name.yaml @@ -0,0 +1,178 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2a39871a-952a-11e9-9523-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:14 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/%E5%95%8A%E9%BD%84%E4%B8%82%E7%8B%9B%E7%8B%9C + response: + body: + string: "\uFEFFInvalidResourceNameThe\ + \ specifed resource name contains invalid characters.\nRequestId:96754b44-b003-009b-2636-29e938000000\n\ + Time:2019-06-22T20:13:14.4920008Z" + headers: + Content-Length: + - '243' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidResourceName + x-ms-request-id: + - 96754b44-b003-009b-2636-29e938000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: The specifed resource name contains invalid characters. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e8093024-952a-11e9-b975-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:32 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/%E5%95%8A%E9%BD%84%E4%B8%82%E7%8B%9B%E7%8B%9C + response: + body: + string: "\uFEFFInvalidResourceNameThe\ + \ specifed resource name contains invalid characters.\nRequestId:c545f0c5-9003-00ae-3d37-29476d000000\n\ + Time:2019-06-22T20:18:32.8886233Z" + headers: + Content-Length: + - '243' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidResourceName + x-ms-request-id: + - c545f0c5-9003-00ae-3d37-29476d000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: The specifed resource name contains invalid characters. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8359b186-952b-11e9-bf6d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:53 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/%E5%95%8A%E9%BD%84%E4%B8%82%E7%8B%9B%E7%8B%9C + response: + body: + string: "\uFEFFInvalidResourceNameThe\ + \ specifed resource name contains invalid characters.\nRequestId:f0ca0c73-b003-00d4-2d38-292d20000000\n\ + Time:2019-06-22T20:22:53.3439399Z" + headers: + Content-Length: + - '243' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidResourceName + x-ms-request-id: + - f0ca0c73-b003-00d4-2d38-292d20000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: The specifed resource name contains invalid characters. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c600e686-952d-11e9-be2a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:03 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/%E5%95%8A%E9%BD%84%E4%B8%82%E7%8B%9B%E7%8B%9C + response: + body: + string: "\uFEFFInvalidResourceNameThe\ + \ specifed resource name contains invalid characters.\nRequestId:5204ae80-d003-006e-453a-29cd29000000\n\ + Time:2019-06-22T20:39:04.9889844Z" + headers: + Content-Length: + - '243' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:04 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidResourceName + x-ms-request-id: + - 5204ae80-d003-006e-453a-29cd29000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: The specifed resource name contains invalid characters. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_get_messages_unicode_data.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_get_messages_unicode_data.yaml new file mode 100644 index 000000000000..3e8a479d8e05 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_get_messages_unicode_data.yaml @@ -0,0 +1,522 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2a7b79d8-952a-11e9-99dd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:14 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef853140e + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2bbaa09e-e003-000b-2636-297c74000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: "\nmessage1\u3688\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '106' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2a9e84e4-952a-11e9-b4d7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:14 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF956db5c6-f895-42bf-8d30-606350ee9015Sat,\ + \ 22 Jun 2019 20:13:14 GMTSat, 29 Jun 2019\ + \ 20:13:14 GMTAgAAAAMAAAAAAAAAH5Zu7DYp1QE=Sat,\ + \ 22 Jun 2019 20:13:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2bbaa0a7-e003-000b-2d36-297c74000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2ab19e62-952a-11e9-98cf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:14 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF956db5c6-f895-42bf-8d30-606350ee9015Sat,\ + \ 22 Jun 2019 20:13:14 GMTSat, 29 Jun 2019\ + \ 20:13:14 GMTAgAAAAMAAAAAAAAAA3hY/jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:44 GMT1message1\u3688\ + " + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2bbaa0ad-e003-000b-3336-297c74000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e849c65c-952a-11e9-9679-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:32 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 47478cc5-2003-00da-2f37-29c12b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: "\nmessage1\u3688\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '106' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e86c73d2-952a-11e9-969c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF42cd8c38-9c3d-477e-bf38-f94812824644Sat,\ + \ 22 Jun 2019 20:18:33 GMTSat, 29 Jun 2019\ + \ 20:18:33 GMTAgAAAAMAAAAAAAAA8Zxpqjcp1QE=Sat,\ + \ 22 Jun 2019 20:18:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 47478cda-2003-00da-3f37-29c12b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e8abd8ec-952a-11e9-9b7f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF42cd8c38-9c3d-477e-bf38-f94812824644Sat,\ + \ 22 Jun 2019 20:18:33 GMTSat, 29 Jun 2019\ + \ 20:18:33 GMTAgAAAAMAAAAAAAAAEKJVvDcp1QE=Sat,\ + \ 22 Jun 2019 20:19:03 GMT1message1\u3688\ + " + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 47478d69-2003-00da-4137-29c12b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 83903c18-952b-11e9-9037-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:53 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e34992d3-5003-007f-4f38-29fa32000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: "\nmessage1\u3688\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '106' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 83b12a7a-952b-11e9-98e8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:53 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF39309ea3-92b4-4ee0-8dfc-bfa68648af54Sat,\ + \ 22 Jun 2019 20:22:54 GMTSat, 29 Jun 2019\ + \ 20:22:54 GMTAgAAAAMAAAAAAAAAauyuRTgp1QE=Sat,\ + \ 22 Jun 2019 20:22:54 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e34992db-5003-007f-5538-29fa32000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 83f0c038-952b-11e9-812c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:54 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF39309ea3-92b4-4ee0-8dfc-bfa68648af54Sat,\ + \ 22 Jun 2019 20:22:54 GMTSat, 29 Jun 2019\ + \ 20:22:54 GMTAgAAAAMAAAAAAAAA7d+ZVzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:24 GMT1message1\u3688\ + " + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e3499307-5003-007f-7e38-29fa32000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c6be41e8-952d-11e9-b18f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:05 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:04 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4041e8ee-6003-00dd-0c3a-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: "\nmessage1\u3688\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '106' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c6de6b28-952d-11e9-84dd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:05 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF0eebaf54-9a63-4c31-bba6-efdd77552edcSat,\ + \ 22 Jun 2019 20:39:05 GMTSat, 29 Jun 2019\ + \ 20:39:05 GMTAgAAAAMAAAAAAAAAgrS5iDop1QE=Sat,\ + \ 22 Jun 2019 20:39:05 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:04 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4041e8f5-6003-00dd-113a-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c6faf5f4-952d-11e9-9408-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:05 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuef853140e/messages + response: + body: + string: "\uFEFF0eebaf54-9a63-4c31-bba6-efdd77552edcSat,\ + \ 22 Jun 2019 20:39:05 GMTSat, 29 Jun 2019\ + \ 20:39:05 GMTAgAAAAMAAAAAAAAAZESlmjop1QE=Sat,\ + \ 22 Jun 2019 20:39:35 GMT1message1\u3688\ + " + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:04 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 4041e90d-6003-00dd-233a-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_update_message_unicode_data.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_update_message_unicode_data.yaml new file mode 100644 index 000000000000..f90927199fc3 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_unicode_update_message_unicode_data.yaml @@ -0,0 +1,886 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2adc397e-952a-11e9-97d9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:15 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue223e14de + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 193b3fd2-0003-00e4-0536-29770a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2afbe72e-952a-11e9-89a8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFF6bfc1578-8e80-4df9-80dd-87675d27ed24Sat,\ + \ 22 Jun 2019 20:13:15 GMTSat, 29 Jun 2019\ + \ 20:13:15 GMTAgAAAAMAAAAAAAAAf87B7DYp1QE=Sat,\ + \ 22 Jun 2019 20:13:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 193b3fd8-0003-00e4-0836-29770a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2b05a8f4-952a-11e9-80a3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:15 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFF6bfc1578-8e80-4df9-80dd-87675d27ed24Sat,\ + \ 22 Jun 2019 20:13:15 GMTSat, 29 Jun 2019\ + \ 20:13:15 GMTAgAAAAMAAAAAAAAAAcKs/jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:45 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 193b3fe3-0003-00e4-1036-29770a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: "\n\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '110' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2b0e9b9e-952a-11e9-af1c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:15 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue223e14de/messages/6bfc1578-8e80-4df9-80dd-87675d27ed24?popreceipt=AgAAAAMAAAAAAAAAAcKs%2FjYp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:15 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAA7IkY7TYp1QEBAAAA + x-ms-request-id: + - 193b3fe8-0003-00e4-1436-29770a000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2b5b6f50-952a-11e9-8b42-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFF6bfc1578-8e80-4df9-80dd-87675d27ed24Sat,\ + \ 22 Jun 2019 20:13:15 GMTSat, 29 Jun 2019\ + \ 20:13:15 GMTAgAAAAMAAAAAAAAA55IC/zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:46 GMT2\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:15 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 193b4021-0003-00e4-4436-29770a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e8f56c5a-952a-11e9-8c6f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:34 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - bcf4a418-6003-0055-8037-298f77000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e9182b3a-952a-11e9-8d8d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:34 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFFbadee19e-591a-4805-a686-0c8541c80fa0Sat,\ + \ 22 Jun 2019 20:18:34 GMTSat, 29 Jun 2019\ + \ 20:18:34 GMTAgAAAAMAAAAAAAAAjlffqjcp1QE=Sat,\ + \ 22 Jun 2019 20:18:34 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - bcf4a424-6003-0055-0637-298f77000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e921ba26-952a-11e9-a3d6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:34 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFFbadee19e-591a-4805-a686-0c8541c80fa0Sat,\ + \ 22 Jun 2019 20:18:34 GMTSat, 29 Jun 2019\ + \ 20:18:34 GMTAgAAAAMAAAAAAAAAig7LvDcp1QE=Sat,\ + \ 22 Jun 2019 20:19:04 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - bcf4a42e-6003-0055-1037-298f77000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: "\n\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '110' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e92bea0a-952a-11e9-9976-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:34 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages/badee19e-591a-4805-a686-0c8541c80fa0?popreceipt=AgAAAAMAAAAAAAAAig7LvDcp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAA0bowqzcp1QEBAAAA + x-ms-request-id: + - bcf4a439-6003-0055-1b37-298f77000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:18:34 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e972f5ba-952a-11e9-afd3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:34 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFFbadee19e-591a-4805-a686-0c8541c80fa0Sat,\ + \ 22 Jun 2019 20:18:34 GMTSat, 29 Jun 2019\ + \ 20:18:34 GMTAgAAAAMAAAAAAAAAV64bvTcp1QE=Sat,\ + \ 22 Jun 2019 20:19:04 GMT2\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - bcf4a491-6003-0055-6037-298f77000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 844c0df8-952b-11e9-8356-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:54 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7bd999d0-3003-00ce-2138-29024f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 846e3766-952b-11e9-ab29-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:54 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFFcd70bb73-c121-484c-b75a-83f489b1e638Sat,\ + \ 22 Jun 2019 20:22:55 GMTSat, 29 Jun 2019\ + \ 20:22:55 GMTAgAAAAMAAAAAAAAAiDY2Rjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:55 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7bd999d5-3003-00ce-2438-29024f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8477ec86-952b-11e9-9cc5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:55 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFFcd70bb73-c121-484c-b75a-83f489b1e638Sat,\ + \ 22 Jun 2019 20:22:55 GMTSat, 29 Jun 2019\ + \ 20:22:55 GMTAgAAAAMAAAAAAAAA3NsgWDgp1QE=Sat,\ + \ 22 Jun 2019 20:23:25 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7bd999dc-3003-00ce-2938-29024f000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: "\n\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '110' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 84814374-952b-11e9-b4f2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:55 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages/cd70bb73-c121-484c-b75a-83f489b1e638?popreceipt=AgAAAAMAAAAAAAAA3NsgWDgp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAArcdvRjgp1QEBAAAA + x-ms-request-id: + - 7bd999df-3003-00ce-2c38-29024f000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:22:55 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 84b195b0-952b-11e9-912b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:55 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFFcd70bb73-c121-484c-b75a-83f489b1e638Sat,\ + \ 22 Jun 2019 20:22:55 GMTSat, 29 Jun 2019\ + \ 20:22:55 GMTAgAAAAMAAAAAAAAA8kVaWDgp1QE=Sat,\ + \ 22 Jun 2019 20:23:25 GMT2\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:54 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7bd999fe-3003-00ce-4438-29024f000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c75a7380-952d-11e9-9bc7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:06 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e9f352be-3003-0002-033a-2966fa000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c77c8434-952d-11e9-a18f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:06 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFF72ffe2a7-12da-4d1d-b8f2-8f40d2b955b8Sat,\ + \ 22 Jun 2019 20:39:06 GMTSat, 29 Jun 2019\ + \ 20:39:06 GMTAgAAAAMAAAAAAAAAA9BEiTop1QE=Sat,\ + \ 22 Jun 2019 20:39:06 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e9f352c4-3003-0002-073a-2966fa000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c785bd62-952d-11e9-a0da-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:06 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFF72ffe2a7-12da-4d1d-b8f2-8f40d2b955b8Sat,\ + \ 22 Jun 2019 20:39:06 GMTSat, 29 Jun 2019\ + \ 20:39:06 GMTAgAAAAMAAAAAAAAAWnUvmzop1QE=Sat,\ + \ 22 Jun 2019 20:39:36 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e9f352ca-3003-0002-0d3a-2966fa000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: "\n\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '110' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c78ecdf6-952d-11e9-8016-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:06 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages/72ffe2a7-12da-4d1d-b8f2-8f40d2b955b8?popreceipt=AgAAAAMAAAAAAAAAWnUvmzop1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAJ1ypijop1QEBAAAA + x-ms-request-id: + - e9f352d0-3003-0002-123a-2966fa000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:39:08 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c8ea7b82-952d-11e9-98de-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:08 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue223e14de/messages + response: + body: + string: "\uFEFF72ffe2a7-12da-4d1d-b8f2-8f40d2b955b8Sat,\ + \ 22 Jun 2019 20:39:06 GMTSat, 29 Jun 2019\ + \ 20:39:06 GMTAgAAAAMAAAAAAAAAliiUnDop1QE=Sat,\ + \ 22 Jun 2019 20:39:38 GMT2\u554A\ + \u9F44\u4E02\u72DB\u72DC" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e9f353a7-3003-0002-3d3a-2966fa000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message.yaml new file mode 100644 index 000000000000..eff132cfa07a --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message.yaml @@ -0,0 +1,878 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2b8a3706-952a-11e9-95ac-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec0820c59 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 44ddeb3a-a003-008f-6b36-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2baa45ee-952a-11e9-b59f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFF83095281-1ec9-4175-9dea-586954608941Sat,\ + \ 22 Jun 2019 20:13:16 GMTSat, 29 Jun 2019\ + \ 20:13:16 GMTAgAAAAMAAAAAAAAA0Qhw7TYp1QE=Sat,\ + \ 22 Jun 2019 20:13:16 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 44ddeb47-a003-008f-7636-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2bb2d7e8-952a-11e9-85b3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFF83095281-1ec9-4175-9dea-586954608941Sat,\ + \ 22 Jun 2019 20:13:16 GMTSat, 29 Jun 2019\ + \ 20:13:16 GMTAgAAAAMAAAAAAAAAnsNZ/zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:46 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 44ddeb53-a003-008f-8036-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2bbb7a4c-952a-11e9-b70c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec0820c59/messages/83095281-1ec9-4175-9dea-586954608941?popreceipt=AgAAAAMAAAAAAAAAnsNZ%2FzYp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAJHGB7TYp1QEBAAAA + x-ms-request-id: + - 44ddeb5a-a003-008f-0536-292a5c000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2bc4737e-952a-11e9-ac85-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFF83095281-1ec9-4175-9dea-586954608941Sat,\ + \ 22 Jun 2019 20:13:16 GMTSat, 29 Jun 2019\ + \ 20:13:16 GMTAgAAAAMAAAAAAAAANqFr/zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:46 GMT2message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 44ddeb69-a003-008f-1036-292a5c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e9be19a2-952a-11e9-bbce-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:35 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b6b69a26-b003-007e-1c37-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e9e114fa-952a-11e9-ab1d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:35 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFFe14c8959-6eb7-4504-9d4d-27fa682ba738Sat,\ + \ 22 Jun 2019 20:18:35 GMTSat, 29 Jun 2019\ + \ 20:18:35 GMTAgAAAAMAAAAAAAAA1Uaqqzcp1QE=Sat,\ + \ 22 Jun 2019 20:18:35 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b6b69a30-b003-007e-2237-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e9ec2b08-952a-11e9-962c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:35 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFFe14c8959-6eb7-4504-9d4d-27fa682ba738Sat,\ + \ 22 Jun 2019 20:18:35 GMTSat, 29 Jun 2019\ + \ 20:18:35 GMTAgAAAAMAAAAAAAAALeyUvTcp1QE=Sat,\ + \ 22 Jun 2019 20:19:05 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b6b69a31-b003-007e-2337-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e9f56bb4-952a-11e9-9ca4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:35 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages/e14c8959-6eb7-4504-9d4d-27fa682ba738?popreceipt=AgAAAAMAAAAAAAAALeyUvTcp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAmHK8qzcp1QEBAAAA + x-ms-request-id: + - b6b69a36-b003-007e-2737-29fbcf000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:18:35 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e9fe3988-952a-11e9-8897-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:35 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFFe14c8959-6eb7-4504-9d4d-27fa682ba738Sat,\ + \ 22 Jun 2019 20:18:35 GMTSat, 29 Jun 2019\ + \ 20:18:35 GMTAgAAAAMAAAAAAAAAusmmvTcp1QE=Sat,\ + \ 22 Jun 2019 20:19:05 GMT2message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b6b69a3d-b003-007e-2d37-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85152d64-952b-11e9-b241-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b0cdb40e-f003-0050-3e38-297b08000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8537880a-952b-11e9-994d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:56 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFFf446f6b5-e9f9-4abf-a32b-3ed9358b4851Sat,\ + \ 22 Jun 2019 20:22:56 GMTSat, 29 Jun 2019\ + \ 20:22:56 GMTAgAAAAMAAAAAAAAAz57/Rjgp1QE=Sat,\ + \ 22 Jun 2019 20:22:56 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b0cdb423-f003-0050-5138-297b08000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85413eb8-952b-11e9-917d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:56 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFFf446f6b5-e9f9-4abf-a32b-3ed9358b4851Sat,\ + \ 22 Jun 2019 20:22:56 GMTSat, 29 Jun 2019\ + \ 20:22:56 GMTAgAAAAMAAAAAAAAAUZLqWDgp1QE=Sat,\ + \ 22 Jun 2019 20:23:26 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b0cdb430-f003-0050-5d38-297b08000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 854b088a-952b-11e9-8989-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages/f446f6b5-e9f9-4abf-a32b-3ed9358b4851?popreceipt=AgAAAAMAAAAAAAAAUZLqWDgp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAA/o0SRzgp1QEBAAAA + x-ms-request-id: + - b0cdb43a-f003-0050-6738-297b08000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:22:56 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85542d7a-952b-11e9-ac53-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:56 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFFf446f6b5-e9f9-4abf-a32b-3ed9358b4851Sat,\ + \ 22 Jun 2019 20:22:56 GMTSat, 29 Jun 2019\ + \ 20:22:56 GMTAgAAAAMAAAAAAAAAnKj9WDgp1QE=Sat,\ + \ 22 Jun 2019 20:23:26 GMT2message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b0cdb445-f003-0050-7138-297b08000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c95fdcb0-952d-11e9-b4c3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:09 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e1088934-7003-002c-743a-29e63d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c986134c-952d-11e9-9ef5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:09 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFF0b1b2830-4f09-42fb-a348-490c551b040bSat,\ + \ 22 Jun 2019 20:39:09 GMTSat, 29 Jun 2019\ + \ 20:39:09 GMTAgAAAAMAAAAAAAAAQDBPizop1QE=Sat,\ + \ 22 Jun 2019 20:39:09 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e108893f-7003-002c-7c3a-29e63d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c9907bcc-952d-11e9-a76e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:09 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFF0b1b2830-4f09-42fb-a348-490c551b040bSat,\ + \ 22 Jun 2019 20:39:09 GMTSat, 29 Jun 2019\ + \ 20:39:09 GMTAgAAAAMAAAAAAAAAHW48nTop1QE=Sat,\ + \ 22 Jun 2019 20:39:40 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e1088949-7003-002c-053a-29e63d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c99cbae8-952d-11e9-8605-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:10 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages/0b1b2830-4f09-42fb-a348-490c551b040b?popreceipt=AgAAAAMAAAAAAAAAHW48nTop1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAnsllizop1QEBAAAA + x-ms-request-id: + - e108895a-7003-002c-133a-29e63d000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:39:10 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - c9a6b9e6-952d-11e9-ad29-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:10 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueuec0820c59/messages + response: + body: + string: "\uFEFF0b1b2830-4f09-42fb-a348-490c551b040bSat,\ + \ 22 Jun 2019 20:39:09 GMTSat, 29 Jun 2019\ + \ 20:39:09 GMTAgAAAAMAAAAAAAAAvyBQnTop1QE=Sat,\ + \ 22 Jun 2019 20:39:40 GMT2message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e1088960-7003-002c-193a-29e63d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message_content.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message_content.yaml new file mode 100644 index 000000000000..9333fb6d5a4d --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_update_message_content.yaml @@ -0,0 +1,890 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2bf19836-952a-11e9-8d4e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:16 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue32150fb3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7109b759-d003-002a-6036-291145000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2c122c9a-952a-11e9-b48d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFb06ccc5e-672c-45c9-a6ba-c04789bd31d7Sat,\ + \ 22 Jun 2019 20:13:17 GMTSat, 29 Jun 2019\ + \ 20:13:17 GMTAgAAAAMAAAAAAAAAULfX7TYp1QE=Sat,\ + \ 22 Jun 2019 20:13:17 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7109b769-d003-002a-6936-291145000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2c1ad5de-952a-11e9-8dbd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFb06ccc5e-672c-45c9-a6ba-c04789bd31d7Sat,\ + \ 22 Jun 2019 20:13:17 GMTSat, 29 Jun 2019\ + \ 20:13:17 GMTAgAAAAMAAAAAAAAAXefB/zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:47 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7109b775-d003-002a-7236-291145000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + new text' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2c2381de-952a-11e9-a35a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/pythonqueue32150fb3/messages/b06ccc5e-672c-45c9-a6ba-c04789bd31d7?popreceipt=AgAAAAMAAAAAAAAAXefB%2FzYp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAoh/p7TYp1QEBAAAA + x-ms-request-id: + - 7109b77b-d003-002a-7636-291145000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2c2c2136-952a-11e9-90bf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFb06ccc5e-672c-45c9-a6ba-c04789bd31d7Sat,\ + \ 22 Jun 2019 20:13:17 GMTSat, 29 Jun 2019\ + \ 20:13:17 GMTAgAAAAMAAAAAAAAAnSjT/zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:47 GMT2new\ + \ text" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7109b781-d003-002a-7a36-291145000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ea4fa7f0-952a-11e9-be8e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:36 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e4d0f39f-3003-0081-4d37-29c657000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ea8828be-952a-11e9-81a2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:36 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFadbb41c2-2b5a-4aac-87d4-4ba81c935d10Sat,\ + \ 22 Jun 2019 20:18:36 GMTSat, 29 Jun 2019\ + \ 20:18:36 GMTAgAAAAMAAAAAAAAARz5SrDcp1QE=Sat,\ + \ 22 Jun 2019 20:18:36 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e4d0f3a8-3003-0081-5137-29c657000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ea944d2e-952a-11e9-bbc2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:36 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFadbb41c2-2b5a-4aac-87d4-4ba81c935d10Sat,\ + \ 22 Jun 2019 20:18:36 GMTSat, 29 Jun 2019\ + \ 20:18:36 GMTAgAAAAMAAAAAAAAAWW48vjcp1QE=Sat,\ + \ 22 Jun 2019 20:19:06 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e4d0f3ac-3003-0081-5437-29c657000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + new text' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ea9d9958-952a-11e9-8acc-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:36 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages/adbb41c2-2b5a-4aac-87d4-4ba81c935d10?popreceipt=AgAAAAMAAAAAAAAAWW48vjcp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAADRhmrDcp1QEBAAAA + x-ms-request-id: + - e4d0f3af-3003-0081-5637-29c657000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:18:36 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - eaa83640-952a-11e9-b1f6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:36 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFadbb41c2-2b5a-4aac-87d4-4ba81c935d10Sat,\ + \ 22 Jun 2019 20:18:36 GMTSat, 29 Jun 2019\ + \ 20:18:36 GMTAgAAAAMAAAAAAAAAZb1Qvjcp1QE=Sat,\ + \ 22 Jun 2019 20:19:07 GMT2new\ + \ text" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e4d0f3b7-3003-0081-5d37-29c657000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85b21be2-952b-11e9-a530-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 645fc07f-8003-0076-2738-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85d39d76-952b-11e9-8152-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFf064e1f0-b5b9-4264-90e5-4dd0d61d3cd7Sat,\ + \ 22 Jun 2019 20:22:57 GMTSat, 29 Jun 2019\ + \ 20:22:57 GMTAgAAAAMAAAAAAAAAwBCbRzgp1QE=Sat,\ + \ 22 Jun 2019 20:22:57 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 645fc085-8003-0076-2b38-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85dd4100-952b-11e9-bbd9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFf064e1f0-b5b9-4264-90e5-4dd0d61d3cd7Sat,\ + \ 22 Jun 2019 20:22:57 GMTSat, 29 Jun 2019\ + \ 20:22:57 GMTAgAAAAMAAAAAAAAAcFKGWTgp1QE=Sat,\ + \ 22 Jun 2019 20:23:27 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 645fc08c-8003-0076-3138-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + new text' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85e6bf46-952b-11e9-9286-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages/f064e1f0-b5b9-4264-90e5-4dd0d61d3cd7?popreceipt=AgAAAAMAAAAAAAAAcFKGWTgp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAT5yuRzgp1QEBAAAA + x-ms-request-id: + - 645fc097-8003-0076-3b38-29e0bc000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 85f260b4-952b-11e9-ae44-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFFf064e1f0-b5b9-4264-90e5-4dd0d61d3cd7Sat,\ + \ 22 Jun 2019 20:22:57 GMTSat, 29 Jun 2019\ + \ 20:22:57 GMTAgAAAAMAAAAAAAAAuRabWTgp1QE=Sat,\ + \ 22 Jun 2019 20:23:27 GMT2new\ + \ text" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 645fc0a8-8003-0076-4a38-29e0bc000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cacc2de2-952d-11e9-a208-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1323d8aa-e003-0029-3a3a-291242000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - caedb2a8-952d-11e9-80f3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:12 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFF039e3e8b-5dbe-461f-ad6c-244c448d0691Sat,\ + \ 22 Jun 2019 20:39:12 GMTSat, 29 Jun 2019\ + \ 20:39:12 GMTAgAAAAMAAAAAAAAAvQa2jDop1QE=Sat,\ + \ 22 Jun 2019 20:39:12 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:12 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 1323d8bb-e003-0029-483a-291242000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - caf8c7ee-952d-11e9-a41e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:12 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFF039e3e8b-5dbe-461f-ad6c-244c448d0691Sat,\ + \ 22 Jun 2019 20:39:12 GMTSat, 29 Jun 2019\ + \ 20:39:12 GMTAgAAAAMAAAAAAAAA+TKinjop1QE=Sat,\ + \ 22 Jun 2019 20:39:42 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:12 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 1323d8c5-e003-0029-513a-291242000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + new text' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cb01dc30-952d-11e9-bf4a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:12 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages/039e3e8b-5dbe-461f-ad6c-244c448d0691?popreceipt=AgAAAAMAAAAAAAAA%2BTKinjop1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:12 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAe+DJjDop1QEBAAAA + x-ms-request-id: + - 1323d8d0-e003-0029-5b3a-291242000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:39:12 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cb0ac886-952d-11e9-813c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:12 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pythonqueue32150fb3/messages + response: + body: + string: "\uFEFF039e3e8b-5dbe-461f-ad6c-244c448d0691Sat,\ + \ 22 Jun 2019 20:39:12 GMTSat, 29 Jun 2019\ + \ 20:39:12 GMTAgAAAAMAAAAAAAAAihC0njop1QE=Sat,\ + \ 22 Jun 2019 20:39:42 GMT2new\ + \ text" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:12 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 1323d8db-e003-0029-663a-291242000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_base64_decode_fails.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_base64_decode_fails.yaml new file mode 100644 index 000000000000..35060896aa1f --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_base64_decode_fails.yaml @@ -0,0 +1,336 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2c636510-952a-11e9-9187-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/mytestqueue453d1525 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d08b9d97-8003-00b1-1536-299c7d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + xyz' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '98' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2c851746-952a-11e9-b889-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:17 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/mytestqueue453d1525/messages + response: + body: + string: "\uFEFF94a01e91-df10-45dc-9f98-f11cca4e89dfSat,\ + \ 22 Jun 2019 20:13:18 GMTSat, 29 Jun 2019\ + \ 20:13:18 GMTAgAAAAMAAAAAAAAAmNlK7jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - d08b9d9e-8003-00b1-1a36-299c7d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2cbaa4b0-952a-11e9-a792-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:18 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/mytestqueue453d1525/messages?peekonly=true + response: + body: + string: "\uFEFF94a01e91-df10-45dc-9f98-f11cca4e89dfSat,\ + \ 22 Jun 2019 20:13:18 GMTSat, 29 Jun 2019\ + \ 20:13:18 GMT0xyz" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d08b9db7-8003-00b1-3236-299c7d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - eae90134-952a-11e9-8170-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:37 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue453d1525 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ccea4f98-f003-009c-5737-291fbd000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 863b39a4-952b-11e9-958a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:57 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue453d1525 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 96786836-b003-009b-0e38-29e938000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cb698880-952d-11e9-ad1b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:13 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue453d1525 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d08d5f82-8003-00b1-243a-299c7d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + xyz' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '98' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cba71c5e-952d-11e9-8335-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:13 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueue453d1525/messages + response: + body: + string: "\uFEFFcb3c953d-67cc-4fe5-9cdd-4f5aa8d00f11Sat,\ + \ 22 Jun 2019 20:39:13 GMTSat, 29 Jun 2019\ + \ 20:39:13 GMTAgAAAAMAAAAAAAAAiD9vjTop1QE=Sat,\ + \ 22 Jun 2019 20:39:13 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - d08d5fa0-8003-00b1-3e3a-299c7d000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cbb08136-952d-11e9-aff3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:13 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/mytestqueue453d1525/messages?peekonly=true + response: + body: + string: "\uFEFFcb3c953d-67cc-4fe5-9cdd-4f5aa8d00f11Sat,\ + \ 22 Jun 2019 20:39:13 GMTSat, 29 Jun 2019\ + \ 20:39:13 GMT0xyz" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d08d5faa-8003-00b1-453a-299c7d000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_bytes_base64.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_bytes_base64.yaml new file mode 100644 index 000000000000..41bb08e5efc8 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_bytes_base64.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2ccdb122-952a-11e9-b264-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:18 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/mytestqueuebdb1127a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - cce89a6a-f003-009c-3236-291fbd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + eHl6' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '99' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2cee46ee-952a-11e9-8407-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/mytestqueuebdb1127a/messages + response: + body: + string: "\uFEFF930ab462-e7fd-4c8b-8d33-509158ff5fbaSat,\ + \ 22 Jun 2019 20:13:18 GMTSat, 29 Jun 2019\ + \ 20:13:18 GMTAgAAAAMAAAAAAAAALl207jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cce89a7c-f003-009c-3f36-291fbd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2cf75018-952a-11e9-8abe-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:18 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/mytestqueuebdb1127a/messages + response: + body: + string: "\uFEFF930ab462-e7fd-4c8b-8d33-509158ff5fbaSat,\ + \ 22 Jun 2019 20:13:18 GMTSat, 29 Jun 2019\ + \ 20:13:18 GMTAgAAAAMAAAAAAAAA4p6fADcp1QE=Sat,\ + \ 22 Jun 2019 20:13:48 GMT1eHl6" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - cce89a89-f003-009c-4a36-291fbd000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - eb4ed798-952a-11e9-97de-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueuebdb1127a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - bbde3a58-9003-002d-5f37-29e7c0000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 86929b2c-952b-11e9-8a70-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:58 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueuebdb1127a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:57 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 8ef2c0c2-b003-005c-5f38-2995f9000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cbd48bd0-952d-11e9-9f34-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:13 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueuebdb1127a + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d5155af0-8003-00ba-6f3a-298409000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + eHl6' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '99' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cbf8d6ac-952d-11e9-8663-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:13 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueuebdb1127a/messages + response: + body: + string: "\uFEFFdf2964d9-edbb-48c3-9416-cc0ed5a12d69Sat,\ + \ 22 Jun 2019 20:39:14 GMTSat, 29 Jun 2019\ + \ 20:39:14 GMTAgAAAAMAAAAAAAAA8xfBjTop1QE=Sat,\ + \ 22 Jun 2019 20:39:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - d5155aff-8003-00ba-7a3a-298409000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cc01dedc-952d-11e9-ab67-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:14 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/mytestqueuebdb1127a/messages + response: + body: + string: "\uFEFFdf2964d9-edbb-48c3-9416-cc0ed5a12d69Sat,\ + \ 22 Jun 2019 20:39:14 GMTSat, 29 Jun 2019\ + \ 20:39:14 GMTAgAAAAMAAAAAAAAAGW+rnzop1QE=Sat,\ + \ 22 Jun 2019 20:39:44 GMT1eHl6" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d5155b07-8003-00ba-013a-298409000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_base64.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_base64.yaml new file mode 100644 index 000000000000..96a537a5841c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_base64.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d133a8a-952a-11e9-b792-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:18 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/mytestqueueab101218 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 431ab50a-2003-007b-0d36-290fb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + AQ==' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '99' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d352f78-952a-11e9-86f3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:19 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/mytestqueueab101218/messages + response: + body: + string: "\uFEFF5b3ae901-d4e1-4fb8-b619-10953e8f473fSat,\ + \ 22 Jun 2019 20:13:19 GMTSat, 29 Jun 2019\ + \ 20:13:19 GMTAgAAAAMAAAAAAAAAMzf77jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:19 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 431ab511-2003-007b-1236-290fb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d3e1f7a-952a-11e9-b25d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/mytestqueueab101218/messages + response: + body: + string: "\uFEFF5b3ae901-d4e1-4fb8-b619-10953e8f473fSat,\ + \ 22 Jun 2019 20:13:19 GMTSat, 29 Jun 2019\ + \ 20:13:19 GMTAgAAAAMAAAAAAAAALkDlADcp1QE=Sat,\ + \ 22 Jun 2019 20:13:49 GMT1AQ==" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 431ab519-2003-007b-1936-290fb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - eb923a62-952a-11e9-a853-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueueab101218 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2c9d842f-e003-0022-3837-290a36000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 86dc5c08-952b-11e9-bd0a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:59 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueueab101218 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4b3c6eb8-3003-0009-5c38-297e8e000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cc450ce8-952d-11e9-9ece-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:14 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueueab101218 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 3d13f9fa-e003-00c7-753a-2918c1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + AQ==' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '99' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cc66509c-952d-11e9-947b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:14 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueueab101218/messages + response: + body: + string: "\uFEFFe3f866dc-6126-406a-bd52-814c4958bf89Sat,\ + \ 22 Jun 2019 20:39:14 GMTSat, 29 Jun 2019\ + \ 20:39:14 GMTAgAAAAMAAAAAAAAAeB4ujjop1QE=Sat,\ + \ 22 Jun 2019 20:39:14 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3d13fa00-e003-00c7-783a-2918c1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cc6f5908-952d-11e9-a7f4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:14 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/mytestqueueab101218/messages + response: + body: + string: "\uFEFFe3f866dc-6126-406a-bd52-814c4958bf89Sat,\ + \ 22 Jun 2019 20:39:14 GMTSat, 29 Jun 2019\ + \ 20:39:14 GMTAgAAAAMAAAAAAAAActUZoDop1QE=Sat,\ + \ 22 Jun 2019 20:39:44 GMT1AQ==" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3d13fa06-e003-00c7-7d3a-2918c1000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml.yaml new file mode 100644 index 000000000000..1e46e40689dc --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d58b0ec-952a-11e9-a4d9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:19 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/mytestqueue75b91164 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9e429531-a003-00ad-3136-29446a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + &lt;message1&gt;' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '119' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d794398-952a-11e9-ad11-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:19 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/mytestqueue75b91164/messages + response: + body: + string: "\uFEFFd6fa5603-dba3-4831-9af7-065ae4704b0eSat,\ + \ 22 Jun 2019 20:13:19 GMTSat, 29 Jun 2019\ + \ 20:13:19 GMTAgAAAAMAAAAAAAAA4cY/7zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:19 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 9e429540-a003-00ad-3b36-29446a000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d82ee98-952a-11e9-82ca-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/mytestqueue75b91164/messages + response: + body: + string: "\uFEFFd6fa5603-dba3-4831-9af7-065ae4704b0eSat,\ + \ 22 Jun 2019 20:13:19 GMTSat, 29 Jun 2019\ + \ 20:13:19 GMTAgAAAAMAAAAAAAAAHUUqATcp1QE=Sat,\ + \ 22 Jun 2019 20:13:49 GMT1&lt;message1&gt;" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9e429542-a003-00ad-3d36-29446a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ebe5e35e-952a-11e9-97ee-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:39 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue75b91164 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:39 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 06a84066-1003-00d9-5837-29c22c000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 87291bb0-952b-11e9-aa66-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:59 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue75b91164 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:59 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a1c27077-e003-00aa-0c38-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cc986a98-952d-11e9-a3c8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:15 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue75b91164 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ab00caf3-5003-00b8-2a3a-2986f3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + &lt;message1&gt;' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '119' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ccb90898-952d-11e9-8333-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueue75b91164/messages + response: + body: + string: "\uFEFF570ec0b7-c050-4fb9-b52a-656744127c30Sat,\ + \ 22 Jun 2019 20:39:15 GMTSat, 29 Jun 2019\ + \ 20:39:15 GMTAgAAAAMAAAAAAAAAGcyBjjop1QE=Sat,\ + \ 22 Jun 2019 20:39:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ab00cafa-5003-00b8-2f3a-2986f3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ccc2bc92-952d-11e9-9898-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:15 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/mytestqueue75b91164/messages + response: + body: + string: "\uFEFF570ec0b7-c050-4fb9-b52a-656744127c30Sat,\ + \ 22 Jun 2019 20:39:15 GMTSat, 29 Jun 2019\ + \ 20:39:15 GMTAgAAAAMAAAAAAAAAWkpsoDop1QE=Sat,\ + \ 22 Jun 2019 20:39:45 GMT1&lt;message1&gt;" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ab00cb0b-5003-00b8-3c3a-2986f3000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_invalid_chars.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_invalid_chars.yaml new file mode 100644 index 000000000000..4c16538da031 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_invalid_chars.yaml @@ -0,0 +1,194 @@ +interactions: +- request: + body: "\n\x01\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 2d965b2c-952a-11e9-86f9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:19 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/mytestqueue93de171a/messages + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:76204e57-a003-0025-0936-29fcb3000000\n\ + Time:2019-06-22T20:13:24.5657796Z228Error\ + \ parsing Xml content" + headers: + Content-Length: + - '327' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 76204e57-a003-0025-0936-29fcb3000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: "\n\x01\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ec1c41ba-952a-11e9-8f8b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:39 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueue93de171a/messages + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:ad53ca4f-d003-0008-1f37-297f73000000\n\ + Time:2019-06-22T20:18:41.0960581Z228Error\ + \ parsing Xml content" + headers: + Content-Length: + - '327' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - ad53ca4f-d003-0008-1f37-297f73000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: "\n\x01\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8768049c-952b-11e9-9704-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:59 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueue93de171a/messages + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:b1c82729-0003-0023-6138-290bcb000000\n\ + Time:2019-06-22T20:23:01.2841285Z228Error\ + \ parsing Xml content" + headers: + Content-Length: + - '327' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:00 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - b1c82729-0003-0023-6138-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: "\n\x01\ + " + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '96' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cce5b814-952d-11e9-bed8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueue93de171a/messages + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:e4d223e5-3003-0081-163a-29c657000000\n\ + Time:2019-06-22T20:39:16.7647126Z228Error\ + \ parsing Xml content" + headers: + Content-Length: + - '327' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - e4d223e5-3003-0081-163a-29c657000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_whitespace.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_whitespace.yaml new file mode 100644 index 000000000000..750106cc275a --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encodings.test_message_text_xml_whitespace.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 307c45d8-952a-11e9-9d17-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/mytestqueue509615f0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9e23a4ac-c003-00bd-4736-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: "\n mess\t\ + \ age1\n" + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '108' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 309c176c-952a-11e9-bbbe-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:24 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/mytestqueue509615f0/messages + response: + body: + string: "\uFEFFc5a57313-d2dc-4229-ab5a-83eb20a3b4eaSat,\ + \ 22 Jun 2019 20:13:24 GMTSat, 29 Jun 2019\ + \ 20:13:24 GMTAgAAAAMAAAAAAAAAmeVh8jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:24 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 9e23a4c7-c003-00bd-5e36-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 30a4b62e-952a-11e9-8691-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:24 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/mytestqueue509615f0/messages + response: + body: + string: "\uFEFFc5a57313-d2dc-4229-ab5a-83eb20a3b4eaSat,\ + \ 22 Jun 2019 20:13:24 GMTSat, 29 Jun 2019\ + \ 20:13:24 GMTAgAAAAMAAAAAAAAAfcdLBDcp1QE=Sat,\ + \ 22 Jun 2019 20:13:54 GMT1\ + \ mess\t age1\n" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9e23a4dd-c003-00bd-7236-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ed3ba7d4-952a-11e9-9448-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue509615f0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:41 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2d59992d-4003-0042-1837-294f14000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8847281e-952b-11e9-83bb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:01 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue509615f0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1ffb13ae-7003-00e0-5938-298288000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cdd58448-952d-11e9-9193-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/mytestqueue509615f0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b1c917a2-0003-0023-513a-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: "\n mess\t\ + \ age1\n" + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '108' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cdffd87e-952d-11e9-97a6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:17 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/mytestqueue509615f0/messages + response: + body: + string: "\uFEFFce3d42b9-500a-4f77-91a2-f9a0960d7df4Sat,\ + \ 22 Jun 2019 20:39:17 GMTSat, 29 Jun 2019\ + \ 20:39:17 GMTAgAAAAMAAAAAAAAA6KbHjzop1QE=Sat,\ + \ 22 Jun 2019 20:39:17 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b1c917a6-0003-0023-533a-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ce087f58-952d-11e9-b536-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/mytestqueue509615f0/messages + response: + body: + string: "\uFEFFce3d42b9-500a-4f77-91a2-f9a0960d7df4Sat,\ + \ 22 Jun 2019 20:39:17 GMTSat, 29 Jun 2019\ + \ 20:39:17 GMTAgAAAAMAAAAAAAAACv6xoTop1QE=Sat,\ + \ 22 Jun 2019 20:39:47 GMT1\ + \ mess\t age1\n" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b1c917a9-0003-0023-553a-290bcb000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_add_encrypted_64k_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_add_encrypted_64k_message.yaml new file mode 100644 index 000000000000..23d07c9ba9b8 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_add_encrypted_64k_message.yaml @@ -0,0 +1,451 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 30b7b834-952a-11e9-ae52-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:25 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue446c19b4 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - eabc17ef-7003-0027-1f36-29fe49000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '65631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 30d87ee6-952a-11e9-a038-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue446c19b4/messages + response: + body: + string: "\uFEFF088e0fd0-aff6-4667-b31e-f3ee33c69840Sat,\ + \ 22 Jun 2019 20:13:25 GMTSat, 29 Jun 2019\ + \ 20:13:25 GMTAgAAAAMAAAAAAAAAh/6w8jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - eabc17fe-7003-0027-2a36-29fe49000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "T1aEd7qenVtCmz663MysNSs+3qUQaZwCa/kQDoaUzS2jqBP/BEOaliWEDXuUbbpCBwpTBY5lk3kAAsADKUpCLLMtIRnINTTKyiZ1V6TIb/PTogyZpa8m6tFxRHt4iotzVc/jJMfXIUTu0kWn7Xg9+09KPWgCFL8XGiQoGwJkB7oZJMMmmDGeuc5uEOLs27tXJ9DBQhdlzzUk4lWLhe3SnqdnjSC/av2Ttc9v4qDg89n8vXjCil/ILUPnwP+s2C8+nq3nUekIfJ/cIvUG0e2CZxp9eGWSxN521O+VEfc540qVesOJuwD4wREi8RkBwcTwtga2N6dLfOgLCZiSO4aR6YqaMPg02CqpEmGaeIu8dicP1eXO/aokmua9eunLfDaOAPwMSwn5bG/uvYE94wXVSDaaT7jwu90grkxiNi8wvnFE/AgBXmDcDOw7uVWyUEZsLDkeE1hRMUS76Wqz6XDu8Z+jeIlVoffIe4iWaVDUSU285fBAuImHspPxXFh0CrOZRqvbuL6w7Uu6+RRe2LKHxMgWi2S9FNYoYKxVyX3vF3MR183KpWsLkOw3hbiAOeQcqCtDy3RhCZFXguTnK81Vsn6rwmEKrhtuvGsTdQcrKE3KkqwoCIv+gmvN4cF6RkSId6S6wm0J8tI/PyCN0IWJwxyGHZUuB7LImIZjioE7tmbw4ncmd/v9zga7Q89NB037UTnkqsB1d/Pmalp+1k0AfRX0i0RnGz+Kuiw4yO+4G+sIkUDwqRAhzYEV9CHUFW1K2jJRUjohWoXLzpzBxogpfbzK0Jk++jXbj4V3N9TL97O3c5dY1xYwXAkCwmv4Ty2LgTdxyFdEGZRQM9RNoQqgvyeWX03DLlZ1MaBI90Pf/ekqUOp7/lE6XkZ32aqfWk8pQuCXJmtAk/VUhq67WsIU5da24v/FZh77TnvpJMprgv84vOZms4eQNAasBEOFt3LwWbY7ParFa6R7mZDFdpYweHwcLi1pITXItw5CkGh7zniXvegkYeUX9X99CrmYqg295KCYCN0diuNxh7ZgXlIKJ5fjF3GPnb4DArMkll1G3nLyXCfdbRY7oAeaEg5ZejEKigMuhTBYQk/eAY/4Ab3m148GjNhjwxq27vHo+/buPBo8RlSaRNgAVtc+7YPPq8qSZuAd9ytLIXS0e7SGyHlGhEZuagF0sDFb0u9Qm6szq/UXDKuCxznRz9TLv+5KsFYRRiU2Ypcc91aKT5Sq4laRCvoWEp9xCnb/Ovjpu8xPjHhCOWWYuSlY6PxaQdOvGfEWuJJIOJhw1IqiDWbVjQZazaAOeOpWK41RYn8gvaZGwS93DgL7P2XOrOS/RvluPcB7TuZHLdc73ujILaJJcRBlsS8YJlhkEJCqOnJVVr8PhYDHdxCGhD6tDFiB6oslJdMOswqEEG+N1tmUcLLmV+bnLLpkInMw9lppbSRMkvs5juq6X0S/ejtGqLWe2CntuY4QSUD/Xrad3ex8fCp3SqGQXgLJ4urf0FV8pF7phivb4cPgISbYtiXPwfbq5WWgkDpEsefAcBvLEX7o/KKaqMyVd7W5i/vp3dk1/Gm71eEy/Mo99d9P4GL1/lrfG7cuzzBEwg9sGjmh09XZf+YYS3tfMvW2MmSrMQ02uPkInisQRFgy91HFXyvB6/v3nmFRq8dPnojPKfKzQLSFEer2Un/K4lINW4z9n3g8d5Avy0k/HpnTfuNEPMgbxIlbEPUXGfRuFRRSHTEOYin4lmjRJGX77dmH+3XvJVAdmHxZ/3Beu+h5XnI00yIJ9XireaQW1MTJcJcUAPRiGKv1/v/54cmA4zj8yEWwaCyT0zwzjZ0SPlq4Q/dN6agj3tk4jT+xa8Ix6aIMWXmpa8YF9EKTJfDlh/i0xmb2Qdod7+J7G/iwy4C9x3u/CXJQLR0GlN+BIEbsFbT+Mr7U4GUZlxMP7IjPyEX2jKlJUQZgAlAnnY+7jW/uWI3BLgxrzZIhARIJ/HtpEwr0J9+Bq/pemfxPm3FZUXbcDtOueuNyu1hTULMxD/lbkvZiZo9LRVZGs1zZftcAZRm9S8U6zOlHLJQVHJ2M7XMSX27Zyw8WE6JzyNqaRQcMK+YKOzS2/gTNVIb0wb3lh1hwL4RK5fGZrM2lA2J/fDR4cDDelETr07v79U9UjdNRDmRPp4DXgnLgrjIyhL9R8gnJFoiD31UTf0Yr7NaVG0HC+m7OwaEbs+R2p6OsgPYN0DwepHEjv7errRnnQrAF3lj+i5MLfW1rJzPDWav9YLR9aT+hOLCJJpWCQoBkQpO5OQ2ynkB+OZIXb51fszA4WN5ol0kXfXrGfXU4m63PoQJKB4cjiofgjxrKTZX7CemaPHRbBlx32JO/aolEhd6OvD76YURj/x8tg79+vJG0umtvGAaRRDwnYi6DSnTPc3QJHi+N8xIHuiCtMiCgMWyzLExJkRtfT98k77PlEJKNwxa3sATZXvzmv5nNfpD7HXgCoBl7iYNpTfS2HNOKVIZHMXV2tpS37XVQugyvLs7RxUWs+PVezlheu7g43N4eoKarLbFTIxS2iX3KaCMpo/L2sAzdtdZKlzManqhVYp1uAFNbgeyAIacr0S17/6UZPIJNU9wfXhWB9h/jI8W3po51mdKA2sQNE/BYrw71EBdYovLhfIVDZl4iBWG9Ubed3spI3/1bzUfDQmB7EE3C6CdQTKNEUzuJgiRHqtuEGrSKaWdkPBlnowEr7GDuxlIa9re1I86X+xX4Lx6ODiT4QM3U3rzYGLwEztG1bUCISDkOuVyxdfjrBWBs2hC3IjxKsFa/rS9PW7CQISPYWirgisLPG0OS76pGRx+pAgYIp6LUQs6e5VcJCr2pgE6RcjkFRqxFPlTVtcIN0mZqquu8+Jq5V9oXa9CuNrGv9f+kiS150krEEEXY0APqBgKTjplxsfY7FvsQF9Tgk3/K+049MGazOTXlf1irBI6QEsBxb87Tmc4nUCUmMtIl0r0N4UltAkNTcvYHVnQipTgUhBYB572Y95PErPWKnEVyuh33FbbBi8b0cP9Bdz2bDUNconPa6rOZUkgfABSehRn4N22EvRA6gFqcJFnfhp3uPoykWx+cImwma0CrfYBkEzeIqBXm2Shx/kHWuExWo+ghegbPpYN4eA23ijNdZDMAO/Fd4fcmoaf12cmVnfnHkwGX92pjFo6grXyaG78LLF7x1MAM55MU7LElodJQIZbDRraaYNcpjsZdPQlBQXEwnswmpk7OCCAQB2HNrxUwRPd6v5wfqCX0ysA2zkIeXOFnGpEMI5GO9y09H27FMkcJfe4RptIt48iRjnrdSDMa4sKJe6IuojWoNXl0lBk1zaSfgalyt9WkHItQmoP7KAw3nUMWZXCP8exyxp9e3yIoUBQfG6i63INta/JB7uwEgSDXYLepU5dY29sufITl6vMuwpJrGURgK64vcl8g1ySpqu+IJgzsWBisG57MkTIGi6zUUPFfFffn6BB/qunKWRAOuoM7Kxx9ihbZRmXyvC9twihf8SqvKAMOAWtyZUwgFFkau+OSPfybnVCoO+Cqx3ZrQQsVFH1EeREM1Lc1qGUhHTGV4FcoaZpDW2O9rsEZw6/BW1zLtQi7GmGXk4Y26rGaR7/oaZ2vTBWbmpmjADL7CmBou0VGZcm1haO0SQKcaPcXBPo4S7wNJZjhq3ShYC3zUDMrokMuG4a05WNQGfq4m3245U50bn2+BO5TH3x/8JnyBzvFujt5Tk9F4AxKCCxpZGvMoC7Zkdq3qEI0AFWxUuk62JpQq56oJ9aUjuWHqGRM3W8eYbhGkCLpWKSx3fJ+wL6Nf0jS5K/5jvmeIf+NkFwIEBPoAmQxVxwv9trxAk0qiDo5uHZTYJDySzKiEmI567wu8WKyRHA4S+R4W26FKFgCWVqhS/ogAxfKMpu9nwoB5DnebIXGvjr6es/mwCRt3SDiCvDUMV5Fbf6xkx27r22GLhQo5V7+I18BnTbMKj3b6600w9j/SjTRmPZb2hbEfPL7E/5/T/pNzXi+ZjcQd+vpratS8MkA4y1FGF0S/WSdL1vHADvUS4AdZjutX3Pxg4NKyMbmQgf7qcOYvayUSBvr6XSzslCsDJOVJTSyT5DxrhuSpuDB0aFGwCk3yd72WdYa5d/WEw05+Hr0EAXzFu+2g4KSCJN+1HgcUuYNt7ApjlMoriDc2nT4NGQqCZDFYWYWq3fyfXIWMq0owtZiw2wLpAhajcnD13LmMAd6uIuzKUehwrzR7rf+OeocmawXXhuzU/oy5x6dcTdW/QSIb4ySQBRcEDQGEo5HJ/7VxrrY15u4AhIpqUy9LOZT3TVOD3PdJBsZ82waWyMWO1ogNpfOov5tuPSQIdN/g758Abfe18/UfgszIseYsfp2o0lpJyFXdc82LoDj2/Eva9I5sxrhbgtNdzTuh/jB6rHCjkv0UBC8CNQiDtiHGSbBzd1eNZa9OTLgxo1fVu64UiASs6+KvvCbsRan/TXhsFhX1xBOyjmRpgJOQzCMVRcv0hSnZV3bJQPclgJVAFjAlOmNTJYjzviwrKn3xMNHYQ9qfw3PTjy5Z3dzFuxSBqDgMHP2imIUoMjygWV7+hz4lozSXsH62Z4Dsmil3dcz761gn6/uxyhmQutHMqXXW5UwKwA4yPTrWIBEsod7Q6Yffw9G4pIT3owMpLNC19zkI1Jeldyz+kDyqs2sjnlcUf9cxkKVZyBp2ohDkP13SSVdI3KtMf3UUnp5brqnf1eXKfydS0q5d4DqmXjOHfC0DC+QoAXU6EXRlmOQV9tiAQEWMPFaykFMOEmZt2NR00yfWVnaiezV6xrv0P6vN04FRc+Nd2q3jqWgoEv7BU3nU+0HSx2rdYyIrYAH056M4i4tSOFPyXrh+0+z2hS3Oy8FHw19AEPmoQ0R5M+MZ3cQPOTBASVGjXeDzAEISxGh05Pb7xCFEEIucWTrVOZjOAywE4rcaUlrPcewXZwJ2n4EoJJc+q/+00ues60mNnbz3owNsaqDQB0py3K9oAo+ribgwC04P8ETOt7ziu35CSUgFOmu64xqqccvber9mIfYheJz+0WYkxfKO8hBBXxgLF/zisDp0TrMUysq26JYsSlJy/u/uJDtk605N+5z1w6En7Pz4jEy5fNhSXsLn7AhPuH7X4eMT5EV4MkQNCYTDbp7w3883052bRCVXSq5xsS5qhhho2jm1mxNf+PgrmLipmV8qbVsLzmKNrghNVxMLLyGxmIxS30Ygpu6c3CrklJrUTiTU85rh2lCV2TmtQLr3AnI22TqatOsqsZ/BINoSkNIVb1K14rPtAdQw0ZieH+j5DeiEjO6JbaK3x6Y2CsHAOdVV3CYzQe8X3Sp+HCJ7BY8KqtVbBdKY9mBUIY31ad91KjHTS1KMP1Rb21ZT+EEtKnbI05Wtooa6HxqFeBgjVG+g5716PyQ7s7en/688mGYECZzet/14AfUBuPhloBuw3qRbtRqLithV9h2cZGAPjVol66qGGNyglGKoFC1Upduoj6O7j9qP+7hZ1N0qZdHOywMFJcJpCH8Fec/p+W3X5XibeczqRJ2BMNxFxqLxekeX9OqpXW8svXpXBl55D0lQLQX8SFvmMiV2awbDp3ZQTQTmtmtOUYkjmF8qdrGwhh6QdHmgvSE0Jq1cDhnCqjDyF3grmlqDxZ4ZEOoTQY6YOmNn7hxTdny+bAY+4kyiXoq6JQ2qNRqWqtRnLECVjQ+Yqz6C3G3jN8RUPxddNwKPXb/vyHX5qai/GqRu75Y+HI7fUuHwp2j98FQ/fkOlpiCXNex/G4nNek/L7sUyrNz7Q3A/cEGXC/gJRrcvq512tdyDXC2X3E2PI163A5E6tC0fsb17lsN7QfB5ji+WpFeJO6pEuTC2R5ON0ICALoudluoRirN4R+o+f1M5TDyhOqnoy19bEjyn/3rkvtcjO2Xga1jbwSVcXSUdi8/DPfXNbpix4mo8Nkb7peEKZBr8kkwK1U6oBnwmfUNV+7fol1qGAf0PZMS+BxwFLzuX8Dx4TnCXrIZnLDboe0n6wqEAWwlaTU6xx6iGqFDEZjAsnBbWT3AoMyo7dGZYxttGftDupAo3aATacLukzw0hyrqU979KxihIvCvG7LofdbYyVbGmVQFk3TbqG7+BjKBPMyZw9Ai/rsbVW4a5EwqOh78GANh70J2eDZy0R+eb5D1byMrYi8y11kW34Z6ah5phtaqYzrUhh04naWAuYt9ypWjJBlP29++vZ4Gf+koyaQrIJEagTEln/xznV6OFwOkXWM7Lgw4xQ94ij9j70ESXAIyjtiMuKzMsvv3ZblcL5pc3bu7YgohfRKqKS5Dzm0L1JF6RB2Lai7PZnY+5cdwB9f9BWRCkdIMXWld+bP5q/Uvlh7gU3NsVq/crgjyQJWGRcwabwe9DQcaTMzTIGSfSm0/ee95k/FAXrxb0oU2uYw3ehNLjD95rPsC5Kq8zhScPokWxsi1xaW3l/TXe3cmHcOpjBlUVTyIE6F4Sf7KY9kyM/lJ6S/tDpY/cdlthJ8ZmSPgru0ByqomszQOkEs+hd7V16TqWWrCw8ByQhGltZGs2mESvrdRnDRtJocyID6QBbRgZfgKiWNeFELIFWphiA2tXFofYFyBdPe94hOk7FnEOBBIlSiheNj4CYQg7z6zGpykqBt8NxDteD553h3AagBhL3CP4SS9cnKrJEook5sgVRVI8ZTJJuzV7r+nWKVmcFRjhYBFMbYaBt4sOVGOkgpE5ZUzWpL5H+1+qrG+c5jOm31fety0i9YdcNwpXPoXZ3jyGywiXGWnbiyvvsXpWseCTN9Qrlwu4CdUAxBLGCJ15ZzTqwE0+rHdiodBwXllsmuB7f2ACZuZ/69G/Ti1ajWQC5+NuC5EKfZwSm/5YYrYPhQX2sLW1BDUaZy0SHoOYnK2cm0K9T/DKDpENGi3rHU016WCtmCW4wY77M4wRtzVwRripAVCxwCd5SWML5xvA9LGn0VCwUb8iYrK9AmqgUKa0x/ng+/ke4AFz1d1tq7jwRRgjqDCjwkf4DSuYgZnnGf6EHHQHxgKYwjiKQ2ehilzLXwqJsHqzpGVK3A3JDhT2x9BWfGn1zV5sdaR6gp43I9XYpGCPF6rYIdSIZBNer1RraXkIsDmYwRpHFpt0WPWj79VLFUkkBOg6TTBVaWZtw4y1abUYDSohjr9sj2PtwT4EcZhJHK2IJHcZsGAZ6orCxqKE7gP/t60XoTl+hZesUjhQ/hF0QBwOogzHaV5zVariX68AklkEZYtUkgE98tqRv7zt3JMGrfMYx+wf8iN55bRDLKTq6Ct6JBMlVFaO1qWo+NepCbGCl9KU1R5q1HGXEK8ZcmtHN2sooKW+SQ2vy8+vYrNlyWPZshSL8dzf+JpcYCKOqCaeyewH1k0j1E78kDyScYB54EIjDt3wZ3nLtY6G3e9/XjO3RSCI1t0QfJTr9Y1/QDdwFsc3yxwUnINKZtx6crYp6D4SnWXZK6ENO1tE067ZB0dn5/yfsFJuOhzLxdjwpo26VGsf9X0QVVqy+7XUpvKWS1dwhrmwtwAQdFlim6gdXq0xZKHkg+Lw05x5AbGx9HVs4HQjdrUmmFndJSN56Zxy38Z5xKOP5FknEC7zUL9GTjB0az5QHn/WcS34bDzLzMxt1f3JgncSv65CXnzvLCxVv7/L5kKjJhscyjTrwwLoP9lqb7Y+XJs4Y1KVJpLNvbGQ0E8eDKldZo6NoW51qOTceXzw6HI4JF+KkRrDwIxLkSRPmw+Dm4nNzNzbVwMScnsB5ApypfMahqb0a76NEIKq24vgYPJbDqInc2uSQoRTaRkIzhPDK5OwptdCl8n0Nau6P5idSvaC+CsS8Xzmyr0H3fErm0P5NOqkVi1jyIWgfYVRkSnC2S2uA5WDFQttDHeY0XZ6rqWaGaF2K6OXQsn0Z2hoM8lfJOI0E1B6+imFj8KUXYsUvvt5uy0huVD+xd7yFJljH8BQG5lAuF4Vzz7YsTYbdpRyYpBCZJUkQv6mpOP+1CAc4ugo5rWAs4ixP1aeygG6DRxn7qvcmnRZT4Rqn3myRWhLZ27RrAjn00gCSaJCUFAjqqd5231liVljLXvTLK9ery12zNT9aWFM6LIjMy1OvfNk74Udym080NJza0qoNFsOiqvmbcL+RTmXQup2z60dzfrE9cBA1kjXOUBPZmRveDlWsHcwcj6FQ5Zf2yJWDc+zxuVc3GmVBK0TU825YUuKkwe22sqC4ta953hnLm5RWN1SEzN8MpwqmdmFF+wk6ZkA8s7m69igIU/KcfDh2LLBxpVoYhS1rk8IWu3gIbR+yGZcuGzQViCCoso8tlq7M5iI5GGcZmzm2V6rXPavYxajCau7XxdgRfmqQb1GCBESiOMaFsaXkbVaDjz5b7s8kH7iObZrU1hrITNwPC8+gJudEdDstDhgWSlOMe1CLAhOoIUekp+RIicOheQw3gcCLWWRI0tt5eeC8eTzN8zJOhmghtZtNXRyAV/qoY/EWL5SMGbi5enAxuRMyVGvjWGyPNKdulSuPOWxHzaOTEw/ptjGjyEizMvTExNDYnlIiVkUXm683hHsYkYbcbHMFFqKFnbUsFaNZMkKkDLV7EFdIoJaQyZvGVGgHnSFls5V8WUGmBf27F0iHlZJXRmgjxsP2N02DIoAfQHhQEq0DHFYTTCF9e4I96Z9juSikktQ9dss8xMYy25H9YnNCCIP27qY5POUISIf/AuUlDBoDrpEPnBXGDqcnKcZTad+EPPB6qTDpI69Ob4JBnL88On3DQc+TVMhqfaMGQ3OSYVZcYba+pJuKIq/ytPKFNLo2LFyxgWzCnkU9PmqwpaPxvREL+wgSwMPtVlePZMQdq9Sbd+v721XttjD8F/MFZoeKQw0JhmH/gA8+TmetnbglqizKJUpV9uoVJcCgUiG6jKMg9Uty+f1p1tQTDAsMwmTwH+3HRcDUVygwAZ7j8EgsQDdjkL3fFKDMSrp1M/6z7JqojMtfRhrtE+hMXxQ0Jn2IRd3utgFir7pvKcaePfzsrqmD78PE0nNH8GI8FdOq7/teD5+gG7zFR8i5l5SkzYjod6LnAgzX4vxhw0f3uRw+RP+i0Qn1w79DBwywDdd+/ent1gTMchyLwpLdxGTRcIi/ppo3Wiqz2jE7NY7LiqYcSax7Mk7J6o0ypixgdhHFIiXGn1yKilOAEmlBJPnuGUci9zWM4P1EofLj+oFxCLEPMrO/cGheiK9EL+4JikAaphtI+gxVL+wTigyl2VBB3jo5WZL69tfZC0d2JBMSori+xvD2UgGNP5+yry8cuikLhvAYKMpz2mv+EPYQ4wrCb2UMgJfGh2MQVpb8xEnjdPVl9HXRWmKCzibZRuZ2/xTvYddhJmH224LmVMRUT/crjQGmHkr9KVG5r3XASyJeulAhykSkopu1B920JjQa11R+JHtGhOL0WDYZKHPYfesGLX5GP81LgSvws2r3i+AnD5typfsdLyo8HQumgoqfuJ7amTZ0QWs3+Qc4/3QHOiNySHp3NpUu/EZvROYhzmqi8ReBbZ6Im13HoO1yHIKGtH0cQcH17nIXUpcR2bQpYkwfiImiq0LLHONawLQjC/4Ql9suMUlrFhV0GKge2H13IDhuWRnMbpOYzHJMoyV2srQtSKi00yWPB4a71GYj6ug5BAgnrnhXbeUwBQS8xkeTlAt4VSy0B5uJIwmhfhkntrzT0uoxBuk/LSxbfIqcfb3bUBNoqHcYnWC+LEIvGXAOG3GsVN5wMbTQgJfJq3Qk7JT1VnfJ7mPrDT0rSRZ4r0h0HZENn+WuJmDY50VjzFdiinhgI2CIF/KCXI1NudB8Q+ww+z0jTIQ7FeaU7fBB3h/wgt29rRTRMHH5FQhEhSEZ4BO+rk8JghA15fyaPsdRe9BvFpQTxYBsR4JQXLox2OOAkJ85AsW+HOsBiLS/ozXsM3xXvW/l2bDQ+XTKF0YUds5nhTyQBLY28oq/xVll/kT7rEuugvgJJyoYfy/xNSiPtj0B5rRVDEZes+HpVlJqPP21vR9BWFwXdlt3usTMESqiBUEp0XEVrasU9BFXPctlX+nFE6N0sAcnURVV94XrRHz62uCMlcYd9Jx9/u6S3fDtiu0zBBmenUaJD7+4W+xqZsyN9K5JDJsxPoxiI+YHNCXjN15dCA8dO9+C6Sz9tdQ8ynVhlbPsGwzIxLdbStVQV36aOIaecTegLdE/8waXlbSMiEB6OFs2kNSEq6N1FaEPqLvjdfSL+puV7wnj/q5Ioy7aQTVmTo185ZDHY8zbCt4IY0mkaG1EQ0Iy5+C9z8r2H3G5UgnetdTkskGLfuMf+CZT8s5jq/KUJY5i/nuZ9ivI1wgCqc0O/a0lW/V39DdZQ1DzCXc8qsZU5aehiecDlhK75V+Fd82Y9GyHfL1EYDjXjviSkKsn8bpmTPBWVAA+UQ1AMH8BJ9+5YIhiXI76y+ubmFIwbvt6623+CVuWGm8Zo6Y0Jc8IDAvoV1KkqwgUWrpSs8yuE0UYoiQA1EhjsB0Kp7gWzzN3pRzNasTLuys/pisZtDDxJwmwswGnrMKqlbvwpJskcmrC0cmnUYVYXbHIq0oIdf0t6dPgyDvm2GIxAX609JwEuUwVPe+VZUVfJi8TBR1yH5rcn0OJTJNx2NSXcXU5cN/B5mVSea/BCw8imK+KJ1icpi4W640PbaO/ROaPeQOfYJJWeY2QORN3UDy10IpPpi4UC/mSkxaX8Cux5PU81RRMZAXHlpSLe/KwXMlTwjLH26e18PfvgVeHgAoFtx9WkQF0ERIOo1J8/264HbDQB17MNhu3zq/Y5AjgdginuJtL/jaZ8ob/e1xWhMQgLxwwCR6nWDZSiqgU847yWJ4mLWXJc8KsMy0YqpkcaxoBvENODmGXfKjRL93q8iZ5sdj99SDohlwX8LGBsnTHlJfbR6gvyMxN0JVw6ew4ebKbFkivU9oiHvud+JezSbvCTi8frvr3qlEG+TEi2FUyWXRV4nNKKLC6/BZxnmN4aMn7A2zPh+N/jDtqplDMqxZUTo2ach21Q/CA5LyrekZg7vc5DIlJEDjdDZJtpWWuctn/gNOaM/izbh3Pm+di9zmD15+R5Gtsn0EPoxugOEkBTGIQpJnWLWl2kRMlV+utJ3hiWtZnVOBCxEQNnEcQz2uOpP9GFLWEjIoVMvfYf+H37N4lwFX86ITqUknu3ctvdpYaB3J06M9PwMtJDytjTthoNmWUwlMnMADiO/3w7KUck5JM3I6Q9PownQ6Ey6iS93la7NgaJ1qzh3ssgfIMU1ZAxRgMto7kErZpL37wOpPrjHDDCCfS+i8sf5yUy0uUeA5uMwaiA3r1SSHgIYwUENeCiQ9RQh8274kpV/96dF+sOBMmwsM/SKtnbEWFrMT9jMfgrBCTWEq1g57pky4QGgAQqHjwk8fujm28ZR+Im0CO2WPvu6d6w5ACD4+BoHZeCUKvL8sI1/15WT37EVLzJAeo+6OuT8iDuAJRDoaxoWDyTfe3oxBXXaWVbltgivrGFW1RYlLzqamBr9wjK0tUoXwMOwudFGXU/uu9Zg6p5dmfDh6NFNp79IjyLMHHExL6zR/YnY3bs9QPv+mWvlfDbBCJFAZ52coJ8/S1Hn8natFDxdxJSVfSfryzLghgRXdvkTW07hIa/atXVMnjDfdFk3If8wjS8tZkOT/FtEs8sN6VDbwKFifNU58lIz2iAebdoc9O0b+lmznt6sXt3SdTzXKqccDGlPes4lfxgLxBUMQqCEGhZmkoaUzyBdORhSeOMPfmPyeNCJ/WMTY26V+3U7L9uFetb6shmkPb1q/iUg41xiMSqEOLaG+aKSID2OD9sHe1tqtCS3CeRDPwe9wp+xNn3pjVhS5GoDCpxYsyS7eXWk//+tb/9CMyvcYTtso5IN16Lbi2tgXzXnd15NXOLgnBZd7Ag0kqn1uzmaShejcon239BsZUSJQ9QfrULZHNDRNjtICgS7tjJnGqchkRVKn8XKq7VYjlOc6cl+xJ8ZDxhw6lckdk6W6INMssjKvp/5YLaTRauFZiy1iPrbABcAhYrEEJe41RfIATafGnttA2rW/Ay/+gQPJSVA//bdPO0AYlBlQUhVwqUjzoRMCaAO9b3VJI0sfiYdygStnK9ltejfKfge2K0Phr95LyHbcxN7sph5NkaPGgqVw4i+kn1h+hD7BxviMj1OgC/s27Lp+P3a1/HP1vE4VmjcpxCkZq1g1Od4EgeHoehmdADufj9HEzzLbGr0aeSb8RDB2g+EqCD0YFn3kTiV7AOnGRbA1UpaRE2NPNYN3RmPLRqVHfuMEjPZMENBeGfPaZmx23AS5Uctk4ZCd+cBCMTdvKFn8f6zKqQNgJ4vxWXrutsGPn0sscpWab1vCVG9YVGOXu0tYgjAVvVO4P8s7KF5yWW+uXEKJPkIERus+Q2MOdfAsztmvqCF1KJzz0DO2IjEMnGIWzLJclDitE+GU/jl7Fc2o8EmJyhk4vi++XKbEknOK+7Q4p7BDDFeSOo2PGtvDeqIG9TFMJku5NeFbAZbBZ0neyX56wcrBZD6fgZ+abq4U56ZDLurX+Qs0owWw6OG9HHahpzdexlRUCs4V3yR8Yzy0RY++CNynlnUbAcD7k6Ypf2qk3EC5irJWiNoV9u1/EaXMmo05i/VtYlWjNA/eThR8a17ZAU8Ho2/gxOYHBbP53JaCGfdNGqVnmMwSabSGqMeLmnkNQToHxJDnluV9/BDAZdHf+fSCDQqsD7SVktQNucLcSvbQD+Neb1Wd0ZbEWWuImzIx3fVYkec6mvt380mzgJYr3iOvA1qmPfdXm6ZvEE4UjhZDAFq45Wj16TAaGiVy7nFPfMD8rAmcHU2sZ0Ln+V5Qz5GDrDqzEFEtiebrqIdpyusQQYmSXwqktyZhaPi/3S3+HAtrH8bXl6lbpDfqk4j9udkxGB+ReePwYX7SFS9o+/gwT6A72xomW34GGPjM4A5fH35GNzxZ7rpZSP0GugRWIRCXfatsO4jQspWf2LHACZwfH2cpL/S8Jjo8IS+kqyM12fzJhBCLwa9ieFg7a9pllFPeZw+omut1bz8prRdgcCaGP10BcY3BmxNKPNsDuyONFLJvxUz5UBo3adYWKxZRqZXVSMwvQdf3eMQK/yCXVU1zoTIyYmo2jlksg767Wy1+BS/Now921wfc/ytdF4Bbu5JWPI8TVE4LIehXnDHEZaN7ojWr5mK354emq77Var45IdPkSEjdRty2l2Spy66FLUpoSM0RsKt/Hg+EuXkQNy/YQ/HD8inaHPISTUR1Y7YRSZ4Ha6ulG761Ae5NrXsiMrHylMBfd6WJ+WV/5h5GjkJcj5sSi1uWNDsv8SQJ7trJZGpR3y7/0UGA2PvfJV6z9TwbS3zZzeNZ6z+lrUeRfBSSNhFF0GcQHnn6sEr5DB++3MpRsTMISDCBQiPew00PUHDiOJSWwuIEWlYhBPFXQBswYujttsqAWP7Pq1vWmY8pRbfGh+vCjdJ86SLQvfM3Qi+ri/FFtTcm82C9unw2s/dpjHtYg7nm7yNKA4oGDpntq5b2I+OHAhe6FQg1V8FGCcG1rgI0YCh/902uyUG8pKFzg+TKwZ55HH+2Bc5A9of7iB5ttWXtONfcJXS8u1Z+RUnjK8B4/S9oNl7lrD1h+tfOB0xjtsEOI09zzLwmYyCNU50MDMuc4tn0uahZFGUg7xktppVtuVjjz4gatbkk6FMNBxWXWtK19F3U8fNlm8jo+zbis7norpYRs3XAjqZjnVDciB1L5seqUHJ2f547k+msxmUF4rwokUeVtSrzWFXQkHnoykqC49zaw8/cl0HYgOW9DSl8rwNATwP+ZvLQfEnufqd1hkdNiBUKF/Dv3cdMEsepDAVSTt5G5P9TyI4/PpF8GF5AaB71yJwOkubXWByx/eMZq4Ql7KTPG9JQybwHckGs7Rk4lw6mNHrePNU7mjki6f9KIvmhim8HI8tgCSTaBkKrU41/bGy3+RDQbRi1nGJ38PuQUHbDg16tQTuUAdQD+Ji6GMSFFAqaVEb1hjLX/buN040tDdAvMn5DDmLKZ8PwnyB+Pc7t6KyWWt6DMb9w97pW0o2h8fo5RjdUyKOOEskf4oUTa99mpGIr6Y9ICNVUyu2AKuCZCVFVw0km6eOGUCUKOwak5B/sgojquRzyDIg/vAiLzbzFKpyUhrtxbJOYe9MyGktb3+wmlv/OsPXi926LfdzgwYufnNQb7QxJgQ8cOnBueAyYklwC+O7EKBoqQ4EfG2g+BWM2CALVHJip+ZsM3m2TRckfr15wDp8PTjYeIT2MmIpZyNRzUVdEEvnHLyeJ7VQDnI5+fzjG9XLFc/5bK2Ma/VcjB8I5wpcipynb1SikLCQaisHrZSjLNSJc39uFvLs6nKCL/rNWbIpP91eiod9n3IA6yEjKouLqWASoBz0kiSPAMnAQSd1IP9+zTC42cJts7ni8sx5Gja85iUD7FJIJAb7wdKJCuHu7/NvKCc09Foy01tgCDOwYvu713pCx0WtediOA69s7nilLqq06pC7viE2USa22xbpjgxCQefe3waEUlyVCkkbaJBhgaHjDIl5KVkkj6PnoVI2JQ1UoA2edk/DenAjFhtw+U61aAEfBsm83JKJwosopo+xPgRLhZO+0wRsKcLJSkqgQ60eCeeHlifthK/nTh6y8ivFqEN74dMWiBWAw/7DomFAVGGLb1y/lLnyN+AVItHSO+HGebGplvl4tcZHFLrDB/Q2TGNyP8QUoIxn3KBmTIRenNdOSYkSUC2pGoH8SwJtuRcodr0NPpg2COsm1AggYWN/iJcS9YbHeL7sUbF4fD1UexxU4c1bKuFk7PWMVdPRtK3vzW6OrTJMJ+LI4bLI3IcvODGHiLFjiUFPuDk3+Htd5osp0alJzsSdKZMvlLAGL+XQbB/heYGvG28/KsRFhqpXNOkp1/K7JldyxbvmT2WaKy8iVA/u618lg0bVUOE6qtYQgLi63qBw7YwfKAaTuHY8Nrk1r5VzN/Ei0PHuzB1B956emGGLvrfyf4JSJsxOnXDv7oLODvb+CwusRulWvt11EkCkf3A+U4JZ6Kspj8Pf66ZXoV15h7EZZiIhu99V++uLI2W9y7dug5oPsrV7Luywrn8kwNIwOgS2oFoEiLUNhFqGI03P/TYuU0w43oPoWKtpwmxF+bSr7h3hn1aSlT6T4DoUQivBdNXabFnod2kBZFnlQooHFvDhvLYaIeoozBVRRAAl+hlliX1D0KQWMRJA57mMI5MXyxa0fTZw5MPxEs278A2rtG8sPctPNWxF+Gp10N79elkqL0opO9aunadLA+7dJVo1EyiXhb1uZomd8d4TnLHGt+px8xvL+Zo7hAYgNlcQx1IpltXr3mkKn82XtHy3kaugiWv/AR7d5xoVAl423Ahe+jIbBXqShL3Cdfk2BG+oYJfR3Rx2MzLwJnKheZnCEondivyXRPUtNZ3MYYPJe6pD+PY8iFYUkiN+uF0opYfbggGPh5F5U0UIrnfT0Kskmg6XJPumPdK2gV/w459CL/404dyhlZyX9K2SDJjS2wDXFqCknDp8s9z890MC+KjXrl/0ufGh8EWSbPvp+maa8+V7dpPuHjZBOzn1oABeAouEBKeqjRC3JQrxyVxQtDCGYe7zMEO/SNzEbQYDY/H/QonT1uTu8lAUw7Gyp7YFc3/Q222OWD3sfZaOYRAbHCtR+1gdkULAWBSDaZjGt1VzHgWnhDznp4Msz/WjlNjLcZsArXCzm77pX3JgE8kH//sYCjEjS7Gr2Iz9k9kyfoPorePOns/9LFpGSUKO+Zko5FTGt1ABbWUil79IXpu48WDEK6+vYiyPruVh6mQeZhpgFCCXNNgbeYO0er+25yNk7gXidZkWG80UYR7WR2t6VK+Qs/RmT8lSJ2H+WfWSV53EQqgtNZWCHXBCPsG8W9qyCpB45r7a7R/+OeY5vg1hyR39SnUfQQKjMKIpPOCensCaCpnQGa24YWXkhB6yuYgTCLvpZozweOLgnQ0S3GstQvVjqKsOlwENtOF1lXHXK4rAAWmgMbzEu8nTMZAzNhAw9CuxQqS7F4Isc/kfZeH4gUGjeJbbrQ5nawNGrTSxBtymCPnTEHQ9IH92rHqvJrB2o/42hLjbPs9CJcQyfty9cO2+zHUHdbyElcLRkEoEGqMVKZkQr9bm7L8p/NDKCUmDUCLQKyGeL0bozTbWdWA8pyTafw6LAXn03wiNjxEY4jMl1ytdblMEKDIz38JVgO1hCHemGs+I1jwI0/iyB52QMO5za08m/oSwWnN+KkgZ5kZs9zTHOIA1O2KIFwopvD5PPOBHMH+EFlwjoT9j0zHz6H+K7TtlZ6PLGXUcZoGL7DdVaOoCrkaC9oZKckcWZXVDDJUb8y4XnSyiRQeI+xODI2yX992hAehucTYeTaTlz01b6JgROqRjGue4PUJGVgCCu09blfZQRTtiLlKa7/sJy2z3dHNOHARrLKa7DhtTszLVru08m63JoAVcrDbdgTcQdtJfvu7eYsVpraM1xxYa6WSsuCrJKeWdylYLQ/P/Xz2QnNAWsqy8TYc+PiRFrUVAp6Qk8oLCOn39Ru/rElmJlCfQ3oekuwkm9/Y1krtBXAtprbOmRkuiug73aI/CEy8ea2T/VXrq/PtAa6U0ydF6iqgISq44lRB02wOSgHrkyLKuZKw/wzc1CBab/44rNB0Nhhrk6HBxNLIUWJzFzi9q8UMTscaP/eDZ5qgJ3fwP6wWTeqXqeevNMbFbfvfkV+LKU7SO5f0Uh8jE7iuYnd/S4Zt4QIMquOjGM3GMbnRi9f9toZpEAhP5wT3Ad7BJwmSlxYtB4UFhxHZib1oXiL6NQ/CObaQNmoUxkGLw1Y7QSFsgFxIOxQx1a5EOzGDyAMqHwp7ofLA0xvf0XOdme4Ca6GzdetsvAFwERoTuuoTnz/emTxzrfQIkT1Y38NxSFLJ+SLJ+s1E61S1dhaeJnEDm6oRNuHD7eCwHVWiT+mJx6S5SsI1GJjebf4KKfgfM1fD9Hn105HfP/zD2EmDc+Q7fGiKbuZis6pZSumSrNlTpWvbwjMsitmj6It1mCboWowGnnznkOBZBrVG7XfEA7gr+jVeTSyo8IQxaAcQNpzf2yflWLadsFM43xj6ORC+74J/AzdpCxMdJiC3ZQJJjMI8M5fyHvqCzZq4lGC/DAA0aa6Z/13tFEefk5OC1KGcu3BdJw409ZgJL/V55k5CMYO/XA9uOub5JY9FEMhTgqnuU/i4TsoB5qhVvdxYYd1L8jmjtG9VIinnv8ap+oDH3NklQ1A0dWx03sB9m/i5L8k5RzXRiTvyhWP07L387+quwEFHVDP0k4MjlF3IAtmULoo1qkvsKEmgG9QszxsD6YvzmSI6t+2GcJkw20pXg8QTDILC1W/prqdVW+3FSi8X2hD0+mvePgnzU2Xzn4E1OKkx/j0re8m3WEvEMGzWpNesnzOJYwNGJorbRKzrswTcJna/cVj/yUGcyPVph7i1q7WhS1z0BJONF4pfva38u1CLGcxI4O4pj9N0/a/ZIcvhCXe1UfRuqTqnCcIcBXfRncN3oumtHgCQdztLFjt9SQOkYSmkY5cZG+sZzkxAXqMCQWiXoYkK0FyP3LHphImtehB4+IbzLdtqsy/sbZRaOzwgF4gjvGsoNglMykA/CTcZ6MVtsGlWWC4SGocYqL2ZLi2i21ssjMIJ0LhO6lwAVjT4e5GTCb7MvNG08zlF5jDDr/eqcUGc+OMXgJO26U7EmgLMdxoX2MzYh9U2J80Td3tGNqSGRxyEOc4wZ2vv9YGBSn3+IZ099hdT7e62+NgHSBeGCd5vAAjUWPl+jEXt3xBTK/1QsTxBrJZHa9AhbIoE3qz/2R94Mdd88FJcyCbdGxVZwujvJF0ydyDxow+Nm4cutLAujJoA+6b1ij/7K+TSt6+EeU5QqXckImgTvvvOajIy6RyKTZP4XZUNp40bmNZ1MOaCiwEC+cFVswyzbMcnhkLHGht9nio+bj4//cFFAxKL5CEOujMP/0qHb2Di+y6yhJ3uCnAigEqpxy4A9yp2/PGx218ddV/jblTgb8PJkQNdfztQc7If60Rzzh0xf5H0c79aWhRgT4f3i6YjPXnqUNGG9kK8AxH+STUFSeROwRuwK0+pe8RUyf+oni/mdPqkqj+mXlhCO6PzUUTzLajxiUm0XjNVg2e22MJRE2cch08zERvbHzLShbgIYI6I5xucj+FUEACPmNB5JOp5xriyKwhP0ZwnnT/K+9B9g0Za04Pu6PUUiQq6CZOFO7yzFoo6DCQGEsBK6iIwx/TPVhYJIyUvoI3SV8Gc63PGxs5c5aoFP7RNFIIPTKc1LHK/wB5lnTilEUIUiUyBPSL6iuosYzfMbrVETd0CHgRMRberewk8y6CR2i4kxE7UYFFXf59gVAKMpE+6hwVpziokmFj/rQKWzCVxtMoH3fVJ+yHUZ1PxaAFdc3zXIyHSQGICYfQpj2jJ7BWNpZOiuHi4USBsaFgdmi4DSXwuIirbquZ1wRu5hMWFPXeMxOEjQJ7xLmfnbS7nHJK60aWUYkYaE5Mr1tFtDp4WjutlBrBh+BbmD1kCxgsw6NvAafNI0U+9ljjdqkUfzQHDbVi0v8dWqKDoGAG5NGPHT4OOGCyO00oNW4zqIWYPwRfvbFXIJgHDVfb8+xH+0HX83jWvpczFJskB+bKP7xDiPYd8p+iOUjBIzNh7ry2EqOpEAwI9g06IEayh6eJSL85Q5X1FcLvosre21Ih84lWmDVS6gp+1+8bl8uGGtKzChFG2P+v1pbURs2XJi2xh7AWYggC84OeDrmFCWdMjh/HkkiYyJIpTdiYBU60xglW8ZDXbpWjC9rHbWjWMcLheMamD/0bj3EmernUaCRcO7h/0GYEz6JB7g9jch06cBVr8acED1BtfwVmHPzGscHGgLH0II9jQSHdFMB6Xw44vQbG3fLPTMAC6JoWbXcuTD51FO/UR5x7Ux4jX3RisGwAKRkGzJULRUsumhVwNTl40WaAbei9SGopBPiKWLGTJmnUVbcQU/82WdfqxcernkiUxxzQUWxnKGuWr+t7EbCcaYA8UNP+KUAeBFm5zW8OJZB2dEkpNX1X3ra9X6BQKDE5EigqYta2aWcSBOywrikJoIL6xK5fd9Yq/32aXk+uvSBr31zNwGYKR09QGoh+yglzd6G0EyJ1rJs0/FpRP8P70wR6UaAypCmWBnD0qiP/JafbKfACr0MriuvnQdKolON02KgPkgtKU+QRQRPaDy73entGsZPNiv639vcj3MpICz3aO8OUJs3FXp1iBrn6sNaXtUP6Z5FsYoYgHjLpAlgMBZnJ2Oq/xoE4aAh4nMH++GhzR7Yu5hiPPSgBJqz5yVrZmBO5x33A3MByeYsefqnpA4BNkUaIM6HHKuD1NlsEbwpKvAfXkygG09LSK2s9DuH0Da1Buxv28pgLbBenK4RtsLY5G51THRuPFhLygpQduOc167U4jKBaPYZ25Xgo/+dh3pG6gjXa9TyN8lxXnFGV6ovryC+Mi9+fMA4AMlOov4+GA9Ic8RX6qkJhgDCTRTBDNaR3xtdR1cafV+OXIelR7ZjnT5xftSuRkkR3I6Nvbt8vcFNBVleNDcE8uU5DCjKRpEG1/z3a0CU6HdjOieKaOraqB8dfvafmVyit89tdZDP/5N4hzgByJ4LUDobC6pB3eeVB9RUNBe+dp85Qm3Vdy7uZHdaWr53iLFJAm7s0XJv+HPWMcV9TELhwPRqZxZZeeGH/QldsRyWsU2AnP2GHcylm2kkZNBn3hAKrC9ANoZSNmS4ImmFqfiKEyXuDQ+mcwpSOW8n5xcjHtgDlLEsde9SiaNGOV8w0cTp8eWwN7wW63CJ0fRqE/YQcfJ7ZCednt7h3rE79+DXtVyoWCl5trFEEmQs6hZ1LW5u7LrrIoGNlXF0LRBh2LGfwOp6Alt+CWt+UO/EuJrU1XzTknCDNMoyBC2tt9QBqP9TlRNt3jFbczzFNn+l66QdHiHNGBxQ0dFm1DIF2ZOcAnDWCBnXXGtsJOJ85TaGzKnvNkXeKR0eBrKnLIKHayIuVhMso/6L0151pOQF5jCMybkGSIT81X6esgAXbtls0yM7Tsj2gE9+0cmtBQYZey5K9SbdELfnY4o7U1etSlTTk7AT04Oj8qPGI/Vl5N7vuNhK6aaWe/UDpIa9xr7fKDjM8gYxe/oEqLz/3NiGUh/qceSf2SilPtxazmyZQ/n/4ToY7hh7EWbesVKVFc1gTZvkcnQ//VX6U4nrnmjPsGVT/C3YTjCy8Mn0tyB4k6s6aAG164tVBTosh3KeGjdN1sQB7Y7LpGK4Zoybh6mDrNRj1xTlKrtPtfLUDaMXWoaTdB/o+d7TIuyuhSnBWNsnw4s+A7w1hfIqUuF5GplA8b2m0muAgGIZaOUOd3fKYvUL4OjdxkWJfpG+kgFSYk23hP6xTyYGxedX2uOQG3M4hr+1i57HvuaYf3DwTvvw/v+BqEVGyjoScBcIuSRnkQkOmJO7INIz7BReWQYtsSOwbRK6isDRWMXuLDwvUEybLPw1fDzqKLc1U+G81F8urGbkiKiZe3ZvQPmRqMrgfYKvYZ/qcOedy46tK4pdYhsg4+htgIMqlZvrxGJDgDiyyuMHtsuJmh5E9M+cvui15b2O3qbNHHyGJOBryGJY2jknKNMy4DvjlSZpv2U5OfL91kkgNZEapS+PabgejADqqKJm7tBK1gFyiB2bBvGnqXK0AqiZYizdywpqftkwFj3qS3glJnPSNwQfO+yAQuRDWJKvNGLufViKLQkptiCaztW6Yj9Ul1t9DeBAsXVd1CcVj+G1cpKhxj8qqykRH1039A3VHDw/Gsg6MMV+yzFnlfYCC97vkKS6YXzI9gLJ/i6TViV8QFh44/AhDnUEj5S9pvJt94o5Ycd7HsI2JocC7p1poDg8w5e/dF2rWfmeD2NXAjCM0+1ws/MQqXyri5f/meLkofnnDdWj0CYTxsY4/zdAuvwPOWvsPOBx1qjbjfFFFVRN7ZZHd/X2uNlD8YRWlFNs4f+oH0EETkKM3Jy2Gke/igetcgZs5UAm1594/SX1jBj/+secjkv4021UP6YHNN4ckoOzmUVT3ZzjyH1cfHmvuZtuOnW/Qr7H9HgwqPR2JFomTKOQvnsOIa6hRFEiTtXJvhfIA5uItpTkIT5HrwW31G3Ar//qx3iDNnb4sA2t+m4gvkZw/2c867C7R1DJdGA4u37ebj36vq71eDPUCEi7NzJDQI3H3pB018hR+PhBWzHOPIfbElMbcE5yBR701FclqEUAQsgmi39iVY8LLYTcGsBc8KnbAWo0G9W/glRTQPnB8wBGnQUUXGiSJSYljQ204hLidhQBudSwQCBeuyZ8JbYHtA+1bHc97qn0cN5H64mvEP7jOp3wfy5OckVv8NrlZXXF9ONWOWqe7ML7SxwcTKZGDE55jlBeEAk7+WzQwdVVOIF0fK1Gkwomtn1J38BuxP3eHIKCNhpVcuL1UG7VZSCseijbOXeowUnikdsNLZVGnrIdSiPuvImOTmmR+CeWiiel7HxX6vjUWMV5s6nQ/mgXXLCitwk2EPuJCh1w+jj1jVGAeNO6jQZ8YbHVxv5mvq4P9ZJ7rn6N5JiglQa+L0LbfuF04uvD7s/Zi+ul/8/YOD3KjFMKX/eqW/ouBNqacHf63FpgxpCqyd7gWkzIla3+rcOPv17GyhQP9THQKSU00VV46vX3Hk2qEgjLkpjan5n3VYRMcPQIaUXFbsO3H+aRDoDdVjvGjs/CqiGFNykb7P3HPSi9rtHKLUHkFax8zrouM5MNAoFSes6rV5eVMRprJsUK1bXAZzOQpIsPrJHjxgvsmdtnlpI5S5YNqGCpujGRSApCjGukFHOfjJmLdoDoRLP3Ms1w7b8TZhsud70s+D4l+Wt6OOfggFXTjaXMwDvfeGYPuzSusiFQei5tkiWHqw2mfCwUYudHol7po+dF888QSF7qr4G3Mn/2DNH1sJYQ/+NQMcRdfP7M6uN5ANyT28G9eZCVc1WsDx/WMRf0dVaOLM80ZtQzRQ/YTa3cOXq1G2NPW7gepYfY2wiZ3aKX/1sooSnM+RKj5rcUfoiG1b5I9Pv5Z61cxvRqMc8kz0ZhcHCP+DmXVxF78o6g+7PzlrLYFshtyJ3JPotp5tn3Zxrvcop+V+LXcA+V5e55qRWvSpwiQKDmhP484EZykNey70J5ztUwKQ7gKj8LmQgQxG3UANz5T9A+ZF6TZz7vG/1ZjadlMnOc9pNjZgOjGnq8q46F1jYfiOTDCymY6n6UK15tyNDzbx1C0gxEQXngD3i84947ghiiR9hhqx158cC5WGvNVxULdq/0GdT+Zw7epiYBnRHcaHSuoNOL7ITft2Q/JDOjjX3FatRhqA6Dc3NDZpmBewf8J78XU93tJFzrwEY1YRR3qXU03tmS9RHuvYaUFMJWsWBoAXk3BUAemBHhYpU54felb76lkssU3QYjttjf1jUpqQNONj+QUs0Eu0cQ89apXUPKPsEE6m1qOzeja9J02IHXDOJ6eSPIY2gWLye+cAZSoo+pXCHxv9OcAYcTr0dntCT1R7yDpLFZsyimHEPbX0KJXVpycqlzGwgEtrb2T9gxnP2s34liNqPhXTYpZXTdnO/aNS4/jjTiB/Mf+5ikMXxk2+s3GJCK6utiYBy4P8N5gA9jD+HDjb3TgXI+n/nRNf2bGtiN4o/nujhbZ7kyTtz4SbfDsgvpb7NzcwOEnLafanPGL0JygQ8wTCItIrkyseXbnZNclzZlRhN3/71h9yTVqRI83X7cqMrPdg1I9gUh/b4ZfQ4GtRz7Ji1TQs0GgYlWyURlaxNzhvYLCSfKNTTxYf/ImAt2Go2HrOsltft/rfZTATzr93nxY/ZOG7mSXarnZ/h4dximUfcDJCzmedoqXBvSMBAVcKQd/93Fc25/DPYKCU5dTAB3lqwbaEmAhB68EJtIo+ml252N4F4aP0z7IkGJyQFI+5rGYAJeOinAEjdmr8eri2ywi/TX7ptyYbblxXZP0bwBJkNos3HEKIoGhJHbkhEJEwv40LSdfNnqhN2K2aMXqkpLQZL02ney/XoWj/4OmRisyIo3BN6dhY8ap+wHo7m9k9LlOtswQqWxP9/ry1pmf2RAyBLTqlKrxrzen3pgPpO2UFCgTdE6J1AyXtikR7kZypmhcoJIuhXkCfcdmkDIy5FmNf30CSICuaje8W/5g1+OpmoL4SnFA+HvPHqRc1Bjkbdp7Fz+EBwabrChxSwDVPF2P9hQDKe1m4/3ejhnXiT+IWPIx9jAPJzEf8p4FVANigCOVCaLcU9Xz9JcDDG2X2q9OMvG/UEvwUKQ4talOzRt8aHphabBkVrecEaLDXid1nZ4JaYDOrbsXq82J3tvh3KRhPhWnGgrZy5LLkzkIK6wfV574hYgJJCLgSEd7nhkQ+ziZIZvFAxzTfQG3OZ3DgkEtDWrmUZQ8+CwloZdZDrB9TaQqQoFgNe/E2mHoUymwjLyjWctQcXMidKcBS+IWAZWPyUn4duNJMLcpmQqEY26xknFl+FRhxgxPHkfTJnTqZINsQNj3Gj5Z0qcB1cohVtbIbpOwMG2l/8tg4zEXC+8btEECUdS3CstZM7pNEEyS9xaJls5kvC+pCjPWU4KGaqP/+NODse1GLunBN+U8hscJfXrUKq0TtF7xpp9W+o3qKrGS20/KKcC+QD5cNlKVP8XxWwVcFLePUt/4bmUzEn0BzQpLtJ1iwvNKWk3sABk4cn5M6GMm7NtGD9AcDN3RI9ElUiX5xgpFVn5nJAXqk8qq469E3D7+O14feLFrsN3g20yfH2i3SeFfw9zEs7J0VK2zkXuTkZC3KaVWpvqLoGdvEeg09uyJ/i3XcUJyFWsWIZSr7EjZkNX6QVbYJ8lHLWNu5fJIaa9eoLy6ts4P5jxv0PYfPut5vFle0EOaifsIu9wbBO09rMFUW658fFCA+jgozsPsayG/Ff8RiddRKULcAnNTIzYCJM2YRKBAWSn1003q+FKBZl4NtmOyBcxmtQYNRVrNh16NRxi3T3xEjwiPMzPQpCke64HjvuPwQMDqXSqZz4OybGP6YPtjg9pytfGF2fQAeiU3oBEDsZd8VgOLSr3KnFCW4F6k4oecQgxwLFbSbBuBas9PYMoabKK4yetnZAiFqEnCC+F3IrgwH2BE+Ali/JAl8thDLIHXBdJ7fm7gH4pd900WrlciahtCo2T4LsgO3+gCadfFNXn0a/aq1TRs/mJTN0odkwoa2aULC+66/+YazUtQpObhwNW6Ps4aQPdmNh9mg6m/oDhHNMeAHebnm/cqZMQKwTdrP6z5XR31qKmn3ZKd91iSUxCLBCf1Btmu4gzHEpNsuCIZV/ApmTVCVqKOh+1arS9FDqzV6QV3V1AiOiCTipphbSyvSO+Q+YtgQSztXkQaqqMmweFWz1QGtpBJQhHDrDZT8hQZAL6YFICydSjb/qB15PT5akBQO9qhOX/GJ56/0m1pvMSdd4M/zwdYhOLC6xRNRnm4yHHqi3N6JD8XlUYPC+T07xecjqBwdj8SgVXu6AYRbx086j7r4ZP+d7JcdIWrJrIsUHs+lf6LCzx+5SVkncZlquOP3gYWAFR1Ewwf7efRSl+IRZos3zoHEhQRz0HrahrPVds+crbSEUCp3t3/rtBQ9/qop1nkRANs1H/QCZifUiGfexT70evkRdf1uaGRDnzPAEzpvNDhUz33lsJGuQNGsMtFZ3XH3rlQTB//H5FjDUVIrDRfWcqgEeV0BAETdQZ59k0jwDdUSxSBQtUVK4UXk3ttPjeZR5zjTd476SsJDv4cRVD9AV1egDAoglc8Yf+5f3BthiZOljVRgxQ7xJwQqC7wxlOIZQS8qALd4XwfN7z+cfD+yp6T0/BRm0upShbRadHbJA2Aobi1IhNM3KCsQinvNJdukIJbTcYyFj4G4ed9B7liyxBBAklJg/NB4KrlPt6/wdBIH8YvNcn7UneAO8kxo1jkAZt2+QUQzaMVuZJDn9cZqBNDzFizOU/PiEzBhFDolrXx4e1P8CBhClfmnDzxlrr+RMmREYHXX5hkbfh1MCxJQVz1rjnxQm7HwCcC2D5ERbsJQyDfh0AcORqq/y+W9SGSZH4YbFzABcfM/14cws9/QU+SQ7YDdbLqOdYoL80SQXl7h+ZvT/uOLxZAyJyiqZ/vcoeb9EI7e37GOd69YEP65OJQ8YaomWcnl8lJ6evQbBzgFyuF+BbBJMxLOx7modjhaJdMWWAeUgJ9iLAMMG6YZuH+u0Z4uNm0sxk5s8PqayOLSkknCfKXeLrO79jGblw1GSGjbknfVJS7nICjGvoUlUBmF6VdKwUQNioQ2LPUaFT+djO4w4X94hJ7PDGI2f4TKcMLY5i0sQ5KT5FwQzTuZpkbXPKWgCTne6GOhD8o6D6OcWHyY5qWDOl9n3WaM7qhqY8JpCU6KAlDKU/nnnKi/D7f7eY2sjDchfaGWEjeXJ+38pT/nv8o09PB6K8KYoYCpVFo/T6wMoRPiPLjDBoqRP5yjc4hs02PPxGuBPbMNMnDzHhWhNXwAIS8tAoL9uABXe+EEzJC8j1NPOPjxuSCi9/RABBqRiL+Eon/l0OCpJi2ob7mt6j0NneEpS0g9S2j7KqV78Lrt2lFVR7UHiace92jNarmT381GZ4DShor6DdFwlynxGCLuGJ4AWBbBhkvW7A2DMdlton0cmNSkWZtQ1zMS99/vPBcMNhJieen52vkwPLx0IZJ2xnhXSsmNjFJmzQbvTOIiIWMaRwsk9GYUQSxiQSTNJXpQBRm06H5o8eYA359hcneqkcyELxLSODy0/wMg/XMWkP+xmPoPDWq1B1hNbVU5tnqCKB3F/Xnbj93JDvKD0hJbC7Zp5hoPeGPHApZFkfeLYEBwVAXBWXfmfI9W+9C2eTTDQL+Jne5mSPdxV5bX5aAqzsOayGwCu/xKYDSdZ2FwE2VJr/SqRJK5MDSaZoghYnfx2amF4LMTh62rXSL0FwYlinm+QAb6NkSCUQqoBSH9QBpjtCVbARlMrZJvnvka0WNIE5sbnuFgeEq8AEDoYGFW4zZc8VhS5Hfzrq9IuONQPsVHLhwPDdhvnLljeEFy+4BrJ7Er9AMxxhlHUqycSr/K+6M1dJ+8ygvuSRD7Jktlk9FDDoutLh6IGnxjLLwZVbvmCwL7BiTW+aRwdmnLGgquVb6VSRakHaDlqdyMmxhAdnDxdsn82874WugrsWZTr95/8sSMcD5Rtv4GX0omp9pndFN12f01GmjtSAudyieJOr/T1zRFMWifrLxmOIk+J/40KUwmbbMxuBMYfObQ/Zl7z9mO7IwV1ncyXHKtutHNMDSL6/DykyoGYndX80jqnqptUZ/oetfuflYUPGbl272hmVFIN7tECD1NB8wXeuCHB9Ew1fpapeK7d2csgkMTC8BAmnTmtNbtYZXiSPUGZFD6GvV0/gNPJvXnekhImhKaZHGE2PQnwCEzui65GC0EGIkyecgaFaqGOKg/pBlIpaJFkgHb87GonrpRaC5rm4sbAZ9URGooQaR8Q7Nhk0X4st7jXejxRILjtW0XR0DvlIUF/XnfzlaHYKTtyCRcKBCx0eIC9CE99/Qev7yxziULgsknWlGzbe7mae4rbOENwj4dlNtyQ7IN+vK/UnfJmXJB4CC4P8Gi0krsRlK3FcRXDqRBB3ZSkOitGREJkb+wITFnZSLS3DqIEV89V0Bu5KUXkvYUqm1hrRWLm48iOa5t83sOuS+KLqhZoXJe+bf5WC/h5TmzrXIaDBVMOFHwp4KxhItJPXh4RoxmT9D+oYbgI/Ti+4Qu32nQ26LY8n3iwNgtCNR2lL4amNXNX5mOPvoTUe4c4mCnqFWBbXGY8ct24hCK7mnZpdsjS0roYUMffXbUmxlMf1MQ7y+LsxVQEtI6opsnWerQmreExDtYU2VeL38Plx5Zau62tycPDK90oNYzU7St/fmmFSj/HyGTywJpRhYr7vZjMDT3CNuMgg5Yc8o2lHUbt9DVevbQkpmS5YllC2L9mN+BvP3fDokey8iCUkLi03oBKYj/9Eg+XuDIOdVytgaB9lFgCd/0JInOq8vsxofNqpYEKh9AEQ5O+LIPQpY4pRF8KdwlVmf2FA4WM2Ay8WvDcGNvLrwnGQBhoms+n5cGuIfXGV7g+zWmiJ531azz4VLnBejYJlvLCf6EkEPWuLuXi3Z9nSJIiH4AE/8bNdXQW6vWPf3gBaypGN2Yw5kb9lnIX2mDHrpSXwHzmRWT7N/i/sE4afSnYGeaN0neBVCxW+u9AvvGb7qEZYZEww+5IYCzo/tGQvFFKjHkvKsuRd758YzeVIPOmhsQkb82dGfl8dxBOmCyg/jdP8XyNAAjoNbOWzvHqk6kCjJpRs7RBkqyykyaPW7bwfysipvYMB60cWe23GEflse0TeesbnFiJHhN3d7WweDfwvCVWieo69CzUQcnwSfI7XFrvZTWM6wS4CnKEuHi8Q65e1sVk5a/3BdPRAWJT7ctMG1OIg3wa1S5wftRYAH+JyavdYqJ6oUQDyELUtHDOGeL1OAgdrhjdHiS9NuKVuPiPibb5tMhzDK9aAsUUASc55rxVeVYU/XmLnljU47PYXk6GRg6SW7xyiVg0Cc0VLaJtJdH3UNh0XyPrsTIr5h9YfE3WMDTnRdlf5RSqqX4Iu52tontL1cVlfoghChJlg6FzchadHm8GrkCJiRSQmJ96xzrgIqQ10FhKW/hyhlK8/yCRKGsDT6Ida+xqTpbw7UnZJGwxb4+Q+HC4AynqlpqN+tDm7S+1AzodkNL/L0xBHBBcnqm5MXVs3qiYaxtRxTzTD5sCLbhXCej4cgb7WODDgMon5Sj/ngW54SktIuNwK8qODnNV75I+4i+Vba89gu47lJq2foBs8KZ83JagbqFndbDghSFxqp1qtsXe+uEWCuu1z6RWlO8hueyDR6hSc6vdqbW8KsKv52TQBOjb3XFvFENyXnZVrLdF/EQhjAzcRihiXdhHVvhJn+nXKcKp3j6fuvpanXO9RPJ0eVcrOgHGoLDdcjnuH8uOHDQf8yxnF3n8RZYU2UCEegEOfpOObPo5dgthbY4xJDCH0ZyEfgMJu/UrOOxV/vbksaNAKGdjihtfSMIHoyZlojTHxP9TG5bf/2WNNePSK1sMYGEAvwYidOWW+fz9T8VMX6al7vQCEMKdyrCnFuLo8fDCBvCBebeMXfhY0C8bfHzjRtnzsksVfyLddYKigJtFM8UlBtFpdmnA5WdZ9gEHcPHjNulW3WKGe5Ac00aj3mDVq681ztunkDdZEfeCwDhZ6pN+p3ODAQPbcCeP5s+2zrlQ2ZuWAabFR020U/KopmNu4lPJBFYntFtO5ShBPbOGUPdF2EkoDcUMXrh9aPeAqo7S0NXoi1WbuZeCX38Xc98k/bzUJGHnqaa/+0l8sTc5HgTXQRUX9IP/8gT4wKziX3tJbMbqAGSyLxvc44soo6oABtQpmgqm5vkPBxWNaCQR91uzteyNUGJ00+PPVmOlKfN7Lc7Jr5gjJNN6CYU8skqzr17w1QHjh3Bhsh0m8XDJafbahyGtlWNI82p2EMvUru8iTdgghHutiUvdpZ5ioMEQsRZwUYzv1t4/yYiE0pAViD8NUEm+A15687oCXgyqVm9fE5L/mtRc45e41yZa80pR9w03Hk09HGClHMADP/vx0tfACWltmeGw6PN+kB+38MJV2O0wAdZYDOqfBu4484W68U+HRCuSql8yqFIJtRumWyXA02amgjxiWSouHciBBukXfzoCkTo5Ge8S+7dMBLS4CkyooODqUdxniI1r9542z5B03FpCTagN1Hf7o2v0se5NletUJHJQN+AKiUOQwmpGZZ+ET8OXEtGLCZy15gr6j+Rhr0NlPny8jIK+QLHZICgCLJBT7+aD+1ounRWIue7NOmXtfIbdA4C9qtTWOV7bJtSmtl2C4CpCwWhIntr40/a0Wlql9ruxdhzSL+b/mwTToSHSE6ahu+cpgjNdG+PYAjQIosKbh2dk6UonY1/MDJZlH6+GlMO0bE57dJkjOIZXV6TXUufiibskz/9KE643I+L+P/+dfxgLfdQwh5HIfMX6MC8crKZ43/ndhX1i+cKVLUI+hjKYPEyxcSFygiPF3dqvr557XCCoIgW0y9qbHWj9OBmEoYUsw6eGgL9GzNMgllO6Tq4kQiBZVne6xUJqKKj7myIsCPast+aO//5xQM7fBfYjVPIFCOoujXmOCL1frITYOUSTpBU3k+vobi2rjGuNZ4LWJOOlMvaZhgZi2WGKrFbaMJpRWHgGV3o5bgwL5gAQsNRTMQ4EaVjKnz99/BzMqw22zFsT+hCu4pQRbxjVgA1S1LJTGbg2nbcmoHo+JJ2z1L8iiPa0mgJmwEa+1H17euIa2e4DQyN0fv88twRwNLU9EkKBVTb0SrpYq3gDQpIrvhFLXAaiVkhs1SgXUx22tYsRjNd+zxh2AryIpNrVjkq2VVG4XZ5zrWrC/evaAc1L9H2YEmo9FZiRZyc9rFN5hNAj0l5M6L6ksehV3ZqF0jZy7BuO7gOqimDDwMMXuj8qKQ4bq7xDXNXgFHk35dK+14ZOztzcRmFo9C95ljccfjonIbAcRVcYXgHl22n3L3uyAripJrhXeD+ZevHBieVFvVgAboZBTMsrBv4t5s5qBq+pOurcJoGAlOEJGU925mVAOG5+5erIW0H8iTjOJDv8UfFLboeyKzvN2lg25u8s1FiicIfuWNWPoNc9SQzl4F5gVkWx8SDVACxm+Cw9bMavS1ptsU7MNHY4DhqeJCeSZftTl1QRa+5TG99eFIrmVI341vrvwWJDFaAQRz3lMZd8OYc6RMzBi0LWPa1mpibmmWI4g0F/pJkQzDuwLi8t1+U5ejj6kaQG9DxhnszsmcPHYqKFxm905oxoD0RydsfQ1nJHb+KJNYfDI/s3xb7tEfBFsFPqmTmx4dp7CAB3fQFg8TX0RrxoQj/Da4DPAXocxhcDVsAc4UDmCEn5MK+EXgdT3EHNEu+dqkcQMFazVQbuEoOzteBvaYWmJB93uKdjFJDo0SEutXeSHPochKl4J7S19jvzcSuxdsypTHM6lzU2KbJfKu+f7GeDqnziHCCLIz6ZK7TpvIR3cvsQXmYeHKYIgNq7BKu/dzrYjDJAXY/J3HVNnpnNTIV3v2tuRZoM9qjMJl5MWNm3hrecXfz9lKtqDyNGTaAl9NecsudLiY6TMt/dN6rTI6+iID1g7mI0O2t/q7WzYPGIBRncapLiwsju4Xq4ZpsvnWhj9hye7gJ3O41GfF6Gg7XvbzA/80Epb8zv4cplWbRY//yExBMalviQCWg4RI+z2JaKTrrdF3/hyuSSU50pAQ32Qv6sNjIyJ4AkWxOuSNS6QTeq6MCmkxNixWTKEK2NmDuididIBtpCY0aEOjPrzmqouiPnn0ssm0tMqp2YQtOyjkj3dUuYMh3koVoXlHJI5jKVkQJWIYFgnfFOELkcusOrs6lkHIYQOD50pY5TDg2GiBTQvJ+ZAWWHyt0gvsjm5xQ5OgXnw34Ge1ZEBcnmJTiEzJcTTqtvuGnPm0axigOjZz8R5FbFxdNC7Ex0pI545I1Ne8T7nJUw9DJDukS59/AsbRsFZ59FiEOFUWMWcQpC2yZGEp1l/IUhHuyTTZQtNz6+oKA3JdS6QtxNWUw8joFZXCm/nGQz+OZLw0zKrHSdHnZz3eGCBdUmxGuh/lvhkbLsHk+kLo7nQLJ5Ij4xvUhbzy64tc1iC4KL9Q1egRTLlh6khtAJ1lK6uAcIWQCTorVpkDTeNZw+aSQBzeMzLT+m27eIG+WuZbCm/FVei77EnQETrFpFMeOCoSj2iPM96PRTa5NNlOOncBnoP4HfTxXaVkgkF2Gl7fKkPUrcbbe9151gYKPpQiBKJsLsKObknNQqnk5oKdsWsx24ujDqnhgxWAEVwllNOtuZH7hcUA5EjlxH5HY9ey8VhjFJYQpCplejrpMW6IcoApnyd4KkmuXTvOSimJJ/FZ8VrtnoNi373nKM606VyWzGbHqINnjPQAhAsC1eSGL48FWIQgykTihHMHBKNE0KgnnOa28CdCSPOGpToEy116eQJqcI1TEWeZbFaOvcmBAybtk7Wt7HSfiZ0UiiH2aJCTDzSIkqlLBFmwCrG8EroiYQBoRAtyWCqlaFzT3/796sgA06ISs3bvnmra6FSLWh7jZ7tYZBb5BJKtfas1vmhj/VhyOn42IIG/IOJMerNP19cj/P9zFGmSBz2vR7OC7hD/iNY9tQfXUVvCreZlAccC7ifdC2RsmHCbpl/Tub8oMaLXUS47eyQJN6CplKFtRLpSw8H1NH/8CPPK5DVUAAbwVcbxHr3pc4YJqvGIIM4fl77poJJHjGExgSGJABZoqGlu/xhkaDeXpRQntIKjdwZE/rM+b+pEuXMvC39m+KaCllveVxYwusaRuiJSCgzbeYN0jobUvDxMX5LN8ejskX/epIARDfXv5O1ARcQoMakmNXdaDHVHDpXLlbCZphPXG2+gmAsg5Vx45KD8TrEvy1hIaXWRLFM0SN89P+X+G5ktVQ1VSxG/KQTn1S/kM4Xaaz+8pcfdxRIkH9knAzeOpz3kRCLldDDCnxF8WwWEyykFkPhUmFC06m6oFisCNsbp3Qy2iuFmv0rwVhO26KVddxPUqzMwdbIi8R+PJ3tBnA6QIONThcgzkJ454JB4VvC4PfkFfKhDKzZemhW3OLnA2Vyief9hX/2Hr6k4/bAcJ/MgrqMQ/bAemOLWONzV8VVfjuC3EItnz+uCynGr/v6A/BPYLoFkpb/1e/3Q7Lp61oix5zoKi6aE0dEODoGqRq8Ccx7k1osn+i0RSkkZlfeBeczan45d0+cALrkJzZeKCz8k0DGG4Koark3PonsTYKHsyhISar82etU5gFl5goB755/Jd1LrAJX5nx9xR8GonpxVpvMneP89cHlPY8OzJiY2b1hUItwv3jDZEbma1juUzH52wHqrKHH5U4oSkXwS8pQYuFk6vEbI0acmEf+U8NkfUrkA3mMRf16Qqtb2ygMjeBuHjSxijpNl26ZJyxGia1d3McseifnOmPYwX8U2np181rMahwwhuoYh0CdJ+kw6vyf60hEfWjF1SzU837WRaRlJvo4hQOZKbDY7Qw13uTfc6BK6xnJT/UZGlIHsPjeduyZXVQOUfqZozcbEso19mi7rRQY2KI8oya3SFruOWUdrC7p+1QVzNGDNAQwLNORRJAbPIaGseTdi4sE6ekvtmNUfdzz/iHCHFaemnsb2PjtBCwmW+7/Tm2F+VreSoMvSyJySnNiN6qnOOc4q4Vr/kzYY2W8h6Ef+KVKtzvYxmaWakEfJJxzxta5lLEOwoKl/meb5WqyYbr1p8qpANOaSKDqaGE52DFnAtJpq5b9ObNS24cBYuPKvgLjjhXNf7zNT8MHszia9vuGuu9myaOmw2S6+fvNqgq5o8uNcNfLr8wmliICol9g0yxvyr3LV8H9Pm2D7HHhBQHmUOFrnjPJGtEIDJTdiJXfmsGsR1c0A0fUe6jJn0CSWJxnF0J54vRB+2yPaSYEJyL1PM+TiofcrkHhNbjHRGcfCTGl1lhPnv9Bcl4qbNPEb/QQM6JRg9UnFfdl4gJzUThAqyBW4Mk5Lj59n+3Nm/B2xp73CsOopin5BZ+SJdMsQGz3jKohOSg7c06EU2gXx6e1wAkbv9wh4FtofnXGPHllImhNdjzePpBxgCWbVC23JMnLMF3e7XKARzpBI/UUlC7/4tVZnSynVT3vHOvoikjxpDaEaC9w2KHMK8m75UTj1RnoaCFynDZ7w3e4NVoSbrnrDSGw+YwuX+6PN0yA9a/PztIBujRw8VNIj4WHx7nVMUfZsjyqxJ8Ralwl+uPKg1nTQsFyCeOLhD1X84IqZ9BJqkJgrFdiLFaNgN8OjWZ167lx2vEiKkK8HTuUgntaAuiu83WsTX0lo6XAavf8rSgNsBOLBg3gGcwbu78HT2OW7iVmZSO0bUGomde2Mkky93Foa49XUgGpt+g5Ia/7VniOprucD5eJuB8dZXUrY1od2Ri8hA1V6AI/0/iyFQcj4YBMXfbs6tCX9MuVZOmuboCPlAOV/BFbYCKR6nLJWkbuBXg/8OPQPoW5TQ6RRnhuGrZwcNRNaKoBhs2QyqVtBKB9wxQBU1VgOshL/czdXrWzEKrDJSEbES8Kwb6+OJKQnOhDtatkdpkPM9i6Eg3YcLV9hOLpE7chCoQ+/vpJBWnpLbN6WqjUBKRhVH2Z2Qr4WQAwgHO2TbJNG8EM8jmHPUeeVNfz0CN1szayBvRaPXZgAUZess0rv+CqmVhjPZaVxurR7RaVCXcDGnPzKvZxpzEqeRqsPcLS8I6Pez65IdXAFbZYc7cJMFMv+Hi68lK5R+BWGmFye5PB4xYGG45P0CvNhtdgseNtmi0DVJ3GoY13JRF80m2xHyIIVgBUv9FfCH6llof+B0Pm+X1pyEflemyVe8LOLoDRZ5q1Cqth6kLaWHLe90rRKj+q7wNyPSVMuUnyGDNPa1wMOiJKa3TpSY13/FhRpVYLrwFGaK/WOAKJqXG695GxTmkKr+68Oh5LMeB4Iaw7OagredMx6393tgP0hArKw1sxYocrDn4m0S8AvIhTDWtKfX6/yC3z8oWlXPqQYpqtgvYuGkcefoVp9NQJEB3NbUq3uLSNaFMxz4Kf4y+Lx1PROFRcwdKhNKrwDnWQ+RC4hLGDIFNFR2ALzb5IkycJMGZWekHzuQ9mh4egswPurMYUMRAZ11e2nkZai24xvQeR3DS5ox2Lg1M9cl75BLDcgKZpU6Uu7S3R2HckhIRwrcIyGViGpvHxLbnuj8AHN2Jho26nOTOdchwtBB7DJPBSDN4vZvbd2GeAPItAfxsheYQHyc59JUl4Yls4corR+baMehI/VKTuepSw1Fm+tZ8/V/FG+JfrqTVMnxXBKBva6L2tp4fLYjZm9l1h3cqXsLf3v48p6RRyl3JVttBj3YowcAFB0wLUUQA0xofN98b+8ydVesJgnUjjSJK+LU+NuniqkFVj6PQ2T6cE0xBts+ykEPvTIk+eS4lgpBQOA07K+ZAO0PZZKzLCKyzUH+f/Zz9HJjoCw6wwOLf58tHPdnvlZDf4+IDKNesJPG5/KcFE7oOA/e02IrIOw5loGZ1hq1ALtHkQQEBQ2nmaRhhuu1LrAQdOewLHTHohaqkFm/4v1SUG23T8t9gQ1cyhnqXAzyMtl/3UTL2G9MmiDfo1IPjnfyS4PjYLRQyAUNea7CW7b/VnK9SD7XYOYjVv1Co57a4Otjr1tZg/aTbGbYdVf/rM+9uuIfQ9etnJzYRCuhXb3bv+Q8+aUGUT8X77bHVathvu41FvFf0UtCOwpUNLRDdtffPFrYKW1NNjQxIl6Um8Nca9yZ8RkLKfA6Z7mF/hFKoncHrm271N8UCJXdpDA6NJwWnnuDaeUZGaq7vPaD98ZK8pJiU01vSWjgqU0Cx6k5ZmTmmJZYqIrsc3Y3sy6f15WskOSRZ4UUqH3Ymx5CEhtlfdz8Bt9/X3f88vl9hH48jvXP+FlVgaMCv3aOxCx1WRKfmS2c1KOs9oggRnm2G0vAV3jQU2bAgMl9Y6g1OiaLOds3l8Hfsb2rgqNyQ7TGZ4I+GDlMjhME8MGw0U6b5j5PsBjfR6XZZS2Ie8EaH4tYdW+LMZV7HvtbZDNEF2oMR/9RR9CJzhUcUapP+G2pUkSC2STTyX8pWiPHMp8Zyhhg2V0z7Hq4SdxP09EytmpSzzLUaiLhlmtgy3u3PKeMKp3s+eNVhrlIB7JsJfBOZd/h8zDjScC3aM1BQ7uD0Ml7ZyMbn53Fem3lY4ze3PaiXL04n2dr8ZHGbxQMVof9hokjBxk1xAuoXnmhzH/PCpdFD3pfnIX7a7G3dr24FP2/tOsYKuQqFR36fQ2+EhINPz7hrJGsJr5Np6FnjJY/Btw1GMEYZKzM9Texb5zrukfKH1wH8EXpiBqGOMG2YFu3igdFXb/ZgRaYLd9r8cwWaeeM/39YdnBhsDfOBZDLya0MhWHgzvhBm0onjGPA668WEvuCLdUeeU+8DWzuAMCSnfAGH5qpLpCSbk9khiFW3dLz2tSi30tB6MjOiVuhpDgQ2Dm5pf3KqCxcsFM8Aekujnqf/lBAsiPW8de5vVZNhAMU+55jQos5y0Ii09qS+8rm/1YoGYCvgHDXx0ttmqGz5nc9m1RV1/+vUCtvInWf2ce19UCtCIvn8GL5LEATbxNpvYrTuP1xO4kiIml8wtmFmuGgVI4OFYMtr2HHJOdS02JysikIh2YYNBf8nuK+Km2LZ2U+EATj8WaNcXt44/89u7P+slIEVYDySvDdFT9fXq7G/8hsphU4QUokjfcF53IiVMPjAae+cJr8e5se0sEdOWZB0I/Ya/LcngvaQdsO/ctOGMO7HHNsK+PH7EfgSiFKQfpntgtPc2VuqSpx9hPxmbcQGn0xYix+kjUoKc52oIMp6Yh4XPAkktvjNLI1l1K3E8hH3EYBEpTCynO3rCtfF7Sh27O6X5FmX+8XkP6zhs8kOrenPyfn7TiTSj1YhqnFe/hv/uR7SC30jEB+YlR1JtuMudLgKWLZSBwTNShmZzo9z2WcYx+tcPJkeTsk2/ym1GHoep2s5uYftBuCX8RYM2sq1ABoWQLsdaopzruwKLFzP2e6ChGxJgMqmXe+MWJ4lU4ZL3/94SE354qSo6y9L0Gf5A1FQkMUawYlMpgbSOckoYTBIbae3NccV+2j0C9NjEkKAdnJ0rNir+jkER9y5ZS6DottavvY+P3uVcTLEVre5XF0fhsZqApdkUP/WD2d9KIPM+6CsVouxvItF/k9jINqPfm/ZQ4PFwuHMNmgGrAiAJ64jq9arNXTJbsPsTSeMU9xSnBPKYtXxVXwuiVpoix+DI216SMtUyhdfKDCZC+3TlvUjFFUypXh4u63oJ3bd/epf6cRk6DNmm8iT8Mvy8xpfWBofvEZPQUs2y/GxIZSzXXBnqK7qkNZdK6kdCVfq6axmaF5nSE280KxiD/6eTu/4neYZWJ16DodiWw9Jr729SG/I8fuYuDDTGy3oWcKG1Sg3zLuUTW+hNcOV5dTm6sHnO5RIrpLD+Bo8CCtCNiWZ+xTcKKtbXj0hme8r5+1xQkxBgNCoXVjlN/8dyQ0XcE3ZkMpamDqANyKzf6rE5YSgILK+IvjuRLT96RVGa0DeyDtN8wdMzVYM59GsszMDDGP3/LfxKfcHEJ7IdWkuXpAxedXcJ0zBI7EZJSSkp+Jg0kqfxMRGT1xfQg8eK/YZaYNY3hierp+x2O2ZEDuCCks80QRE9gCX5WgWFJnrqZh5txqWoV5C8LYsIRJ+sFcLvfkyCmtdQdcNW8EqZGyCfZXYft089rR3cVUI4hkSXJLNZWmhx60niHox+eUwuOxUCp0BFmOsf2x7vg5U8qKzBMOcY03ddDqj3dXOBmsN2PRUWJ3gJU8QYhF8216LNZmpEqprXq6eoBbTvm8QO0zKKaD1/jQwkmgllOrYpPExDCo735RJ86RvK2OBwSra0J99T9CmtgT9iEhUUxcWMwK7H6Fx9fs00Pa5FlZob9fsLPSlhv3S9OhVYlytAJFqYsYVHWAyimj8ebI0a7sUpue2qh7R6pP5g61p449qMqXedFMKCRi0NU273vfwRcyZAlsoVaPsHL47p/04eIw2OdxTEsTvD93C2SGz7hUKzRdh6ztt+ibV8A0f4cvtaOd58ZcsBbPzaIXAHZg4CZcj0FfmBcM1bEAgYCvpWNsDtrDEtf8tJ7NxNffhYmr69El7Npc/0Yi+CvGdSnpfauZXQjOa+W0ey/EP79E9CI9vKWZW3tJfYiHGPHCI6HcFWXYholFtEq9bQ7wbUdddXYFZI3I+U12qyI60uOz6h7vL9vw9mrpjTDRUbhgOkgp3XvUEm25ME6UXMMx86IkMqQez06JvynH6DTdJOBjk/DjbwZG9owuRZEhZRXLfnu/SoWHqO/bNdxJwPE13jPWPe74J1CyjHfb9R19y742n5eqJifdsIkmOXWE6mVLL9WQT9zEH4nCKSDAZ4ur2Vztym2bmdk+AOzdE8J7gfIwA/0k+R6pIj89LPMKKwS7C8W+GIHyoleKNsOJMub/w5zNZMw4dFKHrwkC9BQbOfDTnz/FuHQvs9tRWm9PaZIAiONbwZqiHBg1zCjBol/FKcL9RbZ+O5b48IYvolAWeb8hrE1cE0KVelBnXagwaP06bjnLILTpiEF28R8el6lYhzgIgSjsFpbpAZDKsX5VZxdOjBCshmA/tc/i9lociq9AKhSM6wR5iHQpHPL4dt4oIagvWsgB8o7NFU8puDwSiIHWcWGWt76MGk6g46wNrwZ6oH7kqnqLLaBCLuWQthmxDQRoEPJcgnzVFPWOiC6eEeTYmvma+gCrl6X34Do+1pUcOGaufJOd/gLqIK39LQqegcrO99mjMAHymYRx6D/8MW3avoAzSuJvNxwaRD3XjsVRUAn1ryi/KUD7OAqdacOb0InVkXjm4y/umvb+nwQ2OzhnfVXcjftP51vrdmL0lImcoQjqDKzcsgWaxEDmGZ35Di3feLCpN6jZ0ERBljCOjZ5bs0xtSzop7blpArv9zoyv/lis1eTT+hop0XlH/sKpxGM+0uK/MLo8foGZZJpUU6UqtVkml4ZoWFRSTxCIsBEy5jyuKpLcj1jF3PgOPqo1mTLyW04FZ4uw/h+sxxHECpWu0AkZ7q9tHYItMkLU7tGpwGsLXm0atR3+8CcdiS33b/Ow2Na7u6epKOjDq2sJcrzDYb8xprugrVcnafUJFkNIEqRMZVOkJXKve59XPs48MdwOpddCFNjFHajb2WGUetlQr1UxAeXHyHilqzer19ld9KsPuLhUNUAO1sq3VOxQRARa2o4wvwcPAu57kVY2+l/Y72hhuIRgIJASJ59UEl6wUKGpENfbeUhhqFReVBE1fRXmS1Mn85yZRk1EqO85crI3pAmVoWmZePBDZf81jiXE91wvi8HtUOxy/cawLO3Y1jMpuGxT7CTQROVCycQn4cagObs7Zzf8KM+GS/BKmXZ9urGNkdYwoSrcNvCj2dyOZKEwC3YcME7Y+JH0B0GeEjcczLmc/aTTb6V0m76NGQdI2Q+MVbK1x25jjV9LQV4EA56ykiurszfuKoWzdzzimTeO2d0yQMI0urKhofJmaYPxYqPeZYOMUjgUEsgPpMp2cnDElmt08kV6GZFpO3gIFYfkqPcb3+dFAHY0IZyFp13ZgiM6bjmX2YTmQFplfavlGQr7BemnbXqRCdTsEXyOHk5zpUN+cJMrzUGMtmrRP82niufvNHnNCqCsERhpWiHVmh47L3BGkrkgo474VEAaJ+GnHkFxMvDe7W/G3AO72TnzfjKMLeiT0sLWd4ZR1BTFNyfUScnq9hjpK+T1m6FctZytHth8IBmfGh28swD5/FILj4q/uVp04NLPrpNfusNtqGF9niaEOCQRH0p1RoKMJ+UvUAjK1J9e3rP1A1OuDYahJjkyFlMoeInmWbbjOTshzB2KoNMSKIUxZCsFkXCJsUm7AODyYW/WZR75LvHnMl14OH1R9LwW2WLwsHQPo77iEMT6Izde69PaLZIF4Qn1qv848yv9aKRrWzyKWSzR9yWMUxOcA8wB6dQgzU0npMYUOBT2p5m2XkB+7TA/DJSs18612Xj/INE+FhKNBev4vtTRAdwQ4onQlOG6I0Jmbg2nXXKglqV1SmIo4uWg+ntTzJL01tC2B7W02FwmKB6Q4DSEq3HVd6YpsFRitJQRoDl6tHgwcRwfhJcga27RpO4ttD6Fmk9e5lvV6O5v7MoC6655sUlxdhgGBgAPlFJxBmlaiv/ql/Dj0EIgcqGpS2er54uplRtE5SkcyO0BkBtiKiRp6rmgEIiNzVmqIYpdivCayQdz9IeJpFx+1HdtapXHtLY+CY74OqwxwltTYaswlQoXsNExxzO8wsD7MX2YpxHYbW1PTy2Mq8T+3knNf260QMy4+WzxYFgougQ/8uWU0ns4eTTxxgDULIiteusy0po5Mu3Wt4COrPNh9JEvSL8Ey4OZaKcBTdTPhm/JeXSHgUlyF64OJe5PZ3R+Ya9tS8CuUBoXpBL3qoYzoW5IDuZEQph0xR2aVWLUTgvOdxw49rcwGdeC7hOMK0vrPmZSJ/LEXhGCxw9JY5UOGv/IkzHK5xMcqJbJTuvuYPuwFOzyPCaSm01nvtbd3p/i2MVF+ESsuEiRN3D6gedwPB2rbxsopcp5Z/sDH0MrG6I5BFqJqKsDixaYSvZpIai2Zxl2Oh+LyI3kZgze4yIJ6gtjVfrfc4duDC+TJ4mU3GnEToVxxnwhD4aNrnQg0da7eRHzmVPFc6AYMiQmcr8bOoarD7SAp32AxgOS9IxXis3AdegK+D8DZEGAwdCHEr5K/o4SvR4uSUB2IbFiPqUCZQsu9tJxjP1ssxuVgZNvsHtVB1S+mgvghAzvABzT+y0SpHyR7zh/yoTrlBb28xSPUmup80GJxR3owia0CPqPQDXIXAZZ86XXgzUbOXjjJNMXf1cxE6uyIDv14XER8zDsYSWftrixrwsM/IacX2+3QizePStYuU6t22xN//fEqhuVPGxaOxJcAVNHKzXXA0uTW6WfYWIB1+PBpnEDhh0JLxckRXFw1zAjwbw8Uw/1wI/HNdyPt7Fiu9ZH/jbaqwZ3TGqGzNfZTJaEfE40pSBIQFj+FEu1irwk0bmFyK+37qFl+mlUO/OhTznnoRbP5I/hPGgaAI2SvNEy38DkQrDvarFy/F5eCfMEAqBTePL+9/xiQR7KrPF2B0GAOf6l1zbnP7K6x6IHIjAhZeBqax0rZyJ3cxua/tWFRRJ5/5ZIth8H0h5kP/28K8dzJFsM7fnuZLXP9SsI2GY080O44I09wvB1BkeIOGbHxPLjFoea9vV1w5TpVBM6qV+vogAnFJYF754fL4lgA2PWpNVOf3GtTxQJv6BIfbvI1kUgYQ49OHmrrE1b0ZSfPK+/UBqO7G8Lrkw7DvXeAIIh3vXw9KWmzMogKbf63oN7Itgxd6E+0Lj9VTVEBJ+jUOU/nUgD+iYOv/Hg+lcxs4GvMgjZ86AYw/ivpmzY4rvl+rQjHOQ/lXtj/Rld2DWV8sH+eL4fuRMEqPv60+HdW+A13jSOIXreZajeaHlvY7JejbmFJRo1w/UQZx38O5ndjeeAU8sNGQS5VryfeeSsXncCxAJLcYCs+1fTMSBqV5idYusDYXqE2XuIpgwGgpUmLejv2Pnjn1UZL4inmQa3vCPFy53TN4sdIL7iqOtfdVxsXRIGUegJwHNwBsQRRrdm5OhyqeANTubRCknUuAUATPn6LAzpZNEwJLnYqPxIVu0JkcANIuRZFETu1OSFtRCb6jnBFKYAbmOWGaVCiepKp5vFaKmLlLQkUjrIXJYyzLXSFhbzjS6mtB7U2EaTeUet/NAoPtz1JB/Nq2xERRXetdJ/v/8zrRq1BvpRYsPRA7+rQ9+pZ+9XY1/tIOQRFPhMfCvto5Ky+IQWR3Mms2GKAjAfNWTuUq8Qz5ekFKwKMqV7XFyyBnBEaCS/C1VrCcmJ4IYh9eY8Wha79o1V1QI4yNGOHLO/9y65OusQOziZZM4dIzLzLERSGpywnDcAanVZRzCep+62L8jxB4TF1QUX1WXA9wfIq7O3YFkFi8Zz81dKqp8NI4hRbKln9tLtu3s58hp32t3OLiGfcH1vSUuLLiWZFwPVlM6/IimlOf0L4aDMm7nV6oAsBv/ZvAc5zqLBINXHI3S/z9wBtaMw9SP8W6Cv2S+NePossfU76T/cRpQ/0FyX9IvrueR4aEkA9+70+YJz4P4m7+5RPw1j47vBGfTzKay3vZYvzvr7IsKPCXo9Tzx9pIJAMvn4mwKLy9/Zx/rs2ugqsfCFGnN+wUUXtMgS7Nv0Pw+Kld3xS9mR2BTL3REzE8MTKAYEtyCwCX7/pl5h5quOCAqPlTEnEpIp3Jtv02wb0jDDW7nE9oEQh8WWFpTmGh/SFqEWvb/HxI038bZTT/0sMDrCI0jjRfvtOmudEi1TQl5vrozTtrxJ8n1Gz1oIkciyR2QA1lYx3NodJ4W23fR/9AlkcF5ZhQVX3GB8McEG/RXHUjIBEulmpgZXIk8qx+d905xnkLuN1pD1IEV8UPV2HjFhEh8vj69V7QnjFpwNP59tkHODcV6BRGK2skbNF9DXgrwcZrciEULK17ww7RhTC9mrSubNHgr0a6jE/v8xMbye/6qeXMKau82Qo9l9KU2Q4ctS1DHEXV6thUIBUJzb3PS0LldAaGKeKjDtYI8MQrtJk+8pI6va34noNNmq3hqnTA0toKkFWP2JRHr9Hr+gOfD3aIxkAFuoXBC5xaWJOXs8sL2jt8XOY6YTsubY/lQAIytLNfwfio+RJcW6X/TPVdKePo9E8S9lS0Ss9O+bw8UBTjnf0oUO/u32aj54JC5UC+yPDny7jgPVub/+Mhpr5GiHfirrBKuS/46tc+25rwpTuPBPt3X9DJ6vy+P4j/TAo4kO1C3HuL/PxRba/hvZPWPWCZGFXpd5qtnHvd0UZfPfx5Nn8iC7Ag+gpBCQEB5JirFwwFRjrQZeQLZ3AZSmtmPvFS83Ler9SAqiRFuICzD6e/Jy7tUGah0Jwiu35/EmfTJDWBzRqfSCCvI+0B/tKPrfvwlFYXfQGFTruby+VOWfd7PskfUoZE+uKYNNLgO9pFbdtRfgulFK70u6HEDVx/DBJ1wmyeRP/rVbqOKTL+nAE8rb3WXuMdFZLAZ0vVDIL4s2EMDu+SzHUUOyyCuWFNRIrqyho1cVC+d04wQRPeHcAHJXLOy/sgTFrPDEbl/RwTHTZtT609c+cQtLlHgZsC9CMdrdKLi211I8Rv4Bxru6Fg65QBKkdCh1eDDKq+XuCH9ZcsVmROk3wcRAgGlYBqae+wr7NZA52xoCxqFSxYEYuu1QG13ZMHSf76kBQAuCD4BeBSvMYn09y5B0zJl/6qjzML1Xs68+woPWzPf1o3ZzAMmqty9wxQNNij2PLxI8ffpCh1C+m0XykoOdOHZ6hv7X6QqDlrQLjJiY9pS7p1DO3aKo2+0egWWeEo8cgATyCRJDUkXFVflWGEO/I1EO2YMxelTrOBtpyuV9AFYbphqvNk1dB5dnIBsY8JhIcaf9cFJzmeEbmqPeRMFB3HcQUBArBbTM0/EKjq+lZb5li3jVK4JjzsuUYmYWSDO1+YdZHYNOOwjZUDx/kw5lcgaYQIXUocOS7VBCyx+5rGrzGLQmmU35gJE7WDvh6dqpMafFTsw3BXUC9CIYI76+40nVPnmlJM1e0jTOqWigNbjnXokGoWd5Nraz46EjZvwHaZ1VHQ7VWkgkqRnngDs63XPT19C8n/9bRxxjl4F0vxxX5nx0e/jXZFRzNKbrU8KZmb0ii8aMvyf2hoHvdpxpW8XAu0ZUHptJCSR9DzAVqd1LQ/JIJeJYNhqu6vIxm3+VF0n9RtrWpeNCYQapU1soF0pW82SPthdTWAyM6wn8/XGeNfnUYIWgQhpAJP6iqV9MsoD4qNgh14m9qMXGMcvI4h2QVoGfifiemh/0Up/+H45c/A4dR97J+XZUsUTvQMdUfyyhjWuc8Rh+4FC9gctcWMBzzHJPj9KtuYXsBzCTeyyx1FbJV3b0tJ8mdAZwUNA20zDnEq7Jhq4WaVMnN0F9bW1qiUEIqBzfJSplF9rRtnraABTGP/jrqAYXVcM/YTxGBmf9+bnM8S7gNnq6R2bCQzHG5OdUNXC2xepm9t18oKDlxpsVykSanSfPzRPshs2BD1C4gxc1PnRf+iTwrPishkerjuJGnhzEl+c4qV4tPTHLar9hUT8GyPAwp+THr5sUm/ek1xESKWqysTP7XPkOldlEtmJmNgbRz+0DOCBOBKske90UboPe9NXXCAnN8LTiA7MZz+1oZb9zMUKKulnG/rxI26IMAipCIKcFW0/m6csDiv3jcw8rrYlPO9b/+FPJwKyJvQj6tItjG3c2ZCk/mL2v2UaBmJZVcTV20qL8MDRNwjcWHQPoMEwdu74f1JTNVMNyn/luyvGBVvUxXym9OuDDkpBb4oJKZoO5T8XLgR8SdqAo1kFNGUdR7L9PJL9+36NWLdrNyIjZYCGBszwWi3iQP4Dn3+a/TSa2HEVoypUYHWRjQ7DPrlbyuuX/4TgdlDaKXK2bkX3j/wyiEsGMj0mElTDPrSVC3l9Ju44V/yX0AvyUpXc1MtM2qJ4rfnsLBX8ECiH6gBmFQTY4uDuCMlScyxHFa28NYnXVZIG0Pn5DYujpC1qaXM+0/cnXSnL4WMGTv3YUkH0TUanyKc12Bnw2hjcgb9BzUgap2A/XXCj6AZddLkxOEeKNA+Vu7R0++JiETgI9QImQMiIZhryhqQZ96JHaWYMxpAUe6jrJusIsSM9ujk1IdotJ2o/gju+RLw5LbJbh+v5PnPU7PBiPZFWlI8imp3DhKhHWpoeXVoHkh0dXV/5qK5UOS4rfxjCB0lcQLRPgi/n4nd8cfNs17HNmjXG08yYEoSRt8w9fqbYOq32wTVjVhfV4veSqgbYXSbYErlm7F44I/N5bsGSGXv8RplU+A9rkkOtbK8tY8Fe/tvceHVUVUonxop3zbDypdEAchvY5MPDla/8z0vhf/K69yvDwyN7kiiTfC78Bzz+svqqoM2Zw+ytv8EDa2tM8zg1injsqLy0AxQNcLC40kOnf6utNuN/zSfH+Qsmexny4dyy4WaqxnmqEViAK43cY7jxbh31fj7nlrnCCKfcdflda/+KEvDJdcqA9GqIuXlxmDomjAfwcW+xS5JkVvMX3aXjUW5TV4EpLIYBvRs74oAdKo4R8LWp7q7dMpCBd5whsa9FuiTmbrqUry7lm69TMCHHf69NQGNuwBQZvGhrIMO6RFj9TPlBwrtKmY18SKE4tMUB9z/rBl/HwdV7pdT6lwqalZbGlDAwipPBkoSgvRG43HYUmeI4QR3iHLOTg6DeVnMgzKQtRLrz42BnJkm2ZgpoDFdcnrJftQaOYiMGrTQYKXCcZiW2PcZDdTyFjb665bnGLL+ZXS0H/szk5GgsUmUhg2SBehqRWkLStj0qrqPbcUHoQITPvwz64DDcsQ/0fiF41BjjSWlYN/d5tB13mldxKGr+rn+JLWj3JsaRACF1XLy0/7EzVKoIjYE6Fv9YS92Aw5E0PbJ8OlrZ+omhZOUsQeaHk1hj4nxuyHJmgVUdIbAY3eKa6VbDVkeTKU8c+cH91w9EAGzI4oX6z1L/xeiSTt+ZgggJ02FXq05Iger+/0jybmcB1bJ+hbK4PiB6bmcHWZlHkyvMQ8la4JCaTfc1JN0O7dMzXwQwopTOJaTX1KYhjXvXSX/Eavx8Gs6WwFbXxx6r3Q5ektNL1bo8dXvXuBg2dAqwp3b7jzgi4IAf7G7xp0buzLe3sOOmQ3rTu3PYu+JptV080EBTPkUKUbe9IqWrl9hx064BUVReaQL5gdbu+2MeE340UywwTbp/C/h9c+NY+t9tlRb+yG0Yl1tqL/ElTBDSAmElfFqc50BZ9lNlTWR6TN5T0bRMZQRX0RKYb4BllDnMQNBppdrjqQTz+l9PNfspkCE6wzlnljZM+J0g2ZLvLOErxyMp41Q8W02d+YyD1qJ5vHTQXdgmGsTbCmyfJQGyVgHlJavq9QC1V3Up4oqsfWM7RbHcJ7gsf7ldp3wAjNAXHdXo9TCpH2Do95JE+tjcTLIz9dpwSp8OBezmem6BizIzWTPl9gOyFM7PHCu/ys+fHfu8BDqIsQfGfndFYfOvo+QHAMFX3jr2uj/hetDQQi0X3Z4hSC3YUH8BiDu7OiZA1WwkUrZms9VBaTKI3/PXLfISNvUV9NDwhZlw47OcTuVtfB3P3OQhXtJt61P0M69yvV/KYxru0qAZxrzVKekyHEAauns9e7TAoyK/en4J6vbx5TFRdm9kRUyow7YDbqp7uo1sntZm9Ro4pNswgWOWiSCokElM6hgqcze1EuvGHaPe4LDCaH1njTnilKN5k2OuN1msge6HDJDQhCKg1EiiQyknR8p4UWOrlB5/IoJvnKSPNYXkW5agwtrJAdT8iRyoB77b9HgsiaqYkNumXf533YptDenimkAulDJpp7W+xYrzL/GcVSACKRaRmP4mAo52fA0y4Y/9amauDVsCk0jocaKN+yHoPvvlxR02QdJxAaB/5MaghWnJzKP6jVG5SKvJCLU0nYZhKShu97htmdVlZ/Wd9/kkAJ9RNSJ8QbTInMKdCnnIYuHppKZqdM1/kI+EUcb3D1ZzUGCm0DMhAyWrwSGeL+nzjQb1d4FOWMSWvQSt6rI3CzTuDLJacPV6COg2g7nbTVPB9Fh51g4zb8FnGthsQFA1uN+ySzBSITPMkPPTr5MwJ3xi+QYvtUN9TplCBUvT1O4Oi4cFxEK2cI6Cm1icJryKL5y2GnuterEK5SMcB5J4dufjrpGnqhrzO19tBCaDIPgHQMzQmRymYBq5AoASYKZOw0kK1bfvWEOvwZYoIO32aEzZz8wwiYoK/fwf6Y3Gd/a9Tddf0MOG7cCoipWaql/9a8MXRSCTqkl+RnxuVzzKdxXDaSk6R1sncNUypryTYkvTS09sND1Gf46sFyxlnqmZ7ava+xTMwvajFN4vNhDzs4AIZYAxa1fbF9M/l2Ks6RSJ/Hwbnd2X3/AaRodPWVWNN3P6xWGiIqKanAVvuCuPYwNN493waDHzn2fEH27rNJvSy1bbzGHEUe0oZ8tmKpOMdYeBmOPTPNxjUbQ4kaUaG16IBg48pjNRJcmyJR+bGrwsNIp6xMo1dIABAD5HDnlh93XSOGcsuEkUNRVhSLZVPR2/OUM8UAXNRqpVVGiju9Vifj/Lwn47XGKhLOaW5EhxNDkU+fYScaFA3rBV8czbC93/w2mLA43RDFWGXP1cwzejjEqDDm7vh6Y+RYQIWeA1ylZTwbGw6gGB0U34dkK4MJysjCN1BVrl5C6qCzjEPKtqWqhkn5Q9yFZs2Ndl/ufP6uVQR0QcDwP4QV2J35Ab6mkggmEmIipSUMGZ6wDoXoeYX4XzlYMkNc7xrfkmV+keI78xoKCWn9oBJgce4/z+nzBB2Wsi2zS3wL28nXOixmebNAdSw/2waJBjo/3RkLosquM5yJbayci4Np89Wei6H2Wn8UNiniVZgAJE9FFfrjBIVypklS2kj6B6SDFMK468sz/97mdZsD+43nEOpxXqq0Kpskiwb12iRl/as3ZdPZqnhZMMNY5qi8RzX5zd0hElpkaYiJ23d942jsiTc8wDfodCyip7jeGwW+QGayG5O5OD2MENmlLqnrJBBOZ04186NCb5l4V5Q2AlJRCQYiQGuzk0YeKU+xgtnj1X5U+vMs2HRy52I9pHFmJTNHgHex2mWv8MbiQQ7pjDGaPkBNsadfknDAbO+WDWyfKbNFi+PdJJgkz7QrpkdLFYSWVJ+sDrfCapaZx9Sih9JA+TY9Rg6v8bILGny5WRcQPWpnBUqoqy2oc6AjMqJDeE5V5JRbevjq13Hu/W6I7qnfOdZ39lMeGCsDm3OyGWL+mW1zc3sy45nUlLqiTauECKAr+iiTjHH58preQrdS+LZym4hroJINiEQstEpWS94eFXRIDbGraEbgLDrSuwzF82r+oK8lisEqnQox7RCWa3JkhV7iBuaLwgslVLLLaGtBlMuBC66+G4SRVMr1KkOrXlJOD96QZHJczweufERVQeb/CuwxZ+H2y5pdxmvAgsyUCJLXcdq44h4uO/vKDQRP4h5HDskqe1shOb1F6h5zxQ9r/9uxDNrCDdtCT5qICy7R/lJBQwASrBNSbcl6IQU5g41VUrXxt+Vu4Ju0C4A1ZxReKPbJfElCEHwH8tCC8TbUIU5GLA46QgPTk0BKfRvxdXfuuuXvJYPWgbm8ASj3XhKxB/W9caq2m+b5JTzhtVDbjdZKYni9nTNWNQauNFrTDSldYIIMLOeJaLwCqGkEo2GEo6y8O7fn+1Aju7LtjVLRTIFP+J66XcqS6ktOL5alO2GwX0ptLjk+k0+tEinM69hhdRu2DPMNNEEYO4fsoEb03YxN0M9Ppr6LMa3mA5f8hHTSK3L2RGOTqMHS0h0ilvaktaI9HrxiOxlIP6+t2YKbfOaDDCL292gjU8HRdV8AzF01rRQ2I/cc3Dj6qQV/SDr7s4G0nvaQH6EiqJWylIZFImp54MLGEcIRKHtUTuQKFK44OHf3lBf1mlebbyjN6pTX3t3KgUiq99XMEVm935aKt37euNYPkjoTZSXgLQDKCQD4SmuMrVCDMfO4cpE2I5yIZquWAzbeT74jDx++6LTbpMYIToPL0DGHHjQfQ9YATk36IbieqV6ANw1mFRpXqsE43OPXuXqcOmGveMpN6ui4mTWgI1pPDLNuqAzTaH7tS8QLTzlpld3lSel+c9zHuYkVTXycHLugKgxzSaassu42jcw25WaMkdFrem24a9fA9DtVeXST+C1qFC3bZDq/Nu1w7ORIN345oSYcQ8wvG8x8FdMudT/bbdgwkt8xerIlt+oeM/no6Dr9x1aSz9OQ4itG4LzzBkqlaN19tMam6HJXkQs4H5Az172k81pWTvUD1RS292N+hnJmi4MkCP//FOMt5819l+U8YT9BebBT8Bop5ia8vUrlh/NYuEbazLx8M0QGhhILGqyDxJx6mlG1fvuy+Tjv4Wqd4P1NNVJZv88eAq0Sj/1uGQmqoFWG3gjbsF3ZxwXL/mYjW39lDTPXVWl5qv6wt8o0e4EXvN0Q7GCUTqSbkCFIlyOu2pe44ab45ild0sWGFcrC/3/StMPlURCsMxkH1Te+bfcMvveGhUZ1oBhaAxohr5u4aKxq0PDlPuqPFWrWu2RKB8wrDZuwvMS9dXyGScuh5CNvPCeAWNOSfD9N8jNpjGCGlZZj8INmrG9oBATG9V2V778hGTClMay88fFi4SOS/8Bg1EO4AuULWPPxa4uip4r+oqTsBaaf1YFq7NCzfm309kHeP8FsjT1BffMkhvCVoEni0kKmOy4YOAw+D4RpRTfS0bFiOO8nIOC1pctaRYW0R/685E6DSGpJoP1fRNwRDr14B3mnD84pi/Eu5tmNvjpVYBeRBFSt2ZGy0F0HrqxrQaMnNOOKjyDvqlN2uuvLdZpSspDBP3DKR2Wy3k5XhPKFM2I/51T07Vvy5MaKS6iXeR1Q4efPdB5N5lNYDRysP+BbgQT+FJ0VVyoNGEetyfDRFyxBpPzituY74OQe5C/9RG3AetMacZyL11/fUykm+ydKnztpnHqArtGi+tI2LMGXFU9mHl/n5FjDhJIv75nYicYlvumlIzebgYhMUngsymzkUSEQ+GSKbDI5oUrwZVyrOGUtKDZw5JS6Ej4+oSETLjxd5/mCw8kwQybJhPDdz4Ir6IIwoCuCQiawuq0UC3AF/mfZwQAjp5YaCjLL3rUhoKSupOAu3hLYsyYjOOWzhmDRGNyqPCTFf6duKpbPlU4chgaUFmmYr64fDnmzkzjWep++abhHS0kPRMqbpwnQE5dK9QrerVL0/JhILHMlrgzyA7lJ83FWtOD3IIfJV4RSAphfFddmhdtIzbWKON+LRsCPXxH0r/nsYivgHEyJDDR5AdP0aH3lEoFF8S6SkUNdccwIOG8SK9BkAWPcp2mVh/0mi1P1kneS8NrJgTurJAvtYyusu/ZF+ZolPH/JnQFeG8UjAigFY3/REVpr5NOc/Rs30b5HUtXcJW2LP6EEE4ibhMJ3Cj+zcx8oUopU3WvHaca+dlDlSEKgntjhK5MffJ/XRHXuMJhJ5VzoIveDKor1yW1TxIz48cMA1KD4I0tfJzhTNKdv9fk3BFSZX8EiB3Ob58M2TNJpI4x86uokQHzQQEJK2CLnddzfEz9eqXNMRUSIe+07sUuivur4ABTeHpFJ6247kMiPsDUt/hG86A0qsjHZahsqQHk8dQS14/MPe1B8boDNJ2wofm4W4xNDywiVXW0xmTnC+BCGX4dzyaFxUkVPHoPLceCzMy3I8qacHKZ/4HnDlsd+AChSHffcBd94U9NYRJMYRhlRED/PxX/JGFDNhtI7AIjd1z6Kbk/sXit2kmJDmp2PaQQixSjjA8F3IgXZSGtFd+AqdtT8IosbmLZkt2GIxT/M3RXrI/2oF6S8VrkUlmVvAzxni3f8/uXN3lIO9B1VZnXoBpZ3kYKDoDvFKledNBZjDNboiaNxSfTs8VZe3yEuUKfchsfu/8lkgKhpE/xojMfCIjhBTUMStiVvYLlOgRnROeo2QARQdvYQemhiilJS3EMbzrgsqQ8r04cHf9IW0Kffp9Y542AF6+NSoJPU8ORdJHeJBNh9ZRdhQmYWDOhcJn8YY81diyQ4npSam/t1WyblxoCSF8YNe1UMXVqc4zkrxqhcyqzqYeoQ9MYms69tqo6h0zs2yHvPrTOZLSEVgO04TzPNNV5PL4tk6PnT9XvfX03hV0EG0FmgthnCHPiw6cQ+TxxkoOLwhkljENH3PRdco39KBOz0B+koK6pSuBBvI9ruwNt8DBuTYutOTM6qm/WZ5bPaqHRTNp3JTRgAej8sJSPZY7ux0d61SvZrG9Imf+1g+xzrRrUue3KyDNB2URGVTAuyobU+LZdunRg9d10OlQZED9ywMEa//iNbniZvnNAraLsF6bqtsQzrJSvaxHCMTc3eltlvZf9k0lpGY5kbgSx1EnnUT/L39e/Zi1P1EMXWzw8EKTUcvs6muISZv5OfMYLh6CdG7mWzReqI5rhyC3+qq79fN+eLnXVr1/uuHb6+JzsoDFi2MOP8ClWKXBewkcZEFrayek0IUeJg5kpqMRwsiaEuMlWJHJuePe+iWhOFBlCtM9aNIzN2fCKebvCXABTrWogQoGfvSVslG3OQvaz57/dQGh9PUvdvx+BlqBCeniK/ECxPtEcBKWuux/xiexCurtsdUR+QX3pLYc3g9UobF/G/YVQTMdcyKXtxBktcEV5HpBCIq8jIM8+9LRmtLt/7wIv9Wm2JxIC1g4y687Xd6ccc8snhrjMlmTJOeha3CFBohQuK5vZbqqffZW5uqoAqbJrRC4t1MoDa1rl1f65bkMVmouldTjps+1E1GXU2MOyq+Or1/ho/JXV6C+zDX/0MVRR71urBJ8kQg3OCHV5makrN8/z6xCTt9Ic+KY1Y+LKgaDBClP0VM5XDGPgySGmqPb4eVl+DCBZNWekBRboOXBxOTu8r24eY54H80eI1wn78bCwVLwOL8csI3SQ0yeFZy3I7zdVUxmB+V8VzLS3FNgjbBFD6Vd1dYhDcNUCh+cj4GvjzByz4p6S9oKLvhl1AnMD2zpuq8GpRD8kTJDxMSXHDEca6hrEuwKlDlq3SVDmekf0xHCiN3DYREJkyaEiwDNPx8iOF3w85Llowcsrdqf8Fm80J55DpjLmUtx/i3hmpkEWr6gdp4lN6ee/t4vdL7mcU/0ONEWP5xf/XtHZT1MeEaHRvFvL0C4Bo6ghtGE/Gj4ULKEbgVhQvLCLXSF37A2jJxtgm6bJNKYCc66NeIfxKpBdjCqnB6hMnHDxrGuuhKV6Zq030JI/RnPcvp0QtWpxCs4r0DhLIguq6SRChXBdfVMclfs1GjaCJvaHvIEtJu+pFQ0lfdvqHm9+wsQchtR5a5SZkKoRDnMr5NIgZhrPBfU70rrHcSfZ1o8FHXwzZ7wQC4OzcPwu1Q3ENwfwWqLgixj6xOF8mNbpthanOMDYS35juI1rkVFMMcHMAzjCbSBD63oV46AdHLyW/3V2+TilxGu3QzGXfwXnXRogaeO9mY51UmtsKxnk1EWgaTi8ABrOaUZi7iJpCjsKpwOpK0fKY/B7PiwCJ4cbAQ24LiGwK6itYK0+LT4NvtU+a73j6W5nMyEyL9vFEg9h5fzspyR3/7/JE6bBGWGFgeJBzJcXGIEJ7LzP0vpxT/AP3s49ShJ++EEqXIlitNLKl7cqyOUrBftLqLBI4fNMftgBr/NZpOFeXsWrTY88u9ifxPl7dSU+FTuONv8MzJBGc1+BZT7MaGHHkmUX7yxqWTcyLtIpCjtS52mlyg5ipGWkkGBECDvuG8aNgqVQDpoO88V/qKt5v1CcpTPb4het3mXGlK5ykcnv3EyQx8k02buzk3aQUXlWl1/AhuBkeJdh4yYIhVKJxOb9B7Cg2+wPMHUvqX4dbQc182PJrEMbvn4Clk+BqfV47FCMoLld7hC+AsQVQXI8XqyT7A+TBEM7gI9I7eELEK8OSag5sppSjTcKBosnACAnCD4YezyOq7X3oWp0UNKeLAMNNJtbZCKi3KL2h0kPXWEO4x//Xr5zk34csumwRXjaBQINp6KTgXYdU9gfmkF8sj7d9/jHJvNU7zzc5EbqIA4t0nh5U1X0Fj0ncmbWEZsgb45Vfidn+aViSRMSqZsr9CcV8tEOazMoKUkwGJPfZHoDONV9P4dTRHU7s7NGySUDR4tPdWEJ/X+Uy2UAge+Yz2VMyzRTjpqprfLHgPQyTuQjMBphndIxTgli3i1oU75KFXsTd0Now9RC7nZG5Xm7n5WfiuQOq7qRtPnAxZN3AAPQEWnQilUmAj5QD8NkWcAnX+cOw5DbU/QNppa8RL57ffiQcMAFlRs5kkAUWaC3oIwpEpBcNRGlf+KceSk9Pkf0YYgg7DN2PwbaZb3q7hZXcThK1t2e+bLtzYCKR8loOapzlO/OZB0DKu8PML+bqFUc0h7Bq4vGVhc98n5hyJYwN2oZV733SkrqRMF/cAwBXCnaNM4hqVCmmESDvX5ltTOozLzvRPNzxpd9XSe4lvWPDo0H88kP/eEQl21V+6BRYrHpjgCWhNHaoqpnggbxiV8Ai5grsso82UItBGDYvaFk6aUCCw44t1AB0Y6vjxwQH7b/nLBj8Y+mMNJFD+rVaW8fzJ2a2GS+yx9uoJ8ttyKkawMNP3A/deCykyAm/iMqC+gPbU1Am6Yoee7xCiFKsnXN9JwvC9LRnGX6zwDRQsXAcfdaQUe3vkQJl84ci+EM7KTI8Gy+cp8iEnTarp+y8ieHDuSzJyenj+uhMsOj78fyFGspxtMQfIwG0AuWERUd04Iuo3KrXcnPASaaIYLe2KR+iNez+Ld/RQgkXr/I4UH9cVf06E2AZTmfwo0blExPg75gk/TTHblRWWNjFAJMEHupJAduVB+qtAcSODLSXPE+kfZe5CkoM41AtQItzvBvb+h6QgUcnzswDlIotNSOtRxlLgmi4SYrbtk1eJz59zsn+EZHBXE+vvCwux+tlEZb1SALL3w1VzZ+XRzWjrhDXJ6apL4GMU5ISHvpUX+kqejV2Ly9/JKvZrh+crl5YY3dk+M7pLr8KE9IA2ddg0SokAt9plIQ8j+cBYkCJtiYO2tmZreiMqvB0OGK0Q2ETJ/ZZk+Pb0PpGDKkzlCDekybl0EXZv26ykVZfTINJ1IoFAzMxhR4/zNp1fN0zcDtV6ttdelOfI1dtbWO+fmye3Z3EoH7e4+wfTu7OirgjgqlEffGNCUfKJfef9MgEqAjf9sOh18pnkIujZ+6h9pBfL20MM8fVrmt0gzqPMNDgRDkyo0CTYhBih4kySpzg5bRTb0JvexcGcgdnOnXua/sSuxBBPcMHD9L0rqyBCgKXAaUq4ectis/gcglac4vzY6kMW4GH3phLYYz5xg/KLWu/CWPdh4ZLxJb0D7SSprepcUNRaNZJ2204IwlLEqRJ1Qr+9mYmEuw2Upx0+ezyl+Lv7bbT7oEO2g4hTLBMeR03Jr6xN6TOrYkVLVHLrnsV3T+rdNqtDyOQ6nEzTkLflC06EudOhs9nlG9VvC7WvPVhyEzSG50++dVNRnV61ALNbRLqexI1DupBbXadfMGdnkR33By8uS18PKJoMhaaiJ81ZNrgWxUYsiDsPHFGzCIcA4au9vuU9icxOmRqBxKvHgzxuNKEQVjTN+lxhbocHkZeXuxp29FyyIzhFYN8j//W6eob1Ie3PMyAi3Sq2UHGx97aBS5ivDFFPED1a1V5HMqJTJ701WzzsA6Z2pfySIm5EP2g06psdkZ7VPad4vPqkHV1z1HxZS5sAoJAZFbO5w2F9fNG563Q1fyEbLoa4iRkqC+D89KQnv2/mtOmmHritqAYNAXFICYY3KMARxXEG/1golzRU8xcsh1iyqX24ChIAmhCvHASHcYmPS4F/0+0j8qIBP4+h2PGeQD7dEE/R2l94n7+2h848T+AkYvTF/Em3ISMQ0acDeL4npvwjzOe74CkloNhZbmCtykXSqRNlmqegLrVj34nxl+s4QH/GVwwsYqIkQe4ENyDg9SLbVSpKolgOcF598nS5srcpzh1l2QHXLa2N8R9Fhb6P46jeYZaLdJRjO9YXfqDY9qHbHLEb4s7MuA1xblw1XAfp2RNrELmzw0V3LndJhb9gkhMs3WeUyEdXy3GW/Q0IIK10qFT1vmfVjCJJHANcBg4+6wVDl+Wd8FjAxtw2Dgwrt0zgy49gwFAVFtCjc+RwGt9quENV+ZPH5h+2LNUBoowKyildDRFwWN4vdXQCizzxKBjxIa2WH6GMQ7K8NT5MUzsgzIIyjGY7hpQ32y1RyVW7ycbPKRuKNWPEmPg4pohWDYkYqxzbQa8c9DvcBedfcAZ9jtQVxpvFK2debLAIKWbP3FS5VkbTOaq8B8VPMkH4Wy2X4VpQse0FgIANPO1tfNektPlEh54jOV1AoDyKmPa9HClML5rYaILh1zhYtKYDcw6sjwP1WJvk9FfjgVsDhANJ+aqUgQ4l96NNmCfoLr1C/R8e+yRbv7oc0+Q69jiVtOrweoV4bWse2K+vKEUZByRnCkB+KUtAO6toGk2uWZVGX/I//l4PU5HlbyZukF52Y+ougc1ILrdQjrhs3ptNCzaQEJfktJgcBAF5Ot8UvUYBvaUQxLe9NrlXcZzmEwtGrM3GmjYPOT4e+9TGiT27DD//2Ongwc7d2yCcWgj0x5nP6+R4u48350bJ2m3eg+Ku0VJ9QBJoyI9s5VGB8wbEVzIutSETXb8LHbvEO6gHxxCSlcqV1HzCBqnn5CvlAyn2HkeU+T39vEKEA/AUHjh7x+Bt7pb34lbVp/qcg1gmziKKiUoQc2WcrhwhRQ5jyjG/DeL/iUr8LPAlDzEKxVPPE1GrEu7usB1nQuKOdoG2F+zWN+iIA1Ytm6XNa4LaSYSJMh0bA7pof2nqpKlbJoN1Mjh7nW3DYOlReThAi3LuEJ4i6UjihixUby0KAyQefkkzYToyrqtXbhfZmMPPG9fUO5+XPTdgDK0IeEYjYC2dLzCXMGuj+cGxfIKCIOoMK1XMdfovRQv+M1axYBkyWMbHYFkzwtA+eE+lhnZOnZFwvDO9nQrhVNEZVPVcFqQwcrYY+pwiQ8I844KLAc4hXAbUdu4FPxObNKnqjp55HLreAA2B3ESO53wl+Ws85ZnWOe+fd381WyfGO3jx8WO5iNK4TH/q5E6Nw6Zcyh3jLwtMt1Sxm3Ejg8X26xpcyOi44jJd6z1cdTPbDzaaZJO+N+A9VkLIUPd2h2SBjX6PIvftVdfG5aowlRRXzOPujjw5f4rO26HecBILJfW7JdxthRfu9e0Kk07cw5AM1qjYlSyiolzlxVDYFoQUTwmNPKihSWMdIFUci5iFkp9y/5tOeyeEX2ZDtjhOII5evM1jmW1SdTuKVXiHLkLA7F6xyfQxylhtP7uiSHZ6J8k3ZW9O/DTwbQcrtdy3ErOCHQVcOVKVmeoKGLK8C/7zcPi5yoEsAr+J3n+qkLOhWV2qjs1zMM//JVYhymA0vr4Cb8WvUOgy/IEm2TfgllV9OBeC2YQgWYaCT+baRJgu4XQDdjyg25HRyUvv6IKyLnixM+uifq2VcP3zvHYg2ZWEmpXXXNd4YvPs4Y6N/uL4WRjk5gfyDiTBdyIQ3AimTbp7Djg8atxYTnkSoAfLjRTDpDow39vPTJSurLFLc7pjxdmQ5yV/hqVob14eKeAKiqs5n6sfCwuKZXH5GJ17LNhR2qO7Ys9zRoSFY+78SKBBCj9KvGm5fa/2VksJsgxXf4UceIOKI6FKf5gqkK7jFAtfGM1BrTeSrgLfc10LX9QbCoGesRHM9huiaEn7ViLmLNoIZ56xeDpgwyLd5mwOq89lqhR4Se5dQx48NnfRPc2ND2DQo8SgjSs5dRDm6jzHNJ3xRBY+ikXI8OT3r203yrUgl28j7FZwrZxLk7hSS2AKeV3hpqvsAM0YDVwNKcZlRiwWoOVG048NDIZVXE6gnxIvL+SNsbjV3QIsfwxoK+vj4J0AssYuKFc+Qbo0YinZVCp73TM76gCRg+XUyL0kF38ik63d6lFS9BMQftt9CO9GBzN9ysBoJi7eyQRHsGTtvC/GV2PkPl3/FHwSBIY3wAcgVb+HyaNg3ftXvgUIiSLd2DAwYYfosqhNVvMLVXwKpJ6UE1c0UvutAHvNcSbFPzUEKkL9Yl4Xrs4aHrUPRoLZZhmvm3qGdfZwgFHZcaJB+v3nCmsgmGjrMwp3dpTrFq+H/oXWkDzZd0aUP0rpFjJkUkmHtegHbNqUU+wW09H/TawpKZrXjfl+BfkEqCNOhOqkuG7SdFkOwq1KX5stXInwjhdiD2MvqAXfCkBVlZEYyIEG+S28kBGAu92PUXj5JQd3pzWMmSS9KJ+lunvb0mFNnB4ySlfBgBeiZSJ8+DFIXrTE2xVx5XzuB+OOGa34r4aVZoyWW+cv9lFeozdla5naNPzkGlFOLiUmxImGLZDgNQABBNR0UtWXzVwIoGhMKJTKWu+dYuGt/JTEEnWFx41MfRCqqNMNXUbGKGxDxuXbuG/0jY8l8eLdSrGNBooxOZErTmIZmAqU0OVrnHV3AtTD7RbEZjdYedLmQAojBCdS6Ix8nwdcN/h3FqjkuDwWRdEgPrlzYzwNCSeBL2qq2yqKzAWan6WhMGhDu+wNw+16kWzBlF8rCmXm4ilKDD/HkLo3h4goDYYBOH+e3GzwEfhu3DMKsmhG/CprueOon0xvYCTmkmVvze7sl7hxBEAIOzaMuf9RXe19OVlZ4Bao4+gDER2op68qXD3xWajzH9uuwfdOPtmruDrzZJT9tSRpgvU3o9v2vANGjMAiLBl4mbGu/CsFfaiaEssA+YywYa942d/0SrvMkHnnJbQauhD6bUnRZ6/XsbKs+YVBiThg3Fp5EnuXa/8Iquz59/f3p1Lk49asg+YCVj1siBH1niufoR0o1CLsOJEibD5PwPoTNVOii0gALdl+53yDAFMUSCMak7Ch+i2IuvaRWoUE9vBkQSpwTo3XeaqbQz3cqwqjczadFHWZXXdbbe6TXz83niq7agwg1+yvH3DLGVennnGMGvtFFLUupSP8xuYBF8Nkr0p3SLPeopok19P+9qAIQn+DhwBxNvUU6y34GyajNp26GBK+hk/2yCWxtc3d39uImTU361IoUz5mgaQsSWj4qNpCCqiHRHdzw4KUMyL+X6EgN8B+OLcgwg92UNuxFtSMVnh04f+gmynBixevbvhx02OB6+8zC+EjYTkLp1HNYVFAy1nTdimwZhnajITzd+LstYnGANB4NIvYWxy+KgQeD6MPY00eT0B9me3OeG2dWNuN+mI8Db7Rpi9XTTI+3+7f9zK1K6n/KTC+/hmQOk5g4CtgYsIHBgSkL2Gmdq323ec4fo4suvwb/qkaH4d0zJxMCvhFJ02kT8lrVB4FpWPY8n7LV/stsH29ox2Bop+sSOjANDoFSW13OLeOaLBgYvpmsjP+Uhp1pWeUzuKYRYWp6EpeflYN5oo/X2FqlHR/1EtvAlgHK3MDBnFT4e7PzwFaeNnS2KD6+y6aCANNhcBlKzXGCxyKV1amJ0Mz0V8wCUSveqdDLClawaO9xL3d6huzGy/1slmp1HOIytina4VLwGbWv0LFDWeQhacHI2YhZjg/9QNwwRijSH9C3ufU6eFFznMMWL8I12yKqAZ4b0wnDI8YHQGjEYvzlx+bBNKFcCgq4tUT7tw2cgV+0Jqu8sFdW4W3/1oOBrhIR8rmDTh3hLpXb3Y4zEHvtJD5UP408f6c71FfpdpQPJVquStcVFPYAP3o4O5kYwnvjJ4tMFZweFKTHrio4p6J1FKuHVb0vB0o8o0tL5+Tv3jhUDk0VeY3Z3cMufOac5if+BRAPTuGp7NI6RJZJmw06tDbbwUqX9O6vHxWHaXZswEgAbuPTOnLUvycMP/sPb6bJPMWfWc7yZW78jYvqoJoQxzv65anauvH0RG33o8osdlPUaUbjDUPlOZj1tLPCg8QntVjQIKspgMjnRPjUK1LyuW9uLi5mWwuj2Ka33Dh9nXErpgcT5/noiV8C2uRTjG9DbDNHAvnC5s/i7AZNzNizGmj3BIqUpl56nz6qxb56LStgxwS9eCZsTeqbJKcd6cl4eyaHhAHKpgN/4NQIJSK6vpe0DO1pRVziya5nL730PWE0SJJf69YMwm03Z8vdpK/1KHM9tHiPBvMe/wRfs5wQCX8uT6GFyUuX9JPc0yPgnlBbL6cLHoTPWtMMiSV8tWxTcC7/jjoAZBttgtuScapMOmEV7E+vAmylOwNsTXFCFAdEBz2+lYTwaEy9Gl62HDcofMzYIpQHTccxeljX93ku0H7+C6WVUxwNHcwmUi+2WWeZWnNTDi/PGRGlv+AoiEV9qfGB61Su/LU7vD97FfstOqi3kfBTxBWQpAEEAl9MNzilyyJMlj3CnQgr4ar8bxAbCogkGaEsJ+KE+eeuC21Fy+43COf4htCTFnuZNerP8o3qAScHbK4WmZPkV6cRsqB+FDYqNvTrnGp3iEItZjt7s0CcCeWKB7NC9Xfg/7l+ZUINTHy9ObL4RjQkTTAOKZBBt6wlyEXAhaLb4BdDL/7ocOZmQ492dh+z5sRjyeNm4SYbbDSM3Yjptx+tPIDMZ/ZweIyH5Hzitm1gus6NUuDAjxGXLYZHlIwkEQJZHRlKWjEZkuN2rdKoJiXdYkw0LrzPfeEUewvAMC0rxATs/69oNxyedLoVnsrgLzGrjU976tqBoNtn1csFVoXWCIxUZMvYpMxyJw0XR6gzEohs4fnE+dBZ+oVVgGwjijAs2E4snenBEc6hAeY9ui9ECu81h9EG/2mh/mall4oSUELzLA6nM5CARUQz6pmbQrZhMbzF+Gem2BFrppOVxAQrY7ZLsA1lc8DwIUylzBfx/FM9ttE8I52WdaYPdXzgKFq0MolVefG48QBBs+2H7o4INg31CbRoAjDdkjuYEHbuAJjSW4JXtcyCZEbSkn/nW+9hc2IJz9596pV4sqOCXaQ/jvZP+faISSyAi1kJWiQNScjHZ4PKmonVT9tfB9Wo2kVXZ46OqJGmomXClUzQn1p3A8/OnDUs/svl0XrzjnHxWyyHDqF3YSAnnkNZO2gelH9bhUXjx75XsEbtiAIfbzjIe5YBEZoGLdoWf68IGDbHiXF/E0S8smMLBn8sm53TkSg/2KwAyhX+P2kIij1wYUd3oL3EgfgD6uCnkH2NxYromxgY6NdTZqcz7lFErgT0RTbzLi89YOLYFCvdrB+Mb8DPQFHcOs+8OJG7/kBD0DJRm10c0xU0nAOr+BDwJQS0DBPxkMQzzB0gzsAKrCucgY3VgxZWKCDPWyWwtlswhFq+71UjSSRiSOvoBUWR20fYOkqEQftDSfxIIrcLuLZHEdldaxX3z1JU0xx+rOTJsJ679NtxOAHN0RVa21F1y0SllRX0RnX9CHTNO7opfCKT8VGgCKHwJW2RjHKMoGb0hqMO6x9gmhDD751YXSpVGc12cOaVyxJk4VmzI882JO9pzT+/2lzTfnNj2H7zlG70VtckZGUXuac3olwAwifqVDsJ9FVkPM+GpwM8aMXh47Ermc9AhQBccWtr0YNUNIiPE2aBhb+UyBCKUH1AhAmy7zRBcLAz1fNkIH72GwR7xNhFrOw0fUUT2RFmGK1CLEJk9BAqwzvbosGkpu36Q4HMHwCF2yFntAbW8w82g28nuHa8YytcMjyInULK6V8UTK8MorPrLTNyEtf/szca14tpwSpAahgub6iFQe1YL11ArKCvsmbTNjQlkfMW31k0BY0HwBpy/K8sBSmvcDCgDU/ajFTr41kzlcvLMthJ4B7FovYcIJjNyco/fpeItnt+zQqh5FNV/ZfAv04rciOfn2d3Hl6znxLdmX3dB8VdtHKZs3TqQGRLUQ0M1UJ6iHM3+51JjPTwCCCig3pdSxYDYCMjm6h9/MMbwsrvGHW07IQzKh5chPaDEV0zDYIeZRynILKc522nDd/FnBNZYhXXFQy9P+ZXDxYwc8bVfRO/nUKkupmDL9KeRlcf5RAZ/Sdml497Skd30QL1FXEg4/vE7CbDwXXbE0Dpy3PDx/u/7p8GGNM01znTL2iq6//54HiqVPBRjATBq3hNIfZtcrp/VJy8rGnMfJ1ueQzbFwhfv6w2U4ZnPQWpM+V6Dnhj5lOUji/6nMFEOX5ko2lUkMWvQznbEz9mhzjkSEpLA2chaL6l+yc+U26JuRvItMjIOXxVENu+QIPVZE2glBPls/J0IddkvlIVZf7wvpL/lfweH7kT1UwzFIdNJSyWF4m4V8s9fRa9npyEF/sqZjQDBVexh9rshH6IDsCW6e6Ef6BlRfeu7MH4HOZgq6ggV8hAI3YgWzXNg4TwFg0AF6vyIfA8oGIvQ84qCWSU0nSPtvPsYi+KsKnMBIZSIx9Vs2Rx9eTh3dpMMi6MRahkyToPw01hDdDp9BNmhD/2GmGuRwRt4N6LB7ULsfZyLnKLGFyZ/K2+eV+xq706qL3XGJmmKFBkG4BrROQg/m0GiOUnZHZsgoDSDxPHPoLrqLYXf+6PxAwrYibdi0MrkbjcwjffRwu+68JmtnyqwCZZk6wy1n9YJ5w0C57rEBZ6w0n/jR7biRxFfy3WrF8WLEEY6Xydo8ngmpjqSGEamgcvSccNRpLfL40OzDW6hzcqy+sELctEv4HKNgEELHKBpZ7PlAJwTwG671qxAfStFndGLXMpIIOcUwgWxrjK+aX5JnTr3tU1ttGnwcxuYoQJVqAw3ttxN4SFYPmk68QFQuIKVomuVyCwYlNI8H+o+BGywW0/tk52n2V6Bpez0395Pp/BoC/QkSzTvXv0LVsN789gCxw4t3pdthoNm24y9hDhrW8l84hjlkM7dU2v06mMBDNmq04OHrElMct78GxZ5jY+RsIULQ2VgOujfQinOT+VnJUKRbCK+ZtcB/jrjLEKYCdSyXvAR8BB72nUCJpUReJ6PJmQZ2FXMAnGZp8DBb5daUCF0TO9lEblA8ck0L2105KLCUOhcflpoUiFUV8UNTOVIe7iypTo17ccHUk+gYRm3DzwVRZ7Pi690USbDxtljUimPvYvUrrfk7reDqWGm0LDkmqujv+eUEjymXmztQalspAG5v7YbmyYpGDsVvwcltLYlpFEOfhsQCr/nK7jRQ6JrcwI9B8iUsQbAR71JvMX7Y75F92q8OVac2FtZxK+SX30/fcbWGYr4eWU/HDUXdy7aX2wJ06ZeSj27xWIUiLECbJ1wZzt6K6TyCFYEYjmW+Pr8H7UF65mGtuwMSYPucSbqXCyOwZdpr5cSK71sB6g5Ce+1mABy2PeYuCQDBTZLStHWSTQmFWrda8aTIBcxSo8ub77stOU++ioGI2x8pjiXMXJ/KdvzXDxqxZ9285cZQhlP7j4waQMRR0DNno4SFCbFnwJgw4ZHhtgW2F+N+EBknH6UjSGDzanVvpSPxkVgYPYx9xEY3HNQd9IbdoZeGbcIBvSOvpjVAS6gjwUrHktDIchnY5kf5nvgxzPiJStylQ7H9+BNOPbfnV4oUHwGe4vJGarPhAK6GgryExgOqUbnT3BKwio/xthqDoBMewd+LxrplBszIZJVbsa4fuZxjo0Rqvm/N3MrRCb2i60WH0EC+G8SHP+tQv6TBqUWkRRSDlYdWb9pot1XNPSniQWv2RjljmOesaO2RjonVmu8FIArYBdBzia8/nUx/VJE69pC8UhMw7GqrxJZm6vKTjBd6dwiHr8n0Skj1pV2e2k5rkEy3dg46JgbOc+Ho7iAlV+e2ewvM72eKReWBKuQ3caAPU855sBwaRnqKGs4VsfJmV61rzelaIoxhEBxGYie7XLFNrhT4JJ7zTXHmwcybcBDAo3vsnrKcbTVLOT4e4u0SLRzKzufHGtZBSOqZSErYrE02VyLuyAGuIazoYPtzk16D/PuCtUR4EAW7Omu68q4aLZQvFxBxArO1pHEPq9+QM1DsokKdIoLI1cMVb9k3AB0o2gD6Z5HIDWq6hKxlXnRbeHozPk0F1Bft9KSylwv4FABIIyjwPGgOX1s71hec9KxAl6jp7SEycWAdjwDUe30Q8Zp0sZCr68T7caJZWamLjb4IrywqG6Buhn6DD74bPSkkLSS+5ZNfYjZts0PtCsRylhoy/i1PyL/qmTOVB9EcQPZ7lGj/OrM0se0qvQMp6wvWVICCjbOFtiKK6AUd72GpA52RI/VIpWVec6vBRHhj/SXvYjN8cP8AVxwYVuU3sl2fbSB6Ow3DaHQ+skouUXM5uA4vJ5n5vy0BcGv1bmIWfxuQqFj+nCCWTibUDeQrPSBC+dOsYq7EOCxaYtImnwjNqc9zSUcBDplnSUT3IDnmlmaEy3l6puRdzkPD5mdx4XyTlU/Rilv94ovHta3oeqDJpKpFe60oZqKVwT4h7kJC+74Q6LutipepVLYjsANNpTPe7O3DG0zx7eyUZWrH0jQnm3rYMFE6aj1nd8yRcqzjHu64Xllzvru3dGzAJGRkiL6LpxV0ugh+EEGwoMFoUe5qeB0ZfgJaUrOnSdOldRzuqf+sKzqaFrj8WeYWu1xBCeXsoZj9uXpESiLiH/p33iH68NB7JeCFJ3PeeD5A00//C8a0NiMgmwRbm8A6dWYkTfrtF7ARiGewhVLspDgAAdcsS15gdfofbwPeR3iTG4lq5S1xyzZ+UYNl9H+Pd2goeqtk/jY6RgqWQlz1coHzLjeb84OZoDum/A3ixEAu0DGP0N3cg3Pe1CGKVX9+8I4me3VT3qrZZzvvWt5yXlD289PbEs5i5e1KoMsY0xjYn1ycdcdYFBFo9QfRl4mGrKWc8oUIXxSklq4r+m+4qevAjGacqRlB1nA2We4gLWBgvfK0p7oSW9G6vxNI0GxweWi2l8+RLZBCfZ7R/M3F3NyRd658IevEuj4U0nlK4q+BJ7UEjsksb7ssSANC+U4RkCCG024fwYRybnjyd9vb9Dqck4MLs80qFxNd4XrMu7TvSEUaCVfLBvLYcf8sB+fWOf0P7Ms+ktDvY20/S1NS8LZmiB9ESJQIbBc3DO7F0/oa+XSM/vqN7+/7sW/mdRmg2x2romBkgu8q7OpgaXqNJTNu2URUeoCcxJXiyOkDGIixv9bqCJkaQdVgcxQ0sQ5c8WaM8JUnGo5bwBi3hqoRUu8wGKZmBRhlWHdh+imcP8HKbDdcwuTrNfc2nODvhM+kuwk4FW6IDdfkRFZiVH2m8qGC9lD8wU8n8JrB0KxzyARu5Z4GW5UhFNKDLG+21HtXJRlq5XBTTPEt7Nh11KKO/SytDxTlo5qlvjQJ74PF8XW9yKjZj44HUD2WFZcWa5SFMv0AfL12Izpwxj3hfCeKPNvCX73q7PwmN06UPYumln98s67cz5JaYQG55DxwN5EwA0tFx7WuYN/2EtrmwZerOTjOiJU9jQnFBm15rm2HLKfEgTZ2/A45YsDt3O/z4hzvXRtFzcYCHM+lHYn3fbHQUazmUoJCg2u47xHWd7hn9CtWueiY9hPEa281Eu9cKVPxwDkMUQVmP76DazV9PV39Y8wBR1QfEAddkVo8aS576RUhkxY+3tCAnEFexzKuvcXNNfmFpMGM/jtbicjb9TwqBvnC1jMGoHP0+hM04qoAE3nxs1G6NDNtJAWplQr3stihd0vx2KVlllX6fNpis5SgrhTQi6KNa0m4VUbyNWF4SkF8FakHQTDS+rA4UCAaQLkAq+vb6cbsOz7cs4eYE6YgsB2G+l1jlnNpiasAM5LZQug4uPFxBLB+fpBjDKTvuZ6xIhsrChcBuLN3My7ZdvrdHCJauo9n+xpjMk2Wu7T4EZcRZubr/9zk86c90N6YN/6giUcweMYTcUSqrKFozCrqSQKKUesOUdU5kvkADEPz0FIMKukGyw/oGNtq3QPi5fMMSynPDW0eprnur3bwT50kP4zdikL1jQmtaHrSTmzUcJwv+i5ipzq/Jd0jl4/RewVT+BS98jgsaVbjqhH9vAc38Rw4SEDYuWzpdVb67YTd2rOZZoXuC2hzylfIBcrXDMSiy2kgT0KZNn4/z84R5GEinKoRrdXvcyeqr9BCDjqbdExiez9RDVURjxhqiD7uWMiHfi7j5krC/TooudS1ah6sD81vPXl4o+ePpOAEuJdMdSE6i/J6up023yJF4Y4ZawnXCJejoluyhUmqSZ6i2wZa4xR5NX1kuoZ6ybJyKYoyk/SgP7M6piuQeyl5foM7FSZ2MTsd1EyB5VN5r+1ZOWdZ1Wmaj8Pd5Fn7BMQ6tgme2pdg7hRySUMUz0ik/sfNKGxTKDW6MeelZdS6kAcxjJBwT32eQ6Vaow/7BCk1vuIEPv1DezS8lnczUkqlsjKlIFxYF6xpje8RgPWNLlj6d9LxM1X21vsV1cMoN20F+hyyvaCIW/VgHFqQSYZMKW2poVQRgHSZBHSoQyxuALQP51BxsIPYfKFhGn18d0gA99T3zbXpM86YhAx54B0oCmAhHx4/zqL6L2ClDNLc1QpeGZx9bUJXJbwRxCQ7KLikfAzogV4iyrcs5dsXHfyna1Y6DfZVlhZXQeqyhEucnl9uMkxN057YA2gdtSStVONs2b9ylJq2f8oCB/z8wxhUVH6gnc3nQzDpcc2T6T1czpJVYO2tJsh/ga+Svn4u8YIZMIpAaofDMm+3DpMoe+ExAW7BOPXd+YYO9JHBndC5zhTkFfJULHHtVOBqJHZJnYokjg07DdH6QMFcbJVQYOTyJbDjGi+luwwTrX8bUTC1hrxMt1D5Zuh9LV+Lb/TNNVtpA/wOIU9o/RmfP3JDERiQZD/RWSkvAWKqzlw76ckd34bfqBlR5AI3qlZfIszjYlmqo236uP9zgWDYSgmbs121JF48D5YlGg6LTIxA0rrx3goqg84m7ytJlqlPAQg8bbH1PnJME4Pk2Q6aKivGn+2WyIEAMFLr7+yvwDcCLZXTXO4PKPa9wd5MLB29zPMoTMgZqzf5OHvOL0/21r8nB6UwEP7FvMTFN07jqR0KNLKET0OpRjqobFw3CtS433lY+WzUh7N4ce+rPWUiL8rNItskLaHWyeMbRWpjEUT74amkhzaCooEPR8Eoqr9mKExb/Amb7bIAh0cG3qrfJTKiJQAHhsL0aMStFdc5dkj19ES5NXirMIitZhTEvC4Eh0TRanNnEPY4HCnLJVHNESw7FxdQ8ggSGICxqiktkgvrp1CrAYVfvr47bwHuyynOVCddaQ7I7argCrxEH4o3LkWGQEsZrkNG+EtPIRp9Z+OYdq9BsG+FYsREIDRESfdhstzOrTNoHJ5A9+Aw/brb1dFEHRIH07StC1mck99+dT/c9U+pD0T3oCuni3JxtwnSoem72n0NJxl7UrkPka/sLEz9tnECdvuJe+p1mgsHzq5gk/e7GFAwQQoJaHPQY3VQlkiS3BPd6Afd/SzKyyiLd/HD+vTCZBJ3JVHmtSgJqDPZzSDVodoH2V/tHIeEYGpKMHqfQY8767H+4jCoSwHEeaxUlzoFviWcil3ZsqtZ4/Pj7elLbGdK2p1QppuDvBSJRUPlwmJHNAwJEuyx7iqOpk0rkdx+0OmFc3sG78iPrBpwkNxl9vxrqnMKIQSfVmoRDkCsGxzOwIIB50mJzlPsxP8/FDF92Xf6EZSU81i0QubVTjmnGfsQVEmzKZiApSkIY3889P7t6YMCvpm0uA4L6jjYEEjpsZhzBDo03d4QSHfDir2ZALux7TFV7EVPMwH3vSDk9chtC9wpuK0FwQBKkXEICfC+jvwDSQG4t24DUZx0wCeJOWeoUPL6JFWe5PS7rD7HZvnIGU03MdwLnN/oLi9sc8AOWLO7mCzDMVloQtire2vBsG+UZKopMvmF8bQZYZdBb766Q3veXqHhM3XjzPI0XabvFgznSy/qr48nLzhxta9uHR8T1xedtNYkaDbDREcAyREm7dwdMpT4p0llgsBybHyOcaBNhu9EOvEfLEV+yWHpvTwlv0n2Ufx9zgQ7V9KIAxrpmvx72wJxGHXzaEREu0vvvjKZ40mpLpI1RjM4qLxgq3j/y5UrJ73f8gSyiAzEpadN/Wdm2wC9mHjNV/xG2qZhk5Qkd9KmE9g1QwTOqNQ5LAWLu16sBdNkkCbwb7a9qzt6FTg/W/s00xmWwhhjloeD+ST41V3TT3Lxxc+GdxJ/LjJlgpMEySVAimTZjUkSnjP2e+3Upi2hvNtUWkCE5LdP2SjNySORn2iNeWOkneNILxK/N5abHeepha54NnoQB3wnd4/7HV3+ym0o5UL/Mdp0JMz7KVN3r6IWk//6fshWHTXIbfLrhTcOcg9TyCKPU3Qq4je/NhPueDWKb/6/6YfeU2DF/LtIKDhTv4cXxeDDRLHM4O3UWYMhYK/PFBLbP6geH0EHNW3Lwk54DmIbKnNyiW4doPAg2rd1jHoBk2IO8+ryI+IC88GWxh3eYZVn2tmVJRBSgrA3yKkAENZzlQD1Y9WXGPtqLwI4hFePBwRwUQNPCwPs81i2LjXzB/UUSz2P1HbL0j/X6IVxPGND5O13m5+NQAsBclnDktnnKn1bTdlPva3GFQhAELfzyoPZf1gHE6ldpXXfZ8exfbRwpthT61Xqo7AWhyvVyU9K2lXaZKSG7KYXwWr3Mi1fQpHeSWhClqVJMMaWbKOFzeK8VcnAazpAKc/uOJlPpPaU6Q2PfIxqTz0NEOaBNTzIcsjYFnSVhhaZIkDbJpLsTf6lshZIDgXdUhuD9xaJoJKgW5DjYSrHK5e7uLsAYfEZg2TFYBH4L/tPJkwhuUDgExMk1nvBjuPZIrLVJgRdynepq2KGSXRJsXs7hZXVStVYcKNfrqwwqlJd5xHOACPXADySohLwiyPVYeSHMVgycwc3fmRP1YzDJ2hpSYe7ITBsErKO5tSE2CqU0sBjEDD94Uom9K7q99SJPxPupNMD1Yu6VvaTx65tXFcUrnGbELIwKpnDn0ejK93sp9o5ftFAOzmGZL5XRB171ah9SjrNkZp71KSsekkWqBrrsFzIheZ3Fsv7rHr5mZfnP2EJNZaYCfaCGF7APHCmE0byoD+BjTSvhZ+Jxws0pkS1G0Goqkc2Z0PJDOgZuU9wVU4MTomRqg5ErWMgt439ZY+Em7I505x6NvtGZmF8o82z2i72thR7R7Y9I09YN9oFjxQXiF8VOUMvb7HQ4VNYFR5CZTyhf1Fh8M40ZI9d16UTveJHGpaqg7z8BZVjoMmIqbRfg+21kTI3y1TpTYztevM8vT5LcLU4ezAliXEzSsa9qtrEUUxXzp3TqSblwOsOvJV8wZPXDsI7XDXaynx+HhT0krqkMDm+VszIxlgmavmq1qBLs9kHSnHEywXf//V4lo+XkWoFAdTvRCGVXgxf4hw9SMXEmY11xOad5dQhYOWvLPfGKNPBB2K0HDi4dVNQFPwSHP2jinnPFxyGDSN+LZHVIRreln1OEX/kZsGSP4DryXn9yMB20XCgr+EfM1t5n1K16gzJ2TxK2y6YkbBvd5ZSXyDK5XWum4mB6k4A6KgnJ2FFT5NTT34i4i3g15vQgVpt4FMhx8Lu7zrBErozJbk/74D3b1VywUDSX7u6AwW3/RiE2098Ssl2k4IjQJDfdIUGY+/K/i1Wwt0wdRzVm2XzhQl3//nTPu9yVSkCqgJIJY5rWr5hUuxpa0ptLP9YH770QFWoAb/iRNFb0igf9WdGqpSkMDQe3JY58TWbnSz/VSRY0HfknsxPq5B0JwF1CW/POtjiwcRozj5aYeJtO7K8/GAKvDrhewoh50Nz/4jVrKrtNv2YA5nOckgSBOeM3iVW+KtoByaaq0uSvFouF86c0/GIt8L1uJ7Cek7tgB89dGlslsQ+d/s2c9uOrnkzRDU9vEhE+t1M3nFb66DpL+t/pa2GsU2BqUnuX+C4fQM57o40DK3KPVh6RrK5hfSJ8l/DY5XZlF14MTVXByAExZKjldgMAsyt29fjb15G04KxTvD+jg5lhbUw3g+6g2fMLZQVn6tl0ul3QlsSNzwJl18D/OWvs33gK6YZ2D850Ia75917xevMCJHsJ4enZiSHodMjTNmb2s5VkXAhX0L32l42L6J3BxjGf8SJzOMXldxROTxlN2DbLL1zwhMf3fMJYZIid9XxP2OxvNxWE+Vx6qOWlOxmH7djmn7GyBy5XK/dFuANeCzQOHuwGylBJZeL6+AyGtpxzolwa9+2uQDr+PdEdlJcXCHOHi0nIRV9KPIx7kT7NEH+YszdKj7mzVqa8g5D3IUjsBLmxEJplR7AAML2Xs7ch50KgHtLc0oSentO1ICPmYIL2I0IWJ6F6hqss93okyuNY8CaXhv+DHBLB61ZLTWlYK9IQJy1dxbTPvDKVC2Lm8qrCG2Srrtr7qsHLpmN9+6OL0JBAczz8syXPdrxJVKzb1xZGL67zm6grKJH8I/DVAh4oV8YkPyndNJjWkRspZIKX3l/qOrETNtGUS/w2TxsiSFb8zmFcqGhmyA686I4tYh1S+wsUgSWWk/2j8xoQ0OGcPNgbuBIAK1z8sNp5tFQc/jsun2v9zZsjccH/lMgx5ZAQcnmF64YBhI3fHltXH3vGLmpf5RTU1E9F7531zKz8ht0a8eYIPyBsll26awht36u3TpRD9NM4412Vo7zCrhG2anRk+gSR2kRZupIHHq1WY+4vucUu5qnZodxyc/EVayZ3vA9iqF4M7ZRPLiLG/iyw1OpTDq4PEI0jlN40U0KoyCjBWRHcaloj7COlf/ah7ppL8vUlWms7eGg7Bb6635YQ7+8E2wq/3GWbTwH32D41wylax1e3GvAue0WVHc7difg5M7CocaVIaqf+ETVqlk7Y+EyUJWtvTfhROGKieWKPp0W7oH0MjKaZYsoWkjzFoWNgJa+OEcubB1lObPyE65LHLvdDQPL7kqPobAGF5Q243EaPmjhn+HNK5M/iXJ5X7/Z+UhTti7SDwXM8xy44KOWOmGTWBhDt16QT93gvh/+0EyPyENMHkorVcHw8JLwpBqX8gWwEqMBEdcIvflgGOrozND8c4DM7GKOyHnQ8IpmQUWW0F03iySnHDREoVl+T9iPT84gBkzxuDgj5pvpqOA+1cq+Xx8HePOsj8Mwjj4ajjPkOLlfSHFKbECFqASWKToVndXx9ggx6ilfo3NBoOeQx+b7jCVq11g5qRLYziICtxhSNMGpEZx/ES2Qk24AeHcnRlL+UUq9td/2OqiQ5zFE8kzTzBeecaWAGsMF2A2loltiKKaid21/pfUngzRNhztxS9amvrHCorFZtNz5Gzs4K1ylvGvplLGRLJBPN7tsZOn35gWSYlGZEn4SnqzzhXXIDt8GlZsMSwg2hJME4YdozPUUAyoVoGkMwUG6F7V7t90fAkzqSEkCZlWYZfqfJiKgKTSn5f8OY4fWmGMEag9JAVlqW+Kq2KE3iYgc0DcmVEbSkhImRj8DqZqITATpBzU1P7xoP+/SijIcCuxf21bEuL7LUjp1TeMcbkwctpYBxa9HBvdUxEOFotw5XwcmfWcscdTDvBwYkCwe1GPXmZTUwWhKouyFNn1yKZINFf+hX/Bz425PFqaVe6YItGUGsTuIbjg2yH1j3piq3iaOzF7QamZB1/SPnaRzWwNFxTjQnK9neGCEZiCts8YMw9RtixXBKlidHTJSnG28EQS3ZIvP9wiqhtL66b393VxFy2jpgnRxLJeyBdR2hpRnBrV48/Yetxl1IHVPNfIWMbbMAKfDvuCOFIDd8kxDTHnFELRul9wbd6wYSLKY1URtzzuGTHLU22IMZA8pWOxPGDDsjPKhggeYwseOs+NtwtgcpXdG2P3aF8BLCFLz3PaXKlREtQO3TEG5A2DWbYgqU1aMk7TnVYU+FR+PTa3pX2dl4mUg23J61A0jFU+haeyDVUp3g28G6YPzwVj4QIJ9HmmZADCp+ikptLZAf/hUNcxUrRS4U3iVIYReUTXiwU9DuXCgxlnYS/lr5+jFCEVJEe513gYVJVwf6h3g5y1xLL4iSjI8TKlZZ2w5qQVVSaGHQkvzgBxxzOMowbeo3/gSJVXywFo+0pMVaGp+ybTDiIfE4EeLVn2aMmCDeQYCTN2xJ17dOkjIOq4mTp2xvwjCPcK7CWim5Mj3sTCgv0NiO0b1BTlHjEkJeuEa3P7AznhViFkqYYcq/ib+ad6xHHB9BL2zQ9yu8yjJ8u1xwFab4hhzKV7dqZoNtn4Pn16+j99G7E/aR1UZsSM/jw6K4fG6tifxLlHKZhO7Lr2lrMG4v4v6YEUpZuqMg6VePs4FveTTeZc2+H0gvv97tMhdWCldMKPBNHSjxBe88BPPQlihpiua0gCxikz/jsecvNCPaAx3/EaPjMg/cRmAsE21cbj/WHZ7uyk6q4sTWMeofaYnpRAx1X+pdQc5pV9VBqvfAqerhW/d/Ml5j8gk7Y/uAZRQBHxp5SkFySCI04ZY73yXQHFvJpaRkKPpEMx2gjJGREygrRAJeomTCBWvr2sDgeiyJl4q5DDMSUAtB0enDmYll6TPmHpNbXifC7030Tug2lAyDa65PZmnxPxAMvk7tbhVQQtSv4+ZxmSdjMJCAc1CDWB3cS3d1mcf/bTSPnkB7m3esc5lBXFG5xJfocC1u1lqfvX/5W45pTq0ZUKnDDktZWDnZlyTKEXNXwt83SKZIUJBdZPLVoR3pTuQJf+U6W0dV+IEUsYksYpXXcvWDqOnBBEBprNy3rRJkbog7NJEuHhHNeamMTxEY6o4tDCr3E70gAccmlk4FuN2Ey5IA5nHHsgVxEa0hjqMtRWFMknnwg1QXeBhMsiHWYSPgGwqOtG8vf6LppiTpXqDYJW7WncavvfLx+TrhY74F0Zwmm/xbO4DOn3YKjVt7SgAgqImpl0+JPyqYj5Grgz7tK6bj5XWSOIOMU3vxaPH5uDIUObQDIyeNMGpT+RBuK/bF5zx719il0ci+KSCJvEEkhCzCKY8W5r13jXMr+3TZfLi1rInEU9cD23Gcwe/3r1erla450QEt7493N3vLofi6Pp9sJLExbW6vOCIAZDMy6UOBDl68phDQHyOcU3Hnu+F1fwlQI/yevpYh2hVAHNAW8Y5aEYBw9sRnYaerCoTwS3ICEg829pTghxsPNeUEAJ1IjyL8ASc4VV45ggCFPUSuOgNosxKIlU0Q/G5PUVXU2R2/iP8agOUsaaNEKKzsEjkipDjc+3HY0m+KA+4UpZ7VWhjz2s6s1D5w6eZT082Iuvq+kWeO5+F1+SQDhsPbn9IUHZjclPhz4XeGdUaYWNox1Y5MMmxfuCDaQqvicojBtQVMcBhKMVXjcV8+O9weoP65LSkYJQGXedG4OgMfUTO8c8tg6Zxoe0SSKxE89KRZrTMTFSjSrWUH2zIIpH2Iu0KuRYpsEn18H2CJaufT82gBFcJt2jHesFTvaTNwt4yeV2E/GxayjyLBZDFMPamTQAebRR7fQuG4NZUWPYiplcabVNjTctHvsKaPiF7P7p+hI2na1dLSYtac3TEPPDXLvl7DSsOTD6NoQo6OwL+8eQqKxiDTGnznsacRlL5iThHLgvRgNHfAbNXrkJ3rWY0yDXSk8TJ4vnaeJly76KuKIGyNGB4KnW7Bzr3DKZA1+8zJPcppR4d37TiCxIAgqipHwW88S6qhKiI/XCDVVoO91bK95Hf/rpaCWvvzNYClwRZrBNAKZyQ6Tc88hbYHGPavhLRQzwx3MCvlH/SoeVCFkseiHybXC2nqCkeF96RFYZrsH7bECmBx9+W18XSUZyBBgCBSBH66YpDwSiPnjPY42hcKuUcd6ivEmE2WFC3P03seuxUGv0Yk2cjxhgtR0T8J2zTHBkfOYByThs4vgQ0wdba5QGmcIcHUME51G0wgHCvnfY/x84Injte3XQfMa3JVzAg9GDbvyPuthDpIpphIkLjXSGrqIPm7kZcpzcznRQ6BfjjAFST2H3nTrvwVDYo1Q6F5QPLp0Z08jU/p0jXj85lTy3JztsRrR+ruWICaG6P573I28Z7ExDedjHmjYcolkAoolVt91NgjdkaUfXG/LA8PpkvfjJG93+k/bs9KHBocqACEo4Q4Vaui1QO/rVicvEwANRPHtCo2NmBvAc6ipjGuUKeFwBpgIolTg2lq/v9/COG3QR1Ef+lrKQ4IoyE0htDxunMWN6eKp8lFZ5J+g68r5OSweBLfAL0roBWAjWpI1zuhjFu2sb8YNzg2Lx3PZzF7/2h1WaFkN+JWXQ39mP3HJFQzoQ6b0sMEOL8zhVt3i/4zDRizOg3fTrsVTv7ANYk6+Ig36gK0ywwkRprANhKuvyB9Fnq6rmT7t1yUarMOoq0AO6UNTKnGfioNqm2bd7LAbohl4rzrXKT7pcnQWoH4kl+15/3bdmDNTMBNQY+5ZxDaX6yyVq6141XmFMccZ5BGSQ38ldwc40LHHx7N5zyeFMtD63lWMIKoiX08cKBEoR/dbxsVVy3DZgPPCsFJSphAlA7wKtv1fWujueZUhu3AoRS4hwOz7Er1rcHB+7rV5ZTyE+PcMJpUvouAGbaOJjxxUQbtQHba9XwuNHoLO2lVtJorTeyYkTkzA0TH5rgBelL6U9oCDUapI86WpgDpUJYjhd3hwGj9yK1EoYi6LnihGiXGbmFWEP3/88U5RcGzRm7BQCKjkb71Gedy+P6dEOiGRRxs+xnMOpknRHo9jzx4GazG69EJuYM82fKshx1G7h8aYZRJYith4VTTUAPuj4KfQCDC7TMaxZaRKjtw7dydveyN3MEEVfY+764MV05zs574Wj1EHVbqGfC1lSaoprLvCfSKDA742XgeB/ZZb5ofjDZk5hFEEigyEzWiK9i+9vTZ0z62NDPr+HzT/AQ+UyXwImydLakEtCdtNY+0uSbI33kFNTa9RtVQwRNYP+OuIrQhu7wN5Lpc+2JqRvnwg4jlpk7MtUNLlhJnphx0M3NNp9rGss1xh1FobBeapTL2LuaI4M4d5ll+vG59XT9lqDhFs8D2/umgFQCTD+TwmLB+qoVbRMyctTLRoQsy6jT+ZuoGkER5uR94Y28XJWWLZGGH6bhUGx1S328uAW27/5k44g1GQCJKv8PT9N3DBUfW9GR3+2qOavR5gJRHJ93Yw0jxmXkw4GwW8wAm8aZrUM0ly/cYhQSY98d+ylMJR0JCtS65RoePlxhyh3hWWOYZ5sPHnKOoWOPlD4lz9VA2tP+2OGM7+Vl2TYFnVtZMRuohMAumQbSwl3PaYjgutaNcKsutyFE5VYlDFL6uHPGEzNdLb5jYjEC+A8EUjhln7SbZN1wB/aDcu5+Ef2B37bNWmKAN6I8ev+IueryrwwOWTj3mxZxuNDUQc6kiAtd9tGsbLzDFW1jOEZNe5olK8WEVO5JKIWZF9yk9ZuuBej6+bLZ228d1lmMh6n+Xzh0tTrchfLX86LZtJiJZOb/DLVz1gkhmruGbubWqgIBeYSuKvLIfH3J2Qj5VH2iTPaK1EztGoFAGIU6FqXDIF/8WQcVoJP7fhiCNE4Lm+arJOpjom3UH1LsTdslwomvr6XIRnskrhMv/CPT0p2xSoBnV4x7Dr4HhLXRe7Mj/5XgqN+uBE8mAHIZ9SBaXkaZuxVoI0VNoM6DHYnwVpcpZwJgPEkzplr3ZQFvEn187EHlP/UFPIOxQF5YgaKtpUuS/NShIiuDit1eqCRHA7DY2VxV/RBCn7wBxVGGe9OEFRcQ4ERnLOA4ZXdsvyt3lUVEZoL4zYRP4IfVAoGrViP3Z5kLx/PlwHlD4k2Q3d5Rww/XeoF4FM2CN7K2fco2Qsyu+PYmaUO2XuZ2XlTVBLP+JnuxnCiyiBvTrQbHp4rF3kOZmOpvFMLcvQ6/rc55hUKdgkIx4xYiQ5b67+kCR1meqbax+SQhb2IL8pDz10Db0KQkQ1G9UZLuaLsKwAD19qYlfEA5gh2MX6xkMlZDe+B0vvUF7Ag1m8vavfdPUGhd/80p9MPR+fZ9MTkt2RxwZqh7U6h+FifAHyBvY/HpW9Cd9SYR4o0Cwrk8wS9syG1MyUFbSieVkAVpIY3UwY9DorsGLb1XoYJmJr77vxujyudYjqT1bE08j+9XOLF9ukejsji1L6fQ53vFuLuFWSqA0FULfYR/qTD5Ajve0YEvBCgPWZVba38MWxHVLrd9gsRTXGLR9kbwVYECho+cIRg+M45t39ly9FZjXxqDd31F1IFpS0UIEIDG+XsRtqfN1JZvuAavK0+C3OnURPEaRKj68RamQRySColB9zyCGU162sZuVPRBd0Ba64o2iz6wDzg9atxa1LksMKoKJ86dnpJXYCiAtVUDl4o3qHynV4AACYgVl47TyDfeWl9vDdRaSsc1xCLAjUIYx/0w4T1CGtbZOrPIklGn9jOdxIdixhHKDID9s/RfbslvW9rNFCVSpijVDywCRaGtuCTyppPm7qDXQbTThIaPntaCNbrvfJQ323BRWrmVOuoRX6QjJpBRojG6TAdGOhNMhY+wSSFeFmpqSniKNL0CGwTmnExGfGceP3zv4vYIM/vhbV2ARaozTJ0neb1EMIb8VASsLSLddTJ9WSyYLOz5Y+TYKKlCq1CHQOt/UYgIZJJnFYNFfnWNmHqZ8stToT7kFyUPzs6couRd9LAUrtKCfHblPKdahyOZrBpsvGddW33tcCcotRkgcFriJjPGGs8sjZvRkzKc/Xa1Z0MEG4pyJmH0EixRj7N0rUPNRBiOpR8UIwDK1bPCay2TOW52mN0LP7hkw6xlUnnv2RV3Fql0UuXIjxbNH/IovYYIatTlGxEb0Y8wWghzj8bwDx6hGmZ/J17rPUM2kHGwhDcIaufsJ1IIzH4jmGUOCe84GqxmgvtRuPSlvEnkQCEEPDMw3NeEQ8f6K+otEhwkril7TE0sDZkh/cywM3xKWQRT7Or8ngQ8ZrQaA6Tso/+HXHWVLXIgtRUvfDiojwdyiSV7OOL50ndZ7MWYd+JcRnX98U2U9weVvogSaQPnNaNq0opMVPcJ7nh/IdEUdIfKxw/nHRLI17lJOzt+VeTbth5klFiyH25c4dw60WTf9iKXOdYnwEB3WMXIBLH/bKS9qSlf2kx8tqMeoM032O7bGLA804LbqIEm+v8tHAUSsFX7ytxLGhIZSxZFY8fv2b6z+KFcecJ4nA0IjaxjXSzCmjPGe2pSGYEpVik/qLa4dRzHSrgAcMA5hfDci+22+AYdlGfbp5LALz1vjihJV2Ce/Taw7Rx0JM6s5u1NHzhy/l6wmA1HeGEgFn4f3kaCGK17q1XP8bT2jpKVYh+SpmrfkZcuPpMUPFj/jfe9+cOeubwLk9PWkNbZeE3X19pe1ox+Lu/ONCyvmFpqugKIOMt6IOxh4te6XrsoR1nbSbGuiXUR/G2UyC2XCbGptS2wgvf58AhZYXMlha8URxHxjnKv1Vx2RThvuzuWuijYrpJc6nIcbIdM2VxzcgH/qlQHPjY5mFJ2ySEuHrIPItWj2XC5ifeAaqO1PR0K2jGicPCOWWE9PdguI6AKnSifbkNpDW0NjcfepIwK+fKNsxb+aEbG/HMFHcjYV7cL0kUqpj9b9GH4HVIO71TOm16nZ7tEdmF6/ptOVUYXHvg5gPC6U8KvAzE2oG+I434q9t5MS4MQWAPmnJLveQf+AH04+0nrPq6GcRtxNeGevKi11kpAOiv8PM5BNubO1FtUCt5gyZ4tyvKN7UR71yO28U5JdxN3sacFkteapNshJYVTpYEYvZ/eR8wUfkt3CxjMtuGRdiAMHtd8rQY4Z3xja6XcmSnbsCGQ2x6mGw5BJAFfJxmvc95wHCkpmYjDoCN4RbWir3h+BELmtDrUU2UMElprKqSButAWxIoWW+NnFUnZnP6mtSonRUiJKOxdiGA8dzXbx/f0FBRPeQrCD744mScZMFDhibKFH4N21P+/QNGcU+vzrmCkeWigs3MTPrarytbmo2XIOW31+u2AN3cONs3PW0jCnPmdG9E+bVh4xzqC0s9QNNRBqhZAl/5caC+Yf8boNrp/vfO3dRASP1tn6qM8as+hbkkOcTqLWCQGX9pr/gj3vg3LrybwuwZx1j2lRnOjLecAaN3XSveJ9yM0klrK8036G78aFES42doa8yzJnLY5BcAKDModw19U4rNY0udwEV/1ww4b7jaQW7K2t2JQyyhMc/4rlwv7vcYN2ESjZ9PLbHBjSue7PUftQ15QznXF66vHk9WOIYtb2Cg+XjuQRKhvE5fQ9pNT12mevd08NqbHYOqGnDWi5ZcbzCwb9rBZqaPiPLJC0XVxeJH/H/kJFy5vFxZU9rHekaxr15JL8ju5Ypd35oMX+VatIyylPmGeYhQtBpS4Gi5b33845ThXAV/XDmvtjAU8x2kY5VzxiWmjG78hc0k5cR8yankebSXFjvKYFMcFVmY2zTJbmOqQGBJJEgknBEdj6fMY+XvCsx4NR9PWIMAoLSTaYH2TVkxRZ2H8EuwK33ICkKeHO7ALws8B0VCqLXDcREEndkDEmiMIpIIYtr+UE5pbPxJJXX3hXqhGic/MaWTAITBRDLySJlEroj+k9aV1EkOScRDpLXJZ//vK49hmPhTZQVVuJpeOKTL9vZnXtz+cXJbVj9gTuXirzIhASZaoZU71twDB+IA/TPuzS0ZTjdScHEL706jJfWUHzMeGy2kGq8kdmRpisYkU0y063fRwjqeqyBDBMDkvohN0OZyoLSAg9ncuzjSZok0RWGK7f1ihtrDNk4GqlcFDkJeDwM85qfxPG6XLADY5w2n+heFTVCvRHMs5YRoHz0B8gU3Uv2fTdkhrSFGPtXxonO14kq5SA5YaJ2fowtoHeQkFbulzO9J0UY2FVhKVML+XYuPoZV/Acqcq1O9hkPPBE/uQNfrrVZUJnWOdlxs0sVyXXs7IWcTDDPFAlV9rUzRnjxj9xWNCox776Vktr4MlBqBCvEyAAw3jeLSv+1QZRZVFJ5T9PbcPv2iwOLzdu+RVGqDlO+BfoQq+3xOhRp4hFiWmliynpRYIxNhoFeIkoMKE+huF58ciUVda7wEUYMEyYmo7CqACegwnP/XilolNZGjBKJ7FIgH1q87s/WdE+o7hRbN1zoJV2S7jq5CuoA/eFNUjQ3z3bW7ZT8baYBE1qOuaL3MEaGq0ipMhcvsAa5XTvZafew/L73ubFtoEgLCB8WCuKfUonJY5qCObU9oPm8WyVp1A8wO1d3G4xF2v5N8Y+jZvsWEvsqBjhX4XuYGqn6Pn622zcEvYe7cDbA1sUCDM1L62OS/OtjBRHPdQI5P8XZtlQ06LbZKXvw92daBggYPjT0Be8TsfoIPRu20vylON3oKY1bIAS8Nq52QduLVQUuZjlX23VxEegC7dzRdMk3XRLhxj/TPersNdJzmr+xODhX1qXuiB3FdFXDTCYLEkdEkrP4yQScchB6t1/4FxYfsCMcLB9+CTFHlvnQE8nBUf7c5mnR7uxkmrOwRaVfFqu7se50Z/nZ48Phx8bO2xy3fXqSOugxk0M1cmeKfFEE95KfI+yGZXbv3cnK1jj5trtVpZVNh9BhrLjEdwHR+JT1xwL88SEu0q42IV8cTAcbSd+vVksmyc09Um9Un9jYT0JSp5YYyHs2huBI2lKOO0K99VGoeD1IiIzqqNtYHPm0C+Vo03jSu5/Uhmvff7SCwdRxLSlF/EpBZ5k0QLu0IqYOw34Q7JAZ/AKHLtna/l0nvCOHCfKdTtuZf8sIidai64IQJdrp3x/V6i3MAVPyHphdSB85lxKcboOMsYSLfYat119al5YXTgSZlay8iKe/jRxjqU578GBRFJka0dTs4rV2FqeZ9rRXFz95JzDI4QykYshEpV90OCsKA4eV/uqa+bfmytSgb2WXnGNZOy7latuoJtDDKClj2rkGRQpEVpE5/BNwFNDRI16xRraslX14+voCk0K1/9XoLfmjhkQ4ryz/Uxp6mUG9xMwPy6K5vsTtkS8Hyo2jjxW/B1m3jTUmznDoQ9Cu6m3mG+fzzEp/seGKo6XprldJeZwUwviv84BDb6xV3j/ZPD7SaDo+bSQXN6sJS8k4ncs4zJnaJr9yP1nQC2YlLiV5gK5YdKKnzuM6XVseJA1fRYWXUwkCXrjG/suQupfXzSwoOT84k36pLWEff74LOipVGvYTpjlyOf0FLy+ICzKeazLz2B+C0NHxQbVGyt1Wr0bfqqB2b664e/Js+5ORbSqN/Tk1SoHAP/2TPGaY0aiEDKD6KlrV+KpxSeThraRZZB637p9LGUwDpT7ReBCkZKgbivQz1NUCEQWW4w/Xd9cHrGkAP36F17bp293L1ajT6hYVsuVm/dD2xCjkZAupBfXSn2aldx7muxZYFTgQ9JFeTN9ajZWM6JBJeofbMmiy0Kr1Op0lX/lxTesf581XrNGcm5zP0rsNqITNSruk38prwRtnxaWVVoiHwk+nuQpUMZc7tOxM+luMtubmGpvt+EY9Ii8o3bSsUq7aKL/4Nfzg1dFUZm/JdmVioEGBg142IuVdo3QNpALjNQCv80rxIugs1bR+qshp7jQ47FSFIp0A4pJBEjYFCgI2aQBnL8UqBGIWwfcqwioY1uAhFLpCGdwV1MTrJ3fxFnAyDrj+cmQbkCcZ5Dpu14GWYNKkcnpJtWiC52R24BGW8tUQfcHgzNWDkxMpG6SOOlPpaTPoXmDEbqIQd1xfm8MP5LULhHluWeQjVmi4oxcM8wM8dA6bs1URssP9Ajv4LZ+dnidbXpISCW2u8vZrG6/5AJudMWHJ3za2466z6R0QvJGSQs8cEFGGBimY6L1p7AGVgC8ZrzRXhmoeC5hFWhruBHRun7h+Vh8X7Qdt0Hd4y5TZWNoF9JqCpNOVtmkVBWxICciyWK9a2dJlEcmNYCowRx8WJvLzOkMHfG2M0T5xazaxnm0vIYVpuzaULv198OhDfsLDP2yx9ZpTtqrx87Ji+1zm5sWq6kg0UaSDqXRGk5kH0YSYblYRJbYYGLavEvCFoYaDsGrGVyzU1nIBOO8axguM+cH877HJqSV+MhstT0X8X5pUuythv2lipyMNAk+ynvBu41BZE+CjYzrvwovt/1KNO7oTZDQk0kAxonlDSE19IHfoo8D7P5S/i808eqQbWz4HGKTOViBBZf99M9NJN8f+Yp7juGQF764yDAugoZFYrDorV/MVdcyzLVben37rIg+0sg+HCLAB9FuSOnVRP7eir5wXTkI6Xaozk4Th2WXCc2lWfejbfWbewKvj+R9Ik8p2nU7WaaQkOm/HuockXRiMgbCg3JkZBWmdMuc5BE0jiwIARevUBAmvimpQSVgjIbvVA22LwxjpZSyndjdtYAKnADiEpN3sfaMzO+mq9ks0x7++dZOeWZ6MpZKd/vvdp0lfiUMT6WCxDwI9Ic7t+wFDjf11A+AMRDSeQEc1qF5LpXt2QrFmuUPr8+yMPNB8hSoHghX+dcVrjDmYOsj1PgujjJc84LpmB03Q0ICZTnv8DiLXQuT3pn8Dd2P1JD6YbOam20ByUIX4OvUVD3p+sxb1dS6+jxBfEhF+247V7PGA8TAoYIKDM/lCiY3dLRNS6LHIVLKf/5fFVZK2Xob2sgs0aD5IBJ7XF9KoTbtd4kEz0LOikSKVibkK4eAyRj/mCeSiCEnk+7dXaHWi6hIa/Gb4zfT4DH7cR3gWpmY6Mm86Qre1MZ6SFLzpHxzp4ykFSxdjYjIlRaP+73C23s3wLlFEi+KWLotiRetz9mQlhORKZh70sXgl8257X7rV1PkBmMw7HkZUaBRnA2sWuzwLqx690vGVavIwEaQIO1c0jjW/qaNMfpvK1vVj/aB35DBIFCcLey5mhgtCvuAaNAI7y9lA1EQ5hiXvZ349eKZkiSWS+GTXJgxuvvjhR7sLt7GhGMLORWjlLia/6tXP3sYUv+irBAc+cfkLuWjf3DPpIub3grLWlu4qIaBV75PZNhb1SubVm4BCAjqBKfhCn3wFix5FIXtncMVDECSsVGZL6IBgIlYkGuu/PEjKoZPEq+rPdFAIWdVplMolNeiT1Tuk46unN02H9vch7/ApFSmaIezpl5CKpm1VGCOnvMPhkzvRO7Wy9C0ZBLP7sZ1WTHQ+5SJ6gw+mQtrUcpoM6NvP88z9F+9Z4WNMFhLfxmma+Y251XOgmOITWh2Uis3qgSGx2xTa6FArjhYX2cR+xSgY1a+Lt3lyXCke6EO3/gWtccHUs6fyG5TdyaoU2M6vQ1TvrNH19oOi1Iw9J3iVn/NiMVB1YS74hC+jsw8BG4pzw5JNNkycXL/oEgLssq1E7ICx2vrLQ/dL86OwFMhGy6XggBVrXxqTHgi6IHFMMuIGxP/alnnvxwIABpMCeac0prbZbGv50rOmxzY3PXs/Con43B8j3hKoua2uQATAdFRkvjKoWhD2ACIJfsTG4mw8m24xVEMbDlKRGbuIgJVB3a8MaVZhN+Xa4zQM6S5iWIazHAEKs9xQdtoFbGsUncCeJHNDA1t31leXL4el/RaA66fA/iuzDXKKKf0KZMbv4v/FBV8DCTwVR6BXXMRBroBMU1hTBXXxS6Lg7CRbhUi5JKOvueaiPU4kP3C5URUGNZgO4wV8lGnjwPj5yDAcs/DKm1KOOY6Y1gYm5MPfaQ9ZKv6v/26PwNU3PC6TqbGtm0b24TpvAMlsWNhIyGPzBa7oaWdqn/lcCmwZjhXTYUpte7DP85qYEXkhOVzJju6Qs+FhHvq8kVM4ZK65rgLDF0wT4GghmcTuNUDyHzeWfpwQG/3Qmh17O1Q8aNyfC4CoamfY3ZJrP568ty4VnlsdUBqJz2PHS7UxyVy5y9g4M/1BMWdGwce2MkceAAkZxrOFjbBrehOEPcaMAUcPwlrWk63ho+P9VNQObBbOQZN1V0gfC2a/w3CoUqhwGvbEPH/0E8LvWD6XOU1A+D7UDT0q8oZJTK7we5athPhC07K1+XXJ+V7GeLN7c18qUy2dzyJaDIFYG8H/1iP7oBeMf3qPrNWJ/SW6nJZCL5GQFcsWuf2ydWJFkcO3dOLrcbRv02fNXY07ts9u7lb6PMwqoUHfs1x5haqj6rnT+4Un3gdlg+onjxVS57KtkiVpoXCwFiTDIx8IAq02MYD4ziBYlr4fJZvsllHcbRr2JlNTOE1UyBj3nMQBbhiZO9AWnQp9cIkvHdk3OhlOK1YrqLTyi8/E5LrGyZjo59WyadBP1+NOMqsdGwBaykr2EHNO7FMe3yHuHevFqo2CEMVFlaUOaA5ViKv4eMWhu07TQpaqf3XW/ga9RSGagYQ7mRxvSJ7dwK3KcmdrxjfQu+PYep0Wb9Eo90juqb9uOqVtnyXJCpuXvolax3rFdzatAPeMagutSlQqdzcfoHp/TRb9hWc2d2voTz1OzuNpSiqNkp6bdWCquMa5ZYB38gWFBLzDlzZNVxvwyvjeWFoNtTbsck2hzh6GVwnGChnlOq1mA/TAnYKuECJCXa5Y0K9BHD+4GYBrLmsqfmj0HPGssC1O2qALlptYiS/KpTUhreAuCGuX76H/YFJKoO3LSgtEDzb0UzJgMJYIm/vwColL4tuq5mi7fZQud8t4UCJg2eqTpRNb+w5ZQmGk74RPqIJJacmJk08Sr7wHqG7dS+WL+EJCVBht3dLogkk2oeX732tDfTvWUefSqLMoB+dwaf1DwToeiLIihNlsCi90/UqHFTzOa4SOaRN9e0hfsS4lrVx+HzpNQYyNrbHQe+e1f3IIg3NHE8olgyc60h5Ivq8Yig/B9aP7jvOaxKpmFRs4uN0d7yKIXItbUlKaOCnf9ox10h2kROSvrgn5yeQHnj39D1XN4VyjunpJdTqxb7169M+pmvkc7QPLQ0VKDww9A/UifacgSv2x8K1mccQHQPHFC2h5emlKTzoSMDDxDNS6bkLs+MHgYH3n3MefdQkUC5Yzib11quBwrl5NOGbzWbNH9mTnme7fCa2A+9kKezVY7S/S04u+6ljf4YnwzIwCBUzgKHoAONvV5etA37B+RJc8OkSJFHP+JxF/s6RkanAhbLV+exTQpdPUVBgQn1UKYqq8wWNhd2RKJyOrIFgapSbxTy/0Kh4p7Ih2DOw5fAg7j20T3GU/rMfEDmnuofYmCMe3E6aSVCSaXDuNNkzjTRLQLg3upcrvno1gwIV8ShXPx8+Z94nWCOD0kt5eN5iPZL6og+bfS9T/7nh+EznrM/QicyF7Yfa9Qo+lIpXsaTyTSGcuXjGUjWwTqSScoOv6kQHtkp+vnZ22ZWGC98d0eKPnwfO6yMFrE54uF1QaB1cKqLoWqNkktePyHvHmFIf96isTPPpGPfS4ep5iBFkvVD7ZcHNaCmy0ekO7E7Ni2akwHjnXG9/Oe2XgY0hBDIPomlpOAHvQLVbyh3g7OhspnSGWwqgzYzNFKLWZUGD/gjwTWpMpk1iYoj5Nyh8L3fNKMoEzNYIhdjRchrfU4zawUds9G/VPWM+kJ3OHkoIJ+HNDIW0jPktK+lWDJaPL2Huj/Fs7+aAjoyKToDuZwOIR/AGDnhCkLcCdpCZaIZaQW7KMBJIy82F4UkoOu/yOW32D5jhltUzSd2c51WiOex1eiGfrLf7sRzo3MPGT0akPhS9+oWssEkKWVwXzvlgr2sG4KPteHTnvDcjlHKypvACC4qJdRa4QERuvWi2nDcr82+kVsyR6m6gxmPbvvCPkGnRkkxDzqcQAf9W8kozL1cUG6H8Tw8JB5fz+Kj/SMHTzEpwvGBBiul/qEWbViYouZZfO4IxEgVhGKYT9XEMvyZS9GeYMfXwy4G8z5S5p+iMo0vQDs4/ZFMzv65a9jUt6IojNzvajoVph+igL7JRRSfFx2xN39kKtpRpldcMYjDw/j68u56W1jAjWY22hB9/h3vrU69FKUC0bDq3WmILbIZy3b11nSyikIaYeiowXjgqPPscaxZxVncsQSLdP1s4haEB5OcIEazbRtyAvJ4j3Gs0HugsG03hBGiSvrbIL5yNbAzxH5VT6XForG9/7SAzPOGnZA/UxvxuR5HK7jzRbw0hmqH1ApIGPZkVNsPWjFIjxH2ZIZIjhAuiuVMK+CvPvjrRWun6sBROtbV3kG9df/smpk5ilG1asPttOHsYNj0MEaOoKwcs2w8NkB3qAkyP7PY1aOdSbohK/BagWcZKzNH9LqjxP4WxDeYvDVL3OYaiIzP77Y1Rwi/DevSMJqKrjlOdBantze1j/zmbMiP8YHcrECG6LPOoa272YrIR88qVZRlzwHvsubIF9d2Ro9PyFQNXBYFXIE2Fj+ivqBJr7eyFmuw+J9jNCNgTg73Fz5rkawuHkGB62A4iNoN9zy1Zp2VF7pJmjYNONMb4R9n2C8AyIhqukSse1AT4ihcZndcE0l5bfLO2p3ql0CwFDwt+FatKxK2z8M4kOwhZkYTvpGw0rlGEs/JrsIqmAhq0qXkto66eDO6AYh6q7V5LK+qax86P1aLtSuIzOpDLv/fEBxUZjy2jWeqFw/72tru/xVm7pAdbL7Xht5a4LAf2Fri4kNiGOc85Qy0fLkSnH2LE09MH12wJjrekHXObiY2DlzPrq5+eHFe0vz34kwVqS8PNLQdEXrUZAW2bSXdz3PbYcP8ycxQ+KgJlZjAx5dp03uvVj8Eba1uGGWy9BPpwwRl2s3Ku7+r2KCnlp86aPIaRtVdB4ztzOarF25FJlu48ONzgjkvk0oHrTMzIoTqi536P5MZyTFr4NPhn9zoAIP9vlG6XakmuqxycGoao4MLPoUFWnfSN6kXR0XtVJ+z1+4L5giB3EsJQaBSGoieiQQcBgJ2AjlhVykFJRKVXnHcSmFsdW1AkPtUKrHctQtcPAHFtAd0rc5LI0PJXAHNQeNjfHrvT2pkOZC6snvRdW29Y5lUgrQaij9ptU7SYNPyeLDHcW+gYJ9dWzqYZn9Gpu5AIiuWH7wUTRrapLAiyQx+c8q+C/9bdnNnO4Nj/jenMt1QQGZ6ofCudRYwj5rUHWR/eNN7WLoJSAT/ZPpH1sksdVStJ9y0a89wmWJ6xmqQT/qlzpcdNq1qAJhdmB1bfGIP0WzCMzSh7wgemwZKCatfqSgbRmesxvW0WHXjzDlTn5Vd1r5D88kE0+AYKTI0/JTYvi0GWdQ2HdOPMmO8NKLw9mePcrmZ2NaP4sNv0/Bh/YBhvLo3lg735/139gojXrKv9FWs2E0qtY2NfSJR5MUqCKf2T7sCFpS7pj+6kyNnzZH/Ow+aB2rTGE+v/96s7ywr8mRumHMcEoM6CO7OSD5+MyiScyKYRjZLbSvFwsNvEnvyc8439E7RNGTesO5/rUSuM9S663k8BHSFzVMvcWXBO1BRSk+vOkpVVjcGpGidJzrxk/+vMb/IaYrV3Y2I1V/H238BQ2m/TG785Nrbi1nhC/v1zn/sIOl+9dwnf8SW4JmTsnhxd4hp4fHr/yoR+vy4ubNgkveRje+9c5OtpZ2JYU6M7PRmF0Z4yoE7FYjvDWKQodeJtbRf1ax7YzwEbfXpiL9FpNDCmojNzrIihvmNC7YTfwQaAitg7rNg8WH2qmxOClC9MriffdwiB7yv+6JwwREAdiJx0SPtsSIKC/hKw+sri3QPAvPXDj55EaE1T0/jipQiTRcmUdkMn+amfD8CUmlGc6SEfwEhF22J6w8s4oq/2yBKd9kaMSShijNWoQja69uzn6uU1Y1kZY7tlTzIF3lrupHLPLH6Nk9sHjmNJxIk6xzjZiXRSUc1Yw6va5daOxbnseAgfF8kaqqMZ9BTOLbBn55hEGIUStSbOE7nrce31LNkHjHeHeOvl43p33EwiOt9OIdIw/iMkj2tlT4RtbXLC1GIutNfx4+BAvBqtzplQRBPKj1TbNHurpBqk53MI41y2OWvie6yVLMNGyZmcesUggadBWngPuKQmiSZFzkMMqmeKi+A+hCwWIdpnKYvDgRKDmdUd/JRhjvZCH+jbVTTSda45fJs3m/QZOAY0+A8I19wwjzXlB9dWoGsvcvV0JgGss7EkYtzkwAUZroJF2L/3vlEdhkV68UbFvSbb+7xHthI872Q1DRDnOnT2jAIfRrMNmv3jWLNaHcghd8BvJORHsrGGmfdwQ0WWk/+yveRjDtz19RwrtA/Msuq6FOCWZViMPqR2PYO1i93mvmoJDjUoHNXHUM6gSM1J4Wi/HhW7TQOtSv4OvowcTphNG6+JA6NiRo1Y1+siF5DvhDAMjGjV+TcSpkhm52SSKgpM+ZopTGDPJQzyhOfcDZTRid7siScJ1pQaXoJ9ZPFJsMu+aWbvncPtgLe+cQp4/PXjI6TZpqAS9hgCl9Nei7tKTwqi+Msyhvt/Gn49cUT8vdrnv5Cu+T0SwuwUzit+QbMQ87/6c+neIXjn9JKfaAM2VxCDaLnAzx+DIO0CuBO8cNdG8QRzCqxsdsAzyBM9/aUSBEGiv9jd+mX1V05HVPScay4FCi6/oloGrX9JDbe21wMjprXakwP550KejZWgvJmmitY5NXhnAeScBhwswLtbsesDwKx7GWFX+boH52gE+J2AKgL4S/RCqfs9Sf8FO8znYv4csyxDy6zNId+szEVB4WwWFA7M1qu5PJAItCH2AJ/BuI4Y+GrmBGzb1purmzQMLGkXKkP/8oO/yPJBCrnx+SXSPrhbSdOqpTL2qNal6VfmwE/BNZXJ9zheGKcUEeUeQmIuEsVDIRwm4gkUJhsMTZmRcGdZXdJzxby6bJerhWxkCCgt4I0hinxmNl/Hf6HOTb+APledTHNQIuuvzQM0Y6e3UG4g/IScifNKxR4gcRS8mDbRs6ft0GdqEWaYt6Vtc/vYdV95Bd6Y7S+SWxjUmyocLGBpQWVPY1IM3cOgbI+G+5A+QNDPQK24m4V9OQJ3F5xkkDhfZctsmACsJOEvlET6dHw13En2wxmOeqJawua2lypki69o4K2T+OdGTEnon5lrzhQat7qPJTcNQITfuQZIg8k0YUkBLD85xIZhSB7k0T/5SLl8WUaCOobSmTRhReKPBisWRaaNWxe9b88Ek6M/PbV/OYnL6UCPWTinl5EoRp8kqAvThDyk9zUaHVZvCBvOOYEFt/wCvpg+ZgRx5uXVPUGSBt8B436VZO1N8JZjzLfX+fae9FutBuIie+p/DCeC1amptYyEqr58b/SlmLzEuahFph5lLijNopMJL1wUHk+4WU+O6OP2ivajOa/qOJEbU+QoKxz4HaSWWHet7pKPhmmGdCZhEZJrW8gLXKOk6v66aTfQ37c2chS7tmyIV+FHJw72+N8Xzbu8cCRJBVHp6+ZHduMqz76uzyFhtURg7Piel/DPj+bCSP0fK1jZTDNQQTFnweIo6TXk6poxw7qDGBWb4HJlx6wCWXieB5rsV+3p4+ONz83jOqXIsXGb55M4z1e5NIH7nxBsjp7zTQdz82EIR8a340SGRy/aBzKQGjfpAAg7GqOzvHDkKUGoS3AbW4A3dRrgMm6EwTAnd+YEh/bb5LkVDFb+WO2tfZAD8Q7zQSxwRpCYmJHMO2jezu/kvm/WC7wPF0HJYdyUmPUU0rNV2UmuMerMX5gcZQGsEqpJkLSrbTKMEdegWea71Lr4XrXaI7B6jgNZ9KLMyFYEE2iWnsaKUcZyWINa94M9Czjdzfh2UCOu8WPXgJ7+4dlFmcvxXOv5dUxFWVHHo7Nl/ehNQOp2RWGLaSx1v6ro1Imj3h3QxT9tSEHnDqtjAbbdGUWzXl8ZYHF3QAgKPqCyOPYRe8bJ8x5dxpNGOnNA7mFfuinnKaLtGVcEqqFiPMpKEU/RcVCYEt5Ryu7damZ6p6I3/kxhmgrKLn9/J3eckpygg47u68a6oGAoH4sLoGV9ar534nZrvHU3QDnxU3+3Pnw1QAKK8Px2rgiC/TgN/yOQ4woaMdSar6ySvF9DxQ5Vua6/6r7esBrveyGt81K5muVGQo7SecBAAZG7QaN/RsIUoQGswudWMDYfxdWo+d98SRjsDL2/Y0Wh4e8W94Jqm8zUzTpuhBhlyH+cMX+NEp2OHmS/CQeTmRtxYB7wk8wsLst8hYz3RgJMOpnEIBNrKG+mudI4JYadIo1QY2l/p/TpWZQHbzbLZb0kgOInuDxacL+HMIz4ZbPPbHeuypCFDyuQ1VtxG9uwoGLhupuYgvMW8okt+Me5qtx97sswoMkWkp/eeRs/9SPLCzarOsjw8GSMb6GcPPwjMVZGXnsRHhG9vqwbzxWBGwMJK0yPJxcFD5TT9D9POUNORQjhAHTpJpOG3aR/A4IK1XHCd02YwIk3zDFiAEoKDaQIP5OpMrGjpi3I4zuIMYQQ7xEcniYFt/z8efhlhd96RLW6fl6srmPF/Qlsf6Zc+OzWNG23O587+05pvL7gJdwHpa22aj7qdpj+B0YoetQIkWoMb/U5TxQa5QsYfe7eDZQdO3PBJ0FqQ4AUPM6ihN5M+NDp8yapYCBQWBNz5YMcm5kg3utTmUBk1RnudFDX+IXvLID5as8XsDJ4zKhlDUpUmfRyRK0XitsIl+sDT6B5SWfszRvgUDlXr0XN6JRqOWDxp5xDZM9B2Bbbt2NkfJfaO14UuBx6yxIbtY7PnVgQjX9rcONyLRe9jDM94v4EaPwMUyMFUrOe4YlOfoLCckmQzuLG5N0gyoeoluPAdsUCTI9D1P7NUKrHlBusAzhwZ/vhyOsp+NRX5pErVehvydn1rDgK+dq+tur9PUOEdJiHhOWF8b0qX/89K8jYxuueXBTZetqCRrsgK8VxrV2aUiKX8peANvC5xHBPFOq4RZs6L4CGpXHkccXtAS4CIFPuIgd+K/mTfJTqPAl5XrXTiiVspGDRjuTTYMztUWgbdZC8Orm808Co+MWKNNy+d1OtZ1KhzRlyHg3zAZN1GB9oGfRWFQ2cs8CWN3lAub2PSCm9oK4L6KXGkziGB+5/1HIqVfC1yK3TQZuEgohEFoY2LGiLqaLm5vVqHr7mg89+Cms0+DkdpthoSlValggr286hBqw/25cPmWgrHEFcrjmYlJgueShM6oqjd7wROoZiLk22xIX+xEwOfjpkiK1WYoflZehL7IHpPYb0eSzzirC3gYxATu/YAAmVvNMZPkuRqfAhv2vMSE1EVpgw8v0iEHEPIXxw1Fk6MA=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "OUKnEXpq/evqBXiWRK7f4sCqX7H/8id5JYJOaOz3GSyRylpx0VdYgA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "JPVgma/uYc2KiR+PuqI2AQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '87881' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 30facb0c-952a-11e9-a000-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue446c19b4/messages + response: + body: + string: "\uFEFFRequestBodyTooLargeThe\ + \ request body is too large and exceeds the maximum permissible limit.\nRequestId:eabc1829-7003-0027-5036-29fe49000000\n\ + Time:2019-06-22T20:13:25.5609374Z65536" + headers: + Content-Length: + - '286' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - RequestBodyTooLarge + x-ms-request-id: + - eabc1829-7003-0027-5036-29fe49000000 + x-ms-version: + - '2018-03-28' + status: + code: 413 + message: The request body is too large and exceeds the maximum permissible limit. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - edd21c9e-952a-11e9-a1a3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:42 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 27cb1041-c003-0017-4e37-29a463000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 88d09846-952b-11e9-8a6f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:02 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 477ad936-f003-00d3-5838-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '65631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 88f0feae-952b-11e9-b9c1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:02 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4/messages + response: + body: + string: "\uFEFFdf795621-a38a-445b-af2c-be364abd3f6cSat,\ + \ 22 Jun 2019 20:23:02 GMTSat, 29 Jun 2019\ + \ 20:23:02 GMTAgAAAAMAAAAAAAAA3qjPSjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:02 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 477ad944-f003-00d3-6338-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "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", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "QmISo1mkQBXdfa4HBs8nUKR6uu4C3dTzH46+PEJDQ4iHsG7WMDBYmA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "Y9IWLuY0dOpwFdGtQj1BnA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '87881' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 89294318-952b-11e9-a1d7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:02 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4/messages + response: + body: + string: "\uFEFFRequestBodyTooLargeThe\ + \ request body is too large and exceeds the maximum permissible limit.\nRequestId:477ad98b-f003-00d3-2538-29dba5000000\n\ + Time:2019-06-22T20:23:03.4451464Z65536" + headers: + Content-Length: + - '286' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - RequestBodyTooLarge + x-ms-request-id: + - 477ad98b-f003-00d3-2538-29dba5000000 + x-ms-version: + - '2018-03-28' + status: + code: 413 + message: The request body is too large and exceeds the maximum permissible limit. +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ceac91c2-952d-11e9-8187-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:18 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ba9a7c50-c003-0094-143a-2904ce000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '65631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ced3c85a-952d-11e9-9768-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4/messages + response: + body: + string: "\uFEFFca0aab08-0630-4edb-9ae7-c1c83d14ba0fSat,\ + \ 22 Jun 2019 20:39:18 GMTSat, 29 Jun 2019\ + \ 20:39:18 GMTAgAAAAMAAAAAAAAA6IOwkDop1QE=Sat,\ + \ 22 Jun 2019 20:39:18 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ba9a7c63-c003-0094-213a-2904ce000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "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", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "LCN2b/JiV3Z69vnuZgKseulmA5jk0Lnd7dyCDOmQ3SNuRpPPOv11LA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "snB/dQMeE56zIkpGb5xYWQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '87881' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - cef23698-952d-11e9-a663-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue446c19b4/messages + response: + body: + string: "\uFEFFRequestBodyTooLargeThe\ + \ request body is too large and exceeds the maximum permissible limit.\nRequestId:ba9a7c87-c003-0094-3c3a-2904ce000000\n\ + Time:2019-06-22T20:39:19.9180789Z65536" + headers: + Content-Length: + - '286' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - RequestBodyTooLarge + x-ms-request-id: + - ba9a7c87-c003-0094-3c3a-2904ce000000 + x-ms-version: + - '2018-03-28' + status: + code: 413 + message: The request body is too large and exceeds the maximum permissible limit. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_nonmatching_kid.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_nonmatching_kid.yaml new file mode 100644 index 000000000000..e933ff039ba8 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_encryption_nonmatching_kid.yaml @@ -0,0 +1,457 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 31ab8ed0-952a-11e9-a42e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:26 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue577f1613 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 261ad55c-0003-0001-0936-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "Fu7ZmVc8HsoOUz3pQB9RVQ==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "cs7deR9JFCX58fNADMaSTCtb/bu3dZjLbkpxhs9pD2Oia3UZ8TVsNA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "eQAi+nOAQQIwhc1aiKopPw==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 31d325c6-952a-11e9-b06f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:26 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue577f1613/messages + response: + body: + string: "\uFEFF6828a1a4-46cd-4e0f-b66b-59bab08df569Sat,\ + \ 22 Jun 2019 20:13:26 GMTSat, 29 Jun 2019\ + \ 20:13:26 GMTAgAAAAMAAAAAAAAAFfGY8zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:26 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 261ad57b-0003-0001-2336-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 31dbe30a-952a-11e9-9a6b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue577f1613/messages + response: + body: + string: "\uFEFF6828a1a4-46cd-4e0f-b66b-59bab08df569Sat,\ + \ 22 Jun 2019 20:13:26 GMTSat, 29 Jun 2019\ + \ 20:13:26 GMTAgAAAAMAAAAAAAAAJyGDBTcp1QE=Sat,\ + \ 22 Jun 2019 20:13:56 GMT1{\"\ + EncryptedMessageContents\": \"Fu7ZmVc8HsoOUz3pQB9RVQ==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"cs7deR9JFCX58fNADMaSTCtb/bu3dZjLbkpxhs9pD2Oia3UZ8TVsNA==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"eQAi+nOAQQIwhc1aiKopPw==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 261ad59a-0003-0001-4036-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - eeb364e4-952a-11e9-a12e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:43 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b1637720-7003-00af-1c37-294690000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8add34ba-952b-11e9-81ce-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:05 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:04 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 84071cce-3003-006f-6038-29ccd4000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "5lEs6kDOI/DMso/HE9gKJw==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "t8K9jbdAsvgacRZP928sfaY22YxlGRogDL1shDITALUrdPtC5rBAEA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "6oKbQ+zTzjvfWcerDHwlYQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8afd178c-952b-11e9-bab2-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:05 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613/messages + response: + body: + string: "\uFEFFe5dbd78c-3f6f-4f63-be14-db169b9a2329Sat,\ + \ 22 Jun 2019 20:23:06 GMTSat, 29 Jun 2019\ + \ 20:23:06 GMTAgAAAAMAAAAAAAAAg8/ETDgp1QE=Sat,\ + \ 22 Jun 2019 20:23:06 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 84071cd8-3003-006f-6838-29ccd4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8b067528-952b-11e9-90f6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:06 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613/messages + response: + body: + string: "\uFEFF6828a1a4-46cd-4e0f-b66b-59bab08df569Sat,\ + \ 22 Jun 2019 20:13:26 GMTSat, 29 Jun 2019\ + \ 20:13:26 GMTAgAAAAMAAAAAAAAA03SvXjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:36 GMT2{\"\ + EncryptedMessageContents\": \"Fu7ZmVc8HsoOUz3pQB9RVQ==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"cs7deR9JFCX58fNADMaSTCtb/bu3dZjLbkpxhs9pD2Oia3UZ8TVsNA==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"eQAi+nOAQQIwhc1aiKopPw==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 84071cdf-3003-006f-6f38-29ccd4000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d1769dee-952d-11e9-83dd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:23 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4f9aa440-0003-00ab-2a3a-29b312000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "3PSOHon02940Hfsbuk5nYQ==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "nbeKbTHqmB+/H05JZSqUXkC/UNxRNt4KN79ppPtdEwKmE8BWHIvpHg==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "u10o6ZIj4v9K9NVCyfD6fQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d19e1c3e-952d-11e9-8d31-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:23 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613/messages + response: + body: + string: "\uFEFF7c911649-3e44-4289-909e-ddc5aaba009fSat,\ + \ 22 Jun 2019 20:39:23 GMTSat, 29 Jun 2019\ + \ 20:39:23 GMTAgAAAAMAAAAAAAAA2+Fpkzop1QE=Sat,\ + \ 22 Jun 2019 20:39:23 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 4f9aa464-0003-00ab-4c3a-29b312000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d1aafbd4-952d-11e9-b58c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:23 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue577f1613/messages + response: + body: + string: "\uFEFF7c911649-3e44-4289-909e-ddc5aaba009fSat,\ + \ 22 Jun 2019 20:39:23 GMTSat, 29 Jun 2019\ + \ 20:39:23 GMTAgAAAAMAAAAAAAAAWjFYpTop1QE=Sat,\ + \ 22 Jun 2019 20:39:53 GMT1{\"\ + EncryptedMessageContents\": \"3PSOHon02940Hfsbuk5nYQ==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"nbeKbTHqmB+/H05JZSqUXkC/UNxRNt4KN79ppPtdEwKmE8BWHIvpHg==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"u10o6ZIj4v9K9NVCyfD6fQ==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:22 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 4f9aa486-0003-00ab-6e3a-29b312000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_kek.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_kek.yaml new file mode 100644 index 000000000000..0909af7e6731 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_kek.yaml @@ -0,0 +1,880 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 31efdc86-952a-11e9-a2f3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - cafe0220-6003-00d6-3736-292fda000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "hGK/0avnjZFdmbos+rHERo3r/37242hP1n5NVK05eMY=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "zfmkUHnFc8QdrolOlAZgux3NFckaLx6wz7zhelA89cce9vlA0LJ4SQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "DmbSlrCUd363R1BFBvv6mg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32124238-952a-11e9-8bec-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFf5a3dffc-e1a6-439f-8f7f-be69c4f8cd1dSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAAkyjY8zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cafe0229-6003-00d6-3d36-292fda000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 321b2a24-952a-11e9-a175-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFf5a3dffc-e1a6-439f-8f7f-be69c4f8cd1dSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAApVjCBTcp1QE=Sat,\ + \ 22 Jun 2019 20:13:57 GMT1{\"\ + EncryptedMessageContents\": \"hGK/0avnjZFdmbos+rHERo3r/37242hP1n5NVK05eMY=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"zfmkUHnFc8QdrolOlAZgux3NFckaLx6wz7zhelA89cce9vlA0LJ4SQ==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"DmbSlrCUd363R1BFBvv6mg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - cafe0233-6003-00d6-4736-292fda000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - eefd2518-952a-11e9-8432-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:44 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:43 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 10d1de33-2003-0016-3e37-29a59e000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8b2c25f4-952b-11e9-84ba-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:06 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c31d1485-7003-0063-5538-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "c+KZdXoEYjXqCd+XZo4mbrhIqr84NmGikFVvp29ITHY=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "zN+StyfNPWdKyIkLwusmcg/+Rco0MIGDo8SFX814ecNkZiXk3qomTw==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "b9MYgN2asjO8Oy1NCboPmw==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8b4ca090-952b-11e9-8664-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:06 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFF2b08d7de-5f0b-4545-8868-ab15efcd8577Sat,\ + \ 22 Jun 2019 20:23:06 GMTSat, 29 Jun 2019\ + \ 20:23:06 GMTAgAAAAMAAAAAAAAANMETTTgp1QE=Sat,\ + \ 22 Jun 2019 20:23:06 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - c31d148e-7003-0063-5b38-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8b5da0ac-952b-11e9-a4a6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:06 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFf5a3dffc-e1a6-439f-8f7f-be69c4f8cd1dSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAAgcwGXzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:36 GMT2{\"\ + EncryptedMessageContents\": \"hGK/0avnjZFdmbos+rHERo3r/37242hP1n5NVK05eMY=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"zfmkUHnFc8QdrolOlAZgux3NFckaLx6wz7zhelA89cce9vlA0LJ4SQ==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"DmbSlrCUd363R1BFBvv6mg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - c31d1496-7003-0063-6238-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 027a3ee8-952c-11e9-99b7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:26:26 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:26:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - f350e9de-f003-005b-1138-29637c000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "lpGVt4CHnQSpZbK2+V7iljZSe3jJI85fVinruRl1wPc=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "26y4KrkrJJGIQZID+ot1IV56Zb+ZsnctUn+kAGImPPztY97bN6+Sbg==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "9YbJyb594aH2dwYENH0vcQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 02a88a82-952c-11e9-8d46-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:26:26 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFc877c463-7281-435f-b395-fe9db87c34a6Sat,\ + \ 22 Jun 2019 20:26:26 GMTSat, 29 Jun 2019\ + \ 20:26:26 GMTAgAAAAMAAAAAAAAA4hhwxDgp1QE=Sat,\ + \ 22 Jun 2019 20:26:26 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:26:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - f350e9e6-f003-005b-1638-29637c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 02b9a0e2-952c-11e9-a4be-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:26:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFF2b08d7de-5f0b-4545-8868-ab15efcd8577Sat,\ + \ 22 Jun 2019 20:23:06 GMTSat, 29 Jun 2019\ + \ 20:23:06 GMTAgAAAAMAAAAAAAAA1Ydi1jgp1QE=Sat,\ + \ 22 Jun 2019 20:26:56 GMT1{\"\ + EncryptedMessageContents\": \"c+KZdXoEYjXqCd+XZo4mbrhIqr84NmGikFVvp29ITHY=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"zN+StyfNPWdKyIkLwusmcg/+Rco0MIGDo8SFX814ecNkZiXk3qomTw==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"b9MYgN2asjO8Oy1NCboPmw==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:26:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f350e9ed-f003-005b-1c38-29637c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bb8b69ca-952c-11e9-8d75-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:31:36 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:31:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 209f3b80-a003-00e9-4a39-299806000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "Dfg2RIBEnUrdqZIgKDZAO5xomPG5mJtW3dLG9hmPIGo=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "In5oCKhIfwvXT+fbgXfa+7/ZbggKLAXo3P6rsU7LmjxijlH7CIFfVQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "StvUB3i3OtbTKTneyV8GVg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbc94fba-952c-11e9-b05e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:31:37 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFF465d8cfc-006d-4e08-b964-df2f7adeb395Sat,\ + \ 22 Jun 2019 20:31:37 GMTSat, 29 Jun 2019\ + \ 20:31:37 GMTAgAAAAMAAAAAAAAAcISRfTkp1QE=Sat,\ + \ 22 Jun 2019 20:31:37 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:31:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 209f3b89-a003-00e9-5039-299806000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - bbd69d34-952c-11e9-bb75-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:31:37 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFf5a3dffc-e1a6-439f-8f7f-be69c4f8cd1dSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAAOkmAjzkp1QE=Sat,\ + \ 22 Jun 2019 20:32:07 GMT3{\"\ + EncryptedMessageContents\": \"hGK/0avnjZFdmbos+rHERo3r/37242hP1n5NVK05eMY=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"zfmkUHnFc8QdrolOlAZgux3NFckaLx6wz7zhelA89cce9vlA0LJ4SQ==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"DmbSlrCUd363R1BFBvv6mg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:31:36 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 209f3b97-a003-00e9-5a39-299806000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d722478a-952c-11e9-b95a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:32:23 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:32:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 40413335-6003-00dd-0339-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "lnNi6Cge9iixerXUNXQit2DwUWzP+fzojrHcICGclsY=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "dSs+S8mnmDoSBoXsrhNuQSnPuis2cTCv78m/LurSehQ8tlERAUK2cA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "dr/uvpes/jzLkjo+E7NGAA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d7492a30-952c-11e9-8427-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:32:23 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFe56d81e7-83b4-4a9f-bcf1-66a39d8c373bSat,\ + \ 22 Jun 2019 20:32:23 GMTSat, 29 Jun 2019\ + \ 20:32:23 GMTAgAAAAMAAAAAAAAAqi0RmTkp1QE=Sat,\ + \ 22 Jun 2019 20:32:23 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:32:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 40413341-6003-00dd-0a39-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d751aff4-952c-11e9-8640-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:32:23 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFc877c463-7281-435f-b395-fe9db87c34a6Sat,\ + \ 22 Jun 2019 20:26:26 GMTSat, 29 Jun 2019\ + \ 20:26:26 GMTAgAAAAMAAAAAAAAAjg/7qjkp1QE=Sat,\ + \ 22 Jun 2019 20:32:53 GMT1{\"\ + EncryptedMessageContents\": \"lpGVt4CHnQSpZbK2+V7iljZSe3jJI85fVinruRl1wPc=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"26y4KrkrJJGIQZID+ot1IV56Zb+ZsnctUn+kAGImPPztY97bN6+Sbg==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"9YbJyb594aH2dwYENH0vcQ==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:32:23 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 40413345-6003-00dd-0d39-2937ae000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d23aa342-952d-11e9-a9ec-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:24 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2f000919-9003-00a5-7c3a-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "d5v8QK2Hia8IVxotrcyyHGa6qRvYkSEoC/OirEP/vZQ=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "P+UNIBYXwFzygN7okh8pn/3i621Ubrh1lKtN+4LnXDa5B4gw+tTCmA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "yZoVuTfcM2GXVQPyjFI5xQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d25f4c42-952d-11e9-a88f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:24 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFbb536da4-52a1-4e90-be11-dbe341b9584cSat,\ + \ 22 Jun 2019 20:39:24 GMTSat, 29 Jun 2019\ + \ 20:39:24 GMTAgAAAAMAAAAAAAAA+GAnlDop1QE=Sat,\ + \ 22 Jun 2019 20:39:24 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2f000926-9003-00a5-063a-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d268469e-952d-11e9-9bed-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:24 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue546e15fa/messages + response: + body: + string: "\uFEFFbb536da4-52a1-4e90-be11-dbe341b9584cSat,\ + \ 22 Jun 2019 20:39:24 GMTSat, 29 Jun 2019\ + \ 20:39:24 GMTAgAAAAMAAAAAAAAAZy0Spjop1QE=Sat,\ + \ 22 Jun 2019 20:39:54 GMT1{\"\ + EncryptedMessageContents\": \"d5v8QK2Hia8IVxotrcyyHGa6qRvYkSEoC/OirEP/vZQ=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"P+UNIBYXwFzygN7okh8pn/3i621Ubrh1lKtN+4LnXDa5B4gw+tTCmA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"yZoVuTfcM2GXVQPyjFI5xQ==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:24 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2f000931-9003-00a5-0f3a-295f19000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_resolver.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_resolver.yaml new file mode 100644 index 000000000000..bef8e60a9b43 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_messages_encrypted_resolver.yaml @@ -0,0 +1,460 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 322ead10-952a-11e9-93df-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9311831 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d3526754-d003-0047-0c36-29bb6b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "4yy325v0qAy7xznTeBPiv06jde5O0wZy1zWOyLDk6kU=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "HUhg0lR1ICmBUahj7gMPDyGXvbhOsGSEbRTHd9A+SKkP9I+/pmvfpA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "sSbVxNO1NyXqtsw5tcoZUw==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 324ed158-952a-11e9-b390-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9311831/messages + response: + body: + string: "\uFEFF3e5344fa-4095-4c57-9f4e-900101047ffbSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAAWXkU9DYp1QE=Sat,\ + \ 22 Jun 2019 20:13:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - d3526770-d003-0047-2536-29bb6b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 325c12c8-952a-11e9-a479-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9311831/messages + response: + body: + string: "\uFEFF3e5344fa-4095-4c57-9f4e-900101047ffbSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAAIz4DBjcp1QE=Sat,\ + \ 22 Jun 2019 20:13:57 GMT1{\"\ + EncryptedMessageContents\": \"4yy325v0qAy7xznTeBPiv06jde5O0wZy1zWOyLDk6kU=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"HUhg0lR1ICmBUahj7gMPDyGXvbhOsGSEbRTHd9A+SKkP9I+/pmvfpA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"sSbVxNO1NyXqtsw5tcoZUw==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d3526799-d003-0047-4c36-29bb6b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ef3f67dc-952a-11e9-990a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:44 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54d9758a-f003-00be-0d37-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8b832ed0-952b-11e9-bdd9-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:06 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9911f38a-e003-0044-6538-29b86c000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "imo7JjqY8K9aZ0evMg5dPx1EHjdMqk18QjrIHIoZdI0=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "4stkMePQUT30VwBQUA8RNMkT9kgMUyWbzK7f+iH48nAJDVwlgylXog==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "VnT20d1CRa9DjxPTRklRAA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8ba40cc2-952b-11e9-bb19-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:07 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831/messages + response: + body: + string: "\uFEFF26a4ceaf-5c00-48d7-8624-9ee187ada845Sat,\ + \ 22 Jun 2019 20:23:07 GMTSat, 29 Jun 2019\ + \ 20:23:07 GMTAgAAAAMAAAAAAAAARo5rTTgp1QE=Sat,\ + \ 22 Jun 2019 20:23:07 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 9911f391-e003-0044-6a38-29b86c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8bad6998-952b-11e9-9651-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:07 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831/messages + response: + body: + string: "\uFEFF3e5344fa-4095-4c57-9f4e-900101047ffbSat,\ + \ 22 Jun 2019 20:13:27 GMTSat, 29 Jun 2019\ + \ 20:13:27 GMTAgAAAAMAAAAAAAAAnTNWXzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:37 GMT2{\"\ + EncryptedMessageContents\": \"4yy325v0qAy7xznTeBPiv06jde5O0wZy1zWOyLDk6kU=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"HUhg0lR1ICmBUahj7gMPDyGXvbhOsGSEbRTHd9A+SKkP9I+/pmvfpA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"sSbVxNO1NyXqtsw5tcoZUw==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9911f393-e003-0044-6c38-29b86c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d2de10a4-952d-11e9-8cb3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:25 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e7a7414a-d003-00cf-563a-2903b2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "mGrHnyAmB9R008rsg7W/nol1JIZzfHt1dDu88cXhA00=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "1ti9m7p2oiMmndWQQdTd3bCJl/pj0ebsWErLsgA2q33c9tLJkKPCbA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "r8PEFFq1BhvFn/6dykh1uw==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d304d89c-952d-11e9-bace-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:25 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831/messages + response: + body: + string: "\uFEFFdbf35a1f-9293-433c-8226-c0bec223bf43Sat,\ + \ 22 Jun 2019 20:39:25 GMTSat, 29 Jun 2019\ + \ 20:39:25 GMTAgAAAAMAAAAAAAAA/W3OlDop1QE=Sat,\ + \ 22 Jun 2019 20:39:25 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e7a74164-d003-00cf-6e3a-2903b2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d3129702-952d-11e9-9f52-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:25 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec9311831/messages + response: + body: + string: "\uFEFFdbf35a1f-9293-433c-8226-c0bec223bf43Sat,\ + \ 22 Jun 2019 20:39:25 GMTSat, 29 Jun 2019\ + \ 20:39:25 GMTAgAAAAMAAAAAAAAAwjK9pjop1QE=Sat,\ + \ 22 Jun 2019 20:39:55 GMT1{\"\ + EncryptedMessageContents\": \"mGrHnyAmB9R008rsg7W/nol1JIZzfHt1dDu88cXhA00=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"1ti9m7p2oiMmndWQQdTd3bCJl/pj0ebsWErLsgA2q33c9tLJkKPCbA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"r8PEFFq1BhvFn/6dykh1uw==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e7a74184-d003-00cf-0c3a-2903b2000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_with_strict_mode.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_with_strict_mode.yaml new file mode 100644 index 000000000000..fb19c7685083 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_get_with_strict_mode.yaml @@ -0,0 +1,430 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32701ffa-952a-11e9-82c0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueued7de1393 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a7d12c23-7003-0005-6236-29907f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '102' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32913d06-952a-11e9-97b4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueued7de1393/messages + response: + body: + string: "\uFEFFf2d21db6-31b8-47a7-8786-319979908e03Sat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMTAgAAAAMAAAAAAAAA1QxX9DYp1QE=Sat,\ + \ 22 Jun 2019 20:13:28 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a7d12c2c-7003-0005-6836-29907f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 329a48d8-952a-11e9-877d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueued7de1393/messages + response: + body: + string: "\uFEFFf2d21db6-31b8-47a7-8786-319979908e03Sat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMTAgAAAAMAAAAAAAAA/2NBBjcp1QE=Sat,\ + \ 22 Jun 2019 20:13:58 GMT1message" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a7d12c2d-7003-0005-6936-29907f000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ef81acdc-952a-11e9-a31e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9dea9a5c-4003-0049-2837-295760000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8bd35a9a-952b-11e9-a72b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:07 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:07 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 261e21fc-0003-0001-5f38-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + message' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '102' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8bf4970a-952b-11e9-8080-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:07 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393/messages + response: + body: + string: "\uFEFF8172b458-e77c-4b26-b589-7efe580c5d8eSat,\ + \ 22 Jun 2019 20:23:07 GMTSat, 29 Jun 2019\ + \ 20:23:07 GMTAgAAAAMAAAAAAAAA5N+7TTgp1QE=Sat,\ + \ 22 Jun 2019 20:23:07 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:07 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 261e2225-0003-0001-0338-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8bfd7ff0-952b-11e9-a7c6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:07 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393/messages + response: + body: + string: "\uFEFFf2d21db6-31b8-47a7-8786-319979908e03Sat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMTAgAAAAMAAAAAAAAACjemXzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:37 GMT2message" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:07 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 261e2237-0003-0001-1538-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d361dc18-952d-11e9-af8d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:26 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:25 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 228cb02f-c003-00db-093a-29c0d6000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '102' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d385957a-952d-11e9-a32e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:26 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393/messages + response: + body: + string: "\uFEFF40a29134-d895-49d5-961b-8ddee46ba737Sat,\ + \ 22 Jun 2019 20:39:26 GMTSat, 29 Jun 2019\ + \ 20:39:26 GMTAgAAAAMAAAAAAAAAJCdPlTop1QE=Sat,\ + \ 22 Jun 2019 20:39:26 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 228cb03c-c003-00db-113a-29c0d6000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d3905494-952d-11e9-b8c7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:26 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueued7de1393/messages + response: + body: + string: "\uFEFF40a29134-d895-49d5-961b-8ddee46ba737Sat,\ + \ 22 Jun 2019 20:39:26 GMTSat, 29 Jun 2019\ + \ 20:39:26 GMTAgAAAAMAAAAAAAAATSw7pzop1QE=Sat,\ + \ 22 Jun 2019 20:39:56 GMT1message" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 228cb03e-c003-00db-133a-29c0d6000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_unwrap.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_unwrap.yaml new file mode 100644 index 000000000000..42c72caad083 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_unwrap.yaml @@ -0,0 +1,601 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32ad7f9e-952a-11e9-8f0b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue29091535 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a7dae6db-c003-009f-6136-291cba000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "QIu8K//FhoO1Un9Rhw+p0A==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "qAHXixeQZeUVh7hjnKNQxHOv88/mypVsb3uPeIawSLDdiQXcUaovzw==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "aukQ/2aQFS7lFynt9ABQmA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32d0dacc-952a-11e9-b029-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue29091535/messages + response: + body: + string: "\uFEFF3fdb6dbd-cc0a-44b5-8830-47a32fe27eddSat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMTAgAAAAMAAAAAAAAArOCW9DYp1QE=Sat,\ + \ 22 Jun 2019 20:13:28 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a7dae6e5-c003-009f-6636-291cba000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32d9ce5c-952a-11e9-aa7d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue29091535/messages?peekonly=true + response: + body: + string: "\uFEFF3fdb6dbd-cc0a-44b5-8830-47a32fe27eddSat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMT0{\"\ + EncryptedMessageContents\": \"QIu8K//FhoO1Un9Rhw+p0A==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"qAHXixeQZeUVh7hjnKNQxHOv88/mypVsb3uPeIawSLDdiQXcUaovzw==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"aukQ/2aQFS7lFynt9ABQmA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a7dae6e7-c003-009f-6736-291cba000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32e2c168-952a-11e9-9f66-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue29091535/messages?peekonly=true + response: + body: + string: "\uFEFF3fdb6dbd-cc0a-44b5-8830-47a32fe27eddSat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMT0{\"\ + EncryptedMessageContents\": \"QIu8K//FhoO1Un9Rhw+p0A==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"qAHXixeQZeUVh7hjnKNQxHOv88/mypVsb3uPeIawSLDdiQXcUaovzw==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"aukQ/2aQFS7lFynt9ABQmA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a7dae6ed-c003-009f-6b36-291cba000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - efc20cd2-952a-11e9-81c5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a7d19055-7003-0005-2837-29907f000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8c23bba2-952b-11e9-94c0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:07 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 49277c4f-c003-0058-1f38-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "HUP/KdFXOIVjdt3oXlGn7w==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "HUwPw4ysU1j07dT1mssWuw7tJj75/QrFyinLtnw7dnw4mP/AnLZpVA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "tYlV2JKFK6xehQi91DP1Iw==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8c48af86-952b-11e9-9b7a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:08 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535/messages + response: + body: + string: "\uFEFF0f86b0f7-5a71-430e-bc09-30b8e3d31e04Sat,\ + \ 22 Jun 2019 20:23:08 GMTSat, 29 Jun 2019\ + \ 20:23:08 GMTAgAAAAMAAAAAAAAABJ8QTjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:08 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 49277c61-c003-0058-2f38-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8c56ee78-952b-11e9-9673-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:08 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535/messages?peekonly=true + response: + body: + string: "\uFEFF3fdb6dbd-cc0a-44b5-8830-47a32fe27eddSat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMT0{\"\ + EncryptedMessageContents\": \"QIu8K//FhoO1Un9Rhw+p0A==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"qAHXixeQZeUVh7hjnKNQxHOv88/mypVsb3uPeIawSLDdiQXcUaovzw==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"aukQ/2aQFS7lFynt9ABQmA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 49277c7a-c003-0058-4638-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8c5fd7fe-952b-11e9-98b8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:08 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535/messages?peekonly=true + response: + body: + string: "\uFEFF3fdb6dbd-cc0a-44b5-8830-47a32fe27eddSat,\ + \ 22 Jun 2019 20:13:28 GMTSat, 29 Jun 2019\ + \ 20:13:28 GMT0{\"\ + EncryptedMessageContents\": \"QIu8K//FhoO1Un9Rhw+p0A==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"qAHXixeQZeUVh7hjnKNQxHOv88/mypVsb3uPeIawSLDdiQXcUaovzw==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"aukQ/2aQFS7lFynt9ABQmA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 49277c90-c003-0058-5938-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d3ebaa9c-952d-11e9-810d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:27 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a1c572d4-e003-00aa-2b3a-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "xKDBJnVr+OpKJrXwn72e/w==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "8t2f1vsTc2wQMC4hptUyBCsJvPyzZqTDEceeASDs+Vb8XSb8az6X/Q==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "OH5+mPLLGIkaQKWr776bKg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d40c4f36-952d-11e9-b1f5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:27 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535/messages + response: + body: + string: "\uFEFF1c8481f8-7d6c-4e06-a525-5bac9a2a776eSat,\ + \ 22 Jun 2019 20:39:27 GMTSat, 29 Jun 2019\ + \ 20:39:27 GMTAgAAAAMAAAAAAAAATJzUlTop1QE=Sat,\ + \ 22 Jun 2019 20:39:27 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:26 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a1c572e2-e003-00aa-363a-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d4158fe2-952d-11e9-b79a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:27 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535/messages?peekonly=true + response: + body: + string: "\uFEFF1c8481f8-7d6c-4e06-a525-5bac9a2a776eSat,\ + \ 22 Jun 2019 20:39:27 GMTSat, 29 Jun 2019\ + \ 20:39:27 GMT0{\"\ + EncryptedMessageContents\": \"xKDBJnVr+OpKJrXwn72e/w==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"8t2f1vsTc2wQMC4hptUyBCsJvPyzZqTDEceeASDs+Vb8XSb8az6X/Q==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"OH5+mPLLGIkaQKWr776bKg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a1c572ef-e003-00aa-433a-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d41eed26-952d-11e9-8c32-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:27 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue29091535/messages?peekonly=true + response: + body: + string: "\uFEFF1c8481f8-7d6c-4e06-a525-5bac9a2a776eSat,\ + \ 22 Jun 2019 20:39:27 GMTSat, 29 Jun 2019\ + \ 20:39:27 GMT0{\"\ + EncryptedMessageContents\": \"xKDBJnVr+OpKJrXwn72e/w==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"8t2f1vsTc2wQMC4hptUyBCsJvPyzZqTDEceeASDs+Vb8XSb8az6X/Q==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"OH5+mPLLGIkaQKWr776bKg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a1c572fa-e003-00aa-4c3a-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_wrap.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_wrap.yaml new file mode 100644 index 000000000000..773eae71c32f --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_invalid_value_kek_wrap.yaml @@ -0,0 +1,154 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 32f85336-952a-11e9-9f32-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:28 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuefee61452 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 498fa121-d003-0003-0536-296707000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f000038c-952a-11e9-968f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuefee61452 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 6ed8b631-b003-0090-1137-29f14c000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8c862ce2-952b-11e9-9fe4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:08 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuefee61452 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - bbde8fa6-9003-002d-5c38-29e7c0000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d46aa7d4-952d-11e9-9602-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:28 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuefee61452 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 4bf657e7-b003-0013-4d3a-2951e1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_unrwap.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_unrwap.yaml new file mode 100644 index 000000000000..9f787830df40 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_unrwap.yaml @@ -0,0 +1,601 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 331f7682-952a-11e9-a484-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue847016ff + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9e23adff-c003-00bd-4b36-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "xITZKlfcChO/kDAWLJQxkg==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "AMIWR8IcamDoq1aRY2peAAXHmUBCQ+ED8xvnxUEJukCSJXNK+KoN1g==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "rptbBw1EoSa//sCOhPjpNA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33404b8c-952a-11e9-a5b0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:29 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue847016ff/messages + response: + body: + string: "\uFEFFfc91b88f-4ff5-45b7-81ef-566af61ba2dcSat,\ + \ 22 Jun 2019 20:13:29 GMTSat, 29 Jun 2019\ + \ 20:13:29 GMTAgAAAAMAAAAAAAAAowoG9TYp1QE=Sat,\ + \ 22 Jun 2019 20:13:29 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 9e23ae19-c003-00bd-6236-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33499e9e-952a-11e9-8b78-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue847016ff/messages?peekonly=true + response: + body: + string: "\uFEFFfc91b88f-4ff5-45b7-81ef-566af61ba2dcSat,\ + \ 22 Jun 2019 20:13:29 GMTSat, 29 Jun 2019\ + \ 20:13:29 GMT0{\"\ + EncryptedMessageContents\": \"xITZKlfcChO/kDAWLJQxkg==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"AMIWR8IcamDoq1aRY2peAAXHmUBCQ+ED8xvnxUEJukCSJXNK+KoN1g==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"rptbBw1EoSa//sCOhPjpNA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9e23ae3a-c003-00bd-7f36-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 3351c1b4-952a-11e9-a5a0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue847016ff/messages?peekonly=true + response: + body: + string: "\uFEFFfc91b88f-4ff5-45b7-81ef-566af61ba2dcSat,\ + \ 22 Jun 2019 20:13:29 GMTSat, 29 Jun 2019\ + \ 20:13:29 GMT0{\"\ + EncryptedMessageContents\": \"xITZKlfcChO/kDAWLJQxkg==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"AMIWR8IcamDoq1aRY2peAAXHmUBCQ+ED8xvnxUEJukCSJXNK+KoN1g==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"rptbBw1EoSa//sCOhPjpNA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9e23ae56-c003-00bd-1936-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f0432268-952a-11e9-a153-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:46 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fea5e38f-b003-00df-7f37-293554000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8cbd940c-952b-11e9-8cbe-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:08 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b6b6fb9f-b003-007e-5638-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "OR6Lg0hw0MxMLgBhhrUbzA==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "pP9cGuesLaBH8V8Ir3ka0ZRzROHlamBD+tZA+OqriHE+NfVH0e9MAQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "+Bkftq995w9Yf5VkEuHLKg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8cde79ec-952b-11e9-8a49-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:09 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff/messages + response: + body: + string: "\uFEFF4de281d7-7bd9-4e63-98d1-6dcfebdd0149Sat,\ + \ 22 Jun 2019 20:23:09 GMTSat, 29 Jun 2019\ + \ 20:23:09 GMTAgAAAAMAAAAAAAAAYM6lTjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:09 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b6b6fba9-b003-007e-5b38-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8ce79d88-952b-11e9-b6a0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:09 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff/messages?peekonly=true + response: + body: + string: "\uFEFFfc91b88f-4ff5-45b7-81ef-566af61ba2dcSat,\ + \ 22 Jun 2019 20:13:29 GMTSat, 29 Jun 2019\ + \ 20:13:29 GMT0{\"\ + EncryptedMessageContents\": \"xITZKlfcChO/kDAWLJQxkg==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"AMIWR8IcamDoq1aRY2peAAXHmUBCQ+ED8xvnxUEJukCSJXNK+KoN1g==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"rptbBw1EoSa//sCOhPjpNA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b6b6fbaf-b003-007e-6038-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8cf05fa4-952b-11e9-8883-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:09 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff/messages?peekonly=true + response: + body: + string: "\uFEFFfc91b88f-4ff5-45b7-81ef-566af61ba2dcSat,\ + \ 22 Jun 2019 20:13:29 GMTSat, 29 Jun 2019\ + \ 20:13:29 GMT0{\"\ + EncryptedMessageContents\": \"xITZKlfcChO/kDAWLJQxkg==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"AMIWR8IcamDoq1aRY2peAAXHmUBCQ+ED8xvnxUEJukCSJXNK+KoN1g==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"rptbBw1EoSa//sCOhPjpNA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b6b6fbb4-b003-007e-6438-29fbcf000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d4faef92-952d-11e9-83fb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ac2451f1-a003-00a6-2e3a-295c1e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "7007ike+4yZv9ifbl4bL8A==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "PJrNGMkztsMYiaWM1Ew6xPN6mH6fuLDpkj1+W5LjIIdMWUZ5EbHEcQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "a9gO3hv/2f7uvHz/853zxg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d7973814-952d-11e9-bd72-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff/messages + response: + body: + string: "\uFEFFddaf575b-4551-40f8-8b89-2604d77284b9Sat,\ + \ 22 Jun 2019 20:39:33 GMTSat, 29 Jun 2019\ + \ 20:39:33 GMTAgAAAAMAAAAAAAAA091emTop1QE=Sat,\ + \ 22 Jun 2019 20:39:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ac245243-a003-00a6-5b3a-295c1e000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d79fcd8a-952d-11e9-a25a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff/messages?peekonly=true + response: + body: + string: "\uFEFFddaf575b-4551-40f8-8b89-2604d77284b9Sat,\ + \ 22 Jun 2019 20:39:33 GMTSat, 29 Jun 2019\ + \ 20:39:33 GMT0{\"\ + EncryptedMessageContents\": \"7007ike+4yZv9ifbl4bL8A==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"PJrNGMkztsMYiaWM1Ew6xPN6mH6fuLDpkj1+W5LjIIdMWUZ5EbHEcQ==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"a9gO3hv/2f7uvHz/853zxg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ac245244-a003-00a6-5c3a-295c1e000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d7a82ec6-952d-11e9-b41b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue847016ff/messages?peekonly=true + response: + body: + string: "\uFEFFddaf575b-4551-40f8-8b89-2604d77284b9Sat,\ + \ 22 Jun 2019 20:39:33 GMTSat, 29 Jun 2019\ + \ 20:39:33 GMT0{\"\ + EncryptedMessageContents\": \"7007ike+4yZv9ifbl4bL8A==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"PJrNGMkztsMYiaWM1Ew6xPN6mH6fuLDpkj1+W5LjIIdMWUZ5EbHEcQ==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"a9gO3hv/2f7uvHz/853zxg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ac245245-a003-00a6-5d3a-295c1e000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_wrap.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_wrap.yaml new file mode 100644 index 000000000000..2c7b11326c5c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_missing_attribute_kek_wrap.yaml @@ -0,0 +1,154 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33680d86-952a-11e9-9e5d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue56cd161c + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d64ee3ff-2003-00d1-6736-29d95f000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f084b336-952a-11e9-a945-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:46 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue56cd161c + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:46 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c31c990f-7003-0063-3337-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8d2b5c4c-952b-11e9-b476-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:09 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue56cd161c + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2c9e0d1a-e003-0022-5f38-290a36000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d7f019ca-952d-11e9-a7ab-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:34 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue56cd161c + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - e60599c7-9003-0026-493a-29ffb4000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_kek.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_kek.yaml new file mode 100644 index 000000000000..d1f249b34dce --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_kek.yaml @@ -0,0 +1,457 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 3390cd0a-952a-11e9-9980-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue6a6e165f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c31bff3d-7003-0063-4b36-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "2ZYsyOnVCjohYaGQvNtetNRMPxHZ+931t1m02hNTyLs=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "CNnCoRdJpyTfPbp8rKvKVyjqhVoyNwiCDXv/8l51q9Vm3CHKl2dOAw==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "Zj465sQEp0GaX2TlT5jVVg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33b821d4-952a-11e9-9f13-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue6a6e165f/messages + response: + body: + string: "\uFEFF4b56787a-56af-40e0-95a9-dd2d2969695aSat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMTAgAAAAMAAAAAAAAAzg9+9TYp1QE=Sat,\ + \ 22 Jun 2019 20:13:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - c31bff57-7003-0063-6336-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33c29a68-952a-11e9-8e1f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueue6a6e165f/messages?peekonly=true + response: + body: + string: "\uFEFF4b56787a-56af-40e0-95a9-dd2d2969695aSat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMT0{\"\ + EncryptedMessageContents\": \"2ZYsyOnVCjohYaGQvNtetNRMPxHZ+931t1m02hNTyLs=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"CNnCoRdJpyTfPbp8rKvKVyjqhVoyNwiCDXv/8l51q9Vm3CHKl2dOAw==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"Zj465sQEp0GaX2TlT5jVVg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:29 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - c31bff78-7003-0063-0236-292225000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f0c0b71e-952a-11e9-88a6-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 73ce5d6b-2003-0095-5337-290533000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8d634488-952b-11e9-b7f5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:09 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ace44acd-c003-00b6-3a38-296af8000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "gtXiNLhAmoCyUPT7P5vc679447BW1boFSKnXi50hkHo=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "1X/hnLB6FUbj6Pw6jdyXUvhEPwtvGpErq63T//3nHx2K3U7KF6wARw==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "Sqvyb9wAM6MLKuFjuSlrww==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8d8588cc-952b-11e9-9545-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:10 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f/messages + response: + body: + string: "\uFEFF81ebbcd0-52d0-43c5-b5b3-e20273e8296eSat,\ + \ 22 Jun 2019 20:23:10 GMTSat, 29 Jun 2019\ + \ 20:23:10 GMTAgAAAAMAAAAAAAAAZgJNTzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:10 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ace44ae7-c003-00b6-4f38-296af8000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8d95b95e-952b-11e9-8fd8-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:10 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f/messages?peekonly=true + response: + body: + string: "\uFEFF4b56787a-56af-40e0-95a9-dd2d2969695aSat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMT0{\"\ + EncryptedMessageContents\": \"2ZYsyOnVCjohYaGQvNtetNRMPxHZ+931t1m02hNTyLs=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"CNnCoRdJpyTfPbp8rKvKVyjqhVoyNwiCDXv/8l51q9Vm3CHKl2dOAw==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"Zj465sQEp0GaX2TlT5jVVg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ace44b07-c003-00b6-6d38-296af8000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d8430d24-952d-11e9-a4be-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:34 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 61b13014-0003-006c-753a-29cfd3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "8Sou7XKmSZOEdubeMRic0Bb+cjHuwA52mF6vgVzVS+4=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "eaJ2R5ZNEgfVeaEwSslsa1DV1/qYshAYfJ68chiQ5QqEJUJCHYbzBQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "FFlln3thBE0MkdlgN6OBXA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d8631100-952d-11e9-9490-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:34 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f/messages + response: + body: + string: "\uFEFFd0473797-7057-465d-92b3-35fa9e215240Sat,\ + \ 22 Jun 2019 20:39:34 GMTSat, 29 Jun 2019\ + \ 20:39:34 GMTAgAAAAMAAAAAAAAAuN4qmjop1QE=Sat,\ + \ 22 Jun 2019 20:39:34 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 61b13027-0003-006c-033a-29cfd3000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d86c1480-952d-11e9-bcca-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:34 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueue6a6e165f/messages?peekonly=true + response: + body: + string: "\uFEFFd0473797-7057-465d-92b3-35fa9e215240Sat,\ + \ 22 Jun 2019 20:39:34 GMTSat, 29 Jun 2019\ + \ 20:39:34 GMT0{\"\ + EncryptedMessageContents\": \"8Sou7XKmSZOEdubeMRic0Bb+cjHuwA52mF6vgVzVS+4=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"eaJ2R5ZNEgfVeaEwSslsa1DV1/qYshAYfJ68chiQ5QqEJUJCHYbzBQ==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"FFlln3thBE0MkdlgN6OBXA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:34 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 61b13038-0003-006c-113a-29cfd3000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_resolver.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_resolver.yaml new file mode 100644 index 000000000000..5dfe39f4288e --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_peek_messages_encrypted_resolver.yaml @@ -0,0 +1,457 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33d7384c-952a-11e9-affc-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuee12a1896 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 59eec5c5-d003-00e6-3f36-2975f0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "hK6PF2bGXpcBu4hpdvCZPPv3iTBsMIvRSOc4OGiDrV0=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "dy0w/zF/yZqBZc1yvI6ZjqwNi6fke2W1KhCcybuvQgwvfqQpkoOhYg==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "iJhlhYtfBFCuSHuf8785PA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 33f7b024-952a-11e9-80a0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuee12a1896/messages + response: + body: + string: "\uFEFF0d7655d5-508b-4d96-b956-0df9aa83fbefSat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMTAgAAAAMAAAAAAAAAe5W99TYp1QE=Sat,\ + \ 22 Jun 2019 20:13:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 59eec5d0-d003-00e6-4836-2975f0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 3400a8fa-952a-11e9-883f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuee12a1896/messages?peekonly=true + response: + body: + string: "\uFEFF0d7655d5-508b-4d96-b956-0df9aa83fbefSat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMT0{\"\ + EncryptedMessageContents\": \"hK6PF2bGXpcBu4hpdvCZPPv3iTBsMIvRSOc4OGiDrV0=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"dy0w/zF/yZqBZc1yvI6ZjqwNi6fke2W1KhCcybuvQgwvfqQpkoOhYg==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"iJhlhYtfBFCuSHuf8785PA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 59eec5d7-d003-00e6-4f36-2975f0000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f104b90a-952a-11e9-9ded-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:47 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9defca6b-e003-0066-3737-29d65a000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8dbde3c0-952b-11e9-9050-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:10 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 3d12afa5-e003-00c7-0438-2918c1000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "OJPrYZtbOVSrS7izsyo1ryYIT3e8g6A0aoI+ioLxlGo=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "N757TctIvG5ri330dQrs+nUjjZwJEtwoFpfd/g7XVcgKfiNjjI4MZg==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "eqM68amerKgpl1JbHxNS/A==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8ddea986-952b-11e9-bfac-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:10 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896/messages + response: + body: + string: "\uFEFFc99d8a90-887f-43a3-81cc-0eb853af3068Sat,\ + \ 22 Jun 2019 20:23:10 GMTSat, 29 Jun 2019\ + \ 20:23:10 GMTAgAAAAMAAAAAAAAADQimTzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:10 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3d12afaa-e003-00c7-0738-2918c1000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8de794f4-952b-11e9-8cdd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:10 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896/messages?peekonly=true + response: + body: + string: "\uFEFF0d7655d5-508b-4d96-b956-0df9aa83fbefSat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMT0{\"\ + EncryptedMessageContents\": \"hK6PF2bGXpcBu4hpdvCZPPv3iTBsMIvRSOc4OGiDrV0=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"dy0w/zF/yZqBZc1yvI6ZjqwNi6fke2W1KhCcybuvQgwvfqQpkoOhYg==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"iJhlhYtfBFCuSHuf8785PA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:09 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3d12afb3-e003-00c7-0e38-2918c1000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d8c19b94-952d-11e9-a27c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:35 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b53dab7c-4003-0060-743a-292122000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "YQ3VAbEfoG/ImNpQoapdkH8MqIZ6A3p9cpsQSw43Mzc=", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "xTfGl2P4RztDZZ/NUaIgPqiAJUtTWzyBVvwaIdaT5BM+GJKrb/4IAQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "7vpPaevGMrDtksyvpnod6Q==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '521' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d8e8991a-952d-11e9-88a1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:35 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896/messages + response: + body: + string: "\uFEFF505e8379-5305-4beb-a5b5-85494f25d7a9Sat,\ + \ 22 Jun 2019 20:39:35 GMTSat, 29 Jun 2019\ + \ 20:39:35 GMTAgAAAAMAAAAAAAAAajqzmjop1QE=Sat,\ + \ 22 Jun 2019 20:39:35 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - b53daba6-4003-0060-1c3a-292122000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d8f46bfa-952d-11e9-9e92-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:35 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuee12a1896/messages?peekonly=true + response: + body: + string: "\uFEFF505e8379-5305-4beb-a5b5-85494f25d7a9Sat,\ + \ 22 Jun 2019 20:39:35 GMTSat, 29 Jun 2019\ + \ 20:39:35 GMT0{\"\ + EncryptedMessageContents\": \"YQ3VAbEfoG/ImNpQoapdkH8MqIZ6A3p9cpsQSw43Mzc=\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"xTfGl2P4RztDZZ/NUaIgPqiAJUtTWzyBVvwaIdaT5BM+GJKrb/4IAQ==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"7vpPaevGMrDtksyvpnod6Q==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b53dabc8-4003-0060-3b3a-292122000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_put_with_strict_mode.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_put_with_strict_mode.yaml new file mode 100644 index 000000000000..54bbe3dbab9b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_put_with_strict_mode.yaml @@ -0,0 +1,307 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 3414f080-952a-11e9-9536-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueued9c213ac + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 49260c59-c003-0058-2d36-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "k+pdQqJv2/oFol+BwKHqnA==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "G+8O1kwr+1voAZ4h8MJZwHzkh78Vfa/9w3AX52XSyOLiOGJiaRACRA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "PLk3vnPI+8cge4jLh28Z+w==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 34350ce4-952a-11e9-93c0-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueued9c213ac/messages + response: + body: + string: "\uFEFFbf9167df-0c07-433b-bf30-51797b0fef92Sat,\ + \ 22 Jun 2019 20:13:30 GMTSat, 29 Jun 2019\ + \ 20:13:30 GMTAgAAAAMAAAAAAAAA4/f69TYp1QE=Sat,\ + \ 22 Jun 2019 20:13:30 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 49260c5c-c003-0058-2e36-29607b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f142367a-952a-11e9-9659-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueued9c213ac + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:47 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7fe36c27-2003-001d-6c37-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e0c2936-952b-11e9-89db-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueued9c213ac + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 73ce9d68-2003-0095-0c38-290533000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "vIO6/UuQwrc45al1lxmt5w==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "R5YmjrySV/3AuIiHx1GXQzyf7MwkSXYopnUQEQihqbCHxpe1nBBF+Q==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "XijvE+gdZ7diXNmIqEKGgA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e2c43ec-952b-11e9-96d7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueued9c213ac/messages + response: + body: + string: "\uFEFFf019bc9b-54e3-4f24-a984-515b0f328a03Sat,\ + \ 22 Jun 2019 20:23:11 GMTSat, 29 Jun 2019\ + \ 20:23:11 GMTAgAAAAMAAAAAAAAA13LzTzgp1QE=Sat,\ + \ 22 Jun 2019 20:23:11 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 73ce9d6f-2003-0095-1038-290533000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d9d2f462-952d-11e9-bdf3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:37 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueued9c213ac + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 26244d73-0003-0001-303a-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "5qfI+NgHnUb8g3keO1YL7g==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "CvFsR6aEDyvXuMswoSU5x7oWc1A6cSBv9S4nsjxd1QYAdtGR82Lclw==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "bXczsOu2Sy7unQssYZr2Ng==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d9f27740-952d-11e9-94ad-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:37 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueued9c213ac/messages + response: + body: + string: "\uFEFF3407cfc2-ea34-4140-8309-960cc0f9c78cSat,\ + \ 22 Jun 2019 20:39:37 GMTSat, 29 Jun 2019\ + \ 20:39:37 GMTAgAAAAMAAAAAAAAAnO+6mzop1QE=Sat,\ + \ 22 Jun 2019 20:39:37 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 26244d9b-0003-0001-543a-2965fd000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_update_encrypted_binary_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_update_encrypted_binary_message.yaml new file mode 100644 index 000000000000..f268325bbcf0 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_update_encrypted_binary_message.yaml @@ -0,0 +1,763 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 34469646-952a-11e9-a720-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:30 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9ae1814 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 138cbbc9-8003-00d7-0436-292e27000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "R3WBzfLjLDZzywaIMJoF98CHzchP0NVJ2JoEsRV76BxkBJ+/ubrzQCj2hsLKbgl/KK3tobBM/gVPlcVzAex4SxQanhILUi21OS4NG/wIhPuSozbVRG8sUlzRABQVaaxbwyRRWFdWJ1QibjYfmMn8oPbeY21zXbN+dfaywzJRr/0VLznXr0RRzmruS9hHcGPJ", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "fFcK5dN0IQpOu+EnET8Byiz0lMjOQDx8IVWtfMM0F52awRuCKunqkg==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "8y5O6Yy7YBFtSVFjhryrUQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '669' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 34673728-952a-11e9-909e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:31 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF611f67bf-6991-4d37-8595-d1167b6407d7Sat,\ + \ 22 Jun 2019 20:13:31 GMTSat, 29 Jun 2019\ + \ 20:13:31 GMTAgAAAAMAAAAAAAAAguYs9jYp1QE=Sat,\ + \ 22 Jun 2019 20:13:31 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 138cbbe3-8003-00d7-1b36-292e27000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 34700134-952a-11e9-b58d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:31 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF611f67bf-6991-4d37-8595-d1167b6407d7Sat,\ + \ 22 Jun 2019 20:13:31 GMTSat, 29 Jun 2019\ + \ 20:13:31 GMTAgAAAAMAAAAAAAAAkxYXCDcp1QE=Sat,\ + \ 22 Jun 2019 20:14:01 GMT1{\"\ + EncryptedMessageContents\": \"R3WBzfLjLDZzywaIMJoF98CHzchP0NVJ2JoEsRV76BxkBJ+/ubrzQCj2hsLKbgl/KK3tobBM/gVPlcVzAex4SxQanhILUi21OS4NG/wIhPuSozbVRG8sUlzRABQVaaxbwyRRWFdWJ1QibjYfmMn8oPbeY21zXbN+dfaywzJRr/0VLznXr0RRzmruS9hHcGPJ\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"fFcK5dN0IQpOu+EnET8Byiz0lMjOQDx8IVWtfMM0F52awRuCKunqkg==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"8y5O6Yy7YBFtSVFjhryrUQ==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 138cbbfb-8003-00d7-2f36-292e27000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + {"EncryptedMessageContents": "kCUTCeQlYXq/RGyz7I82uM/8u/FHZcxbf1cSA7pBNRvbg11NSFySkGFCvjT7a9zw4Tao6f2zkZysqxYQDv1HHST4oDNTiIlz9PvOLHwsgA91Ap5XrwraXDFR0V0xXOzlxF9WMC+tcY/7SeO1DUMRBVhohd3VNsWV2lEn++9iHWl6ZQwyapqjBeqbv3gyI3cb", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "3XD9seDSmsGE7ApEnOvThczSmpZpFO9wuU1xVjgXazgdy+5D1jVGrA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "0xbNzruWENA7DbqIKY45Dg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '669' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 34790bb0-952a-11e9-b0b5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9ae1814/messages/611f67bf-6991-4d37-8595-d1167b6407d7?popreceipt=AgAAAAMAAAAAAAAAkxYXCDcp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAGcQ+9jYp1QEBAAAA + x-ms-request-id: + - 138cbc18-8003-00d7-4a36-292e27000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:13:31 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 3481c214-952a-11e9-8e63-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:31 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF611f67bf-6991-4d37-8595-d1167b6407d7Sat,\ + \ 22 Jun 2019 20:13:31 GMTSat, 29 Jun 2019\ + \ 20:13:31 GMTAgAAAAMAAAAAAAAAcWkpCDcp1QE=Sat,\ + \ 22 Jun 2019 20:14:01 GMT2{\"\ + EncryptedMessageContents\": \"kCUTCeQlYXq/RGyz7I82uM/8u/FHZcxbf1cSA7pBNRvbg11NSFySkGFCvjT7a9zw4Tao6f2zkZysqxYQDv1HHST4oDNTiIlz9PvOLHwsgA91Ap5XrwraXDFR0V0xXOzlxF9WMC+tcY/7SeO1DUMRBVhohd3VNsWV2lEn++9iHWl6ZQwyapqjBeqbv3gyI3cb\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"3XD9seDSmsGE7ApEnOvThczSmpZpFO9wuU1xVjgXazgdy+5D1jVGrA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"0xbNzruWENA7DbqIKY45Dg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 138cbc2b-8003-00d7-5c36-292e27000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f186060c-952a-11e9-b839-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:48 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:48 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d64fe27c-2003-00d1-1e37-29d95f000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e5238ae-952b-11e9-827c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 59a794f4-2003-0052-1d38-2979f2000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "j1TYHpzwYT4+6RB4F+BUXbdT9U5DqZBte5UQ/QD+rL0HaKQo9Q/ueVPQZMo4xCeH4YMfUkI75paIsx3XBJQomuuLm/zoSqbjjhs/vi9iKmKfwvHWXYzNrWXNA1sihDXsa8rRwcu6nQgcfufPyOOu+8Jtxjq2EyDTTG/aVJFUncZuqkNQg13HFdmWZ5eOzT6z", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "agXJC0bB62npiv+p2/HvTE3j77pu9FJKC9jbztPtYqPSwjX0HQP7Tw==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "Ynl9amPfj8pS0+rH/A/LRA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '669' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e720d8c-952b-11e9-9f68-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF0ca25108-ee22-4fa4-aeda-c3773645596aSat,\ + \ 22 Jun 2019 20:23:11 GMTSat, 29 Jun 2019\ + \ 20:23:11 GMTAgAAAAMAAAAAAAAAarA5UDgp1QE=Sat,\ + \ 22 Jun 2019 20:23:11 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 59a7950a-2003-0052-3138-2979f2000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e7b3fa6-952b-11e9-b98e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF611f67bf-6991-4d37-8595-d1167b6407d7Sat,\ + \ 22 Jun 2019 20:13:31 GMTSat, 29 Jun 2019\ + \ 20:13:31 GMTAgAAAAMAAAAAAAAAgOAjYjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:41 GMT3{\"\ + EncryptedMessageContents\": \"kCUTCeQlYXq/RGyz7I82uM/8u/FHZcxbf1cSA7pBNRvbg11NSFySkGFCvjT7a9zw4Tao6f2zkZysqxYQDv1HHST4oDNTiIlz9PvOLHwsgA91Ap5XrwraXDFR0V0xXOzlxF9WMC+tcY/7SeO1DUMRBVhohd3VNsWV2lEn++9iHWl6ZQwyapqjBeqbv3gyI3cb\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"3XD9seDSmsGE7ApEnOvThczSmpZpFO9wuU1xVjgXazgdy+5D1jVGrA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"0xbNzruWENA7DbqIKY45Dg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 59a79514-2003-0052-3838-2979f2000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + {"EncryptedMessageContents": "TFWjGlxSYU9YXgo2UtbhjyMN4nQvgokG4KqhUCiWIug3ktPtbwYVA23S0TmKFLaugDxnQ/ijPApX9j8Ow6w/penaSDeIa4Tmcl6KoXvNl5JPuO9YR9JxJkZ1V5B05raHjPK0zmRSEjw/hWSK9YugQlLas4kL7znTh2vn3sYBHFtA79Ti7z+x0ljAlYEfFNUf", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "AkMs1O4675th/UCOTi/8tvUhWgXCk/5xX/F0pNM1vpvOgTf085UHPQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "SZ7UiqsdFTrj5UeLORXJSQ==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '669' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e8496a8-952b-11e9-b5b4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages/611f67bf-6991-4d37-8595-d1167b6407d7?popreceipt=AgAAAAMAAAAAAAAAgOAjYjgp1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAf1FMUDgp1QEDAAAA + x-ms-request-id: + - 59a7951c-2003-0052-3e38-2979f2000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 8e8dd65c-952b-11e9-99ed-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:11 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF0ca25108-ee22-4fa4-aeda-c3773645596aSat,\ + \ 22 Jun 2019 20:23:11 GMTSat, 29 Jun 2019\ + \ 20:23:11 GMTAgAAAAMAAAAAAAAA3/Y2Yjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:41 GMT1{\"\ + EncryptedMessageContents\": \"j1TYHpzwYT4+6RB4F+BUXbdT9U5DqZBte5UQ/QD+rL0HaKQo9Q/ueVPQZMo4xCeH4YMfUkI75paIsx3XBJQomuuLm/zoSqbjjhs/vi9iKmKfwvHWXYzNrWXNA1sihDXsa8rRwcu6nQgcfufPyOOu+8Jtxjq2EyDTTG/aVJFUncZuqkNQg13HFdmWZ5eOzT6z\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"agXJC0bB62npiv+p2/HvTE3j77pu9FJKC9jbztPtYqPSwjX0HQP7Tw==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"Ynl9amPfj8pS0+rH/A/LRA==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 59a79524-2003-0052-4438-2979f2000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da422bdc-952d-11e9-a081-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:37 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a1808553-f003-0097-023a-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "Q5v2ThnIYfmXPmCw9s11/thNIShP92UA5qVeELPI8rLgJ8xPTc/mLP3JdkI5xF+ibYjmzsBEvvJdidyqwbxXUpHbkpMjMKOKsROA9WPwkC6l9A+/P2Sh18JRX74+GY9QfdUUYy4/dILsE9O3R4XQ5P5GoLPxazYIiFwCatj9em4WurnMdZzCt8H7RectlkVZ", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "kLHuvbxsjFpRYvKMVR8xd/jx7QmFGrGUbT3p+7agx1MZK+52XfB7uQ==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "GNy9WED0IKToJZeZGDsCdg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '669' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da627b12-952d-11e9-a6cd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:38 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF998d8b9c-fa74-4cd8-8d83-34fe3b5f48b7Sat,\ + \ 22 Jun 2019 20:39:38 GMTSat, 29 Jun 2019\ + \ 20:39:38 GMTAgAAAAMAAAAAAAAAQ6ArnDop1QE=Sat,\ + \ 22 Jun 2019 20:39:38 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a1808556-f003-0097-033a-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da6c782e-952d-11e9-a3d5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:38 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF998d8b9c-fa74-4cd8-8d83-34fe3b5f48b7Sat,\ + \ 22 Jun 2019 20:39:38 GMTSat, 29 Jun 2019\ + \ 20:39:38 GMTAgAAAAMAAAAAAAAAN6kVrjop1QE=Sat,\ + \ 22 Jun 2019 20:40:08 GMT1{\"\ + EncryptedMessageContents\": \"Q5v2ThnIYfmXPmCw9s11/thNIShP92UA5qVeELPI8rLgJ8xPTc/mLP3JdkI5xF+ibYjmzsBEvvJdidyqwbxXUpHbkpMjMKOKsROA9WPwkC6l9A+/P2Sh18JRX74+GY9QfdUUYy4/dILsE9O3R4XQ5P5GoLPxazYIiFwCatj9em4WurnMdZzCt8H7RectlkVZ\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"kLHuvbxsjFpRYvKMVR8xd/jx7QmFGrGUbT3p+7agx1MZK+52XfB7uQ==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"GNy9WED0IKToJZeZGDsCdg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a180855a-f003-0097-063a-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + {"EncryptedMessageContents": "GbvvrzhJKgnvDhkXLWx7I8O5WnimNh4qUg0Ykea5Xuuz73Ai1YLhU0xx/9eUstc/263egUCeiUg7CMoQv8nlQ5Qd0nw5dLTsUpTghj383DLr7T0XdIbdknRxVeCa6Gg5zLu3reKDEwRywxO5Rs5RPqjGujiopjsu8/dKAZA4WkeO29MBxUhCioISfeacZDhI", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "s0TSfEo4z2cPPLWjUHz5403ZGg3BkG+ZI25F/duro5YQE373RWdVSA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "RvgEI7SPDNP1IgI0AEunzg==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '669' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da755a86-952d-11e9-a5d3-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages/998d8b9c-fa74-4cd8-8d83-34fe3b5f48b7?popreceipt=AgAAAAMAAAAAAAAAN6kVrjop1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAApi89nDop1QEBAAAA + x-ms-request-id: + - a180855c-f003-0097-083a-2907c9000000 + x-ms-time-next-visible: + - Sat, 22 Jun 2019 20:39:38 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - da7e18fe-952d-11e9-9f7a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:38 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec9ae1814/messages + response: + body: + string: "\uFEFF998d8b9c-fa74-4cd8-8d83-34fe3b5f48b7Sat,\ + \ 22 Jun 2019 20:39:38 GMTSat, 29 Jun 2019\ + \ 20:39:38 GMTAgAAAAMAAAAAAAAA460nrjop1QE=Sat,\ + \ 22 Jun 2019 20:40:08 GMT2{\"\ + EncryptedMessageContents\": \"GbvvrzhJKgnvDhkXLWx7I8O5WnimNh4qUg0Ykea5Xuuz73Ai1YLhU0xx/9eUstc/263egUCeiUg7CMoQv8nlQ5Qd0nw5dLTsUpTghj383DLr7T0XdIbdknRxVeCa6Gg5zLu3reKDEwRywxO5Rs5RPqjGujiopjsu8/dKAZA4WkeO29MBxUhCioISfeacZDhI\"\ + , \"EncryptionData\": {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\"\ + : \"s0TSfEo4z2cPPLWjUHz5403ZGg3BkG+ZI25F/duro5YQE373RWdVSA==\", \"Algorithm\"\ + : \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\", \"EncryptionAlgorithm\"\ + : \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"RvgEI7SPDNP1IgI0AEunzg==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:38 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a180855f-f003-0097-0b3a-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_validate_encryption.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_validate_encryption.yaml new file mode 100644 index 000000000000..2d73d5491e05 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_encryption.test_validate_encryption.yaml @@ -0,0 +1,454 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 35947836-952a-11e9-a6f7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:33 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec34e1330 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:13:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 54d83e91-f003-00be-3436-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "0VLwicw0YsCaMTHrXnE7Lg==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "5ukRwz3LjHgkGKZ4cNhPjbldnV363hrKewSrCZxCIezL6gE9WfqpTg==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "qLZ4YoW9K1mpscYuIo6+5Q==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 35b3d6ae-952a-11e9-a30c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec34e1330/messages + response: + body: + string: "\uFEFFd06213fe-d72c-4b01-a8ca-397e88d53942Sat,\ + \ 22 Jun 2019 20:13:33 GMTSat, 29 Jun 2019\ + \ 20:13:33 GMTAgAAAAMAAAAAAAAA2KB59zYp1QE=Sat,\ + \ 22 Jun 2019 20:13:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 54d83e9d-f003-00be-3b36-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 35bca5e2-952a-11e9-8c2f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:13:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/encryptionqueuec34e1330/messages?peekonly=true + response: + body: + string: "\uFEFFd06213fe-d72c-4b01-a8ca-397e88d53942Sat,\ + \ 22 Jun 2019 20:13:33 GMTSat, 29 Jun 2019\ + \ 20:13:33 GMT0{\"\ + EncryptedMessageContents\": \"0VLwicw0YsCaMTHrXnE7Lg==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"5ukRwz3LjHgkGKZ4cNhPjbldnV363hrKewSrCZxCIezL6gE9WfqpTg==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"qLZ4YoW9K1mpscYuIo6+5Q==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:13:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 54d83ea9-f003-00be-4436-29718b000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - f2bf8892-952a-11e9-9111-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:50 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:50 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d0c0d60a-f003-0014-7337-29a764000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 9042a478-952b-11e9-bda5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:14 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:23:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 33593d5d-e003-0083-2e38-29c4ad000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: ' + + {"EncryptedMessageContents": "GD8fS4ZwxdFSpSTotW+Dlg==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "ixY88l4PQQ8+/C6reMbnvWmEDdLuRlP1qBbH2KxQiL9wsE4EsfBx1Q==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "3oViV9b7wKRVh9tdqjf8pA==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 9063bf98-952b-11e9-be53-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:15 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330/messages + response: + body: + string: "\uFEFF2b67846d-5008-4019-a138-01aa440ec099Sat,\ + \ 22 Jun 2019 20:23:15 GMTSat, 29 Jun 2019\ + \ 20:23:15 GMTAgAAAAMAAAAAAAAAHS0rUjgp1QE=Sat,\ + \ 22 Jun 2019 20:23:15 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 33593d73-e003-0083-4038-29c4ad000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 906ce47a-952b-11e9-95ac-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:23:15 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330/messages?peekonly=true + response: + body: + string: "\uFEFFd06213fe-d72c-4b01-a8ca-397e88d53942Sat,\ + \ 22 Jun 2019 20:13:33 GMTSat, 29 Jun 2019\ + \ 20:13:33 GMT0{\"\ + EncryptedMessageContents\": \"0VLwicw0YsCaMTHrXnE7Lg==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"5ukRwz3LjHgkGKZ4cNhPjbldnV363hrKewSrCZxCIezL6gE9WfqpTg==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"qLZ4YoW9K1mpscYuIo6+5Q==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:23:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 33593d8f-e003-0083-5b38-29c4ad000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e53f7828-952d-11e9-8647-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:39:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - ebd04479-4003-0085-233a-2933d5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + {"EncryptedMessageContents": "635uqmig2IcoUyOen/OudQ==", + "EncryptionData": {"WrappedContentKey": {"KeyId": "key1", "EncryptedKey": "rwCpDWxwHJjkecsK6PzZVwG0qfOzinywCQCkPWAl+Y+X3Vv2dyFhuA==", + "Algorithm": "A256KW"}, "EncryptionAgent": {"Protocol": "1.0", "EncryptionAlgorithm": + "AES_CBC_256"}, "ContentEncryptionIV": "tNMIBKJnCTSwSrN9Y1r52A==", "KeyWrappingMetadata": + {"EncryptionLibrary": "Python 1.0.0"}}}' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '501' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e564431a-952d-11e9-9407-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:56 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330/messages + response: + body: + string: "\uFEFF4f94f6f3-beb1-4f6f-88b0-5ffdacc6e81fSat,\ + \ 22 Jun 2019 20:39:56 GMTSat, 29 Jun 2019\ + \ 20:39:56 GMTAgAAAAMAAAAAAAAAB6Ytpzop1QE=Sat,\ + \ 22 Jun 2019 20:39:56 GMT" + headers: + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ebd04486-4003-0085-2d3a-2933d5000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - e56e6b06-952d-11e9-a916-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:39:56 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/encryptionqueuec34e1330/messages?peekonly=true + response: + body: + string: "\uFEFF4f94f6f3-beb1-4f6f-88b0-5ffdacc6e81fSat,\ + \ 22 Jun 2019 20:39:56 GMTSat, 29 Jun 2019\ + \ 20:39:56 GMT0{\"\ + EncryptedMessageContents\": \"635uqmig2IcoUyOen/OudQ==\", \"EncryptionData\"\ + : {\"WrappedContentKey\": {\"KeyId\": \"key1\", \"EncryptedKey\": \"rwCpDWxwHJjkecsK6PzZVwG0qfOzinywCQCkPWAl+Y+X3Vv2dyFhuA==\"\ + , \"Algorithm\": \"A256KW\"}, \"EncryptionAgent\": {\"Protocol\": \"1.0\"\ + , \"EncryptionAlgorithm\": \"AES_CBC_256\"}, \"ContentEncryptionIV\": \"tNMIBKJnCTSwSrN9Y1r52A==\"\ + , \"KeyWrappingMetadata\": {\"EncryptionLibrary\": \"Python 1.0.0\"}}}" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:39:56 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - ebd0448e-4003-0085-353a-2933d5000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_connection_string.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_connection_string.yaml new file mode 100644 index 000000000000..febce55d8e5e --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_connection_string.yaml @@ -0,0 +1,45 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0b44b714-99ee-11e9-bb0d-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f86bf4cb-5003-0048-5efa-2d4ec3000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_shared_key.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_shared_key.yaml new file mode 100644 index 000000000000..df032658776a --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_authentication.test_auth_shared_key.yaml @@ -0,0 +1,45 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0b6f99f4-99ee-11e9-9c67-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 08e4c2c1-0003-0045-25fa-2d8617000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_create_client_with_connection_string.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_create_client_with_connection_string.yaml new file mode 100644 index 000000000000..04067c0601ba --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_create_client_with_connection_string.yaml @@ -0,0 +1,45 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0b887952-99ee-11e9-8b32-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0a927069-5003-0093-71fa-2d88fe000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_queue_and_messages_example.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_queue_and_messages_example.yaml new file mode 100644 index 000000000000..ee91574f44a0 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_hello_world.test_queue_and_messages_example.yaml @@ -0,0 +1,265 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ba01fcc-99ee-11e9-a583-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/myqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2104373d-c003-0065-78fa-2dfdb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + I''m using queues!' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '112' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0bb5a4c0-99ee-11e9-86bc-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/myqueue/messages + response: + body: + string: "\uFEFFe990056d-355c-41cf-bfd1-c9cbe715f129Fri, + 28 Jun 2019 21:45:28 GMTFri, 05 Jul 2019 21:45:28 + GMTAgAAAAMAAAAAAAAAjiVwzfot1QE=Fri, + 28 Jun 2019 21:45:28 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:27 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 21043740-c003-0065-79fa-2dfdb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + This is my second message' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '120' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0bba6034-99ee-11e9-96aa-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/myqueue/messages + response: + body: + string: "\uFEFF7a8d4ca4-b38d-45c6-8e8c-6febf0626892Fri, + 28 Jun 2019 21:45:28 GMTFri, 05 Jul 2019 21:45:28 + GMTAgAAAAMAAAAAAAAA2i91zfot1QE=Fri, + 28 Jun 2019 21:45:28 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 21043742-c003-0065-7bfa-2dfdb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0bbf68e4-99ee-11e9-820f-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:28 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/myqueue/messages?numofmessages=2 + response: + body: + string: "\uFEFFe990056d-355c-41cf-bfd1-c9cbe715f129Fri, + 28 Jun 2019 21:45:28 GMTFri, 05 Jul 2019 21:45:28 + GMTAgAAAAMAAAAAAAAAGt1b3/ot1QE=Fri, + 28 Jun 2019 21:45:58 GMT1I'm + using queues!7a8d4ca4-b38d-45c6-8e8c-6febf0626892Fri, + 28 Jun 2019 21:45:28 GMTFri, 05 Jul 2019 21:45:28 + GMTAgAAAAMAAAAAAAAAGt1b3/ot1QE=Fri, + 28 Jun 2019 21:45:58 GMT1This + is my second message" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 21043743-c003-0065-7cfa-2dfdb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0bc50d1c-99ee-11e9-8a9f-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/myqueue/messages?numofmessages=2 + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 21043744-c003-0065-7dfa-2dfdb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0bc9b7b0-99ee-11e9-9aef-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:29 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/myqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 21043745-c003-0065-7efa-2dfdb0000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_delete_and_clear_messages.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_delete_and_clear_messages.yaml new file mode 100644 index 000000000000..1b01d846bff1 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_delete_and_clear_messages.yaml @@ -0,0 +1,434 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0bd50386-99ee-11e9-9f06-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/delqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a2184297-1003-0059-02fa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0daa2f70-99ee-11e9-a8d0-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: "\uFEFFfad9eda3-bce9-4351-b121-3c75a27d3276Fri, + 28 Jun 2019 21:45:32 GMTFri, 05 Jul 2019 21:45:32 + GMTAgAAAAMAAAAAAAAAmVRmz/ot1QE=Fri, + 28 Jun 2019 21:45:32 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a21842ff-1003-0059-58fa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0db09928-99ee-11e9-9b0b-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: "\uFEFFd35556d8-059a-4e28-b241-7748523af6f3Fri, + 28 Jun 2019 21:45:32 GMTFri, 05 Jul 2019 21:45:32 + GMTAgAAAAMAAAAAAAAAlelqz/ot1QE=Fri, + 28 Jun 2019 21:45:32 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a2184301-1003-0059-5afa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0db52d08-99ee-11e9-9c75-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: "\uFEFF47288cdd-eabe-457c-898f-a6752c74e2ceFri, + 28 Jun 2019 21:45:32 GMTFri, 05 Jul 2019 21:45:32 + GMTAgAAAAMAAAAAAAAAkX5vz/ot1QE=Fri, + 28 Jun 2019 21:45:32 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a2184303-1003-0059-5cfa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0dba8534-99ee-11e9-beb3-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: "\uFEFF0e2e95a1-cb4a-40f5-86ef-9c798c3d6aecFri, + 28 Jun 2019 21:45:32 GMTFri, 05 Jul 2019 21:45:32 + GMTAgAAAAMAAAAAAAAApcF1z/ot1QE=Fri, + 28 Jun 2019 21:45:32 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a2184304-1003-0059-5dfa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message5' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0dbfe0a4-99ee-11e9-bde5-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: "\uFEFF945b5926-2f62-42d2-88e8-60e58d8ca3b7Fri, + 28 Jun 2019 21:45:32 GMTFri, 05 Jul 2019 21:45:32 + GMTAgAAAAMAAAAAAAAAun16z/ot1QE=Fri, + 28 Jun 2019 21:45:32 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a2184305-1003-0059-5efa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0dc49a18-99ee-11e9-ade4-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: "\uFEFFfad9eda3-bce9-4351-b121-3c75a27d3276Fri, + 28 Jun 2019 21:45:32 GMTFri, 05 Jul 2019 21:45:32 + GMTAgAAAAMAAAAAAAAA6QNh4fot1QE=Fri, + 28 Jun 2019 21:46:02 GMT1message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a2184307-1003-0059-60fa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0dcc8aee-99ee-11e9-ae9b-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/delqueue/messages/fad9eda3-bce9-4351-b121-3c75a27d3276?popreceipt=AgAAAAMAAAAAAAAA6QNh4fot1QE%3D + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:31 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a2184309-1003-0059-62fa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0dd31a9a-99ee-11e9-8ab0-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/delqueue/messages + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a218430e-1003-0059-67fa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e224aa6-99ee-11e9-8ed3-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:32 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/delqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:32 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a218431a-1003-0059-70fa-2dd477000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_enqueue_and_receive_messages.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_enqueue_and_receive_messages.yaml new file mode 100644 index 000000000000..cc96b904146f --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_enqueue_and_receive_messages.yaml @@ -0,0 +1,410 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e5f671a-99ee-11e9-94a0-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/messagequeue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0b26d42a-2003-00a6-68fa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e76e67a-99ee-11e9-94f5-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/messagequeue/messages + response: + body: + string: "\uFEFF33266877-814c-4002-b598-3c9b15e47303Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAAMOwx0Pot1QE=Fri, + 28 Jun 2019 21:45:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b26d434-2003-00a6-70fa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e7c648c-99ee-11e9-b9d0-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/messagequeue/messages?visibilitytimeout=30 + response: + body: + string: "\uFEFFced51f13-1e6e-40b9-9344-fbf366195ed9Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAAX3IY4vot1QE=Fri, + 28 Jun 2019 21:46:03 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b26d43b-2003-00a6-76fa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e80f870-99ee-11e9-9212-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/messagequeue/messages + response: + body: + string: "\uFEFF048fcf7b-7f38-4767-a0d8-4a23c0d3e579Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAAdIs70Pot1QE=Fri, + 28 Jun 2019 21:45:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b26d43f-2003-00a6-7afa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e85b350-99ee-11e9-b942-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/messagequeue/messages + response: + body: + string: "\uFEFF17a13f38-41a2-4477-b62f-c18a18d95d2dFri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAAiUdA0Pot1QE=Fri, + 28 Jun 2019 21:45:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b26d440-2003-00a6-7bfa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message5' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e8a72dc-99ee-11e9-af6b-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/messagequeue/messages + response: + body: + string: "\uFEFF4e737f07-b24f-4c85-a213-fb35d9df0f92Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAATRVG0Pot1QE=Fri, + 28 Jun 2019 21:45:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0b26d441-2003-00a6-7cfa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e903e12-99ee-11e9-abcd-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/messagequeue/messages?numofmessages=5 + response: + body: + string: "\uFEFF33266877-814c-4002-b598-3c9b15e47303Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAATU0s4vot1QE=Fri, + 28 Jun 2019 21:46:03 GMT1message1048fcf7b-7f38-4767-a0d8-4a23c0d3e579Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAATU0s4vot1QE=Fri, + 28 Jun 2019 21:46:03 GMT1message317a13f38-41a2-4477-b62f-c18a18d95d2dFri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAATU0s4vot1QE=Fri, + 28 Jun 2019 21:46:03 GMT1message44e737f07-b24f-4c85-a213-fb35d9df0f92Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAATU0s4vot1QE=Fri, + 28 Jun 2019 21:46:03 GMT1message5" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0b26d445-2003-00a6-80fa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e95bda4-99ee-11e9-aff3-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/messagequeue/messages?numofmessages=5 + response: + body: + string: "\uFEFF" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0b26d448-2003-00a6-02fa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0e9a0214-99ee-11e9-a8ba-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/messagequeue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0b26d449-2003-00a6-03fa-2de4ea000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_peek_messages.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_peek_messages.yaml new file mode 100644 index 000000000000..281160fd6aa2 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_peek_messages.yaml @@ -0,0 +1,409 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ea48a5a-99ee-11e9-94e3-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/peekqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7d207d2c-1003-003b-1dfa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0eb94b0a-99ee-11e9-badc-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:33 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/peekqueue/messages + response: + body: + string: "\uFEFFc2003643-5d96-4715-a94c-cde93ed15947Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAAJOdz0Pot1QE=Fri, + 28 Jun 2019 21:45:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7d207d30-1003-003b-1ffa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ebe2ce6-99ee-11e9-8bbd-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/peekqueue/messages + response: + body: + string: "\uFEFFf1687c27-6530-4ae5-9338-9a44ba107902Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMTAgAAAAMAAAAAAAAAoz950Pot1QE=Fri, + 28 Jun 2019 21:45:33 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7d207d33-1003-003b-22fa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ec35bde-99ee-11e9-8632-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/peekqueue/messages + response: + body: + string: "\uFEFFc66dec37-94ef-4348-93eb-8c48dd25c780Fri, + 28 Jun 2019 21:45:34 GMTFri, 05 Jul 2019 21:45:34 + GMTAgAAAAMAAAAAAAAACXF+0Pot1QE=Fri, + 28 Jun 2019 21:45:34 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7d207d35-1003-003b-24fa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message4' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ec8b8d8-99ee-11e9-839e-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/peekqueue/messages + response: + body: + string: "\uFEFF6402f431-334a-4ca6-9b8a-435c388fbca9Fri, + 28 Jun 2019 21:45:34 GMTFri, 05 Jul 2019 21:45:34 + GMTAgAAAAMAAAAAAAAAUnuD0Pot1QE=Fri, + 28 Jun 2019 21:45:34 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7d207d37-1003-003b-26fa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message5' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ecdeed0-99ee-11e9-9826-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/peekqueue/messages + response: + body: + string: "\uFEFFd049b806-e5d5-4650-a647-5f97699d9db7Fri, + 28 Jun 2019 21:45:34 GMTFri, 05 Jul 2019 21:45:34 + GMTAgAAAAMAAAAAAAAAloWI0Pot1QE=Fri, + 28 Jun 2019 21:45:34 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 7d207d3c-1003-003b-29fa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ed2a8ae-99ee-11e9-a132-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/peekqueue/messages?peekonly=true + response: + body: + string: "\uFEFFc2003643-5d96-4715-a94c-cde93ed15947Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMT0message1" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7d207d41-1003-003b-2efa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0ed73d92-99ee-11e9-b61e-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/peekqueue/messages?numofmessages=5&peekonly=true + response: + body: + string: "\uFEFFc2003643-5d96-4715-a94c-cde93ed15947Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMT0message1f1687c27-6530-4ae5-9338-9a44ba107902Fri, + 28 Jun 2019 21:45:33 GMTFri, 05 Jul 2019 21:45:33 + GMT0message2c66dec37-94ef-4348-93eb-8c48dd25c780Fri, + 28 Jun 2019 21:45:34 GMTFri, 05 Jul 2019 21:45:34 + GMT0message36402f431-334a-4ca6-9b8a-435c388fbca9Fri, + 28 Jun 2019 21:45:34 GMTFri, 05 Jul 2019 21:45:34 + GMT0message4d049b806-e5d5-4650-a647-5f97699d9db7Fri, + 28 Jun 2019 21:45:34 GMTFri, 05 Jul 2019 21:45:34 + GMT0message5" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:33 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 7d207d45-1003-003b-32fa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0edce394-99ee-11e9-981d-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:34 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/peekqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7d207d4d-1003-003b-39fa-2d1650000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_queue_metadata.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_queue_metadata.yaml new file mode 100644 index 000000000000..a0032c908438 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_queue_metadata.yaml @@ -0,0 +1,170 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 0fa105f4-99ee-11e9-a2f7-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:35 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/metaqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 128d3c12-e003-00db-33fa-2d95c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 112658a2-99ee-11e9-8b3e-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:38 GMT + x-ms-meta-bar: + - val2 + x-ms-meta-baz: + - val3 + x-ms-meta-foo: + - val1 + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/metaqueue?comp=metadata + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:39 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 128d3c28-e003-00db-40fa-2d95c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 1201f7ca-99ee-11e9-a1ff-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:39 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/metaqueue?comp=metadata + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-approximate-messages-count: + - '0' + x-ms-meta-bar: + - val2 + x-ms-meta-baz: + - val3 + x-ms-meta-foo: + - val1 + x-ms-request-id: + - 128d3c5a-e003-00db-59fa-2d95c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 12a1a3dc-99ee-11e9-a352-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:40 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/metaqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 128d3c69-e003-00db-62fa-2d95c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_update_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_update_message.yaml new file mode 100644 index 000000000000..c41e7dddf751 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_message_queue.test_update_message.yaml @@ -0,0 +1,217 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 12d26a36-99ee-11e9-8f6b-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:40 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/updatequeue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fd8037b3-7003-00d9-44fa-2d2b71000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + update me' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '104' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 12e7a0c2-99ee-11e9-b752-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:40 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/updatequeue/messages + response: + body: + string: "\uFEFFf28add95-4ca5-4fc4-a2f5-75b2469bfd0bFri, + 28 Jun 2019 21:45:40 GMTFri, 05 Jul 2019 21:45:40 + GMTAgAAAAMAAAAAAAAAN0Ci1Pot1QE=Fri, + 28 Jun 2019 21:45:40 GMT" + headers: + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - fd8037b6-7003-00d9-45fa-2d2b71000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 12ec5a7a-99ee-11e9-8029-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:41 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/updatequeue/messages + response: + body: + string: "\uFEFFf28add95-4ca5-4fc4-a2f5-75b2469bfd0bFri, + 28 Jun 2019 21:45:40 GMTFri, 05 Jul 2019 21:45:40 + GMTAgAAAAMAAAAAAAAAM3iI5vot1QE=Fri, + 28 Jun 2019 21:46:11 GMT1update + me" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - fd8037b8-7003-00d9-46fa-2d2b71000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + updated' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '102' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 12f164b6-99ee-11e9-a2bd-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/updatequeue/messages/f28add95-4ca5-4fc4-a2f5-75b2469bfd0b?popreceipt=AgAAAAMAAAAAAAAAM3iI5vot1QE%3D&visibilitytimeout=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-popreceipt: + - AwAAAAMAAAAAAAAAlQas1Pot1QEBAAAA + x-ms-request-id: + - fd8037bc-7003-00d9-4afa-2d2b71000000 + x-ms-time-next-visible: + - Fri, 28 Jun 2019 21:45:41 GMT + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 12f62010-99ee-11e9-a799-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:41 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/updatequeue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:40 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fd8037bf-7003-00d9-4dfa-2d2b71000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queue_service_properties.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queue_service_properties.yaml new file mode 100644 index 000000000000..a83d3e2b3530 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queue_service_properties.yaml @@ -0,0 +1,88 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1155' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 130d4f58-99ee-11e9-9c89-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:41 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - c901295d-c003-00e3-79fa-2d3109000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 1585d5dc-99ee-11e9-b386-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - c9012a58-c003-00e3-4efa-2d3109000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queues_in_account.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queues_in_account.yaml new file mode 100644 index 000000000000..3f459be1c64e --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_samples_queue_service.test_queues_in_account.yaml @@ -0,0 +1,166 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 1593b812-99ee-11e9-9ac7-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:45 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/testqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 598b9d2a-d003-00ef-14fa-2da601000000 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 15a86928-99ee-11e9-b79a-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?comp=list + response: + body: + string: "\uFEFFtestqueue" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 598b9d2d-d003-00ef-15fa-2da601000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 15af1ebe-99ee-11e9-b394-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?prefix=test&comp=list + response: + body: + string: "\uFEFFtesttestqueue" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Fri, 28 Jun 2019 21:45:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 598b9d2e-d003-00ef-16fa-2da601000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.0.0b1 Python/3.7.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 15b539a6-99ee-11e9-95b5-b831b58100e8 + x-ms-date: + - Fri, 28 Jun 2019 21:45:45 GMT + x-ms-version: + - '2018-03-28' + method: DELETE + uri: https://storagename.queue.core.windows.net/testqueue + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 28 Jun 2019 21:45:45 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 598b9d2f-d003-00ef-17fa-2da601000000 + x-ms-version: + - '2018-03-28' + status: + code: 204 + message: No Content +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_queue_service_properties.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_queue_service_properties.yaml new file mode 100644 index 000000000000..06304e2b2457 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_queue_service_properties.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '528' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0df38024-952a-11e9-a594-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:26 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 6a8baff9-a003-0061-3036-2920df000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0f7d611c-952a-11e9-a678-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:29 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:28 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 6a8bb190-a003-0061-0f36-2920df000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '528' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d04c624c-952a-11e9-b18b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:52 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:17:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a1c1b14a-e003-00aa-0e37-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d17b733a-952a-11e9-8777-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:54 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:17:53 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a1c1b270-e003-00aa-0937-29b2ef000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '528' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 647f6dda-952b-11e9-927e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:01 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:03 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2124355d-9003-0087-6138-29312f000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 66194da8-952b-11e9-9a0e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:04 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:03 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2124370b-9003-0087-4f38-29312f000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '528' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a1d86c1e-952d-11e9-bbc5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:03 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 21269aa6-9003-0087-0e3a-29312f000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a1fa3f58-952d-11e9-b4e4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:03 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:02 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 21269ab4-9003-0087-153a-29312f000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_retention_too_long.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_retention_too_long.yaml new file mode 100644 index 000000000000..a81d5074f0de --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_retention_too_long.yaml @@ -0,0 +1,198 @@ +interactions: +- request: + body: ' + + 1.0truetruetrue366' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '273' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 0f9351b6-952a-11e9-9e6a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:8853e50d-d003-00a2-0c36-29a99c000000\n\ + Time:2019-06-22T20:12:31.1824569Z2176Retention\ + \ days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '376' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:30 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 8853e50d-d003-00a2-0c36-29a99c000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: ' + + 1.0truetruetrue366' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '273' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d197c51c-952a-11e9-9f29-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:54 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:27caead9-c003-0017-1d37-29a463000000\n\ + Time:2019-06-22T20:17:55.5796408Z2176Retention\ + \ days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '376' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:17:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 27caead9-c003-0017-1d37-29a463000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: ' + + 1.0truetruetrue366' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '273' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 663d619a-952b-11e9-9b4b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:04 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:dc702338-5003-003b-0c38-29265e000000\n\ + Time:2019-06-22T20:22:04.8948219Z2176Retention\ + \ days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '376' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:04 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - dc702338-5003-003b-0c38-29265e000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: ' + + 1.0truetruetrue366' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '273' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a22462e2-952d-11e9-8b43-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:03 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:bcf6c940-6003-0055-013a-298f77000000\n\ + Time:2019-06-22T20:38:04.1467573Z2176Retention\ + \ days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '376' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:03 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - bcf6c940-6003-0055-013a-298f77000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_cors.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_cors.yaml new file mode 100644 index 000000000000..d0f4a9813599 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_cors.yaml @@ -0,0 +1,346 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 10a97d9e-952a-11e9-bc4c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:31 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9e233694-c003-00bd-7336-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 13662070-952a-11e9-96b4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:35 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:35 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9e233f03-c003-00bd-1936-29728c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d20b5934-952a-11e9-ad59-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:55 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:17:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d5f88ff5-e003-00ee-3337-296e83000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d27d35ac-952a-11e9-adab-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:56 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:17:55 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - d5f890d9-e003-00ee-7237-296e83000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 66ac6388-952b-11e9-a5d5-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:05 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:07 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 9deff021-e003-0066-5b38-29d65a000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 68700210-952b-11e9-81f7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:07 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:07 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 9deff0bc-e003-0066-3938-29d65a000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a2759c34-952d-11e9-bacf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:04 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 6dac268d-7003-008d-3a3a-2928a6000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a3fa7e46-952d-11e9-8e4c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:06 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:06 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 6dac270d-7003-008d-073a-2928a6000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..a0c0e4b92aee --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_hour_metrics.yaml @@ -0,0 +1,342 @@ +interactions: +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '267' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 13791e9e-952a-11e9-8e53-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:35 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b31c32e8-0003-0067-0536-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 14e270c0-952a-11e9-9d6f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:38 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:37 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b31c338d-0003-0067-7636-29d7a7000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '267' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d299c09e-952a-11e9-a5f4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:56 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:17:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 114900ca-8003-001b-4237-294a92000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d4864e9c-952a-11e9-a789-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:17:59 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:17:58 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 11490242-8003-001b-0b37-294a92000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '267' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 68947386-952b-11e9-a440-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:08 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - eda41591-3003-002b-2538-2910b8000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6a445b90-952b-11e9-bf59-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:11 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:10 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - eda41670-3003-002b-5038-2910b8000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '267' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a4281458-952d-11e9-a640-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:07 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5bcda80d-0003-0045-6d3a-29b991000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a54630fe-952d-11e9-8314-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:09 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 5bcda85a-0003-0045-1a3a-29b991000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_logging.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_logging.yaml new file mode 100644 index 000000000000..4a32a0a62db6 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_logging.yaml @@ -0,0 +1,342 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 14f4c63a-952a-11e9-b56c-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:38 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 78334208-7003-0086-7436-2930d2000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1777651e-952a-11e9-9a2d-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:42 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:42 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 78334684-7003-0086-0736-2930d2000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d4a65a48-952a-11e9-824e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:00 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2c9d7881-e003-0022-4837-290a36000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d5fdb11e-952a-11e9-ba1b-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:02 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:01 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2c9d7907-e003-0022-3737-290a36000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6a6b07c2-952b-11e9-94a7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:11 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:13 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a370a59e-b003-00b9-2238-29870e000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6c2d52b8-952b-11e9-99bf-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:14 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:14 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a370a783-b003-00b9-5938-29870e000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a572de1a-952d-11e9-a5ba-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:09 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a1806a87-f003-0097-6d3a-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a6fb54e2-952d-11e9-ab63-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:11 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:11 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - a1806b70-f003-0097-2e3a-2907c9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..80ab9bc4fd2c --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_set_minute_metrics.yaml @@ -0,0 +1,342 @@ +interactions: +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '271' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 1789b78c-952a-11e9-a4de-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:42 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:12:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 79aca164-7003-00c9-0736-29f4ca000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 18afb29e-952a-11e9-9478-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:44 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 79aca389-7003-00c9-7636-29f4ca000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '271' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d61a490c-952a-11e9-8085-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:02 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:18:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 06334647-6003-0092-1437-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d7c592b6-952a-11e9-84ca-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:05 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 063347c0-6003-0092-4f37-29f3b6000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '271' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6c524a5a-952b-11e9-8470-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:14 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:22:15 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 8ef2b398-b003-005c-5a38-2995f9000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6d484162-952b-11e9-aad1-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:16 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:15 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 8ef2b3e6-b003-005c-1538-2995f9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + 1.0truetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '271' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - a727d0da-952d-11e9-9c33-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:12 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 22 Jun 2019 20:38:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - eb1632d5-b003-0031-733a-293fd7000000 + x-ms-version: + - '2018-03-28' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - aa83d85a-952d-11e9-a50a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - eb1633f6-b003-0031-353a-293fd7000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_too_many_cors_rules.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_too_many_cors_rules.yaml new file mode 100644 index 000000000000..40dfc0906aef --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_properties.test_too_many_cors_rules.yaml @@ -0,0 +1,222 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1143' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 18c1b6ec-952a-11e9-aec4-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:44 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://remotestoragename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:1bcd0bb5-1003-00b4-4e36-296802000000\n\ + Time:2019-06-22T20:12:45.0444942Z00" + headers: + Content-Length: + - '294' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 1bcd0bb5-1003-00b4-4e36-296802000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: ' + + www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1143' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d7df5f1e-952a-11e9-b75e-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:05 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:86b7f4ef-c003-003e-2737-29d221000000\n\ + Time:2019-06-22T20:18:06.1635415Z00" + headers: + Content-Length: + - '294' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:05 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 86b7f4ef-c003-003e-2737-29d221000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: ' + + www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1143' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6d6d29dc-952b-11e9-b6e7-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:16 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:7fe46e15-2003-001d-6038-29bdea000000\n\ + Time:2019-06-22T20:22:17.0263672Z00" + headers: + Content-Length: + - '294' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 7fe46e15-2003-001d-6038-29bdea000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: ' + + www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0www.xyz.comGET0' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1143' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - aaab7d10-952d-11e9-832a-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:18 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML\ + \ specified is not syntactically valid.\nRequestId:ee259904-5003-0012-393a-29501c000000\n\ + Time:2019-06-22T20:38:18.6077046Z00" + headers: + Content-Length: + - '294' + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - ee259904-5003-0012-393a-29501c000000 + x-ms-version: + - '2018-03-28' + status: + code: 400 + message: XML specified is not syntactically valid. +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_f.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_f.yaml new file mode 100644 index 000000000000..f0a4e6422835 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_f.yaml @@ -0,0 +1,170 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 18edcb62-952a-11e9-8390-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:09:48 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 28e9434d-5003-00dd-7036-29174c000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d8594bb4-952a-11e9-bc62-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:06 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:15:38 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:08 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - f428ff43-f003-00d4-6037-29529f000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6de4d95a-952b-11e9-b000-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:19:58 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:16 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - ff444167-1003-0017-2c38-294bc5000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ab0ffe34-952d-11e9-8400-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:18 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:35:38 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:18 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b718b670-8003-0067-153a-29f232000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_when_unavailable.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_when_unavailable.yaml new file mode 100644 index 000000000000..37f8ef9b372e --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_service_stats.test_queue_service_stats_when_unavailable.yaml @@ -0,0 +1,170 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 191230cc-952a-11e9-ac6f-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:12:45 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://remotestoragename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:09:48 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:12:44 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - e3423a90-e003-00ba-0336-2907b0000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - d9d10590-952a-11e9-a0bb-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:18:08 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:15:38 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:18:07 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 21039835-d003-0018-6637-293da9000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - 6e10f008-952b-11e9-b3fd-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:22:17 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:19:58 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:22:17 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - d3ac566f-c003-00df-2138-29a9f4000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - python/3.6.5 (Darwin-16.7.0-x86_64-i386-64bit) azure-core/0.0.1 + x-ms-client-request-id: + - ab437d86-952d-11e9-af28-f45c89a7d159 + x-ms-date: + - Sat, 22 Jun 2019 20:38:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename-secondary.queue.core.windows.net/?restype=service&comp=stats + response: + body: + string: "\uFEFFliveSat,\ + \ 22 Jun 2019 20:35:38 GMT" + headers: + Cache-Control: + - no-cache + Content-Type: + - application/xml + Date: + - Sat, 22 Jun 2019 20:38:19 GMT + Server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - e8f3ccd5-9003-0036-703a-296fbe000000 + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/samples/__init__.py b/sdk/storage/azure-storage-queue/tests/samples/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/sdk/storage/azure-storage-queue/tests/samples/test_samples_authentication.py b/sdk/storage/azure-storage-queue/tests/samples/test_samples_authentication.py new file mode 100644 index 000000000000..3528dca3da0b --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/samples/test_samples_authentication.py @@ -0,0 +1,99 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from datetime import datetime, timedelta +import pytest + +try: + import tests.settings_real as settings +except ImportError: + import tests.settings_fake as settings + +from tests.testcase import ( + StorageTestCase, + TestMode, + record +) + + +class TestAuthSamples(StorageTestCase): + url = "{}://{}.queue.core.windows.net".format( + settings.PROTOCOL, + settings.STORAGE_ACCOUNT_NAME + ) + + connection_string = settings.CONNECTION_STRING + shared_access_key = settings.STORAGE_ACCOUNT_KEY + active_directory_application_id = settings.ACTIVE_DIRECTORY_APPLICATION_ID + active_directory_application_secret = settings.ACTIVE_DIRECTORY_APPLICATION_SECRET + active_directory_tenant_id = settings.ACTIVE_DIRECTORY_TENANT_ID + + @record + def test_auth_connection_string(self): + # Instantiate a QueueServiceClient using a connection string + # [START auth_from_connection_string] + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient.from_connection_string(self.connection_string) + # [END auth_from_connection_string] + + # Get information for the Queue Service + properties = queue_service.get_service_properties() + + assert properties is not None + + @record + def test_auth_shared_key(self): + + # Instantiate a QueueServiceClient using a shared access key + # [START create_queue_service_client] + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient(account_url=self.url, credential=self.shared_access_key) + # [END create_queue_service_client] + # Get information for the Queue Service + properties = queue_service.get_service_properties() + + assert properties is not None + + @record + def test_auth_active_directory(self): + pytest.skip('pending azure identity') + + # Get a token credential for authentication + from azure.identity import ClientSecretCredential + token_credential = ClientSecretCredential( + self.active_directory_application_id, + self.active_directory_application_secret, + self.active_directory_tenant_id + ) + + # Instantiate a QueueServiceClient using a token credential + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient(account_url=self.url, credential=token_credential) + + # Get information for the Queue Service + properties = queue_service.get_service_properties() + + assert properties is not None + + def test_auth_shared_access_signature(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # Instantiate a QueueServiceClient using a connection string + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient.from_connection_string(self.connection_string) + + # Create a SAS token to use for authentication of a client + sas_token = queue_service.generate_shared_access_signature( + resource_types="object", + permission="read", + expiry=datetime.utcnow() + timedelta(hours=1) + ) + + assert sas_token is not None diff --git a/sdk/storage/azure-storage-queue/tests/samples/test_samples_hello_world.py b/sdk/storage/azure-storage-queue/tests/samples/test_samples_hello_world.py new file mode 100644 index 000000000000..4edfff18bc9f --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/samples/test_samples_hello_world.py @@ -0,0 +1,61 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +try: + import tests.settings_real as settings +except ImportError: + import tests.settings_fake as settings + +from tests.testcase import ( + StorageTestCase, + record +) + + +class TestHelloWorldSamples(StorageTestCase): + + connection_string = settings.CONNECTION_STRING + + @record + def test_create_client_with_connection_string(self): + # Instantiate the QueueServiceClient from a connection string + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient.from_connection_string(self.connection_string) + + # Get queue service properties + properties = queue_service.get_service_properties() + + assert properties is not None + + @record + def test_queue_and_messages_example(self): + # Instantiate the QueueClient from a connection string + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "myqueue") + + # Create the queue + # [START create_queue] + queue.create_queue() + # [END create_queue] + + try: + # Enqueue messages + queue.enqueue_message(u"I'm using queues!") + queue.enqueue_message(u"This is my second message") + + # Receive the messages + response = queue.receive_messages(messages_per_page=2) + + # Print the content of the messages + for message in response: + print(message.content) + + finally: + # [START delete_queue] + queue.delete_queue() + # [END delete_queue] diff --git a/sdk/storage/azure-storage-queue/tests/samples/test_samples_message_queue.py b/sdk/storage/azure-storage-queue/tests/samples/test_samples_message_queue.py new file mode 100644 index 000000000000..0142bb2a4fa4 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/samples/test_samples_message_queue.py @@ -0,0 +1,245 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from datetime import datetime, timedelta + +try: + import tests.settings_real as settings +except ImportError: + import tests.settings_fake as settings + +from tests.testcase import ( + StorageTestCase, + record, + TestMode +) + + +class TestMessageQueueSamples(StorageTestCase): + + connection_string = settings.CONNECTION_STRING + storage_url = "{}://{}.queue.core.windows.net".format( + settings.PROTOCOL, + settings.STORAGE_ACCOUNT_NAME + ) + + def test_set_access_policy(self): + # SAS URL is calculated from storage key, so this test runs live only + if TestMode.need_recording_file(self.test_mode): + return + + # [START create_queue_client_from_connection_string] + from azure.storage.queue import QueueClient + queue_client = QueueClient.from_connection_string(self.connection_string, "queuetest") + # [END create_queue_client_from_connection_string] + + # Create the queue + queue_client.create_queue() + queue_client.enqueue_message('hello world') + + try: + # [START set_access_policy] + # Create an access policy + from azure.storage.queue import AccessPolicy, QueuePermissions + access_policy = AccessPolicy() + access_policy.start = datetime.utcnow() - timedelta(hours=1) + access_policy.expiry = datetime.utcnow() + timedelta(hours=1) + access_policy.permission = QueuePermissions.READ + identifiers = {'my-access-policy-id': access_policy} + + # Set the access policy + queue_client.set_queue_access_policy(identifiers) + # [END set_access_policy] + + # Use the access policy to generate a SAS token + # [START queue_client_sas_token] + sas_token = queue_client.generate_shared_access_signature( + policy_id='my-access-policy-id' + ) + # [END queue_client_sas_token] + + # Authenticate with the sas token + # [START create_queue_client] + q = QueueClient( + queue_url=queue_client.url, + credential=sas_token + ) + # [END create_queue_client] + + # Use the newly authenticated client to receive messages + my_message = q.receive_messages() + assert my_message is not None + + finally: + # Delete the queue + queue_client.delete_queue() + + @record + def test_queue_metadata(self): + + # Instantiate a queue client + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "metaqueue") + + # Create the queue + queue.create_queue() + + try: + # [START set_queue_metadata] + metadata = {'foo': 'val1', 'bar': 'val2', 'baz': 'val3'} + queue.set_queue_metadata(metadata=metadata) + # [END set_queue_metadata] + + # [START get_queue_properties] + response = queue.get_queue_properties().metadata + # [END get_queue_properties] + assert response == metadata + + finally: + # Delete the queue + queue.delete_queue() + + @record + def test_enqueue_and_receive_messages(self): + + # Instantiate a queue client + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "messagequeue") + + # Create the queue + queue.create_queue() + + try: + # [START enqueue_messages] + queue.enqueue_message(u"message1") + queue.enqueue_message(u"message2", visibility_timeout=30) # wait 30s before becoming visible + queue.enqueue_message(u"message3") + queue.enqueue_message(u"message4") + queue.enqueue_message(u"message5") + # [END enqueue_messages] + + # [START receive_messages] + # receive one message from the front of the queue + one_msg = queue.receive_messages() + + # Receive the last 5 messages + messages = queue.receive_messages(messages_per_page=5) + + # Print the messages + for msg in messages: + print(msg.content) + # [END receive_messages] + + # Only prints 4 messages because message 2 is not visible yet + # >>message1 + # >>message3 + # >>message4 + # >>message5 + + finally: + # Delete the queue + queue.delete_queue() + + @record + def test_delete_and_clear_messages(self): + + # Instantiate a queue client + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "delqueue") + + # Create the queue + queue.create_queue() + + try: + # Enqueue messages + queue.enqueue_message(u"message1") + queue.enqueue_message(u"message2") + queue.enqueue_message(u"message3") + queue.enqueue_message(u"message4") + queue.enqueue_message(u"message5") + + # [START delete_message] + # Get the message at the front of the queue + msg = next(queue.receive_messages()) + + # Delete the specified message + queue.delete_message(msg) + # [END delete_message] + + # [START clear_messages] + queue.clear_messages() + # [END clear_messages] + + finally: + # Delete the queue + queue.delete_queue() + + @record + def test_peek_messages(self): + # Instantiate a queue client + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "peekqueue") + + # Create the queue + queue.create_queue() + + try: + # Enqueue messages + queue.enqueue_message(u"message1") + queue.enqueue_message(u"message2") + queue.enqueue_message(u"message3") + queue.enqueue_message(u"message4") + queue.enqueue_message(u"message5") + + # [START peek_message] + # Peek at one message at the front of the queue + msg = queue.peek_messages() + + # Peek at the last 5 messages + messages = queue.peek_messages(max_messages=5) + + # Print the last 5 messages + for message in messages: + print(message.content) + # [END peek_message] + + finally: + # Delete the queue + queue.delete_queue() + + @record + def test_update_message(self): + + # Instantiate a queue client + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "updatequeue") + + # Create the queue + queue.create_queue() + + try: + # [START update_message] + # Enqueue a message + queue.enqueue_message(u"update me") + + # Receive the message + messages = queue.receive_messages() + + # Update the message + list_result = next(messages) + message = queue.update_message( + list_result.id, + pop_receipt=list_result.pop_receipt, + visibility_timeout=0, + content=u"updated") + # [END update_message] + assert message.content == "updated" + + finally: + # Delete the queue + queue.delete_queue() diff --git a/sdk/storage/azure-storage-queue/tests/samples/test_samples_queue_service.py b/sdk/storage/azure-storage-queue/tests/samples/test_samples_queue_service.py new file mode 100644 index 000000000000..a99f0cf4b748 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/samples/test_samples_queue_service.py @@ -0,0 +1,99 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +try: + import tests.settings_real as settings +except ImportError: + import tests.settings_fake as settings + +from tests.testcase import ( + StorageTestCase, + record +) + + +class TestQueueServiceSamples(StorageTestCase): + + connection_string = settings.CONNECTION_STRING + + @record + def test_queue_service_properties(self): + # Instantiate the QueueServiceClient from a connection string + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient.from_connection_string(self.connection_string) + + # [START set_queue_service_properties] + # Create service properties + from azure.storage.queue import Logging, Metrics, CorsRule, RetentionPolicy + + # Create logging settings + logging = Logging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Create metrics for requests statistics + hour_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + minute_metrics = Metrics(enabled=True, include_apis=True, + retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Create CORS rules + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Set the service properties + queue_service.set_service_properties(logging, hour_metrics, minute_metrics, cors) + # [END set_queue_service_properties] + + # [START get_queue_service_properties] + properties = queue_service.get_service_properties() + # [END get_queue_service_properties] + + @record + def test_queues_in_account(self): + # Instantiate the QueueServiceClient from a connection string + from azure.storage.queue import QueueServiceClient + queue_service = QueueServiceClient.from_connection_string(self.connection_string) + + # [START qsc_create_queue] + queue_service.create_queue("testqueue") + # [END qsc_create_queue] + + try: + # [START qsc_list_queues] + # List all the queues in the service + list_queues = next(queue_service.list_queues()) + + # List the queues in the service that start with the name "test" + list_test_queues = next(queue_service.list_queues(name_starts_with="test")) + # [END qsc_list_queues] + + finally: + # [START qsc_delete_queue] + queue_service.delete_queue("testqueue") + # [END qsc_delete_queue] + + @record + def test_get_queue_client(self): + # Instantiate the QueueServiceClient from a connection string + from azure.storage.queue import QueueServiceClient, QueueClient + queue_service = QueueServiceClient.from_connection_string(self.connection_string) + + # [START get_queue_client] + # Get the queue client to interact with a specific queue + queue = queue_service.get_queue_client("myqueue") + # [END get_queue_client] diff --git a/sdk/storage/azure-storage-queue/tests/settings_fake.py b/sdk/storage/azure-storage-queue/tests/settings_fake.py new file mode 100644 index 000000000000..c4fe5917a862 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/settings_fake.py @@ -0,0 +1,55 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +# NOTE: these keys are fake, but valid base-64 data, they were generated using: +# base64.b64encode(os.urandom(64)) + +STORAGE_ACCOUNT_NAME = "storagename" +QUEUE_NAME = "pythonqueue" +STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==" +BLOB_STORAGE_ACCOUNT_NAME = "blobstoragename" +BLOB_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==" +REMOTE_STORAGE_ACCOUNT_NAME = "storagename" +REMOTE_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==" +PREMIUM_STORAGE_ACCOUNT_NAME = "premiumstoragename" +PREMIUM_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==" +OAUTH_STORAGE_ACCOUNT_NAME = "oauthstoragename" +OAUTH_STORAGE_ACCOUNT_KEY = "XBB/YoZ41bDFBW1VcgCBNYmA1PDlc3NvQQaCk2rb/JtBoMBlekznQwAzDJHvZO1gJmCh8CUT12Gv3aCkWaDeGA==" + +# Configurations related to Active Directory, which is used to obtain a token credential +ACTIVE_DIRECTORY_APPLICATION_ID = "68390a19-a897-236b-b453-488abf67b4fc" +ACTIVE_DIRECTORY_APPLICATION_SECRET = "3Ujhg7pzkOeE7flc6Z187ugf5/cJnszGPjAiXmcwhaY=" +ACTIVE_DIRECTORY_TENANT_ID = "32f988bf-54f1-15af-36ab-2d7cd364db47" + +# Use instead of STORAGE_ACCOUNT_NAME and STORAGE_ACCOUNT_KEY if custom settings are needed +CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=storagename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net" +BLOB_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=blobstoragename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net" +PREMIUM_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=premiumstoragename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net" +# Use 'https' or 'http' protocol for sending requests, 'https' highly recommended +PROTOCOL = "https" + +# Set to true to target the development storage emulator +IS_EMULATED = False + +# Set to true if server side file encryption is enabled +IS_SERVER_SIDE_FILE_ENCRYPTION_ENABLED = True + +# Decide which test mode to run against. Possible options: +# - Playback: run against stored recordings +# - Record: run tests against live storage and update recordings +# - RunLiveNoRecord: run tests against live storage without altering recordings +TEST_MODE = 'Playback' + +# Set to true to enable logging for the tests +# logging is not enabled by default because it pollutes the CI logs +ENABLE_LOGGING = False + +# Set up proxy support +USE_PROXY = False +PROXY_HOST = "192.168.15.116" +PROXY_PORT = "8118" +PROXY_USER = "" +PROXY_PASSWORD = "" diff --git a/sdk/storage/azure-storage-queue/tests/testcase.py b/sdk/storage/azure-storage-queue/tests/testcase.py new file mode 100644 index 000000000000..dd9291e1fcef --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/testcase.py @@ -0,0 +1,507 @@ +# coding: utf-8 +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +from __future__ import division +from contextlib import contextmanager +import copy +import inspect +import os +import os.path +import time +from unittest import SkipTest + +import adal +import vcr +import zlib +import math +import uuid +import unittest +import sys +import random +import tests.settings_fake as fake_settings +import logging + +try: + from cStringIO import StringIO # Python 2 +except ImportError: + from io import StringIO + +from azure.core.credentials import AccessToken + +try: + import tests.settings_real as settings +except ImportError: + settings = None + + +LOGGING_FORMAT = '%(asctime)s %(name)-20s %(levelname)-5s %(message)s' + + +class TestMode(object): + none = 'None'.lower() # this will be for unit test, no need for any recordings + playback = 'Playback'.lower() # run against stored recordings + record = 'Record'.lower() # run tests against live storage and update recordings + run_live_no_record = 'RunLiveNoRecord'.lower() # run tests against live storage without altering recordings + + @staticmethod + def is_playback(mode): + return mode == TestMode.playback + + @staticmethod + def need_recording_file(mode): + return mode == TestMode.playback or mode == TestMode.record + + @staticmethod + def need_real_credentials(mode): + return mode == TestMode.run_live_no_record or mode == TestMode.record + + +class FakeTokenCredential(object): + """Protocol for classes able to provide OAuth tokens. + :param str scopes: Lets you specify the type of access needed. + """ + def __init__(self): + self.token = AccessToken("YOU SHALL NOT PASS", 0) + + def get_token(self, *args): + return self.token + + +class StorageTestCase(unittest.TestCase): + + def setUp(self): + self.working_folder = os.path.dirname(__file__) + + self.settings = settings + self.fake_settings = fake_settings + + if settings is None: + self.test_mode = TestMode.playback + else: + self.test_mode = self.settings.TEST_MODE.lower() or TestMode.playback + + if self.test_mode == TestMode.playback: + self.settings = self.fake_settings + + # example of qualified test name: + # test_mgmt_network.test_public_ip_addresses + _, filename = os.path.split(inspect.getsourcefile(type(self))) + name, _ = os.path.splitext(filename) + self.qualified_test_name = '{0}.{1}'.format( + name, + self._testMethodName, + ) + + self.logger = logging.getLogger('azure.storage') + # enable logging if desired + self.configure_logging() + + def configure_logging(self): + self.enable_logging() if self.settings.ENABLE_LOGGING else self.disable_logging() + + def enable_logging(self): + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(LOGGING_FORMAT)) + self.logger.handlers = [handler] + self.logger.setLevel(logging.INFO) + self.logger.propagate = True + self.logger.disabled = False + + def disable_logging(self): + self.logger.propagate = False + self.logger.disabled = True + self.logger.handlers = [] + + def sleep(self, seconds): + if not self.is_playback(): + time.sleep(seconds) + + def is_playback(self): + return self.test_mode == TestMode.playback + + def get_resource_name(self, prefix=''): + # Append a suffix to the name, based on the fully qualified test name + # We use a checksum of the test name so that each test gets different + # resource names, but each test will get the same name on repeat runs, + # which is needed for playback. + # Most resource names have a length limit, so we use a crc32 + if self.test_mode.lower() == TestMode.run_live_no_record.lower(): + return prefix + str(uuid.uuid4()).replace('-', '') + else: + checksum = zlib.adler32(self.qualified_test_name.encode()) & 0xffffffff + name = '{}{}'.format(prefix, hex(checksum)[2:]) + if name.endswith('L'): + name = name[:-1] + return name + + def get_random_bytes(self, size): + if self.test_mode.lower() == TestMode.run_live_no_record.lower(): + rand = random.Random() + else: + checksum = zlib.adler32(self.qualified_test_name.encode()) & 0xffffffff + rand = random.Random(checksum) + result = bytearray(size) + for i in range(size): + result[i] = int(rand.random()*255) # random() is consistent between python 2 and 3 + return bytes(result) + + def get_random_text_data(self, size): + '''Returns random unicode text data exceeding the size threshold for + chunking blob upload.''' + checksum = zlib.adler32(self.qualified_test_name.encode()) & 0xffffffff + rand = random.Random(checksum) + text = u'' + words = [u'hello', u'world', u'python', u'啊齄丂狛狜'] + while (len(text) < size): + index = int(rand.random()*(len(words) - 1)) + text = text + u' ' + words[index] + + return text + + @staticmethod + def _set_test_proxy(service, settings): + if settings.USE_PROXY: + service.set_proxy( + settings.PROXY_HOST, + settings.PROXY_PORT, + settings.PROXY_USER, + settings.PROXY_PASSWORD, + ) + + def _get_shared_key_credential(self): + return { + "account_name": self.settings.STORAGE_ACCOUNT_NAME, + "account_key": self.settings.STORAGE_ACCOUNT_KEY + } + + def _get_premium_shared_key_credential(self): + return { + "account_name": self.settings.PREMIUM_STORAGE_ACCOUNT_NAME, + "account_key": self.settings.PREMIUM_STORAGE_ACCOUNT_KEY + } + + def _get_remote_shared_key_credential(self): + return { + "account_name": self.settings.REMOTE_STORAGE_ACCOUNT_NAME, + "account_key": self.settings.REMOTE_STORAGE_ACCOUNT_KEY + } + + def _get_account_url(self): + return "{}://{}.blob.core.windows.net".format( + self.settings.PROTOCOL, + self.settings.STORAGE_ACCOUNT_NAME + ) + + def _get_queue_url(self): + return "{}://{}.queue.core.windows.net".format( + self.settings.PROTOCOL, + self.settings.STORAGE_ACCOUNT_NAME + ) + + def _get_oauth_queue_url(self): + return "{}://{}.queue.core.windows.net".format( + self.settings.PROTOCOL, + self.settings.OAUTH_STORAGE_ACCOUNT_NAME + ) + + def _get_premium_account_url(self): + return "{}://{}.blob.core.windows.net".format( + self.settings.PROTOCOL, + self.settings.PREMIUM_STORAGE_ACCOUNT_NAME + ) + + def _get_remote_account_url(self): + return "{}://{}.blob.core.windows.net".format( + self.settings.PROTOCOL, + self.settings.REMOTE_STORAGE_ACCOUNT_NAME + ) + + def _create_storage_service(self, service_class, settings): + if settings.CONNECTION_STRING: + service = service_class(connection_string=settings.CONNECTION_STRING) + elif settings.IS_EMULATED: + service = service_class(is_emulated=True) + else: + service = service_class( + settings.STORAGE_ACCOUNT_NAME, + settings.STORAGE_ACCOUNT_KEY, + protocol=settings.PROTOCOL, + ) + self._set_test_proxy(service, settings) + return service + + # for blob storage account + def _create_storage_service_for_blob_storage_account(self, service_class, settings): + if hasattr(settings, 'BLOB_CONNECTION_STRING') and settings.BLOB_CONNECTION_STRING != "": + service = service_class(connection_string=settings.BLOB_CONNECTION_STRING) + elif settings.IS_EMULATED: + service = service_class(is_emulated=True) + elif hasattr(settings, 'BLOB_STORAGE_ACCOUNT_NAME') and settings.BLOB_STORAGE_ACCOUNT_NAME != "": + service = service_class( + settings.BLOB_STORAGE_ACCOUNT_NAME, + settings.BLOB_STORAGE_ACCOUNT_KEY, + protocol=settings.PROTOCOL, + ) + else: + raise SkipTest('BLOB_CONNECTION_STRING or BLOB_STORAGE_ACCOUNT_NAME must be populated to run this test') + + self._set_test_proxy(service, settings) + return service + + def _create_premium_storage_service(self, service_class, settings): + if hasattr(settings, 'PREMIUM_CONNECTION_STRING') and settings.PREMIUM_CONNECTION_STRING != "": + service = service_class(connection_string=settings.PREMIUM_CONNECTION_STRING) + elif settings.IS_EMULATED: + service = service_class(is_emulated=True) + elif hasattr(settings, 'PREMIUM_STORAGE_ACCOUNT_NAME') and settings.PREMIUM_STORAGE_ACCOUNT_NAME != "": + service = service_class( + settings.PREMIUM_STORAGE_ACCOUNT_NAME, + settings.PREMIUM_STORAGE_ACCOUNT_KEY, + protocol=settings.PROTOCOL, + ) + else: + raise SkipTest('PREMIUM_CONNECTION_STRING or PREMIUM_STORAGE_ACCOUNT_NAME must be populated to run this test') + + self._set_test_proxy(service, settings) + return service + + def _create_remote_storage_service(self, service_class, settings): + if settings.REMOTE_STORAGE_ACCOUNT_NAME and settings.REMOTE_STORAGE_ACCOUNT_KEY: + service = service_class( + settings.REMOTE_STORAGE_ACCOUNT_NAME, + settings.REMOTE_STORAGE_ACCOUNT_KEY, + protocol=settings.PROTOCOL, + ) + else: + print("REMOTE_STORAGE_ACCOUNT_NAME and REMOTE_STORAGE_ACCOUNT_KEY not set in test settings file.") + self._set_test_proxy(service, settings) + return service + + def assertNamedItemInContainer(self, container, item_name, msg=None): + def _is_string(obj): + if sys.version_info >= (3,): + return isinstance(obj, str) + else: + return isinstance(obj, basestring) + for item in container: + if _is_string(item): + if item == item_name: + return + elif item.name == item_name: + return + elif hasattr(item, 'snapshot') and item.snapshot == item_name: + return + + + standardMsg = '{0} not found in {1}'.format( + repr(item_name), [str(c) for c in container]) + self.fail(self._formatMessage(msg, standardMsg)) + + def assertNamedItemNotInContainer(self, container, item_name, msg=None): + for item in container: + if item.name == item_name: + standardMsg = '{0} unexpectedly found in {1}'.format( + repr(item_name), repr(container)) + self.fail(self._formatMessage(msg, standardMsg)) + + def recording(self): + if TestMode.need_recording_file(self.test_mode): + cassette_name = '{0}.yaml'.format(self.qualified_test_name) + + my_vcr = vcr.VCR( + before_record_request = self._scrub_sensitive_request_info, + before_record_response = self._scrub_sensitive_response_info, + record_mode = 'none' if TestMode.is_playback(self.test_mode) else 'all' + ) + + self.assertIsNotNone(self.working_folder) + return my_vcr.use_cassette( + os.path.join(self.working_folder, 'recordings', cassette_name), + filter_headers=['authorization'], + ) + else: + @contextmanager + def _nop_context_manager(): + yield + return _nop_context_manager() + + def _scrub_sensitive_request_info(self, request): + if not TestMode.is_playback(self.test_mode): + request.uri = self._scrub(request.uri) + if request.body is not None: + request.body = self._scrub(request.body) + return request + + def _scrub_sensitive_response_info(self, response): + if not TestMode.is_playback(self.test_mode): + # We need to make a copy because vcr doesn't make one for us. + # Without this, changing the contents of the dicts would change + # the contents returned to the caller - not just the contents + # getting saved to disk. That would be a problem with headers + # such as 'location', often used in the request uri of a + # subsequent service call. + response = copy.deepcopy(response) + headers = response.get('headers') + if headers: + for name, val in headers.items(): + for i in range(len(val)): + val[i] = self._scrub(val[i]) + body = response.get('body') + if body: + body_str = body.get('string') + if body_str: + response['body']['string'] = self._scrub(body_str) + + return response + + def _scrub(self, val): + old_to_new_dict = { + self.settings.STORAGE_ACCOUNT_NAME: self.settings.STORAGE_ACCOUNT_NAME, + self.settings.STORAGE_ACCOUNT_KEY: self.settings.STORAGE_ACCOUNT_KEY, + self.settings.OAUTH_STORAGE_ACCOUNT_NAME: self.fake_settings.OAUTH_STORAGE_ACCOUNT_NAME, + self.settings.OAUTH_STORAGE_ACCOUNT_KEY: self.fake_settings.OAUTH_STORAGE_ACCOUNT_KEY, + self.settings.BLOB_STORAGE_ACCOUNT_NAME: self.fake_settings.BLOB_STORAGE_ACCOUNT_NAME, + self.settings.BLOB_STORAGE_ACCOUNT_KEY: self.fake_settings.BLOB_STORAGE_ACCOUNT_KEY, + self.settings.REMOTE_STORAGE_ACCOUNT_KEY: self.fake_settings.REMOTE_STORAGE_ACCOUNT_KEY, + self.settings.REMOTE_STORAGE_ACCOUNT_NAME: self.fake_settings.REMOTE_STORAGE_ACCOUNT_NAME, + self.settings.PREMIUM_STORAGE_ACCOUNT_NAME: self.fake_settings.PREMIUM_STORAGE_ACCOUNT_NAME, + self.settings.PREMIUM_STORAGE_ACCOUNT_KEY: self.fake_settings.PREMIUM_STORAGE_ACCOUNT_KEY, + self.settings.ACTIVE_DIRECTORY_APPLICATION_ID: self.fake_settings.ACTIVE_DIRECTORY_APPLICATION_ID, + self.settings.ACTIVE_DIRECTORY_APPLICATION_SECRET: self.fake_settings.ACTIVE_DIRECTORY_APPLICATION_SECRET, + self.settings.ACTIVE_DIRECTORY_TENANT_ID: self.fake_settings.ACTIVE_DIRECTORY_TENANT_ID, + } + replacements = list(old_to_new_dict.keys()) + + # if we have 'val1' and 'val10', we want 'val10' to be replaced first + replacements.sort(reverse=True) + + for old_value in replacements: + if old_value: + new_value = old_to_new_dict[old_value] + if old_value != new_value: + if isinstance(val, bytes): + val = val.replace(old_value.encode(), new_value.encode()) + else: + val = val.replace(old_value, new_value) + return val + + def assert_upload_progress(self, size, max_chunk_size, progress, unknown_size=False): + '''Validates that the progress chunks align with our chunking procedure.''' + index = 0 + total = None if unknown_size else size + small_chunk_size = size % max_chunk_size + self.assertEqual(len(progress), math.ceil(size / max_chunk_size)) + for i in progress: + self.assertTrue(i[0] % max_chunk_size == 0 or i[0] % max_chunk_size == small_chunk_size) + self.assertEqual(i[1], total) + + def assert_download_progress(self, size, max_chunk_size, max_get_size, progress): + '''Validates that the progress chunks align with our chunking procedure.''' + if size <= max_get_size: + self.assertEqual(len(progress), 1) + self.assertTrue(progress[0][0], size) + self.assertTrue(progress[0][1], size) + else: + small_chunk_size = (size - max_get_size) % max_chunk_size + self.assertEqual(len(progress), 1 + math.ceil((size - max_get_size) / max_chunk_size)) + + self.assertTrue(progress[0][0], max_get_size) + self.assertTrue(progress[0][1], size) + for i in progress[1:]: + self.assertTrue(i[0] % max_chunk_size == 0 or i[0] % max_chunk_size == small_chunk_size) + self.assertEqual(i[1], size) + + def is_file_encryption_enabled(self): + return self.settings.IS_SERVER_SIDE_FILE_ENCRYPTION_ENABLED + + def generate_oauth_token(self): + from azure.identity import ClientSecretCredential + + return ClientSecretCredential( + self.settings.ACTIVE_DIRECTORY_APPLICATION_ID, + self.settings.ACTIVE_DIRECTORY_APPLICATION_SECRET, + self.settings.ACTIVE_DIRECTORY_TENANT_ID + ) + + def generate_fake_token(self): + return FakeTokenCredential() + +def record(test): + def recording_test(self): + with self.recording(): + test(self) + recording_test.__name__ = test.__name__ + return recording_test + + +def not_for_emulator(test): + def skip_test_if_targeting_emulator(self): + if self.settings.IS_EMULATED: + return + else: + test(self) + return skip_test_if_targeting_emulator + + +class RetryCounter(object): + def __init__(self): + self.count = 0 + + def simple_count(self, retry_context): + self.count += 1 + + +class ResponseCallback(object): + def __init__(self, status=None, new_status=None): + self.status = status + self.new_status = new_status + self.first = True + self.count = 0 + + def override_first_status(self, response): + if self.first and response.status == self.status: + response.status = self.new_status + self.first = False + self.count += 1 + + def override_status(self, response): + if response.status == self.status: + response.status = self.new_status + self.count += 1 + + +class LogCaptured(object): + def __init__(self, test_case=None): + # accept the test case so that we may reset logging after capturing logs + self.test_case = test_case + + def __enter__(self): + # enable logging + # it is possible that the global logging flag is turned off + self.test_case.enable_logging() + + # create a string stream to send the logs to + self.log_stream = StringIO() + + # the handler needs to be stored so that we can remove it later + self.handler = logging.StreamHandler(self.log_stream) + self.handler.setFormatter(logging.Formatter(LOGGING_FORMAT)) + + # get and enable the logger to send the outputs to the string stream + self.logger = logging.getLogger('azure.storage') + self.logger.level = logging.INFO + self.logger.addHandler(self.handler) + + # the stream is returned to the user so that the capture logs can be retrieved + return self.log_stream + + def __exit__(self, exc_type, exc_val, exc_tb): + # stop the handler, and close the stream to exit + self.logger.removeHandler(self.handler) + self.log_stream.close() + + # reset logging since we messed with the setting + self.test_case.configure_logging()