src/client/http_client.rs: add content type parameter to H2 upload/requets_builder
This commit is contained in:
		@ -605,9 +605,10 @@ impl BackupClient {
 | 
				
			|||||||
        &self,
 | 
					        &self,
 | 
				
			||||||
        path: &str,
 | 
					        path: &str,
 | 
				
			||||||
        param: Option<Value>,
 | 
					        param: Option<Value>,
 | 
				
			||||||
 | 
					        content_type: &str,
 | 
				
			||||||
        data: Vec<u8>,
 | 
					        data: Vec<u8>,
 | 
				
			||||||
    ) -> Result<Value, Error> {
 | 
					    ) -> Result<Value, Error> {
 | 
				
			||||||
        self.h2.upload(path, param, data).await
 | 
					        self.h2.upload(path, param, content_type, data).await
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub async fn finish(self: Arc<Self>) -> Result<(), Error> {
 | 
					    pub async fn finish(self: Arc<Self>) -> Result<(), Error> {
 | 
				
			||||||
@ -636,7 +637,7 @@ impl BackupClient {
 | 
				
			|||||||
        let csum = openssl::sha::sha256(&raw_data);
 | 
					        let csum = openssl::sha::sha256(&raw_data);
 | 
				
			||||||
        let param = json!({"encoded-size": raw_data.len(), "file-name": file_name });
 | 
					        let param = json!({"encoded-size": raw_data.len(), "file-name": file_name });
 | 
				
			||||||
        let size = raw_data.len() as u64; // fixme: should be decoded size instead??
 | 
					        let size = raw_data.len() as u64; // fixme: should be decoded size instead??
 | 
				
			||||||
        let _value = self.h2.upload("blob", Some(param), raw_data).await?;
 | 
					        let _value = self.h2.upload("blob", Some(param), "application/octet-stream", raw_data).await?;
 | 
				
			||||||
        Ok(BackupStats { size, csum })
 | 
					        Ok(BackupStats { size, csum })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -665,7 +666,7 @@ impl BackupClient {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        let csum = openssl::sha::sha256(&raw_data);
 | 
					        let csum = openssl::sha::sha256(&raw_data);
 | 
				
			||||||
        let param = json!({"encoded-size": raw_data.len(), "file-name": file_name });
 | 
					        let param = json!({"encoded-size": raw_data.len(), "file-name": file_name });
 | 
				
			||||||
        let _value = self.h2.upload("blob", Some(param), raw_data).await?;
 | 
					        let _value = self.h2.upload("blob", Some(param), "application/octet-stream", raw_data).await?;
 | 
				
			||||||
        Ok(BackupStats { size, csum })
 | 
					        Ok(BackupStats { size, csum })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -697,7 +698,7 @@ impl BackupClient {
 | 
				
			|||||||
            "encoded-size": raw_data.len(),
 | 
					            "encoded-size": raw_data.len(),
 | 
				
			||||||
            "file-name": file_name,
 | 
					            "file-name": file_name,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        self.h2.upload("blob", Some(param), raw_data).await?;
 | 
					        self.h2.upload("blob", Some(param), "application/octet-stream", raw_data).await?;
 | 
				
			||||||
        Ok(BackupStats { size, csum })
 | 
					        Ok(BackupStats { size, csum })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -814,8 +815,7 @@ impl BackupClient {
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            println!("append chunks list len ({})", digest_list.len());
 | 
					                            println!("append chunks list len ({})", digest_list.len());
 | 
				
			||||||
                            let param = json!({ "wid": wid, "digest-list": digest_list, "offset-list": offset_list });
 | 
					                            let param = json!({ "wid": wid, "digest-list": digest_list, "offset-list": offset_list });
 | 
				
			||||||
                            let mut request = H2Client::request_builder("localhost", "PUT", &path, None).unwrap();
 | 
					                            let request = H2Client::request_builder("localhost", "PUT", &path, None, Some("application/json")).unwrap();
 | 
				
			||||||
                            request.headers_mut().insert(hyper::header::CONTENT_TYPE,  HeaderValue::from_static("application/json"));
 | 
					 | 
				
			||||||
                            let param_data = bytes::Bytes::from(param.to_string().as_bytes());
 | 
					                            let param_data = bytes::Bytes::from(param.to_string().as_bytes());
 | 
				
			||||||
                            let upload_data = Some(param_data);
 | 
					                            let upload_data = Some(param_data);
 | 
				
			||||||
                            h2_2.send_request(request, upload_data)
 | 
					                            h2_2.send_request(request, upload_data)
 | 
				
			||||||
@ -847,7 +847,7 @@ impl BackupClient {
 | 
				
			|||||||
    ) -> Result<(), Error> {
 | 
					    ) -> Result<(), Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let param = json!({ "archive-name": archive_name });
 | 
					        let param = json!({ "archive-name": archive_name });
 | 
				
			||||||
        let request = H2Client::request_builder("localhost", "GET", path, Some(param)).unwrap();
 | 
					        let request = H2Client::request_builder("localhost", "GET", path, Some(param), None).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let h2request = self.h2.send_request(request, None).await?;
 | 
					        let h2request = self.h2.send_request(request, None).await?;
 | 
				
			||||||
        let resp = h2request.await?;
 | 
					        let resp = h2request.await?;
 | 
				
			||||||
@ -959,7 +959,8 @@ impl BackupClient {
 | 
				
			|||||||
                        "encoded-size": chunk_data.len(),
 | 
					                        "encoded-size": chunk_data.len(),
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    let request = H2Client::request_builder("localhost", "POST", &upload_chunk_path, Some(param)).unwrap();
 | 
					                    let ct = "application/octet-stream";
 | 
				
			||||||
 | 
					                    let request = H2Client::request_builder("localhost", "POST", &upload_chunk_path, Some(param), Some(ct)).unwrap();
 | 
				
			||||||
                    let upload_data = Some(bytes::Bytes::from(chunk_data));
 | 
					                    let upload_data = Some(bytes::Bytes::from(chunk_data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    let new_info = MergedChunkInfo::Known(vec![(offset, digest)]);
 | 
					                    let new_info = MergedChunkInfo::Known(vec![(offset, digest)]);
 | 
				
			||||||
@ -1032,7 +1033,7 @@ impl BackupClient {
 | 
				
			|||||||
            let mut upload_queue = upload_queue.clone();
 | 
					            let mut upload_queue = upload_queue.clone();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            println!("send test data ({} bytes)", data.len());
 | 
					            println!("send test data ({} bytes)", data.len());
 | 
				
			||||||
            let request = H2Client::request_builder("localhost", "POST", "speedtest", None).unwrap();
 | 
					            let request = H2Client::request_builder("localhost", "POST", "speedtest", None, None).unwrap();
 | 
				
			||||||
            let request_future = self.h2.send_request(request, Some(bytes::Bytes::from(data.clone()))).await?;
 | 
					            let request_future = self.h2.send_request(request, Some(bytes::Bytes::from(data.clone()))).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            upload_queue.send(request_future).await?;
 | 
					            upload_queue.send(request_future).await?;
 | 
				
			||||||
@ -1066,7 +1067,7 @@ impl H2Client {
 | 
				
			|||||||
        path: &str,
 | 
					        path: &str,
 | 
				
			||||||
        param: Option<Value>
 | 
					        param: Option<Value>
 | 
				
			||||||
    ) -> Result<Value, Error> {
 | 
					    ) -> Result<Value, Error> {
 | 
				
			||||||
        let req = Self::request_builder("localhost", "GET", path, param).unwrap();
 | 
					        let req = Self::request_builder("localhost", "GET", path, param, None).unwrap();
 | 
				
			||||||
        self.request(req).await
 | 
					        self.request(req).await
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1075,7 +1076,7 @@ impl H2Client {
 | 
				
			|||||||
        path: &str,
 | 
					        path: &str,
 | 
				
			||||||
        param: Option<Value>
 | 
					        param: Option<Value>
 | 
				
			||||||
    ) -> Result<Value, Error> {
 | 
					    ) -> Result<Value, Error> {
 | 
				
			||||||
        let req = Self::request_builder("localhost", "PUT", path, param).unwrap();
 | 
					        let req = Self::request_builder("localhost", "PUT", path, param, None).unwrap();
 | 
				
			||||||
        self.request(req).await
 | 
					        self.request(req).await
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1084,7 +1085,7 @@ impl H2Client {
 | 
				
			|||||||
        path: &str,
 | 
					        path: &str,
 | 
				
			||||||
        param: Option<Value>
 | 
					        param: Option<Value>
 | 
				
			||||||
    ) -> Result<Value, Error> {
 | 
					    ) -> Result<Value, Error> {
 | 
				
			||||||
        let req = Self::request_builder("localhost", "POST", path, param).unwrap();
 | 
					        let req = Self::request_builder("localhost", "POST", path, param, None).unwrap();
 | 
				
			||||||
        self.request(req).await
 | 
					        self.request(req).await
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1094,7 +1095,7 @@ impl H2Client {
 | 
				
			|||||||
        param: Option<Value>,
 | 
					        param: Option<Value>,
 | 
				
			||||||
        mut output: W,
 | 
					        mut output: W,
 | 
				
			||||||
    ) -> Result<W, Error> {
 | 
					    ) -> Result<W, Error> {
 | 
				
			||||||
        let request = Self::request_builder("localhost", "GET", path, param).unwrap();
 | 
					        let request = Self::request_builder("localhost", "GET", path, param, None).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let response_future = self.send_request(request, None).await?;
 | 
					        let response_future = self.send_request(request, None).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1121,9 +1122,10 @@ impl H2Client {
 | 
				
			|||||||
        &self,
 | 
					        &self,
 | 
				
			||||||
        path: &str,
 | 
					        path: &str,
 | 
				
			||||||
        param: Option<Value>,
 | 
					        param: Option<Value>,
 | 
				
			||||||
 | 
					        content_type: &str,
 | 
				
			||||||
        data: Vec<u8>,
 | 
					        data: Vec<u8>,
 | 
				
			||||||
    ) -> Result<Value, Error> {
 | 
					    ) -> Result<Value, Error> {
 | 
				
			||||||
        let request = Self::request_builder("localhost", "POST", path, param).unwrap();
 | 
					        let request = Self::request_builder("localhost", "POST", path, param, Some(content_type)).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let mut send_request = self.h2.clone().ready().await?;
 | 
					        let mut send_request = self.h2.clone().ready().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1213,9 +1215,17 @@ impl H2Client {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Note: We always encode parameters with the url
 | 
					    // Note: We always encode parameters with the url
 | 
				
			||||||
    pub fn request_builder(server: &str, method: &str, path: &str, param: Option<Value>) -> Result<Request<()>, Error> {
 | 
					    pub fn request_builder(
 | 
				
			||||||
 | 
					        server: &str,
 | 
				
			||||||
 | 
					        method: &str,
 | 
				
			||||||
 | 
					        path: &str,
 | 
				
			||||||
 | 
					        param: Option<Value>,
 | 
				
			||||||
 | 
					        content_type: Option<&str>,
 | 
				
			||||||
 | 
					    ) -> Result<Request<()>, Error> {
 | 
				
			||||||
        let path = path.trim_matches('/');
 | 
					        let path = path.trim_matches('/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let content_type = content_type.unwrap_or("application/x-www-form-urlencoded");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if let Some(param) = param {
 | 
					        if let Some(param) = param {
 | 
				
			||||||
            let query = tools::json_object_to_query(param)?;
 | 
					            let query = tools::json_object_to_query(param)?;
 | 
				
			||||||
            // We detected problem with hyper around 6000 characters - seo we try to keep on the safe side
 | 
					            // We detected problem with hyper around 6000 characters - seo we try to keep on the safe side
 | 
				
			||||||
@ -1225,7 +1235,7 @@ impl H2Client {
 | 
				
			|||||||
                .method(method)
 | 
					                .method(method)
 | 
				
			||||||
                .uri(url)
 | 
					                .uri(url)
 | 
				
			||||||
                .header("User-Agent", "proxmox-backup-client/1.0")
 | 
					                .header("User-Agent", "proxmox-backup-client/1.0")
 | 
				
			||||||
                .header(hyper::header::CONTENT_TYPE, "application/x-www-form-urlencoded")
 | 
					                .header(hyper::header::CONTENT_TYPE, content_type)
 | 
				
			||||||
                .body(())?;
 | 
					                .body(())?;
 | 
				
			||||||
            return Ok(request);
 | 
					            return Ok(request);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@ -1234,7 +1244,7 @@ impl H2Client {
 | 
				
			|||||||
                .method(method)
 | 
					                .method(method)
 | 
				
			||||||
                .uri(url)
 | 
					                .uri(url)
 | 
				
			||||||
                .header("User-Agent", "proxmox-backup-client/1.0")
 | 
					                .header("User-Agent", "proxmox-backup-client/1.0")
 | 
				
			||||||
                .header(hyper::header::CONTENT_TYPE, "application/x-www-form-urlencoded")
 | 
					                .header(hyper::header::CONTENT_TYPE, content_type)
 | 
				
			||||||
                .body(())?;
 | 
					                .body(())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Ok(request)
 | 
					            Ok(request)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user