mirror of
https://github.com/pesde-pkg/pesde.git
synced 2024-12-12 11:00:36 +00:00
feat(registry): move to body bytes over multipart for uploading
This commit is contained in:
parent
19aa5eb52c
commit
b180bea063
7 changed files with 29 additions and 111 deletions
71
Cargo.lock
generated
71
Cargo.lock
generated
|
@ -95,44 +95,6 @@ dependencies = [
|
|||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "actix-multipart"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d5118a26dee7e34e894f7e85aa0ee5080ae4c18bf03c0e30d49a80e418f00a53"
|
||||
dependencies = [
|
||||
"actix-multipart-derive",
|
||||
"actix-utils",
|
||||
"actix-web",
|
||||
"derive_more 0.99.18",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"httparse",
|
||||
"local-waker",
|
||||
"log",
|
||||
"memchr",
|
||||
"mime",
|
||||
"rand",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_plain",
|
||||
"tempfile",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "actix-multipart-derive"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e11eb847f49a700678ea2fa73daeb3208061afa2b9d1a8527c03390f4c4a1c6b"
|
||||
dependencies = [
|
||||
"darling",
|
||||
"parse-size",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "actix-router"
|
||||
version = "0.5.3"
|
||||
|
@ -3313,16 +3275,6 @@ version = "0.3.17"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||
|
||||
[[package]]
|
||||
name = "mime_guess"
|
||||
version = "2.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
||||
dependencies = [
|
||||
"mime",
|
||||
"unicase",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
|
@ -3667,12 +3619,6 @@ dependencies = [
|
|||
"windows-targets 0.52.6",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parse-size"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b"
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.15"
|
||||
|
@ -3741,7 +3687,6 @@ version = "0.7.0"
|
|||
dependencies = [
|
||||
"actix-cors",
|
||||
"actix-governor",
|
||||
"actix-multipart",
|
||||
"actix-web",
|
||||
"async-compression",
|
||||
"async-stream",
|
||||
|
@ -4147,7 +4092,6 @@ dependencies = [
|
|||
"js-sys",
|
||||
"log",
|
||||
"mime",
|
||||
"mime_guess",
|
||||
"native-tls",
|
||||
"once_cell",
|
||||
"percent-encoding",
|
||||
|
@ -4552,15 +4496,6 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_plain"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_repr"
|
||||
version = "0.1.19"
|
||||
|
@ -5325,12 +5260,6 @@ dependencies = [
|
|||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "2.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-bom"
|
||||
version = "2.0.3"
|
||||
|
|
|
@ -15,7 +15,6 @@ bin = [
|
|||
"dirs",
|
||||
"pretty_env_logger",
|
||||
"reqwest/json",
|
||||
"reqwest/multipart",
|
||||
"indicatif",
|
||||
"indicatif-log-bridge",
|
||||
"inquire",
|
||||
|
|
|
@ -7,7 +7,6 @@ publish = false
|
|||
|
||||
[dependencies]
|
||||
actix-web = "4.9.0"
|
||||
actix-multipart = "0.7.2"
|
||||
actix-cors = "0.7.0"
|
||||
actix-governor = "0.7.0"
|
||||
dotenvy = "0.15.7"
|
||||
|
|
|
@ -157,7 +157,7 @@ pub async fn read_mw(
|
|||
next.call(req).await.map(|res| res.map_into_left_body())
|
||||
}
|
||||
|
||||
pub fn get_auth_from_env(config: IndexConfig) -> Auth {
|
||||
pub fn get_auth_from_env(config: &IndexConfig) -> Auth {
|
||||
if let Ok(token) = benv!("ACCESS_TOKEN") {
|
||||
Auth::Token(token::TokenAuth {
|
||||
token: *Sha256::digest(token.as_bytes()).as_ref(),
|
||||
|
@ -167,6 +167,7 @@ pub fn get_auth_from_env(config: IndexConfig) -> Auth {
|
|||
reqwest_client: make_reqwest(),
|
||||
client_id: config
|
||||
.github_oauth_client_id
|
||||
.clone()
|
||||
.expect("index isn't configured for GitHub"),
|
||||
client_secret,
|
||||
})
|
||||
|
|
|
@ -6,12 +6,11 @@ use crate::{
|
|||
storage::StorageImpl,
|
||||
AppState,
|
||||
};
|
||||
use actix_multipart::Multipart;
|
||||
use actix_web::{web, HttpResponse, Responder};
|
||||
use actix_web::{web, web::Bytes, HttpResponse, Responder};
|
||||
use async_compression::Level;
|
||||
use convert_case::{Case, Casing};
|
||||
use fs_err::tokio as fs;
|
||||
use futures::{future::join_all, join, StreamExt};
|
||||
use futures::{future::join_all, join};
|
||||
use git2::{Remote, Repository, Signature};
|
||||
use pesde::{
|
||||
manifest::Manifest,
|
||||
|
@ -69,23 +68,13 @@ struct DocEntryInfo {
|
|||
|
||||
pub async fn publish_package(
|
||||
app_state: web::Data<AppState>,
|
||||
mut body: Multipart,
|
||||
bytes: Bytes,
|
||||
user_id: web::ReqData<UserId>,
|
||||
) -> Result<impl Responder, Error> {
|
||||
let source = app_state.source.lock().await;
|
||||
source.refresh(&app_state.project).await.map_err(Box::new)?;
|
||||
let config = source.config(&app_state.project).await?;
|
||||
|
||||
let bytes = body
|
||||
.next()
|
||||
.await
|
||||
.ok_or(Error::InvalidArchive)?
|
||||
.map_err(|_| Error::InvalidArchive)?
|
||||
.bytes(config.max_archive_size)
|
||||
.await
|
||||
.map_err(|_| Error::InvalidArchive)?
|
||||
.map_err(|_| Error::InvalidArchive)?;
|
||||
|
||||
let package_dir = tempfile::tempdir()?;
|
||||
|
||||
{
|
||||
|
|
|
@ -1,9 +1,16 @@
|
|||
use crate::{
|
||||
auth::{get_auth_from_env, Auth, UserIdExtractor},
|
||||
search::make_search,
|
||||
storage::{get_storage_from_env, Storage},
|
||||
};
|
||||
use actix_cors::Cors;
|
||||
use actix_governor::{Governor, GovernorConfigBuilder};
|
||||
use actix_web::{
|
||||
middleware::{from_fn, Compress, Logger, NormalizePath, TrailingSlash},
|
||||
rt::System,
|
||||
web, App, HttpServer,
|
||||
web,
|
||||
web::PayloadConfig,
|
||||
App, HttpServer,
|
||||
};
|
||||
use fs_err::tokio as fs;
|
||||
use log::info;
|
||||
|
@ -13,12 +20,6 @@ use pesde::{
|
|||
};
|
||||
use std::{env::current_dir, path::PathBuf};
|
||||
|
||||
use crate::{
|
||||
auth::{get_auth_from_env, Auth, UserIdExtractor},
|
||||
search::make_search,
|
||||
storage::{get_storage_from_env, Storage},
|
||||
};
|
||||
|
||||
mod auth;
|
||||
mod endpoints;
|
||||
mod error;
|
||||
|
@ -105,6 +106,10 @@ async fn run() -> std::io::Result<()> {
|
|||
.refresh(&project)
|
||||
.await
|
||||
.expect("failed to refresh source");
|
||||
let config = source
|
||||
.config(&project)
|
||||
.await
|
||||
.expect("failed to get index config");
|
||||
|
||||
let (search_reader, search_writer, query_parser) = make_search(&project, &source).await;
|
||||
|
||||
|
@ -115,12 +120,7 @@ async fn run() -> std::io::Result<()> {
|
|||
storage
|
||||
},
|
||||
auth: {
|
||||
let auth = get_auth_from_env(
|
||||
source
|
||||
.config(&project)
|
||||
.await
|
||||
.expect("failed to get index config"),
|
||||
);
|
||||
let auth = get_auth_from_env(&config);
|
||||
info!("auth: {auth}");
|
||||
auth
|
||||
},
|
||||
|
@ -176,12 +176,16 @@ async fn run() -> std::io::Result<()> {
|
|||
.to(endpoints::package_version::get_package_version)
|
||||
.wrap(from_fn(auth::read_mw)),
|
||||
)
|
||||
.route(
|
||||
"/packages",
|
||||
web::post()
|
||||
.to(endpoints::publish_version::publish_package)
|
||||
.wrap(Governor::new(&publish_governor_config))
|
||||
.wrap(from_fn(auth::write_mw)),
|
||||
.service(
|
||||
web::scope("/packages")
|
||||
.app_data(PayloadConfig::new(config.max_archive_size))
|
||||
.route(
|
||||
"",
|
||||
web::post()
|
||||
.to(endpoints::publish_version::publish_package)
|
||||
.wrap(Governor::new(&publish_governor_config))
|
||||
.wrap(from_fn(auth::write_mw)),
|
||||
),
|
||||
),
|
||||
)
|
||||
})
|
||||
|
|
|
@ -530,10 +530,7 @@ impl PublishCommand {
|
|||
|
||||
let mut request = reqwest
|
||||
.post(format!("{}/v0/packages", config.api()))
|
||||
.multipart(reqwest::multipart::Form::new().part(
|
||||
"tarball",
|
||||
reqwest::multipart::Part::bytes(archive).file_name("package.tar.gz"),
|
||||
));
|
||||
.body(archive);
|
||||
|
||||
if let Some(token) = project.auth_config().tokens().get(index_url) {
|
||||
log::debug!("using token for {index_url}");
|
||||
|
|
Loading…
Reference in a new issue