mirror of
https://github.com/thegeeklab/drone-s3-sync.git
synced 2024-11-22 11:10:39 +00:00
Merge pull request #26 from brianfoshee/cachec-control-support
Add support for CacheControl header
This commit is contained in:
commit
6b05740097
13
DOCS.md
13
DOCS.md
@ -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 cache control for files with no extension, set the key
|
||||||
|
to the 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
32
aws.go
@ -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)
|
||||||
}
|
}
|
||||||
|
7
main.go
7
main.go
@ -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(),
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user