weavejester/clj-aws-s3 — pull request #66 by elliot42 (2014-09-26 11:45:42+00:00)
Title: Support path-style access URLs

There are two ways to generate S3 object URLs, virtual-hosted style
URLs vs. path-style URLs [1]:

- Virtual-hosted-style: `http://bucket.s3.amazonaws.com`
- Path-style: `http://s3.amazonaws.com/bucket`

Virtual-hosted-style is Amazon's preferred default, however HTTPS is
not compatible with all virtual-hosted-style URLs. Specifically,
virtual-hosted-style buckets with dots in their names always cause
HTTPS cert validation errors, as per RFC 2818 [2][3]:

https://foo.bar.s3.amazonaws.com/key

Path-style access works fine with HTTPS, without forcing a bucket rename:

https://s3.amazonaws.com/foo.bar/key

This commit allows configuring the client for path-style access via
the cred map:

(let [cred {:access-key ...
:secret-key ...
:path-style-access true}]
(generate-presigned-url cred bucket key))

Note that when using path style access you may need to manually specify your
region-specific S3 endpoint [1]:

(let [cred {...
:path-style-access true
:endpoint "s3-us-west-1.amazonaws.com"}]
...)

[1]: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html
[2]: http://www.ietf.org/rfc/rfc2818.txt
[3]: http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html