Skip to content

Commit 61b2622

Browse files
committed
fix upload bug
1 parent 06ff15a commit 61b2622

File tree

6 files changed

+92
-82
lines changed

6 files changed

+92
-82
lines changed

Cargo.lock

Lines changed: 11 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jsclient/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
"dist",
3030
"!dist/test"
3131
],
32+
"engines": {
33+
"node": ">=18.0.0"
34+
},
3235
"dependencies": {
3336
"@pushcorn/hocon-parser": "^1.2.9",
3437
"axios": "^1.6.8",

server/src/admin_server.rs

Lines changed: 23 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,10 @@ pub mod service {
183183
};
184184
use crate::domain_storage::{DomainStorage, URI_REGEX};
185185
use crate::{AdminConfig, HotReloadManager};
186-
use anyhow::anyhow;
187-
use bytes::{Buf, Bytes};
188-
use futures_util::TryStreamExt;
186+
use anyhow::{anyhow, Context};
187+
use bytes::Buf;
188+
use futures_util::{StreamExt, TryStreamExt};
189189
use hyper::Body;
190-
use if_chain::if_chain;
191190
use std::convert::Infallible;
192191
use std::sync::Arc;
193192
use warp::http::StatusCode;
@@ -282,43 +281,27 @@ pub mod service {
282281
form: FormData,
283282
storage: Arc<DomainStorage>,
284283
) -> anyhow::Result<Response> {
285-
let file: Vec<Option<Bytes>> = form
286-
.and_then(|mut field| async move {
287-
let name = field.name();
288-
tracing::debug!("field name:{}", name);
289-
let bytes = field
290-
.data()
291-
.await
292-
.map(|x| {
293-
x.map(|mut x| {
294-
let i = x.remaining();
295-
(&mut x).copy_to_bytes(i)
296-
})
297-
.ok()
298-
})
299-
.flatten();
300-
Ok(bytes)
301-
})
302-
.try_collect()
303-
.await?;
304-
let file = file.into_iter().nth(0).flatten();
305-
306-
tracing::debug!(
307-
"uploading file: {:?}, {:?}, {:?}",
308-
&query.domain,
309-
&query.version,
310-
&query.path
311-
);
312-
313-
if_chain! {
314-
if let Some(file_buf) = file;
315-
then {
316-
storage.save_file(query.domain, query.version, query.path, file_buf)?;
317-
Ok(Response::default())
318-
} else {
319-
Err(anyhow!("bad params, please check the api doc: https://github.com/fornetcode/spa-server/blob/master/docs/guide/sap-server-api.md"))
320-
}
284+
let mut parts = form.into_stream();
285+
while let Some(Ok(part)) = parts.next().await {
286+
// let name = part.name();
287+
let file = part
288+
.stream()
289+
.try_fold(Vec::new(), |mut acc, buf| async move {
290+
acc.extend_from_slice(buf.chunk());
291+
Ok(acc)
292+
})
293+
.await
294+
.with_context(|| "get form failure")?;
295+
tracing::debug!(
296+
"uploading file: {:?}, {:?}, {:?}",
297+
&query.domain,
298+
&query.version,
299+
&query.path
300+
);
301+
storage.save_file(query.domain, query.version, query.path, file)?;
302+
return Ok(Response::default());
321303
}
304+
return Err(anyhow!("bad params, please check the api doc: https://github.com/fornetcode/spa-server/blob/master/docs/guide/sap-server-api.md"));
322305
}
323306

324307
pub(super) fn get_files_metadata(

server/src/bin/main.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use anyhow::Result;
22
use tracing_subscriber::EnvFilter;
33

4-
54
#[tokio::main]
65
async fn main() -> Result<()> {
7-
tracing_subscriber::fmt().with_env_filter(EnvFilter::from_default_env()).init();
6+
tracing_subscriber::fmt()
7+
.with_env_filter(EnvFilter::from_default_env())
8+
.init();
89
spa_server::run_server().await
910
}

server/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl Config {
3030

3131
let load_file = hocon::HoconLoader::new()
3232
.load_file(&config_path)
33-
.with_context(|| "can not read config file")?;
33+
.with_context(|| format!("can not read config file: {config_path}"))?;
3434

3535
load_file
3636
.resolve::<Config>()

server/src/domain_storage.rs

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::file_cache::{CacheItem, FileCache};
22
use anyhow::anyhow;
3-
use bytes::Bytes;
43
use dashmap::DashMap;
54
use lazy_static::lazy_static;
65
use md5::{Digest, Md5};
@@ -76,7 +75,7 @@ impl DomainStorage {
7675
let path_buf = path_prefix_buf
7776
.join(domain_dir_name)
7877
.join(max_version.to_string());
79-
let data = cache.cache_dir(&domain_dir_name,&path_buf)?;
78+
let data = cache.cache_dir(&domain_dir_name, &path_buf)?;
8079
cache.update(domain_dir_name.to_string(), data);
8180
domain_version.insert(domain_dir_name.to_owned(), (path_buf, max_version));
8281
}
@@ -186,50 +185,63 @@ impl DomainStorage {
186185
}
187186
}
188187

189-
pub fn get_domain_serving_version(&self, domain:&str) -> Option<u32> {
190-
self.meta.get(domain).map(|x|x.1)
188+
pub fn get_domain_serving_version(&self, domain: &str) -> Option<u32> {
189+
self.meta.get(domain).map(|x| x.1)
191190
}
192191

193192
pub fn get_domain_info_by_domain(&self, domain: &str) -> Option<DomainInfo> {
194-
let versions:Vec<u32> = WalkDir::new(&self.prefix.join(domain)).max_depth(1).into_iter().filter_map(|version_entity|{
195-
let version_entity =version_entity.ok()?;
196-
let version = version_entity.file_name().to_str()?.parse::<u32>().ok()?;
197-
Some(version)
198-
}).collect();
193+
let versions: Vec<u32> = WalkDir::new(&self.prefix.join(domain))
194+
.max_depth(1)
195+
.into_iter()
196+
.filter_map(|version_entity| {
197+
let version_entity = version_entity.ok()?;
198+
let version = version_entity.file_name().to_str()?.parse::<u32>().ok()?;
199+
Some(version)
200+
})
201+
.collect();
199202
if versions.is_empty() {
200203
None
201204
} else {
202205
let domain = domain.to_string();
203-
let current_version = self.meta.get(&domain).map(|x|x.1);
206+
let current_version = self.meta.get(&domain).map(|x| x.1);
204207
Some(DomainInfo {
205208
domain,
206209
current_version,
207-
versions
210+
versions,
208211
})
209212
}
210213
}
211214

212215
pub fn get_domain_info(&self) -> Vec<DomainInfo> {
213-
let ret:Vec<DomainInfo> = walkdir::WalkDir::new(&self.prefix).max_depth(1).into_iter().filter_map(|dir_entity|{
214-
let dir_entity = dir_entity.ok()?;
215-
let domain_dir_name = dir_entity.file_name().to_str()?;
216-
if dir_entity.metadata().ok()?.is_dir() && URI_REGEX.is_match(domain_dir_name) {
217-
let domain = domain_dir_name.to_string();
218-
let current_version = self.meta.get(&domain).map(|x|x.1);
219-
let versions = walkdir::WalkDir::new(dir_entity.path()).max_depth(1).into_iter().filter_map(|version_entity|{
220-
let version_entity =version_entity.ok()?;
221-
let version = version_entity.file_name().to_str()?.parse::<u32>().ok()?;
222-
Some(version)
223-
}).collect();
224-
Some(DomainInfo {
225-
domain,
226-
current_version,
227-
versions
228-
})
229-
} else {
230-
None
231-
}
232-
}).collect();
216+
let ret: Vec<DomainInfo> = walkdir::WalkDir::new(&self.prefix)
217+
.max_depth(1)
218+
.into_iter()
219+
.filter_map(|dir_entity| {
220+
let dir_entity = dir_entity.ok()?;
221+
let domain_dir_name = dir_entity.file_name().to_str()?;
222+
if dir_entity.metadata().ok()?.is_dir() && URI_REGEX.is_match(domain_dir_name) {
223+
let domain = domain_dir_name.to_string();
224+
let current_version = self.meta.get(&domain).map(|x| x.1);
225+
let versions = walkdir::WalkDir::new(dir_entity.path())
226+
.max_depth(1)
227+
.into_iter()
228+
.filter_map(|version_entity| {
229+
let version_entity = version_entity.ok()?;
230+
let version =
231+
version_entity.file_name().to_str()?.parse::<u32>().ok()?;
232+
Some(version)
233+
})
234+
.collect();
235+
Some(DomainInfo {
236+
domain,
237+
current_version,
238+
versions,
239+
})
240+
} else {
241+
None
242+
}
243+
})
244+
.collect();
233245
ret
234246
}
235247
fn check_is_in_upload_process(&self, domain: &str, version: &u32) -> bool {
@@ -290,7 +302,7 @@ impl DomainStorage {
290302
domain: String,
291303
version: u32,
292304
path: String,
293-
data: Bytes,
305+
data: Vec<u8>,
294306
) -> anyhow::Result<()> {
295307
if self.check_is_in_upload_process(&domain, &version) {
296308
let file_path = sanitize_path(self.get_version_path(&domain, version), &path)
@@ -379,21 +391,25 @@ impl DomainStorage {
379391
Ok(())
380392
}
381393

382-
pub fn remove_domain_version(&self, domain:&str, version:Option<u32>) ->anyhow::Result<bool> {
394+
pub fn remove_domain_version(
395+
&self,
396+
domain: &str,
397+
version: Option<u32>,
398+
) -> anyhow::Result<bool> {
383399
let mut path = self.prefix.join(domain);
384400
if let Some(version) = version {
385401
path = path.join(version.to_string());
386402
if path.exists() {
387403
fs::remove_dir_all(path)?;
388404
return Ok(true);
389405
}
390-
}else {
406+
} else {
391407
if path.exists() {
392408
fs::remove_dir_all(path)?;
393409
return Ok(true);
394410
}
395411
}
396-
return Ok(false)
412+
return Ok(false);
397413
}
398414
}
399415

0 commit comments

Comments
 (0)