oss/lib/cors_options.go (147 lines of code) (raw):
package lib
import (
"os"
"strings"
oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
var specChineseOptions = SpecText{
synopsisText: "向oss发送http options请求,用于CORS检测",
paramText: "oss_url [options]",
syntaxText: `
ossutil cors-options --acr-method <value> --origin <value> --acr-headers <value> oss://bucket/[object] [options]
`,
detailHelpText: `
cors-options命令向oss发送http options请求
--acr-method、--origin、--acr-headers分别对应http header:Access-Control-Request-Method、Origin、Access-Control-Request-Headers
--acr-headers如果有多个取值,各个header用逗号分隔,再加上双引号,比如 --acr-headers "header1,header2,header3"
用法:
该命令有一种用法:
1) ossutil cors-options --acr-method PUT --origin "www.aliyuncs.com" --acr-header x-oss-meta-author oss://bucket/ [options]
向oss发送options请求,Origin、Access-Control-Request-Method、Access-Control-Request-Headers分别为www.aliyuncs.com、PUT、x-oss-meta-author
`,
sampleText: `
1) 发送options请求,Access-Control-Request-Method为PUT
ossutil cors-options --acr-method PUT --origin "www.aliyuncs.com" --acr-header x-oss-meta-author oss://bucket/
2) 发送options请求,有多个header参数,Access-Control-Request-Method为GET
ossutil cors-options --acr-method GET --origin "www.aliyuncs.com" --acr-header "x-oss-meta-author1,x-oss-meta-author2" oss://bucket/
`,
}
var specEnglishOptions = SpecText{
synopsisText: "Send http options request to oss for CORS detection",
paramText: "oss_url [options]",
syntaxText: `
ossutil cors-options --acr-method <value> --origin <value> --acr-headers <value> oss://bucket/[object] [options]
`,
detailHelpText: `
The cors-options command sends an http options request to oss
--acr-method, --origin, --acr-headers correspond to http header:Access-Control-Request-Method, Origin, Access-Control-Request-Headers
If --acr-headers have multiple values, each header is separated by a comma, followed by double quotes, for example: --acr-headers "header1,header2,header3"
Usage:
There are one usage for this command:
1) ossutil cors-options --acr-method PUT --origin "www.aliyuncs.com" --acr-header x-oss-meta-author oss://bucket/ [options]
sends an http options request to oss,Origin、Access-Control-Request-Method、Access-Control-Request-Headers values are www.aliyuncs.com、PUT、x-oss-meta-author
`,
sampleText: `
1) sends an http options request,Access-Control-Request-Method value is PUT
ossutil cors-options --acr-method PUT --origin "www.aliyuncs.com" --acr-header x-oss-meta-author oss://bucket/
2) sends an http options request,there are multipule values for --acr-header,Access-Control-Request-Method value is GET
ossutil cors-options --acr-method GET --origin "www.aliyuncs.com" --acr-header "x-oss-meta-author1,x-oss-meta-author2" oss://bucket/
`,
}
type OptionsCommand struct {
command Command
}
var corsOptionsCommand = OptionsCommand{
command: Command{
name: "cors-options",
nameAlias: []string{"cors-options"},
minArgc: 1,
maxArgc: 1,
specChinese: specChineseOptions,
specEnglish: specEnglishOptions,
group: GroupTypeNormalCommand,
validOptionNames: []string{
OptionConfigFile,
OptionEndpoint,
OptionAccessKeyID,
OptionAccessKeySecret,
OptionSTSToken,
OptionProxyHost,
OptionProxyUser,
OptionProxyPwd,
OptionLogLevel,
OptionEncodingType,
OptionOrigin,
OptionAcrMethod,
OptionAcrHeaders,
OptionPassword,
OptionMode,
OptionECSRoleName,
OptionTokenTimeout,
OptionRamRoleArn,
OptionExternalId,
OptionRoleSessionName,
OptionReadTimeout,
OptionConnectTimeout,
OptionSTSRegion,
OptionSkipVerifyCert,
OptionUserAgent,
OptionSignVersion,
OptionRegion,
OptionCloudBoxID,
OptionForcePathStyle,
},
},
}
// function for FormatHelper interface
func (opsc *OptionsCommand) formatHelpForWhole() string {
return opsc.command.formatHelpForWhole()
}
func (opsc *OptionsCommand) formatIndependHelp() string {
return opsc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (opsc *OptionsCommand) Init(args []string, options OptionMapType) error {
return opsc.command.Init(args, options, opsc)
}
// RunCommand simulate inheritance, and polymorphism
func (opsc *OptionsCommand) RunCommand() error {
strOrigin, _ := GetString(OptionOrigin, opsc.command.options)
strMethod, _ := GetString(OptionAcrMethod, opsc.command.options)
strAcrHeaders, _ := GetString(OptionAcrHeaders, opsc.command.options)
strEncodingType, _ := GetString(OptionEncodingType, opsc.command.options)
srcBucketUrL, err := GetCloudUrl(opsc.command.args[0], strEncodingType)
if err != nil {
return err
}
options := []oss.Option{}
if len(strOrigin) > 0 {
options = append(options, oss.Origin(strOrigin))
}
if len(strMethod) > 0 {
options = append(options, oss.ACReqMethod(strings.ToUpper(strMethod)))
}
if len(strAcrHeaders) > 0 {
options = append(options, oss.ACReqHeaders(strAcrHeaders))
}
objectName := srcBucketUrL.object
client, err := opsc.command.ossClient(srcBucketUrL.bucket)
if err != nil {
return err
}
bucket, err := client.Bucket(srcBucketUrL.bucket)
if err != nil {
return err
}
respHeader, err := bucket.OptionsMethod(objectName, options...)
if err != nil {
return err
}
exclude := map[string]bool{}
exclude["Connection"] = true
exclude["ontent-Length"] = true
exclude["Date"] = true
exclude["Server"] = true
exclude["X-Oss-Request-Id"] = true
exclude["X-Oss-Server-Time"] = true
exclude["Content-Length"] = true
respHeader.WriteSubset(os.Stdout, exclude)
return nil
}