Skip to content
Closed
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
4 changes: 2 additions & 2 deletions samples/list_blobs_native_tls/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();

let credential = DeveloperToolsCredential::new(None)?;
let endpoint = format!("https://{}.blob.core.windows.net/", args.account_name);
let account_url = format!("https://{}.blob.core.windows.net/", args.account_name);

// The reqwest/native-tls feature automatically configures native-tls as the TLS provider.
let container_client =
BlobContainerClient::new(&endpoint, &args.container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, &args.container_name, Some(credential), None)?;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Did you folks change your parameter name as well? The guidelines are "endpoint" for the server host name. This mirrors Java, Python, and Go i.e. most of our languages. I'm not okay with that. You may be taking "endpoint" too literally here if you expect it only to mean the REST API endpoint.

/cc @seanmcc-msft @jalauzon-msft


// Iterate through all pages of blobs in the container.
let mut pager = container_client.list_blobs(None)?.into_pages();
Expand Down
4 changes: 2 additions & 2 deletions samples/list_blobs_rustls_symcrypt/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
};

let credential = DeveloperToolsCredential::new(None)?;
let endpoint = format!("https://{}.blob.core.windows.net/", args.account_name);
let account_url = format!("https://{}.blob.core.windows.net/", args.account_name);

let container_client = BlobContainerClient::new(
&endpoint,
&account_url,
&args.container_name,
Some(credential),
Some(options),
Expand Down
1 change: 1 addition & 0 deletions sdk/storage/azure_storage_blob/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Breaking Changes

- Renamed the `endpoint` parameter on `new()` to `account_url` for `BlobClient`, `BlockBlobClient`, `AppendBlobClient`, `PageBlobClient`, `BlobContainerClient`, and `BlobServiceClient`.
- `BlobServiceClient::find_blobs_by_tags()` is now pageable and returns `Result<Pager<FilteredBlobResponse, XmlFormat>>` instead of `Result<Response<FilterBlobSegment, XmlFormat>>`.
- `BlobContainerClient::find_blobs_by_tags()` is now pageable and returns `Result<Pager<FilteredBlobResponse, XmlFormat>>` instead of `Result<Response<FilteredBlobResponse, XmlFormat>>`.
- Renamed `FilterBlobSegment` to `FilteredBlobResponse`.
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage/azure_storage_blob/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ use azure_identity::DeveloperToolsCredential;
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let credential = DeveloperToolsCredential::new(None)?;
let blob_client = BlobClient::new(
"https://<storage_account_name>.blob.core.windows.net/", // Endpoint
"https://<storage_account_name>.blob.core.windows.net/", // Account URL
"<container_name>", // Container Name
"<blob_name>", // Blob Name
Some(credential), // Credential
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "test-container-append-blob";

let credential = DeveloperToolsCredential::new(None)?;
let container_client =
BlobContainerClient::new(&endpoint, container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, container_name, Some(credential), None)?;

println!("Creating container '{container_name}'...");
container_client.create(None).await?;
Expand Down
4 changes: 2 additions & 2 deletions sdk/storage/azure_storage_blob/examples/blob_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "test-container-blob-client";
let blob_name = "sample.txt";

let credential = DeveloperToolsCredential::new(None)?;
let container_client =
BlobContainerClient::new(&endpoint, container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, container_name, Some(credential), None)?;

container_client.create(None).await?;
println!("Created container '{container_name}'");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "test-container-lifecycle";

let credential = DeveloperToolsCredential::new(None)?;
let container_client =
BlobContainerClient::new(&endpoint, container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, container_name, Some(credential), None)?;

println!("Creating container '{container_name}'...");
container_client.create(None).await?;
Expand Down
4 changes: 2 additions & 2 deletions sdk/storage/azure_storage_blob/examples/blob_hello_world.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "hello-world-container";
let blob_name = "hello_world.txt";

let credential = DeveloperToolsCredential::new(None)?;
let container_client =
BlobContainerClient::new(&endpoint, container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, container_name, Some(credential), None)?;

// Create the container.
container_client.create(None).await?;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "test-container-service-client";

let credential = DeveloperToolsCredential::new(None)?;
let service_client = BlobServiceClient::new(&endpoint, Some(credential), None)?;
let service_client = BlobServiceClient::new(&account_url, Some(credential), None)?;
let container_client = service_client.blob_container_client(container_name);

println!("Creating container '{container_name}'...");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let credential = AzureCliCredential::new(None)?;

// Create BlobContainerClient
let endpoint = format!("https://{}.blob.core.windows.net", account);
let account_url = format!("https://{}.blob.core.windows.net", account);

// Configure client options with optional OpenTelemetry tracing.
// Azure Storage headers (x-ms-version, x-ms-request-id, etc.) are logged by default.
Expand All @@ -119,7 +119,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
};

let container_client = BlobContainerClient::new(
&endpoint,
&account_url,
container_name,
Some(credential),
Some(client_options),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ use std::{num::NonZero, path::PathBuf};
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();

let endpoint = format!("https://{}.blob.core.windows.net", args.account_name);
let account_url = format!("https://{}.blob.core.windows.net", args.account_name);
let credential = AzureCliCredential::new(None)?;
let client = BlobClient::new(
&endpoint,
&account_url,
&args.container_name,
&args.blob_name,
Some(credential),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "test-container-block-blob";

let credential = DeveloperToolsCredential::new(None)?;
let container_client =
BlobContainerClient::new(&endpoint, container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, container_name, Some(credential), None)?;

println!("Creating container '{container_name}'...");
container_client.create(None).await?;
Expand Down
4 changes: 2 additions & 2 deletions sdk/storage/azure_storage_blob/examples/page_blob_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "test-container-page-blob";

let credential = DeveloperToolsCredential::new(None)?;
let container_client =
BlobContainerClient::new(&endpoint, container_name, Some(credential), None)?;
BlobContainerClient::new(&account_url, container_name, Some(credential), None)?;

println!("Creating container '{container_name}'...");
container_client.create(None).await?;
Expand Down
11 changes: 8 additions & 3 deletions sdk/storage/azure_storage_blob/examples/storage_error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account = env::var("AZURE_STORAGE_ACCOUNT_NAME")
.expect("Set AZURE_STORAGE_ACCOUNT_NAME environment variable");

let endpoint = format!("https://{}.blob.core.windows.net/", account);
let account_url = format!("https://{}.blob.core.windows.net/", account);
let container_name = "nonexistent-container";
let blob_name = "nonexistent-blob.txt";

Expand All @@ -44,8 +44,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let credential = AzureCliCredential::new(None)?;

// Create a BlobClient pointing to a blob that doesn't exist
let blob_client =
BlobClient::new(&endpoint, container_name, blob_name, Some(credential), None)?;
let blob_client = BlobClient::new(
&account_url,
container_name,
blob_name,
Some(credential),
None,
)?;

// Attempt to download a blob that doesn't exist to force an error
println!("Attempting to download a blob that doesn't exist...");
Expand Down
7 changes: 4 additions & 3 deletions sdk/storage/azure_storage_blob/perf/download_blob_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,15 +198,16 @@ impl PerfTest for DownloadBlobTest {
let recording = context.recording();
let credential = recording.credential();
let container_name = format!("perf-container-{}", azure_core::Uuid::new_v4());
let endpoint = match &self.endpoint {
let account_url = match &self.endpoint {
Some(e) => e.clone(),
None => format!(
"https://{}.blob.core.windows.net",
recording.var("AZURE_STORAGE_ACCOUNT_NAME", None)
),
};
println!("Using endpoint: {}", endpoint);
let client = BlobContainerClient::new(&endpoint, &container_name, Some(credential), None)?;
println!("Using account URL: {}", account_url);
let client =
BlobContainerClient::new(&account_url, &container_name, Some(credential), None)?;
self.client.get_or_init(|| client);

// Retrieve the blob container client we just set (it's safe to unwrap here because we *just* set it above).
Expand Down
7 changes: 4 additions & 3 deletions sdk/storage/azure_storage_blob/perf/list_blob_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,16 @@ impl PerfTest for ListBlobTest {
let recording = context.recording();
let credential = recording.credential();
let container_name = format!("perf-container-{}", azure_core::Uuid::new_v4());
let endpoint = match &self.endpoint {
let account_url = match &self.endpoint {
Some(e) => e.clone(),
None => format!(
"https://{}.blob.core.windows.net",
recording.var("AZURE_STORAGE_ACCOUNT_NAME", None)
),
};
println!("Using endpoint: {}", endpoint);
let client = BlobContainerClient::new(&endpoint, &container_name, Some(credential), None)?;
println!("Using account URL: {}", account_url);
let client =
BlobContainerClient::new(&account_url, &container_name, Some(credential), None)?;
self.client.set(client).map_err(|_| {
azure_core::Error::with_message(ErrorKind::Other, "Failed to set client")
})?;
Expand Down
7 changes: 4 additions & 3 deletions sdk/storage/azure_storage_blob/perf/upload_blob_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,16 @@ impl PerfTest for UploadBlobTest {
let recording = context.recording();
let credential = recording.credential();
let container_name = format!("perf-container-{}", azure_core::Uuid::new_v4());
let endpoint = match &self.endpoint {
let account_url = match &self.endpoint {
Some(e) => e.clone(),
None => format!(
"https://{}.blob.core.windows.net",
recording.var("AZURE_STORAGE_ACCOUNT_NAME", None)
),
};
println!("Using endpoint: {}", endpoint);
let client = BlobContainerClient::new(&endpoint, &container_name, Some(credential), None)?;
println!("Using account URL: {}", account_url);
let client =
BlobContainerClient::new(&account_url, &container_name, Some(credential), None)?;
self.client.get_or_init(|| client);
let data = vec![0u8; self.size];
self.upload_buffer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,25 @@ impl AppendBlobClient {
///
/// # Arguments
///
/// * `endpoint` - The full URL of the Azure storage account, for example `https://myaccount.blob.core.windows.net/`
/// * `account_url` - The full URL of the Azure storage account, for example `https://myaccount.blob.core.windows.net/`
/// * `container_name` - The name of the container containing this Append blob.
/// * `blob_name` - The name of the Append blob to interact with.
/// * `credential` - An optional implementation of [`TokenCredential`] that can provide an Entra ID token to use when authenticating.
/// * `options` - Optional configuration for the client.
pub fn new(
endpoint: &str,
account_url: &str,
container_name: &str,
blob_name: &str,
credential: Option<Arc<dyn TokenCredential>>,
options: Option<AppendBlobClientOptions>,
) -> Result<Self> {
let mut url = Url::parse(endpoint)?;
let mut url = Url::parse(account_url)?;

{
let mut path_segments = url.path_segments_mut().map_err(|_| {
azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
"Invalid endpoint URL: Failed to parse out path segments from provided endpoint URL.",
"Invalid account URL: Failed to parse out path segments from provided account URL.",
)
})?;
path_segments.extend([container_name, blob_name]);
Expand Down
8 changes: 4 additions & 4 deletions sdk/storage/azure_storage_blob/src/clients/blob_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,25 +31,25 @@ impl BlobClient {
///
/// # Arguments
///
/// * `endpoint` - The full URL of the Azure storage account, for example `https://myaccount.blob.core.windows.net/`
/// * `account_url` - The full URL of the Azure storage account, for example `https://myaccount.blob.core.windows.net/`
/// * `container_name` - The name of the container containing this blob.
/// * `blob_name` - The name of the blob to interact with.
/// * `credential` - An optional implementation of [`TokenCredential`] that can provide an Entra ID token to use when authenticating.
/// * `options` - Optional configuration for the client.
pub fn new(
endpoint: &str,
account_url: &str,
container_name: &str,
blob_name: &str,
credential: Option<Arc<dyn TokenCredential>>,
options: Option<BlobClientOptions>,
) -> Result<Self> {
let mut url = Url::parse(endpoint)?;
let mut url = Url::parse(account_url)?;

{
let mut path_segments = url.path_segments_mut().map_err(|_| {
azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
"Invalid endpoint URL: Failed to parse out path segments from provided endpoint URL.",
"Invalid account URL: Failed to parse out path segments from provided account URL.",
)
})?;
path_segments.extend([container_name, blob_name]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,23 @@ impl BlobContainerClient {
///
/// # Arguments
///
/// * `endpoint` - The full URL of the Azure storage account, for example `https://myaccount.blob.core.windows.net/`
/// * `account_url` - The full URL of the Azure storage account, for example `https://myaccount.blob.core.windows.net/`
/// * `container_name` - The name of the container.
/// * `credential` - An optional implementation of [`TokenCredential`] that can provide an Entra ID token to use when authenticating.
/// * `options` - Optional configuration for the client.
pub fn new(
endpoint: &str,
account_url: &str,
container_name: &str,
credential: Option<Arc<dyn TokenCredential>>,
options: Option<BlobContainerClientOptions>,
) -> Result<Self> {
let mut url = Url::parse(endpoint)?;
let mut url = Url::parse(account_url)?;

{
let mut path_segments = url.path_segments_mut().map_err(|_| {
azure_core::Error::with_message(
azure_core::error::ErrorKind::Other,
"Invalid endpoint URL: Failed to parse out path segments from provided endpoint URL.",
"Invalid account URL: Failed to parse out path segments from provided account URL.",
)
})?;
path_segments.extend([container_name]);
Expand Down
Loading
Loading