Skip to content
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
38 changes: 38 additions & 0 deletions src/azure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ use std::sync::Arc;
use tempfile::Builder;
use toml::Table;
use std::fs::read_to_string;
use futures::Stream;
use futures::stream::StreamExt;
use azure_storage_blobs::container::operations::BlobItem;

#[derive(Deserialize)]
struct AzureConfig {
Expand Down Expand Up @@ -306,6 +309,33 @@ async fn azure_set_filename_tags(filename: String, user_tags: Vec<(String, Strin
}
}

async fn azure_list_files(directory: String) -> Vec<String> {
let azure_cfg = Arc::new(get_azure_credentials("azure"));
let storage_account = azure_cfg.account.as_str();
let storage_key = azure_cfg.key.clone();
let storage_container = azure_cfg.container.as_str();
let storage_credential = StorageCredentials::access_key(storage_account, storage_key);
let container_r = ClientBuilder::new(storage_account, storage_credential)
.container_client(storage_container);
let listbldr = container_r.list_blobs();
let mut liststream = listbldr.into_stream();
let mut listing = Vec::new();
while let Some(Ok(page)) = liststream.next().await {
let blobs = page.blobs.items;
for blob in blobs {
let blob_name = match blob {
BlobItem::Blob(blob) => blob.name,
BlobItem::BlobPrefix(blob_prefix) => blob_prefix.name,
};
listing.push(blob_name.clone());

}
println!("Listing count: {}", listing.len());
}
//println!("Listing: {:?}", listing);
return listing;
}

/// Implement Driver trait for AzureDriver
impl super::Driver for AzureDriver {
fn write_file(&self, filename: String, data: Vec<u8>, cont_type: String) -> String {
Expand Down Expand Up @@ -336,4 +366,12 @@ impl super::Driver for AzureDriver {
});
return received_file;
}
fn list_files(&self, directory: String) -> Vec<String> {
let mut ret = Vec::new();
tokio::task::block_in_place(|| {
let rt = tokio::runtime::Runtime::new().unwrap();
ret = rt.block_on(azure_list_files(directory));
});
return ret;
}
}
11 changes: 11 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ trait Driver {
fn write_file(&self, filename: String, data: Vec<u8>, cont_type: String) -> String;
fn get_file(&self, filename: String) -> ReceivedFile;
fn tag_file(&self, filename: String, user_tags: Vec<(String, String)>) -> Result<String, String>;
fn list_files(&self, directory: String) -> Vec<String>;
}

fn init_driver(driver_type: &str) -> Box<dyn Driver> {
Expand Down Expand Up @@ -143,6 +144,7 @@ async fn main() {
.route("/v1/file", post(ax_post_file))
.route("/upload", post(ax_post_file))
.route("/*filepath", get(ax_get_file))
.route("/v1/list", get(ax_list_files))
.layer(ServiceBuilder::new().layer(DefaultBodyLimit::max(1024 * 1024 * 1024 * 4)));

/*
Expand Down Expand Up @@ -539,3 +541,12 @@ fn verify_auth_hdr(headers: &HeaderMap) -> Result<String, Option<String>> {
return Err(None);
}
}

async fn ax_list_files() -> (StatusCode, String) {
let driver_name = "azure";
let driver = init_driver(driver_name);
let files = driver.list_files("/".to_string());
// generate nice list of files, with one file per line
let files_str = files.join("\n");
return (StatusCode::OK, files_str);
}