1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
use serde::{Serialize, Deserialize}; use std::error::Error; use reqwest::header::HeaderMap; #[allow(non_snake_case)] #[derive(Serialize,Deserialize,Debug,Default)] pub struct Manifest { pub config: Config, pub layers: Vec<Layers>, pub mediaType: String, pub schemaVersion: i64, } #[allow(non_snake_case)] #[derive(Serialize,Deserialize,Debug,Default)] pub struct Config { pub digest: String, pub mediaType: String, pub size: i64, } #[allow(non_snake_case)] #[derive(Serialize,Deserialize,Debug,Default)] pub struct Layers { pub digest: String, pub mediaType: String, pub size: i64, } pub async fn get_manifest_info(repositories_url_ip:String,username:String,password:String,image_name:String,image_version:String) -> Result<Manifest, Box<dyn Error + Send>> { let url = format!("http://{}/v2/{}/manifests/{}",repositories_url_ip,image_name,image_version); let client = reqwest::Client::new(); let mut headers = HeaderMap::new(); headers.insert("Content-Type", "application/vnd.docker.distribution.manifest.v2+json".parse().unwrap()); headers.insert("Accept-Language", "zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6".parse().unwrap()); match client.get(url.clone()).basic_auth(username.clone(),Some(password.clone())).headers(headers).timeout(std::time::Duration::from_secs(10)).send().await { Ok(r) => { match r.json().await { Ok(res) => Ok(res), Err(e) => { println!("1"); Err(Box::new(e)) } } }, Err(e) => { println!("2"); Err(Box::new(e)) } } }