add support for vhost/dns style bucket access #154

Merged
lx merged 6 commits from trinity-1686a/garage:vhost-style into main 2021-11-16 14:41:41 +00:00
3 changed files with 12 additions and 9 deletions
Showing only changes of commit df4b739617 - Show all commits

View file

@ -30,7 +30,7 @@ sled_flush_every_ms = 2000
[s3_api]
api_bind_addr = "[::]:3900"
s3_region = "garage"
root_domain = ".3.garage"
root_domain = ".s3.garage"

".s3.garage" ?

`".s3.garage"` ?
[s3_web]
bind_addr = "[::]:3902"
@ -179,11 +179,13 @@ message that redirects the client to the correct region.
#### `root_domain`
The optionnal suffix to access bucket using vhost-style instead of path-style API calls.
The optionnal suffix to access bucket using vhost-style in addition to path-style request.
Note path-style requests are always enabled, whether or not vhost-style is configured.
Configuring vhost-style S3 required a wildcard DNS entry, and possibly a wildcard TLS certificate,
but might be required by softwares not supporting path-style requests.
For instance, if `root_domain` is `s3.garage.eu`, a bucket called `deuxfleurs.fr`
can be interacted with with hostname `deuxfleurs.fr.s3.garage.eu`. Note however you
can't interact with it using hostname `deuxfleurs.fr` directly.
If `root_domain` is `s3.garage.eu`, a bucket called `my-bucket` can be interacted with
using the hostname `my-bucket.s3.garage.eu`.
## The `[s3_web]` section

View file

@ -263,7 +263,8 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
}
}
/// Extract the bucket name and the key name from an HTTP path and possibly Host header
/// Extract the bucket name and the key name from an HTTP path and possibly a bucket provided in
/// the host header of the request
///
/// S3 internally manages only buckets and keys. This function splits
/// an HTTP path to get the corresponding bucket name and key.

View file

@ -3,9 +3,9 @@ use idna::domain_to_unicode;
/// Host to bucket
///
/// Convert a host, like "bucket.garage-site.tld" or "john.doe.com"
/// to the corresponding bucket, resp. "bucket" and "john.doe.com"
/// considering that ".garage-site.tld" is the "root domain".
/// Convert a host, like "bucket.garage-site.tld" to the corresponding bucket "bucket",
/// considering that ".garage-site.tld" is the "root domain". For domains not matching
/// the provided root domain, no bucket is returned
/// This behavior has been chosen to follow AWS S3 semantic.
pub fn host_to_bucket<'a>(host: &'a str, root: &str) -> Option<&'a str> {
let root = root.trim_start_matches('.');