cluster-autoscaler/cloudprovider/alicloud/alibaba-cloud-sdk-go/sdk/requests/acs_reqeust.go (241 lines of code) (raw):
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package requests
import (
"fmt"
"io"
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/alicloud/alibaba-cloud-sdk-go/sdk/errors"
"reflect"
"strconv"
)
/* const vars */
const (
RPC = "RPC"
ROA = "ROA"
HTTP = "HTTP"
HTTPS = "HTTPS"
DefaultHttpPort = "80"
GET = "GET"
PUT = "PUT"
POST = "POST"
DELETE = "DELETE"
HEAD = "HEAD"
OPTIONS = "OPTIONS"
Json = "application/json"
Xml = "application/xml"
Raw = "application/octet-stream"
Form = "application/x-www-form-urlencoded"
Header = "Header"
Query = "Query"
Body = "Body"
Path = "Path"
HeaderSeparator = "\n"
)
// AcsRequest interface
type AcsRequest interface {
GetScheme() string
GetMethod() string
GetDomain() string
GetPort() string
GetRegionId() string
GetUrl() string
GetQueries() string
GetHeaders() map[string]string
GetQueryParams() map[string]string
GetFormParams() map[string]string
GetContent() []byte
GetBodyReader() io.Reader
GetStyle() string
GetProduct() string
GetVersion() string
GetActionName() string
GetAcceptFormat() string
GetLocationServiceCode() string
GetLocationEndpointType() string
SetStringToSign(stringToSign string)
GetStringToSign() string
SetDomain(domain string)
SetContent(content []byte)
SetScheme(scheme string)
BuildUrl() string
BuildQueries() string
addHeaderParam(key, value string)
addQueryParam(key, value string)
addFormParam(key, value string)
addPathParam(key, value string)
}
// base class
type baseRequest struct {
Scheme string
Method string
Domain string
Port string
RegionId string
product string
version string
actionName string
AcceptFormat string
QueryParams map[string]string
Headers map[string]string
FormParams map[string]string
Content []byte
locationServiceCode string
locationEndpointType string
queries string
stringToSign string
}
// GetQueryParams returns QueryParams
func (request *baseRequest) GetQueryParams() map[string]string {
return request.QueryParams
}
// GetFormParams returns FormParams
func (request *baseRequest) GetFormParams() map[string]string {
return request.FormParams
}
// GetContent returns Content
func (request *baseRequest) GetContent() []byte {
return request.Content
}
// GetVersion returns version
func (request *baseRequest) GetVersion() string {
return request.version
}
// GetActionName returns actionName
func (request *baseRequest) GetActionName() string {
return request.actionName
}
// SetContent returns content
func (request *baseRequest) SetContent(content []byte) {
request.Content = content
}
func (request *baseRequest) addHeaderParam(key, value string) {
request.Headers[key] = value
}
func (request *baseRequest) addQueryParam(key, value string) {
request.QueryParams[key] = value
}
func (request *baseRequest) addFormParam(key, value string) {
request.FormParams[key] = value
}
// GetAcceptFormat returns AcceptFormat
func (request *baseRequest) GetAcceptFormat() string {
return request.AcceptFormat
}
// GetLocationServiceCode returns locationServiceCode
func (request *baseRequest) GetLocationServiceCode() string {
return request.locationServiceCode
}
// GetLocationEndpointType returns locationEndpointType
func (request *baseRequest) GetLocationEndpointType() string {
return request.locationEndpointType
}
// GetProduct returns product
func (request *baseRequest) GetProduct() string {
return request.product
}
// GetScheme returns scheme
func (request *baseRequest) GetScheme() string {
return request.Scheme
}
// SetScheme sets scheme
func (request *baseRequest) SetScheme(scheme string) {
request.Scheme = scheme
}
// GetMethod returns Method
func (request *baseRequest) GetMethod() string {
return request.Method
}
// GetDomain returns Domain
func (request *baseRequest) GetDomain() string {
return request.Domain
}
// SetDomain sets host
func (request *baseRequest) SetDomain(host string) {
request.Domain = host
}
// GetPort returns port
func (request *baseRequest) GetPort() string {
return request.Port
}
// GetRegionId returns regionId
func (request *baseRequest) GetRegionId() string {
return request.RegionId
}
// GetHeaders returns headers
func (request *baseRequest) GetHeaders() map[string]string {
return request.Headers
}
// SetContentType sets content type
func (request *baseRequest) SetContentType(contentType string) {
request.Headers["Content-Type"] = contentType
}
// GetContentType returns content type
func (request *baseRequest) GetContentType() (contentType string, contains bool) {
contentType, contains = request.Headers["Content-Type"]
return
}
// SetStringToSign sets stringToSign
func (request *baseRequest) SetStringToSign(stringToSign string) {
request.stringToSign = stringToSign
}
// GetStringToSign returns stringToSign
func (request *baseRequest) GetStringToSign() string {
return request.stringToSign
}
func defaultBaseRequest() (request *baseRequest) {
request = &baseRequest{
Scheme: "",
AcceptFormat: "JSON",
Method: GET,
QueryParams: make(map[string]string),
Headers: map[string]string{
"x-sdk-client": "golang/1.0.0",
"x-sdk-invoke-type": "normal",
"Accept-Encoding": "identity",
},
FormParams: make(map[string]string),
}
return
}
// InitParams returns params
func InitParams(request AcsRequest) (err error) {
requestValue := reflect.ValueOf(request).Elem()
err = flatRepeatedList(requestValue, request, "", "")
return
}
func flatRepeatedList(dataValue reflect.Value, request AcsRequest, position, prefix string) (err error) {
dataType := dataValue.Type()
for i := 0; i < dataType.NumField(); i++ {
field := dataType.Field(i)
name, containsNameTag := field.Tag.Lookup("name")
fieldPosition := position
if fieldPosition == "" {
fieldPosition, _ = field.Tag.Lookup("position")
}
typeTag, containsTypeTag := field.Tag.Lookup("type")
if containsNameTag {
if !containsTypeTag {
// simple param
key := prefix + name
value := dataValue.Field(i).String()
err = addParam(request, fieldPosition, key, value)
if err != nil {
return
}
} else if typeTag == "Repeated" {
// repeated param
repeatedFieldValue := dataValue.Field(i)
if repeatedFieldValue.Kind() != reflect.Slice {
// possible value: {"[]string", "*[]struct"}, we must call Elem() in the last condition
repeatedFieldValue = repeatedFieldValue.Elem()
}
if repeatedFieldValue.IsValid() && !repeatedFieldValue.IsNil() {
for m := 0; m < repeatedFieldValue.Len(); m++ {
elementValue := repeatedFieldValue.Index(m)
key := prefix + name + "." + strconv.Itoa(m+1)
if elementValue.Type().String() == "string" {
value := elementValue.String()
err = addParam(request, fieldPosition, key, value)
if err != nil {
return
}
} else {
err = flatRepeatedList(elementValue, request, fieldPosition, key+".")
if err != nil {
return
}
}
}
}
}
}
}
return
}
func addParam(request AcsRequest, position, name, value string) (err error) {
if len(value) > 0 {
switch position {
case Header:
request.addHeaderParam(name, value)
case Query:
request.addQueryParam(name, value)
case Path:
request.addPathParam(name, value)
case Body:
request.addFormParam(name, value)
default:
errMsg := fmt.Sprintf(errors.UnsupportedParamPositionErrorMessage, position)
err = errors.NewClientError(errors.UnsupportedParamPositionErrorCode, errMsg, nil)
}
}
return
}