aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/Azure/azure-storage-go/storageservice.go
blob: 817560b782bfc07b66ae31ae0bdb0657f63ef81d (plain) (blame)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package storage

import (
    "fmt"
    "net/http"
    "net/url"
)

// ServiceProperties represents the storage account service properties
type ServiceProperties struct {
    Logging       *Logging
    HourMetrics   *Metrics
    MinuteMetrics *Metrics
    Cors          *Cors
}

// Logging represents the Azure Analytics Logging settings
type Logging struct {
    Version         string
    Delete          bool
    Read            bool
    Write           bool
    RetentionPolicy *RetentionPolicy
}

// RetentionPolicy indicates if retention is enabled and for how many days
type RetentionPolicy struct {
    Enabled bool
    Days    *int
}

// Metrics provide request statistics.
type Metrics struct {
    Version         string
    Enabled         bool
    IncludeAPIs     *bool
    RetentionPolicy *RetentionPolicy
}

// Cors includes all the CORS rules
type Cors struct {
    CorsRule []CorsRule
}

// CorsRule includes all settings for a Cors rule
type CorsRule struct {
    AllowedOrigins  string
    AllowedMethods  string
    MaxAgeInSeconds int
    ExposedHeaders  string
    AllowedHeaders  string
}

func (c Client) getServiceProperties(service string, auth authentication) (*ServiceProperties, error) {
    query := url.Values{
        "restype": {"service"},
        "comp":    {"properties"},
    }
    uri := c.getEndpoint(service, "", query)
    headers := c.getStandardHeaders()

    resp, err := c.exec(http.MethodGet, uri, headers, nil, auth)
    if err != nil {
        return nil, err
    }
    defer resp.body.Close()

    if err := checkRespCode(resp.statusCode, []int{http.StatusOK}); err != nil {
        return nil, err
    }

    var out ServiceProperties
    err = xmlUnmarshal(resp.body, &out)
    if err != nil {
        return nil, err
    }

    return &out, nil
}

func (c Client) setServiceProperties(props ServiceProperties, service string, auth authentication) error {
    query := url.Values{
        "restype": {"service"},
        "comp":    {"properties"},
    }
    uri := c.getEndpoint(service, "", query)

    // Ideally, StorageServiceProperties would be the output struct
    // This is to avoid golint stuttering, while generating the correct XML
    type StorageServiceProperties struct {
        Logging       *Logging
        HourMetrics   *Metrics
        MinuteMetrics *Metrics
        Cors          *Cors
    }
    input := StorageServiceProperties{
        Logging:       props.Logging,
        HourMetrics:   props.HourMetrics,
        MinuteMetrics: props.MinuteMetrics,
        Cors:          props.Cors,
    }

    body, length, err := xmlMarshal(input)
    if err != nil {
        return err
    }

    headers := c.getStandardHeaders()
    headers["Content-Length"] = fmt.Sprintf("%v", length)

    resp, err := c.exec(http.MethodPut, uri, headers, body, auth)
    if err != nil {
        return err
    }
    defer readAndCloseBody(resp.body)

    return checkRespCode(resp.statusCode, []int{http.StatusAccepted})
}