Skip to content

fix blob_storage_request #862

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sdk/data_tables/src/clients/entity_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ impl EntityClient {

pub(crate) fn prepare_request(
&self,
url: &str,
url: Url,
method: Method,
request_body: Option<Bytes>,
) -> azure_core::Result<Request> {
Expand Down
3 changes: 2 additions & 1 deletion sdk/data_tables/src/clients/partition_key_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::{prelude::*, requests::*};

use azure_core::Method;
use azure_core::Request;
use azure_core::Url;
use azure_storage::core::clients::StorageAccountClient;
use bytes::Bytes;
use std::sync::Arc;
Expand Down Expand Up @@ -55,7 +56,7 @@ impl PartitionKeyClient {

pub(crate) fn prepare_request(
&self,
url: &str,
url: Url,
method: Method,
request_body: Option<Bytes>,
) -> azure_core::Result<Request> {
Expand Down
3 changes: 2 additions & 1 deletion sdk/data_tables/src/clients/table_client.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::{clients::TableServiceClient, requests::*};
use azure_core::Method;
use azure_core::Request;
use azure_core::Url;
use azure_storage::core::clients::StorageAccountClient;
use bytes::Bytes;
use std::sync::Arc;
Expand Down Expand Up @@ -66,7 +67,7 @@ impl TableClient {

pub(crate) fn prepare_request(
&self,
url: &str,
url: Url,
method: Method,
request_body: Option<Bytes>,
) -> azure_core::Result<Request> {
Expand Down
2 changes: 1 addition & 1 deletion sdk/data_tables/src/clients/table_service_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ impl TableServiceClient {

pub(crate) fn prepare_request(
&self,
url: &str,
url: Url,
method: Method,
request_body: Option<Bytes>,
) -> azure_core::Result<Request> {
Expand Down
4 changes: 2 additions & 2 deletions sdk/data_tables/src/requests/create_table_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ impl<'a> CreateTableBuilder<'a> {
}

pub async fn execute(&self) -> azure_core::Result<CreateTableResponse> {
let url = self.table_client.url();
let url = self.table_client.url().clone();

#[derive(Debug, Clone, Serialize)]
struct RequestBody<'a> {
Expand All @@ -35,7 +35,7 @@ impl<'a> CreateTableBuilder<'a> {
})?;

let mut request = self.table_client.prepare_request(
url.as_str(),
url,
Method::POST,
Some(bytes::Bytes::from(request_body_serialized)),
)?;
Expand Down
2 changes: 1 addition & 1 deletion sdk/data_tables/src/requests/delete_entity_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ impl<'a> DeleteEntityBuilder<'a> {

let mut request = self
.entity_client
.prepare_request(url.as_str(), Method::DELETE, None)?;
.prepare_request(url, Method::DELETE, None)?;
request.add_optional_header(&self.client_request_id);
request.add_mandatory_header(&self.if_match);

Expand Down
2 changes: 1 addition & 1 deletion sdk/data_tables/src/requests/delete_table_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ impl<'a> DeleteTableBuilder<'a> {

let mut request = self
.table_client
.prepare_request(url.as_str(), Method::DELETE, None)?;
.prepare_request(url, Method::DELETE, None)?;
request.add_optional_header(&self.client_request_id);
request.insert_header("Accept", "application/json");

Expand Down
4 changes: 1 addition & 3 deletions sdk/data_tables/src/requests/get_entity_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,7 @@ impl<'a> GetEntityBuilder<'a> {

self.select.append_to_url_query(&mut url);

let mut request = self
.entity_client
.prepare_request(url.as_str(), Method::GET, None)?;
let mut request = self.entity_client.prepare_request(url, Method::GET, None)?;
request.add_optional_header(&self.client_request_id);
request.insert_header("Accept", "application/json;odata=fullmetadata");

Expand Down
2 changes: 1 addition & 1 deletion sdk/data_tables/src/requests/insert_entity_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ impl<'a> InsertEntityBuilder<'a> {
let request_body_serialized = serde_json::to_string(entity)?;

let mut request = self.table_client.prepare_request(
url.as_str(),
url,
Method::POST,
Some(bytes::Bytes::from(request_body_serialized)),
)?;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ impl<'a> InsertOrReplaceOrMergeEntityBuilder<'a> {
let request_body_serialized = serde_json::to_string(entity)?;

let mut request = self.entity_client.prepare_request(
url.as_str(),
url,
match self.operation {
Operation::InsertOrMerge => crate::MERGE.to_owned(),
Operation::InsertOrReplace => Method::PUT,
Expand Down
6 changes: 3 additions & 3 deletions sdk/data_tables/src/requests/list_tables_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ impl<'a> ListTablesBuilder<'a> {
self.continuation_next_table_name
.append_to_url_query(&mut url);

let mut request =
self.table_service_client
.prepare_request(url.as_str(), Method::GET, None)?;
let mut request = self
.table_service_client
.prepare_request(url, Method::GET, None)?;
request.add_optional_header(&self.client_request_id);
request.insert_header("Accept", "application/json;odata=fullmetadata");

Expand Down
4 changes: 1 addition & 3 deletions sdk/data_tables/src/requests/query_entity_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@ impl<'a> QueryEntityBuilder<'a> {
self.continuation_next_partition_and_row_key
.append_to_url_query(&mut url);

let mut request = self
.table_client
.prepare_request(url.as_str(), Method::GET, None)?;
let mut request = self.table_client.prepare_request(url, Method::GET, None)?;
request.add_optional_header(&self.client_request_id);
request.insert_header("Accept", "application/json;odata=fullmetadata");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ impl<'a> SubmitTransactionBuilder<'a> {
let payload = batch.to_string()?;

let mut request = self.partition_key_client.prepare_request(
url.as_str(),
url,
Method::POST,
Some(bytes::Bytes::from(payload)),
)?;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ impl<'a> UpdateOrMergeEntityBuilder<'a> {
where
E: Serialize,
{
let url = self.entity_client.url();
let url = self.entity_client.url().clone();

let request_body_serialized = serde_json::to_string(entity)?;

let mut request = self.entity_client.prepare_request(
url.as_str(),
url,
match self.operation {
Operation::Merge => crate::MERGE.to_owned(),
Operation::Update => Method::PUT,
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage/src/account/operations/find_blobs_by_tags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl FindBlobsByTagsBuilder {
let mut request = self
.client
.storage_account_client()
.blob_storage_request(azure_core::Method::GET);
.blob_storage_request(azure_core::Method::GET)?;

self.timeout.append_to_url_query(request.url_mut());
request
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ impl GetAccountInformationBuilder {
let mut request = self
.client
.storage_account_client()
.blob_storage_request(azure_core::Method::GET);
.blob_storage_request(azure_core::Method::GET)?;

for (k, v) in [("restype", "account"), ("comp", "properties")].iter() {
request.url_mut().query_pairs_mut().append_pair(k, v);
Expand Down
3 changes: 1 addition & 2 deletions sdk/storage/src/authorization_policy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ impl Policy for AuthorizationPolicy {
request.method(),
account,
key,
ctx.get()
.expect("ServiceType must be in the Context at this point"),
ctx.get().unwrap_or(&ServiceType::default()),
);
request.insert_header(AUTHORIZATION, auth)
}
Expand Down
41 changes: 23 additions & 18 deletions sdk/storage/src/core/clients/storage_account_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ pub enum ServiceType {
Table,
}

impl Default for ServiceType {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is Blob the default storage type?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fn default() -> Self {
Self::Blob
}
}

#[derive(Debug)]
pub struct StorageAccountClient {
storage_credentials: StorageCredentials,
Expand Down Expand Up @@ -178,14 +184,10 @@ impl StorageAccountClient {
let key = key.into();
let storage_credentials = StorageCredentials::Key(account.clone(), key.clone());
let pipeline = new_pipeline_from_options(StorageOptions::new(), storage_credentials);
let blob_storage_url =
Url::parse(&format!("{}{}", blob_storage_url.as_str(), account)).unwrap();
let table_storage_url =
Url::parse(&format!("{}{}", table_storage_url.as_str(), account)).unwrap();
let queue_storage_url =
Url::parse(&format!("{}{}", queue_storage_url.as_str(), account)).unwrap();
let filesystem_url =
Url::parse(&format!("{}{}", filesystem_url.as_str(), account)).unwrap();
let blob_storage_url = Url::parse(&format!("{}{}", blob_storage_url, account)).unwrap();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: we probably shouldn't unwrap here as account is user supplied and could be poorly formed.

let table_storage_url = Url::parse(&format!("{}{}", table_storage_url, account)).unwrap();
let queue_storage_url = Url::parse(&format!("{}{}", queue_storage_url, account)).unwrap();
let filesystem_url = Url::parse(&format!("{}{}", filesystem_url, account)).unwrap();

Arc::new(Self {
blob_storage_url,
Expand Down Expand Up @@ -420,27 +422,23 @@ impl StorageAccountClient {

pub fn prepare_request(
&self,
url: &str,
url: Url,
method: Method,
service_type: ServiceType,
request_body: Option<Bytes>,
) -> azure_core::Result<Request> {
let dt = chrono::Utc::now();
let time = format!("{}", dt.format("%a, %d %h %Y %T GMT"));

let mut url = url::Url::parse(url).with_context(ErrorKind::DataConversion, || {
format!("failed to parse request url: {url}")
})?;
let mut request = Request::new(url, method);

// if we have a SAS token (in form of query pairs), let's add it to the url here
if let StorageCredentials::SASToken(query_pairs) = &self.storage_credentials {
for (k, v) in query_pairs {
url.query_pairs_mut().append_pair(k, v);
request.url_mut().query_pairs_mut().append_pair(k, v);
}
}

let mut request = Request::new(url, method);

// let's add content length to avoid "chunking" errors.
match request_body {
Some(ref b) => request.insert_header(CONTENT_LENGTH, b.len().to_string()),
Expand Down Expand Up @@ -509,8 +507,16 @@ impl StorageAccountClient {
}

/// Prepares' an `azure_core::Request`.
pub(crate) fn blob_storage_request(&self, http_method: azure_core::Method) -> Request {
Request::new(self.blob_storage_url().clone(), http_method)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before, it was just creating a new Request.

pub(crate) fn blob_storage_request(
&self,
http_method: azure_core::Method,
) -> azure_core::Result<Request> {
self.prepare_request(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The fix was to keep using the code that is in prepare_request.

self.blob_storage_url().clone(),
http_method,
ServiceType::Blob,
None,
)
}
}

Expand Down Expand Up @@ -544,7 +550,6 @@ fn add_if_exists<'a>(headers: &'a Headers, key: &HeaderName) -> &'a str {
headers.get_as_str(key).unwrap_or_default()
}

#[allow(unknown_lints)]
fn string_to_sign(
headers: &Headers,
url: &url::Url,
Expand Down
4 changes: 2 additions & 2 deletions sdk/storage/src/core/clients/storage_client.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use crate::core::clients::{ServiceType, StorageAccountClient};
use crate::operations::*;
use azure_core::Method;
use azure_core::{
error::{Error, ErrorKind},
Context, Request, Response,
};
use azure_core::{Method, Url};
use bytes::Bytes;
use std::sync::Arc;

Expand Down Expand Up @@ -89,7 +89,7 @@ impl StorageClient {

pub fn prepare_request(
&self,
url: &str,
url: Url,
method: Method,
request_body: Option<Bytes>,
) -> azure_core::Result<Request> {
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage_blobs/src/blob/operations/acquire_lease.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ impl AcquireLeaseBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::PUT, None)?;
.prepare_request(url, azure_core::Method::PUT, None)?;
request.insert_header(LEASE_ACTION, "acquire");
request.add_mandatory_header(&self.lease_duration);
request.add_optional_header(&self.proposed_lease_id);
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage_blobs/src/blob/operations/append_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ impl AppendBlockBuilder {
url.query_pairs_mut().append_pair("comp", "appendblock");

let mut request = self.blob_client.prepare_request(
url.as_str(),
url,
azure_core::Method::PUT,
Some(self.body.clone()),
)?;
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage_blobs/src/blob/operations/break_lease.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl BreakLeaseBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::PUT, None)?;
.prepare_request(url, azure_core::Method::PUT, None)?;
request.insert_header(LEASE_ACTION, "break");
request.add_optional_header(&self.lease_break_period);
request.add_optional_header(&self.lease_id);
Expand Down
8 changes: 3 additions & 5 deletions sdk/storage_blobs/src/blob/operations/change_lease.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,9 @@ impl ChangeLeaseBuilder {
url.query_pairs_mut().append_pair("comp", "lease");
self.timeout.append_to_url_query(&mut url);

let mut request = self.blob_lease_client.prepare_request(
url.as_str(),
azure_core::Method::PUT,
None,
)?;
let mut request =
self.blob_lease_client
.prepare_request(url, azure_core::Method::PUT, None)?;
request.insert_header(LEASE_ACTION, "change");
request.add_mandatory_header(self.blob_lease_client.lease_id());
request.add_mandatory_header(&self.proposed_lease_id);
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage_blobs/src/blob/operations/clear_page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ impl ClearPageBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::PUT, None)?;
.prepare_request(url, azure_core::Method::PUT, None)?;

request.insert_header(PAGE_WRITE, "clear");
request.insert_header(BLOB_TYPE, "PageBlob");
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage_blobs/src/blob/operations/copy_blob.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ impl CopyBlobBuilder {
self.timeout.append_to_url_query(&mut url);
let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::PUT, None)?;
.prepare_request(url, azure_core::Method::PUT, None)?;
request.insert_header(COPY_SOURCE, self.source_url.as_str().to_owned());
if let Some(metadata) = &self.metadata {
for m in metadata.iter() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ impl CopyBlobFromUrlBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::PUT, None)?;
.prepare_request(url, azure_core::Method::PUT, None)?;
request.insert_header(COPY_SOURCE, self.source_url.to_string());
request.insert_header(REQUIRES_SYNC, format!("{}", self.is_synchronous));
if let Some(metadata) = &self.metadata {
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage_blobs/src/blob/operations/delete_blob.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ impl DeleteBlobBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::DELETE, None)?;
.prepare_request(url, azure_core::Method::DELETE, None)?;
request.add_optional_header(&self.lease_id);
request.add_mandatory_header(&self.delete_snapshots_method);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl DeleteBlobSnapshotBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::DELETE, None)?;
.prepare_request(url, azure_core::Method::DELETE, None)?;
request.add_optional_header(&self.lease_id);

let response = self
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl DeleteBlobVersionBuilder {

let mut request =
self.blob_client
.prepare_request(url.as_str(), azure_core::Method::DELETE, None)?;
.prepare_request(url, azure_core::Method::DELETE, None)?;
request.add_optional_header(&self.lease_id);

let response = self
Expand Down
Loading