From 5709b8c173d905bb5fd941cf94c0ca7f1b09e39d Mon Sep 17 00:00:00 2001 From: Arlo Siemsen Date: Wed, 18 May 2022 10:56:56 -0500 Subject: [PATCH] Upload index metadata to S3 when publishing new crates Also provides a new admin tool to bulk upload existing index files. --- .env.sample | 8 ++ cargo-registry-index/lib.rs | 73 +++++++++- src/admin/delete_crate.rs | 9 +- src/admin/mod.rs | 1 + src/admin/upload_index.rs | 60 ++++++++ src/bin/crates-admin.rs | 4 +- src/config/base.rs | 43 +++++- src/controllers/krate/publish.rs | 2 +- .../krate_publish_features_version_2 | 67 +++++++++ src/tests/http-data/krate_publish_good_badges | 67 +++++++++ .../http-data/krate_publish_good_categories | 67 +++++++++ .../http-data/krate_publish_ignored_badges | 67 +++++++++ .../krate_publish_ignored_categories | 67 +++++++++ ...llow_empty_alternative_registry_dependency | 67 +++++++++ src/tests/http-data/krate_publish_new_krate | 67 +++++++++ .../krate_publish_new_krate_git_upload | 67 +++++++++ ...krate_publish_new_krate_git_upload_appends | 134 ++++++++++++++++++ ...ublish_new_krate_git_upload_with_conflicts | 67 +++++++++ ...e_publish_new_krate_records_verified_email | 67 +++++++++ ..._publish_new_krate_too_big_but_whitelisted | 67 +++++++++ .../http-data/krate_publish_new_krate_twice | 67 +++++++++ .../krate_publish_new_krate_weird_version | 67 +++++++++ .../krate_publish_new_krate_with_dependency | 67 +++++++++ .../krate_publish_new_krate_with_readme | 67 +++++++++ .../krate_publish_new_krate_with_token | 67 +++++++++ .../krate_publish_new_with_renamed_dependency | 67 +++++++++ ...ish_new_with_underscore_renamed_dependency | 67 +++++++++ ...blish_publish_after_removing_documentation | 134 ++++++++++++++++++ ...ate_publish_publish_new_crate_rate_limited | 134 ++++++++++++++++++ ...h_rate_limit_doesnt_affect_existing_crates | 134 ++++++++++++++++++ ...te_publish_publish_records_an_audit_action | 67 +++++++++ ...ublish_uploading_new_version_touches_crate | 134 ++++++++++++++++++ ...ate_yanking_publish_after_yank_max_version | 134 ++++++++++++++++++ ...ate_yanking_unyank_records_an_audit_action | 67 +++++++++ .../http-data/krate_yanking_yank_max_version | 134 ++++++++++++++++++ ...krate_yanking_yank_records_an_audit_action | 67 +++++++++ .../krate_yanking_yank_works_as_intended | 67 +++++++++ src/tests/http-data/owners_new_crate_owner | 134 ++++++++++++++++++ src/tests/http-data/team_publish_owned | 67 +++++++++ src/tests/http-data/version_version_size | 134 ++++++++++++++++++ src/uploaders.rs | 102 +++++++++++-- src/worker/dump_db.rs | 6 +- src/worker/git.rs | 15 +- 43 files changed, 3043 insertions(+), 27 deletions(-) create mode 100644 src/admin/upload_index.rs diff --git a/.env.sample b/.env.sample index 4c48b678a3a..279e43e8441 100644 --- a/.env.sample +++ b/.env.sample @@ -33,6 +33,14 @@ export TEST_DATABASE_URL= # not needed if the S3 bucket is in US standard # export S3_REGION= +# Credentials for uploading index metadata to S3. You can leave these commented +# out if you're not publishing index metadata to s3 from your crates.io instance. +# export S3_INDEX_BUCKET= +# export S3_INDEX_ACCESS_KEY= +# export S3_INDEX_SECRET_KEY= +# not needed if the S3 bucket is in US standard +# export S3_INDEX_REGION= + # Upstream location of the registry index. Background jobs will push to # this URL. The default points to a local index for development. # Run `./script/init-local-index.sh` to initialize this repo. diff --git a/cargo-registry-index/lib.rs b/cargo-registry-index/lib.rs index 0e7a8c8acb4..55eb60a5442 100644 --- a/cargo-registry-index/lib.rs +++ b/cargo-registry-index/lib.rs @@ -293,18 +293,33 @@ impl Repository { .join(Self::relative_index_file(name)) } + /// Returns the relative path to the crate index file. + /// Does not perform conversion to lowercase. + fn relative_index_file_helper(name: &str) -> Vec<&str> { + match name.len() { + 1 => vec!["1", name], + 2 => vec!["2", name], + 3 => vec!["3", &name[..1], name], + _ => vec![&name[0..2], &name[2..4], name], + } + } + /// Returns the relative path to the crate index file that corresponds to - /// the given crate name. + /// the given crate name as a path (i.e. with platform-dependent folder separators). /// /// see pub fn relative_index_file(name: &str) -> PathBuf { let name = name.to_lowercase(); - match name.len() { - 1 => Path::new("1").join(&name), - 2 => Path::new("2").join(&name), - 3 => Path::new("3").join(&name[..1]).join(&name), - _ => Path::new(&name[0..2]).join(&name[2..4]).join(&name), - } + Self::relative_index_file_helper(&name).iter().collect() + } + + /// Returns the relative path to the crate index file that corresponds to + /// the given crate name for usage in URLs (i.e. with `/` separator). + /// + /// see + pub fn relative_index_file_for_url(name: &str) -> String { + let name = name.to_lowercase(); + Self::relative_index_file_helper(&name).join("/") } /// Returns the [Object ID](git2::Oid) of the currently checked out commit @@ -343,6 +358,50 @@ impl Repository { self.push("refs/heads/master") } + /// Gets a list of files that have been modified since a given `starting_commit` + /// (use `starting_commit = None` for a list of all files). + pub fn get_files_modified_since( + &self, + starting_commit: Option<&str>, + ) -> anyhow::Result> { + let starting_commit = match starting_commit { + Some(starting_commit) => { + let oid = git2::Oid::from_str(starting_commit) + .context("failed to parse commit into Oid")?; + let commit = self + .repository + .find_commit(oid) + .context("failed to find commit")?; + Some( + commit + .as_object() + .peel_to_tree() + .context("failed to find tree for commit")?, + ) + } + None => None, + }; + + let head = self + .repository + .find_commit(self.head_oid()?)? + .as_object() + .peel_to_tree() + .context("failed to find tree for HEAD")?; + let diff = self + .repository + .diff_tree_to_tree(starting_commit.as_ref(), Some(&head), None) + .context("failed to run diff")?; + let files = diff + .deltas() + .map(|delta| delta.new_file()) + .filter(|file| file.exists()) + .map(|file| file.path().unwrap().to_path_buf()) + .collect(); + + Ok(files) + } + /// Push the current branch to the provided refname fn push(&self, refspec: &str) -> anyhow::Result<()> { let mut ref_status = Ok(()); diff --git a/src/admin/delete_crate.rs b/src/admin/delete_crate.rs index 81805452b8e..8a6191c1863 100644 --- a/src/admin/delete_crate.rs +++ b/src/admin/delete_crate.rs @@ -1,6 +1,7 @@ -use crate::{admin::dialoguer, db, models::Crate, schema::crates}; +use crate::{admin::dialoguer, config, db, models::Crate, schema::crates}; use diesel::prelude::*; +use reqwest::blocking::Client; #[derive(clap::Parser, Debug)] #[clap( @@ -25,6 +26,10 @@ pub fn run(opts: Opts) { fn delete(opts: Opts, conn: &PgConnection) { let krate: Crate = Crate::by_name(&opts.crate_name).first(conn).unwrap(); + let config = config::Base::from_environment(); + let uploader = config.uploader(); + let client = Client::new(); + let prompt = format!( "Are you sure you want to delete {} ({})?", opts.crate_name, krate.id @@ -42,4 +47,6 @@ fn delete(opts: Opts, conn: &PgConnection) { if !dialoguer::confirm("commit?") { panic!("aborting transaction"); } + + uploader.delete_index(&client, &krate.name).unwrap(); } diff --git a/src/admin/mod.rs b/src/admin/mod.rs index b852c54670b..bfe6971f0fe 100644 --- a/src/admin/mod.rs +++ b/src/admin/mod.rs @@ -7,4 +7,5 @@ pub mod populate; pub mod render_readmes; pub mod test_pagerduty; pub mod transfer_crates; +pub mod upload_index; pub mod verify_token; diff --git a/src/admin/upload_index.rs b/src/admin/upload_index.rs new file mode 100644 index 00000000000..48fa053391c --- /dev/null +++ b/src/admin/upload_index.rs @@ -0,0 +1,60 @@ +use std::time::{Duration, Instant}; + +use crate::admin::dialoguer; +use cargo_registry_index::{Repository, RepositoryConfig}; +use reqwest::blocking::Client; + +use crate::config; + +#[derive(clap::Parser, Debug)] +#[clap( + name = "upload-index", + about = "Upload index from git to S3 (http-based index)" +)] +pub struct Opts { + /// Incremental commit. Any changed files made after this commit will be uploaded. + incremental_commit: Option, +} + +pub fn run(opts: Opts) -> anyhow::Result<()> { + let config = config::Base::from_environment(); + let uploader = config.uploader(); + let client = Client::new(); + + println!("fetching git repo"); + let config = RepositoryConfig::from_environment(); + let repo = Repository::open(&config)?; + repo.reset_head()?; + println!("HEAD is at {}", repo.head_oid()?); + + let files = repo.get_files_modified_since(opts.incremental_commit.as_deref())?; + println!("found {} files to upload", files.len()); + if !dialoguer::confirm("continue with upload?") { + return Ok(()); + } + + let mut progress_update_time = Instant::now(); + for (i, file) in files.iter().enumerate() { + let crate_name = file.file_name().unwrap().to_str().unwrap(); + let path = repo.index_file(crate_name); + if !path.exists() { + println!("skipping file `{}`", crate_name); + continue; + } + let contents = std::fs::read_to_string(&path)?; + uploader.upload_index(&client, crate_name, contents)?; + + // Print a progress update every 10 seconds. + let now = Instant::now(); + if now - progress_update_time > Duration::from_secs(10) { + progress_update_time = now; + println!("uploading {}/{}", i, files.len()); + } + } + + println!( + "uploading completed; use `upload-index {}` for an incremental run", + repo.head_oid()? + ); + Ok(()) +} diff --git a/src/bin/crates-admin.rs b/src/bin/crates-admin.rs index 9fb9d60f46b..493d8829a67 100644 --- a/src/bin/crates-admin.rs +++ b/src/bin/crates-admin.rs @@ -2,7 +2,7 @@ use cargo_registry::admin::{ delete_crate, delete_version, migrate, populate, render_readmes, test_pagerduty, - transfer_crates, verify_token, + transfer_crates, upload_index, verify_token, }; #[derive(clap::Parser, Debug)] @@ -22,6 +22,7 @@ enum SubCommand { TransferCrates(transfer_crates::Opts), VerifyToken(verify_token::Opts), Migrate(migrate::Opts), + UploadIndex(upload_index::Opts), } fn main() -> anyhow::Result<()> { @@ -38,6 +39,7 @@ fn main() -> anyhow::Result<()> { SubCommand::TransferCrates(opts) => transfer_crates::run(opts), SubCommand::VerifyToken(opts) => verify_token::run(opts).unwrap(), SubCommand::Migrate(opts) => migrate::run(opts)?, + SubCommand::UploadIndex(opts) => upload_index::run(opts)?, } Ok(()) diff --git a/src/config/base.rs b/src/config/base.rs index e839b627f10..426c6ad7451 100644 --- a/src/config/base.rs +++ b/src/config/base.rs @@ -74,7 +74,7 @@ impl Base { pub fn test() -> Self { let uploader = Uploader::S3 { - bucket: s3::Bucket::new( + bucket: Box::new(s3::Bucket::new( String::from("alexcrichton-test"), None, dotenv::var("S3_ACCESS_KEY").unwrap_or_default(), @@ -82,7 +82,16 @@ impl Base { // When testing we route all API traffic over HTTP so we can // sniff/record it, but everywhere else we use https "http", - ), + )), + index_bucket: Some(Box::new(s3::Bucket::new( + String::from("alexcrichton-test"), + None, + dotenv::var("S3_INDEX_ACCESS_KEY").unwrap_or_default(), + dotenv::var("S3_INDEX_SECRET_KEY").unwrap_or_default(), + // When testing we route all API traffic over HTTP so we can + // sniff/record it, but everywhere else we use https + "http", + ))), cdn: None, }; Self { @@ -96,27 +105,49 @@ impl Base { } fn s3_panic_if_missing_keys() -> Uploader { + let index_bucket = match dotenv::var("S3_INDEX_BUCKET") { + Ok(name) => Some(Box::new(s3::Bucket::new( + name, + dotenv::var("S3_INDEX_REGION").ok(), + env("S3_INDEX_ACCESS_KEY"), + env("S3_INDEX_SECRET_KEY"), + "https", + ))), + Err(_) => None, + }; Uploader::S3 { - bucket: s3::Bucket::new( + bucket: Box::new(s3::Bucket::new( env("S3_BUCKET"), dotenv::var("S3_REGION").ok(), env("S3_ACCESS_KEY"), env("S3_SECRET_KEY"), "https", - ), + )), + index_bucket, cdn: dotenv::var("S3_CDN").ok(), } } fn s3_maybe_read_only() -> Uploader { + let index_bucket = match dotenv::var("S3_INDEX_BUCKET") { + Ok(name) => Some(Box::new(s3::Bucket::new( + name, + dotenv::var("S3_INDEX_REGION").ok(), + dotenv::var("S3_INDEX_ACCESS_KEY").unwrap_or_default(), + dotenv::var("S3_INDEX_SECRET_KEY").unwrap_or_default(), + "https", + ))), + Err(_) => None, + }; Uploader::S3 { - bucket: s3::Bucket::new( + bucket: Box::new(s3::Bucket::new( env("S3_BUCKET"), dotenv::var("S3_REGION").ok(), dotenv::var("S3_ACCESS_KEY").unwrap_or_default(), dotenv::var("S3_SECRET_KEY").unwrap_or_default(), "https", - ), + )), + index_bucket, cdn: dotenv::var("S3_CDN").ok(), } } diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index 217296781b8..1a71b878888 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -215,7 +215,7 @@ pub fn publish(req: &mut dyn RequestExt) -> EndpointResult { // Upload crate tarball app.config .uploader() - .upload_crate(&app, tarball, &krate, vers)?; + .upload_crate(app.http_client(), tarball, &krate, vers)?; let (features, features2): (HashMap<_, _>, HashMap<_, _>) = features.into_iter().partition(|(_k, vals)| { diff --git a/src/tests/http-data/krate_publish_features_version_2 b/src/tests/http-data/krate_publish_features_version_2 index 3dabb01c74d..74e7c7642c7 100644 --- a/src/tests/http-data/krate_publish_features_version_2 +++ b/src/tests/http-data/krate_publish_features_version_2 @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/foo", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "336" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W3sibmFtZSI6ImJhciIsInJlcSI6Ij4gMCIsImZlYXR1cmVzIjpbXSwib3B0aW9uYWwiOmZhbHNlLCJkZWZhdWx0X2ZlYXR1cmVzIjp0cnVlLCJ0YXJnZXQiOm51bGwsImtpbmQiOiJub3JtYWwifV0sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7Im9sZF9mZWF0IjpbXX0sImZlYXR1cmVzMiI6eyJuZXdfZmVhdCI6WyJkZXA6YmFyIiwiYmFyPy9mZWF0Il19LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbCwidiI6Mn0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_good_badges b/src/tests/http-data/krate_publish_good_badges index 8b7e35c5878..758b32c3bfb 100644 --- a/src/tests/http-data/krate_publish_good_badges +++ b/src/tests/http-data/krate_publish_good_badges @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/ob/foobadger", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "163" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vYmFkZ2VyIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_good_categories b/src/tests/http-data/krate_publish_good_categories index b51966602c3..24bbaf7430a 100644 --- a/src/tests/http-data/krate_publish_good_categories +++ b/src/tests/http-data/krate_publish_good_categories @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_good_cat", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "166" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX2dvb2RfY2F0IiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_ignored_badges b/src/tests/http-data/krate_publish_ignored_badges index f686a8ccf96..2dbbb1aba24 100644 --- a/src/tests/http-data/krate_publish_ignored_badges +++ b/src/tests/http-data/krate_publish_ignored_badges @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_ignored_badge", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "171" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX2lnbm9yZWRfYmFkZ2UiLCJ2ZXJzIjoiMS4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_ignored_categories b/src/tests/http-data/krate_publish_ignored_categories index 334dd5f2e11..c5082aff4c0 100644 --- a/src/tests/http-data/krate_publish_ignored_categories +++ b/src/tests/http-data/krate_publish_ignored_categories @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_ignored_cat", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "169" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX2lnbm9yZWRfY2F0IiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_crate_allow_empty_alternative_registry_dependency b/src/tests/http-data/krate_publish_new_crate_allow_empty_alternative_registry_dependency index 2b930c65e9a..0bf3792759a 100644 --- a/src/tests/http-data/krate_publish_new_crate_allow_empty_alternative_registry_dependency +++ b/src/tests/http-data/krate_publish_new_crate_allow_empty_alternative_registry_dependency @@ -32,5 +32,72 @@ "headers": [], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/foo", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "272" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W3sibmFtZSI6ImZvby1kZXAiLCJyZXEiOiI+IDAiLCJmZWF0dXJlcyI6W10sIm9wdGlvbmFsIjpmYWxzZSwiZGVmYXVsdF9mZWF0dXJlcyI6dHJ1ZSwidGFyZ2V0IjpudWxsLCJraW5kIjoibm9ybWFsIn1dLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate b/src/tests/http-data/krate_publish_new_krate index fecacb054d3..1ff2145ea12 100644 --- a/src/tests/http-data/krate_publish_new_krate +++ b/src/tests/http-data/krate_publish_new_krate @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_new", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "161" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX25ldyIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_git_upload b/src/tests/http-data/krate_publish_new_krate_git_upload index 34c8b257872..f8fb995a1e3 100644 --- a/src/tests/http-data/krate_publish_new_krate_git_upload +++ b/src/tests/http-data/krate_publish_new_krate_git_upload @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fgt", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "157" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZmd0IiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_git_upload_appends b/src/tests/http-data/krate_publish_new_krate_git_upload_appends index 21b885f5b82..6f474d669d8 100644 --- a/src/tests/http-data/krate_publish_new_krate_git_upload_appends +++ b/src/tests/http-data/krate_publish_new_krate_git_upload_appends @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fpp", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "314" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiRlBQIiwidmVycyI6IjAuMC4xIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9CnsibmFtZSI6IkZQUCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fpp", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "314" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiRlBQIiwidmVycyI6IjAuMC4xIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9CnsibmFtZSI6IkZQUCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_git_upload_with_conflicts b/src/tests/http-data/krate_publish_new_krate_git_upload_with_conflicts index 4a27effdca8..2b19ccc2646 100644 --- a/src/tests/http-data/krate_publish_new_krate_git_upload_with_conflicts +++ b/src/tests/http-data/krate_publish_new_krate_git_upload_with_conflicts @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_conflicts", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "167" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX2NvbmZsaWN0cyIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_records_verified_email b/src/tests/http-data/krate_publish_new_krate_records_verified_email index 4f06efca49c..406c64c6135 100644 --- a/src/tests/http-data/krate_publish_new_krate_records_verified_email +++ b/src/tests/http-data/krate_publish_new_krate_records_verified_email @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_verified_email", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "172" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3ZlcmlmaWVkX2VtYWlsIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_too_big_but_whitelisted b/src/tests/http-data/krate_publish_new_krate_too_big_but_whitelisted index d4faed76a4e..46d3358019c 100644 --- a/src/tests/http-data/krate_publish_new_krate_too_big_but_whitelisted +++ b/src/tests/http-data/krate_publish_new_krate_too_big_but_whitelisted @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_whitelist", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "167" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3doaXRlbGlzdCIsInZlcnMiOiIxLjEuMCIsImRlcHMiOltdLCJja3N1bSI6IjRlMzNkYzU5YmJiYzk2NjQ1ZmMwMTk0NWZiNTAyNTA3ZDFiN2JkM2EyZDA2MjI3YmY3YjBmZTg4NDJmMjg0YzIiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_twice b/src/tests/http-data/krate_publish_new_krate_twice index 484ab82d78a..d22bfd0dd95 100644 --- a/src/tests/http-data/krate_publish_new_krate_twice +++ b/src/tests/http-data/krate_publish_new_krate_twice @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_twice", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "163" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3R3aWNlIiwidmVycyI6IjIuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_weird_version b/src/tests/http-data/krate_publish_new_krate_weird_version index bae500f1584..2227cae63f3 100644 --- a/src/tests/http-data/krate_publish_new_krate_weird_version +++ b/src/tests/http-data/krate_publish_new_krate_weird_version @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_weird", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "167" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3dlaXJkIiwidmVycyI6IjAuMC4wLXByZSIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_with_dependency b/src/tests/http-data/krate_publish_new_krate_with_dependency index 073a2ff419f..7f50431ceac 100644 --- a/src/tests/http-data/krate_publish_new_krate_with_dependency +++ b/src/tests/http-data/krate_publish_new_krate_with_dependency @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ne/w_/new_dep", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "278" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoibmV3X2RlcCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOlt7Im5hbWUiOiJmb28tZGVwIiwicmVxIjoiMS4wLjAiLCJmZWF0dXJlcyI6W10sIm9wdGlvbmFsIjpmYWxzZSwiZGVmYXVsdF9mZWF0dXJlcyI6dHJ1ZSwidGFyZ2V0IjpudWxsLCJraW5kIjoibm9ybWFsIn1dLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_with_readme b/src/tests/http-data/krate_publish_new_krate_with_readme index 19e29c84e1d..bc2d99271c9 100644 --- a/src/tests/http-data/krate_publish_new_krate_with_readme +++ b/src/tests/http-data/krate_publish_new_krate_with_readme @@ -132,5 +132,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_readme", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "164" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3JlYWRtZSIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_krate_with_token b/src/tests/http-data/krate_publish_new_krate_with_token index 7e9e1f4ec7a..071ea62ae67 100644 --- a/src/tests/http-data/krate_publish_new_krate_with_token +++ b/src/tests/http-data/krate_publish_new_krate_with_token @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_new", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "161" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX25ldyIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_with_renamed_dependency b/src/tests/http-data/krate_publish_new_with_renamed_dependency index bb98392d79e..922217c38dc 100644 --- a/src/tests/http-data/krate_publish_new_with_renamed_dependency +++ b/src/tests/http-data/krate_publish_new_with_renamed_dependency @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ne/w-/new-krate", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "303" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoibmV3LWtyYXRlIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W3sibmFtZSI6Im15LW5hbWUiLCJyZXEiOiI+IDAiLCJmZWF0dXJlcyI6W10sIm9wdGlvbmFsIjpmYWxzZSwiZGVmYXVsdF9mZWF0dXJlcyI6dHJ1ZSwidGFyZ2V0IjpudWxsLCJraW5kIjoibm9ybWFsIiwicGFja2FnZSI6InBhY2thZ2UtbmFtZSJ9XSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_new_with_underscore_renamed_dependency b/src/tests/http-data/krate_publish_new_with_underscore_renamed_dependency index bb98392d79e..6d9a40a3e7d 100644 --- a/src/tests/http-data/krate_publish_new_with_underscore_renamed_dependency +++ b/src/tests/http-data/krate_publish_new_with_underscore_renamed_dependency @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ne/w-/new-krate", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "304" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoibmV3LWtyYXRlIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W3sibmFtZSI6Il9teS1uYW1lIiwicmVxIjoiPiAwIiwiZmVhdHVyZXMiOltdLCJvcHRpb25hbCI6ZmFsc2UsImRlZmF1bHRfZmVhdHVyZXMiOnRydWUsInRhcmdldCI6bnVsbCwia2luZCI6Im5vcm1hbCIsInBhY2thZ2UiOiJwYWNrYWdlLW5hbWUifV0sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_publish_after_removing_documentation b/src/tests/http-data/krate_publish_publish_after_removing_documentation index fda1bfeaea5..0f054bcf34e 100644 --- a/src/tests/http-data/krate_publish_publish_after_removing_documentation +++ b/src/tests/http-data/krate_publish_publish_after_removing_documentation @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/do/cs/docscrate", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "326" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZG9jc2NyYXRlIiwidmVycyI6IjAuMi4xIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9CnsibmFtZSI6ImRvY3NjcmF0ZSIsInZlcnMiOiIwLjIuMiIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/do/cs/docscrate", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "326" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZG9jc2NyYXRlIiwidmVycyI6IjAuMi4xIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9CnsibmFtZSI6ImRvY3NjcmF0ZSIsInZlcnMiOiIwLjIuMiIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_publish_new_crate_rate_limited b/src/tests/http-data/krate_publish_publish_new_crate_rate_limited index 15349dc6b75..e65311b25a0 100644 --- a/src/tests/http-data/krate_publish_publish_new_crate_rate_limited +++ b/src/tests/http-data/krate_publish_publish_new_crate_rate_limited @@ -66,6 +66,73 @@ "body": "" } }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ra/te/rate_limited1", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "167" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoicmF0ZV9saW1pdGVkMSIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, { "request": { "uri": "http://alexcrichton-test.s3.amazonaws.com/crates/rate_limited2/rate_limited2-1.0.0.crate", @@ -132,5 +199,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ra/te/rate_limited2", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "167" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoicmF0ZV9saW1pdGVkMiIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_publish_rate_limit_doesnt_affect_existing_crates b/src/tests/http-data/krate_publish_publish_rate_limit_doesnt_affect_existing_crates index 7867e986dba..48524b01b5d 100644 --- a/src/tests/http-data/krate_publish_publish_rate_limit_doesnt_affect_existing_crates +++ b/src/tests/http-data/krate_publish_publish_rate_limit_doesnt_affect_existing_crates @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ra/te/rate_limited1", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "334" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoicmF0ZV9saW1pdGVkMSIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQp7Im5hbWUiOiJyYXRlX2xpbWl0ZWQxIiwidmVycyI6IjEuMC4xIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/ra/te/rate_limited1", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "334" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoicmF0ZV9saW1pdGVkMSIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQp7Im5hbWUiOiJyYXRlX2xpbWl0ZWQxIiwidmVycyI6IjEuMC4xIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_publish_records_an_audit_action b/src/tests/http-data/krate_publish_publish_records_an_audit_action index 3caea9e43d9..18dda3dcb5b 100644 --- a/src/tests/http-data/krate_publish_publish_records_an_audit_action +++ b/src/tests/http-data/krate_publish_publish_records_an_audit_action @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fyk", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "157" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_publish_uploading_new_version_touches_crate b/src/tests/http-data/krate_publish_uploading_new_version_touches_crate index 04ced61063d..6f0cd7a1347 100644 --- a/src/tests/http-data/krate_publish_uploading_new_version_touches_crate +++ b/src/tests/http-data/krate_publish_uploading_new_version_touches_crate @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_versions_updated_at", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "354" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3ZlcnNpb25zX3VwZGF0ZWRfYXQiLCJ2ZXJzIjoiMS4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0KeyJuYW1lIjoiZm9vX3ZlcnNpb25zX3VwZGF0ZWRfYXQiLCJ2ZXJzIjoiMi4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_versions_updated_at", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "354" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3ZlcnNpb25zX3VwZGF0ZWRfYXQiLCJ2ZXJzIjoiMS4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0KeyJuYW1lIjoiZm9vX3ZlcnNpb25zX3VwZGF0ZWRfYXQiLCJ2ZXJzIjoiMi4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_yanking_publish_after_yank_max_version b/src/tests/http-data/krate_yanking_publish_after_yank_max_version index d68f2a52268..c1bf3ff54c8 100644 --- a/src/tests/http-data/krate_yanking_publish_after_yank_max_version +++ b/src/tests/http-data/krate_yanking_publish_after_yank_max_version @@ -66,6 +66,73 @@ "body": "" } }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fy/k_/fyk_max", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "160" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrX21heCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6dHJ1ZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, { "request": { "uri": "http://alexcrichton-test.s3.amazonaws.com/crates/fyk_max/fyk_max-2.0.0.crate", @@ -132,5 +199,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fy/k_/fyk_max", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "322" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrX21heCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQp7Im5hbWUiOiJmeWtfbWF4IiwidmVycyI6IjIuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_yanking_unyank_records_an_audit_action b/src/tests/http-data/krate_yanking_unyank_records_an_audit_action index 3caea9e43d9..c918c895bea 100644 --- a/src/tests/http-data/krate_yanking_unyank_records_an_audit_action +++ b/src/tests/http-data/krate_yanking_unyank_records_an_audit_action @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fyk", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "156" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjp0cnVlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_yanking_yank_max_version b/src/tests/http-data/krate_yanking_yank_max_version index 409fb7bd0fb..02229a9b90a 100644 --- a/src/tests/http-data/krate_yanking_yank_max_version +++ b/src/tests/http-data/krate_yanking_yank_max_version @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fy/k_/fyk_max", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "321" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrX21heCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6dHJ1ZSwibGlua3MiOm51bGx9CnsibmFtZSI6ImZ5a19tYXgiLCJ2ZXJzIjoiMi4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fy/k_/fyk_max", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "321" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrX21heCIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6dHJ1ZSwibGlua3MiOm51bGx9CnsibmFtZSI6ImZ5a19tYXgiLCJ2ZXJzIjoiMi4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_yanking_yank_records_an_audit_action b/src/tests/http-data/krate_yanking_yank_records_an_audit_action index 3caea9e43d9..c918c895bea 100644 --- a/src/tests/http-data/krate_yanking_yank_records_an_audit_action +++ b/src/tests/http-data/krate_yanking_yank_records_an_audit_action @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fyk", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "156" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjp0cnVlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/krate_yanking_yank_works_as_intended b/src/tests/http-data/krate_yanking_yank_works_as_intended index 3caea9e43d9..18dda3dcb5b 100644 --- a/src/tests/http-data/krate_yanking_yank_works_as_intended +++ b/src/tests/http-data/krate_yanking_yank_works_as_intended @@ -65,5 +65,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/3/f/fyk", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "157" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZnlrIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/owners_new_crate_owner b/src/tests/http-data/owners_new_crate_owner index 00ee2cd435b..b572b693103 100644 --- a/src/tests/http-data/owners_new_crate_owner +++ b/src/tests/http-data/owners_new_crate_owner @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_owner", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "326" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX293bmVyIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9CnsibmFtZSI6ImZvb19vd25lciIsInZlcnMiOiIyLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_owner", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "326" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX293bmVyIiwidmVycyI6IjEuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiYWNiNTYwNGIxMjZhYzg5NGMxZWIxMWM0NTc1YmYyMDcyZmVhNjEyMzJhODg4ZTQ1Mzc3MGM3OWQ3ZWQ1NjQxOSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9CnsibmFtZSI6ImZvb19vd25lciIsInZlcnMiOiIyLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQo=" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/team_publish_owned b/src/tests/http-data/team_publish_owned index efeb70269f4..9715b81370d 100644 --- a/src/tests/http-data/team_publish_owned +++ b/src/tests/http-data/team_publish_owned @@ -577,5 +577,72 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_team_owned", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "168" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3RlYW1fb3duZWQiLCJ2ZXJzIjoiMi4wLjAiLCJkZXBzIjpbXSwiY2tzdW0iOiJhY2I1NjA0YjEyNmFjODk0YzFlYjExYzQ1NzViZjIwNzJmZWE2MTIzMmE4ODhlNDUzNzcwYzc5ZDdlZDU2NDE5IiwiZmVhdHVyZXMiOnt9LCJ5YW5rZWQiOmZhbHNlLCJsaW5rcyI6bnVsbH0K" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/tests/http-data/version_version_size b/src/tests/http-data/version_version_size index 4145c92c378..eab386534ee 100644 --- a/src/tests/http-data/version_version_size +++ b/src/tests/http-data/version_version_size @@ -132,5 +132,139 @@ ], "body": "" } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_version_size", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "340" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3ZlcnNpb25fc2l6ZSIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQp7Im5hbWUiOiJmb29fdmVyc2lvbl9zaXplIiwidmVycyI6IjIuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiNzUyMmRkNjFiZGRmZDM1MDFiYTQ4YWY4YmFiY2ZmZDJjODkwOTE5ZGE5MGM4NWI2ZWFhZjdmZDk0NzlmOTAxYSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } + }, + { + "request": { + "uri": "http://alexcrichton-test.s3.amazonaws.com/index/fo/o_/foo_version_size", + "method": "PUT", + "headers": [ + [ + "accept-encoding", + "gzip" + ], + [ + "accept", + "*/*" + ], + [ + "content-length", + "340" + ], + [ + "date", + "Fri, 15 Sep 2017 07:53:06 -0700" + ], + [ + "authorization", + "AWS AKIAICL5IWUZYWWKA7JA:uDc39eNdF6CcwB+q+JwKsoDLQc4=" + ], + [ + "content-type", + "text/plain" + ], + [ + "host", + "alexcrichton-test.s3.amazonaws.com" + ] + ], + "body": "eyJuYW1lIjoiZm9vX3ZlcnNpb25fc2l6ZSIsInZlcnMiOiIxLjAuMCIsImRlcHMiOltdLCJja3N1bSI6ImFjYjU2MDRiMTI2YWM4OTRjMWViMTFjNDU3NWJmMjA3MmZlYTYxMjMyYTg4OGU0NTM3NzBjNzlkN2VkNTY0MTkiLCJmZWF0dXJlcyI6e30sInlhbmtlZCI6ZmFsc2UsImxpbmtzIjpudWxsfQp7Im5hbWUiOiJmb29fdmVyc2lvbl9zaXplIiwidmVycyI6IjIuMC4wIiwiZGVwcyI6W10sImNrc3VtIjoiNzUyMmRkNjFiZGRmZDM1MDFiYTQ4YWY4YmFiY2ZmZDJjODkwOTE5ZGE5MGM4NWI2ZWFhZjdmZDk0NzlmOTAxYSIsImZlYXR1cmVzIjp7fSwieWFua2VkIjpmYWxzZSwibGlua3MiOm51bGx9Cg==" + }, + "response": { + "status": 200, + "headers": [ + [ + "x-amz-request-id", + "26589A5E52F8395C" + ], + [ + "x-amz-id-2", + "JdIvnNTw53aqXjBIqBLNuN4kxf/w1XWX+xuIiGBDYy7yzOSDuAMtBSrTW4ZWetcCIdqCUHuQ51A=" + ], + [ + "content-length", + "0" + ], + [ + "Server", + "AmazonS3" + ], + [ + "date", + "Fri,15 Sep 2017 14:53:07 GMT" + ], + [ + "ETag", + "\"f9016ad360cebb4fe2e6e96e5949f022\"" + ] + ], + "body": "" + } } ] diff --git a/src/uploaders.rs b/src/uploaders.rs index 2620a1acc66..025c4bb48ee 100644 --- a/src/uploaders.rs +++ b/src/uploaders.rs @@ -1,25 +1,25 @@ use anyhow::Result; use reqwest::{blocking::Client, header}; -use crate::app::App; use crate::util::errors::{internal, AppResult}; use std::env; use std::fs::{self, File}; use std::io::{Cursor, SeekFrom}; -use std::sync::Arc; use crate::models::Crate; const CACHE_CONTROL_IMMUTABLE: &str = "public,max-age=31536000,immutable"; const CACHE_CONTROL_README: &str = "public,max-age=604800"; +const CACHE_CONTROL_INDEX: &str = "public,max-age=600"; #[derive(Clone, Debug)] pub enum Uploader { /// For production usage, uploads and redirects to s3. /// For test usage with `TestApp::with_proxy()`, the recording proxy is used. S3 { - bucket: s3::Bucket, + bucket: Box, + index_bucket: Option>, cdn: Option, }, @@ -28,6 +28,11 @@ pub enum Uploader { Local, } +pub enum UploadBucket { + Default, + Index, +} + impl Uploader { /// Returns the URL of an uploaded crate's version archive. /// @@ -73,7 +78,6 @@ impl Uploader { /// Returns the internal path of an uploaded crate's version archive. fn crate_path(name: &str, version: &str) -> String { - // No slash in front so we can use join format!("crates/{name}/{name}-{version}.crate") } @@ -82,6 +86,12 @@ impl Uploader { format!("readmes/{name}/{name}-{version}.html") } + /// Returns the internal path of an uploaded crate's index file. + fn index_path(name: &str) -> String { + let path = cargo_registry_index::Repository::relative_index_file_for_url(name); + format!("index/{}", path) + } + /// Uploads a file using the configured uploader (either `S3`, `Local`). /// /// It returns the path of the uploaded file. @@ -97,9 +107,20 @@ impl Uploader { mut content: R, content_type: &str, extra_headers: header::HeaderMap, + upload_bucket: UploadBucket, ) -> Result> { match *self { - Uploader::S3 { ref bucket, .. } => { + Uploader::S3 { + ref bucket, + ref index_bucket, + .. + } => { + let bucket = match upload_bucket { + UploadBucket::Default => Some(bucket), + UploadBucket::Index => index_bucket.as_ref(), + }; + + if let Some(bucket) = bucket { let content_length = content.seek(SeekFrom::End(0))?; content.seek(SeekFrom::Start(0))?; bucket.put( @@ -110,6 +131,8 @@ impl Uploader { content_type, extra_headers, )?; + } + Ok(Some(String::from(path))) } Uploader::Local => { @@ -123,10 +146,35 @@ impl Uploader { } } + /// Deletes a file using the configured uploader (either `S3`, `Local`). + pub fn delete(&self, client: &Client, path: &str, upload_bucket: UploadBucket) -> Result<()> { + match *self { + Uploader::S3 { + ref bucket, + ref index_bucket, + .. + } => { + let bucket = match upload_bucket { + UploadBucket::Default => Some(bucket), + UploadBucket::Index => index_bucket.as_ref(), + }; + + if let Some(bucket) = bucket { + bucket.delete(client, path)?; + } + } + Uploader::Local => { + let filename = env::current_dir().unwrap().join("local_uploads").join(path); + std::fs::remove_file(&filename)?; + } + } + Ok(()) + } + /// Uploads a crate and returns the checksum of the uploaded crate file. pub fn upload_crate( &self, - app: &Arc, + http_client: &Client, body: Vec, krate: &Crate, vers: &semver::Version, @@ -139,11 +187,12 @@ impl Uploader { header::HeaderValue::from_static(CACHE_CONTROL_IMMUTABLE), ); self.upload( - app.http_client(), + http_client, &path, content, "application/gzip", extra_headers, + UploadBucket::Default, ) .map_err(|e| internal(&format_args!("failed to upload crate: {}", e)))?; Ok(()) @@ -163,7 +212,44 @@ impl Uploader { header::CACHE_CONTROL, header::HeaderValue::from_static(CACHE_CONTROL_README), ); - self.upload(http_client, &path, content, "text/html", extra_headers)?; + self.upload( + http_client, + &path, + content, + "text/html", + extra_headers, + UploadBucket::Default, + )?; + Ok(()) + } + + pub(crate) fn upload_index( + &self, + http_client: &Client, + crate_name: &str, + index: String, + ) -> Result<()> { + let path = Uploader::index_path(crate_name); + let content = Cursor::new(index); + let mut extra_headers = header::HeaderMap::new(); + extra_headers.insert( + header::CACHE_CONTROL, + header::HeaderValue::from_static(CACHE_CONTROL_INDEX), + ); + self.upload( + http_client, + &path, + content, + "text/plain", + extra_headers, + UploadBucket::Index, + )?; + Ok(()) + } + + pub(crate) fn delete_index(&self, http_client: &Client, crate_name: &str) -> Result<()> { + let path = Uploader::index_path(crate_name); + self.delete(http_client, &path, UploadBucket::Index)?; Ok(()) } } diff --git a/src/worker/dump_db.rs b/src/worker/dump_db.rs index ea9a96ca207..df09c8dc049 100644 --- a/src/worker/dump_db.rs +++ b/src/worker/dump_db.rs @@ -4,7 +4,10 @@ use std::{ }; use self::configuration::VisibilityConfig; -use crate::{background_jobs::Environment, uploaders::Uploader}; +use crate::{ + background_jobs::Environment, + uploaders::{UploadBucket, Uploader}, +}; use reqwest::header; use swirl::PerformError; @@ -199,6 +202,7 @@ impl DumpTarball { tarfile, "application/gzip", header::HeaderMap::new(), + UploadBucket::Default, )?; Ok(content_length) } diff --git a/src/worker/git.rs b/src/worker/git.rs index 54319be8be1..7240a4e37c4 100644 --- a/src/worker/git.rs +++ b/src/worker/git.rs @@ -9,7 +9,7 @@ use std::process::Command; use swirl::PerformError; #[swirl::background_job] -pub fn add_crate(env: &Environment, krate: Crate) -> Result<(), PerformError> { +pub fn add_crate(env: &Environment, conn: &PgConnection, krate: Crate) -> Result<(), PerformError> { use std::io::prelude::*; let repo = env.lock_index()?; @@ -22,9 +22,20 @@ pub fn add_crate(env: &Environment, krate: Crate) -> Result<(), PerformError> { file.write_all(b"\n")?; let message: String = format!("Updating crate `{}#{}`", krate.name, krate.vers); - repo.commit_and_push(&message, &dst)?; + // Queue another background job to update the http-based index as well. + update_crate_index(krate.name.clone()).enqueue(conn)?; + Ok(()) +} + +#[swirl::background_job] +pub fn update_crate_index(env: &Environment, crate_name: String) -> Result<(), PerformError> { + let repo = env.lock_index()?; + let dst = repo.index_file(&crate_name); + let contents = std::fs::read_to_string(dst)?; + env.uploader + .upload_index(env.http_client(), &crate_name, contents)?; Ok(()) }