File: rs.go

package info (click to toggle)
golang-github-ncw-swift-v2 2.0.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 456 kB
  • sloc: sh: 61; python: 30; makefile: 4
file content (84 lines) | stat: -rw-r--r-- 2,332 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package rs

import (
	"context"
	"errors"
	"net/http"
	"strconv"

	"github.com/ncw/swift/v2"
)

// RsConnection is a RackSpace specific wrapper to the core swift library which
// exposes the RackSpace CDN commands via the CDN Management URL interface.
type RsConnection struct {
	swift.Connection
	cdnUrl string
}

// manage is similar to the swift storage method, but uses the CDN Management URL for CDN specific calls.
func (c *RsConnection) manage(ctx context.Context, p swift.RequestOpts) (resp *http.Response, headers swift.Headers, err error) {
	p.OnReAuth = func() (string, error) {
		if c.cdnUrl == "" {
			c.cdnUrl = c.Auth.CdnUrl()
		}
		if c.cdnUrl == "" {
			return "", errors.New("The X-CDN-Management-Url does not exist on the authenticated platform")
		}
		return c.cdnUrl, nil
	}
	if c.Authenticated() {
		_, err = p.OnReAuth()
		if err != nil {
			return nil, nil, err
		}
	}
	return c.Connection.Call(ctx, c.cdnUrl, p)
}

// ContainerCDNEnable enables a container for public CDN usage.
//
// Change the default TTL of 259200 seconds (72 hours) by passing in an integer value.
//
// This method can be called again to change the TTL.
func (c *RsConnection) ContainerCDNEnable(ctx context.Context, container string, ttl int) (swift.Headers, error) {
	h := swift.Headers{"X-CDN-Enabled": "true"}
	if ttl > 0 {
		h["X-TTL"] = strconv.Itoa(ttl)
	}

	_, headers, err := c.manage(ctx, swift.RequestOpts{
		Container:  container,
		Operation:  "PUT",
		ErrorMap:   swift.ContainerErrorMap,
		NoResponse: true,
		Headers:    h,
	})
	return headers, err
}

// ContainerCDNDisable disables CDN access to a container.
func (c *RsConnection) ContainerCDNDisable(ctx context.Context, container string) error {
	h := swift.Headers{"X-CDN-Enabled": "false"}

	_, _, err := c.manage(ctx, swift.RequestOpts{
		Container:  container,
		Operation:  "PUT",
		ErrorMap:   swift.ContainerErrorMap,
		NoResponse: true,
		Headers:    h,
	})
	return err
}

// ContainerCDNMeta returns the CDN metadata for a container.
func (c *RsConnection) ContainerCDNMeta(ctx context.Context, container string) (swift.Headers, error) {
	_, headers, err := c.manage(ctx, swift.RequestOpts{
		Container:  container,
		Operation:  "HEAD",
		ErrorMap:   swift.ContainerErrorMap,
		NoResponse: true,
		Headers:    swift.Headers{},
	})
	return headers, err
}