Add support for CacheControl header

This commit is contained in:
Brian Foshee 2016-10-19 13:56:28 -04:00
parent c228e60169
commit 50ea685cab
No known key found for this signature in database
GPG Key ID: 0CF2BD06C38B4EF1
4 changed files with 47 additions and 6 deletions

13
DOCS.md
View File

@ -10,6 +10,7 @@ Use the S3 sync plugin to synchronize files and folders with an Amazon S3 bucket
* `delete` - deletes files in the target not found in the source * `delete` - deletes files in the target not found in the source
* `content_type` - override default mime-types to use this value * `content_type` - override default mime-types to use this value
* `content_encoding` - override default content encoding header for files * `content_encoding` - override default content encoding header for files
* `cache_control` - override default cache control header for files
* `metadata` - set custom metadata * `metadata` - set custom metadata
* `redirects` - targets that should redirect elsewhere * `redirects` - targets that should redirect elsewhere
* `cloudfront_distribution_id` - (optional) the cloudfront distribution id to invalidate after syncing * `cloudfront_distribution_id` - (optional) the cloudfront distribution id to invalidate after syncing
@ -30,7 +31,7 @@ publish:
cloudfront_distribution_id: "9c5785d3ece6a9cdefa4" cloudfront_distribution_id: "9c5785d3ece6a9cdefa4"
``` ```
The `acl`, `content_type`, and `content_encoding` parameters can be passed as a string value to apply to all files, or as a map to apply to a subset of files. The `acl`, `content_type`, `cache_control`, and `content_encoding` parameters can be passed as a string value to apply to all files, or as a map to apply to a subset of files.
For example: For example:
@ -45,6 +46,7 @@ publish:
content_encoding: content_encoding:
".js": gzip ".js": gzip
".css": gzip ".css": gzip
cache_control: "public, max-age: 31536000"
region: "us-east-1" region: "us-east-1"
bucket: "my-bucket.s3-website-us-east-1.amazonaws.com" bucket: "my-bucket.s3-website-us-east-1.amazonaws.com"
access_key: "970d28f4dd477bc184fbd10b376de753" access_key: "970d28f4dd477bc184fbd10b376de753"
@ -61,6 +63,9 @@ The `content_type` field the key is an extension including the leading dot `.`.
In the `content_encoding` field the key is an extension including the leading dot `.`. If you want to set a encoding type for files with no extension, set the key In the `content_encoding` field the key is an extension including the leading dot `.`. If you want to set a encoding type for files with no extension, set the key
to th empty string `""`. If there are no matches for the `content_encoding` of a file, no content-encoding header will be added. to th empty string `""`. If there are no matches for the `content_encoding` of a file, no content-encoding header will be added.
In the `cache_control` field the key is an extension including the leading dot `.`. If you want to set cahce control for files with no extension, set the key
to th empty string `""`. If there are no matches for the `cache_control` of a file, no cache-control header will be added.
The `metadata` field can be set as either an object where the keys are the metadata headers: The `metadata` field can be set as either an object where the keys are the metadata headers:
```yaml ```yaml
@ -75,7 +80,7 @@ publish:
target: /target/location target: /target/location
delete: true delete: true
metadata: metadata:
Cache-Control: "max-age: 10000" custom-meta: "abc123"
``` ```
Or you can specify metadata for file patterns by using a glob: Or you can specify metadata for file patterns by using a glob:
@ -93,9 +98,7 @@ publish:
delete: true delete: true
metadata: metadata:
"*.png": "*.png":
Cache-Control: "max-age: 10000000" CustomMeta: "abc123"
"*.html":
Cache-Control: "max-age: 1000"
``` ```
Additionally, you can specify redirect targets for files that don't exist by using the `redirects` key: Additionally, you can specify redirect targets for files that don't exist by using the `redirects` key:

32
aws.go
View File

@ -52,7 +52,7 @@ func (a *AWS) Upload(local, remote string) error {
defer file.Close() defer file.Close()
access := "" var access string
for pattern := range p.Access { for pattern := range p.Access {
if match := glob.Glob(pattern, local); match == true { if match := glob.Glob(pattern, local); match == true {
access = p.Access[pattern] access = p.Access[pattern]
@ -86,6 +86,14 @@ func (a *AWS) Upload(local, remote string) error {
} }
} }
var cacheControl string
for pattern := range p.CacheControl {
if match := glob.Glob(pattern, local); match == true {
cacheControl = p.CacheControl[pattern]
break
}
}
metadata := map[string]*string{} metadata := map[string]*string{}
for pattern := range p.Metadata { for pattern := range p.Metadata {
if match := glob.Glob(pattern, local); match == true { if match := glob.Glob(pattern, local); match == true {
@ -115,6 +123,10 @@ func (a *AWS) Upload(local, remote string) error {
Metadata: metadata, Metadata: metadata,
} }
if len(cacheControl) > 0 {
putObject.CacheControl = aws.String(cacheControl)
}
if len(contentEncoding) > 0 { if len(contentEncoding) > 0 {
putObject.ContentEncoding = aws.String(contentEncoding) putObject.ContentEncoding = aws.String(contentEncoding)
} }
@ -150,6 +162,16 @@ func (a *AWS) Upload(local, remote string) error {
shouldCopy = true shouldCopy = true
} }
if !shouldCopy && head.CacheControl == nil && cacheControl != "" {
debug("Cache-Control has changed from unset to %s", cacheControl)
shouldCopy = true
}
if !shouldCopy && head.CacheControl != nil && cacheControl != *head.CacheControl {
debug("Cache-Control has changed from %s to %s", *head.CacheControl, cacheControl)
shouldCopy = true
}
if !shouldCopy && len(head.Metadata) != len(metadata) { if !shouldCopy && len(head.Metadata) != len(metadata) {
debug("Count of metadata values has changed for %s", local) debug("Count of metadata values has changed for %s", local)
shouldCopy = true shouldCopy = true
@ -216,6 +238,10 @@ func (a *AWS) Upload(local, remote string) error {
MetadataDirective: aws.String("REPLACE"), MetadataDirective: aws.String("REPLACE"),
} }
if len(cacheControl) > 0 {
copyObject.CacheControl = aws.String(cacheControl)
}
if len(contentEncoding) > 0 { if len(contentEncoding) > 0 {
copyObject.ContentEncoding = aws.String(contentEncoding) copyObject.ContentEncoding = aws.String(contentEncoding)
} }
@ -238,6 +264,10 @@ func (a *AWS) Upload(local, remote string) error {
Metadata: metadata, Metadata: metadata,
} }
if len(cacheControl) > 0 {
putObject.CacheControl = aws.String(cacheControl)
}
if len(contentEncoding) > 0 { if len(contentEncoding) > 0 {
putObject.ContentEncoding = aws.String(contentEncoding) putObject.ContentEncoding = aws.String(contentEncoding)
} }

View File

@ -74,6 +74,12 @@ func main() {
EnvVar: "PLUGIN_CONTENT_ENCODING", EnvVar: "PLUGIN_CONTENT_ENCODING",
Value: &StringMapFlag{}, Value: &StringMapFlag{},
}, },
cli.GenericFlag{
Name: "cache-control",
Usage: "cache-control settings for uploads",
EnvVar: "PLUGIN_CACHE_CONTROL",
Value: &StringMapFlag{},
},
cli.GenericFlag{ cli.GenericFlag{
Name: "metadata", Name: "metadata",
Usage: "additional metadata for uploads", Usage: "additional metadata for uploads",
@ -116,6 +122,7 @@ func run(c *cli.Context) error {
Target: c.String("target"), Target: c.String("target"),
Delete: c.Bool("delete"), Delete: c.Bool("delete"),
Access: c.Generic("access").(*StringMapFlag).Get(), Access: c.Generic("access").(*StringMapFlag).Get(),
CacheControl: c.Generic("cache-control").(*StringMapFlag).Get(),
ContentType: c.Generic("content-type").(*StringMapFlag).Get(), ContentType: c.Generic("content-type").(*StringMapFlag).Get(),
ContentEncoding: c.Generic("content-encoding").(*StringMapFlag).Get(), ContentEncoding: c.Generic("content-encoding").(*StringMapFlag).Get(),
Metadata: c.Generic("metadata").(*DeepStringMapFlag).Get(), Metadata: c.Generic("metadata").(*DeepStringMapFlag).Get(),

View File

@ -17,6 +17,7 @@ type Plugin struct {
Target string Target string
Delete bool Delete bool
Access map[string]string Access map[string]string
CacheControl map[string]string
ContentType map[string]string ContentType map[string]string
ContentEncoding map[string]string ContentEncoding map[string]string
Metadata map[string]map[string]string Metadata map[string]map[string]string