You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
6.8 KiB

  1. package requests
  2. import (
  3. "errors"
  4. "fmt"
  5. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils"
  6. "io"
  7. "math/cmplx"
  8. "reflect"
  9. "strconv"
  10. "time"
  11. )
  12. const (
  13. RPC = "RPC"
  14. ROA = "ROA"
  15. HTTP = "HTTP"
  16. HTTPS = "HTTPS"
  17. JSON = "JSON"
  18. XML = "XML"
  19. DefaultHttpPort = "80"
  20. GET = "GET"
  21. PUT = "PUT"
  22. POST = "POST"
  23. DELETE = "DELETE"
  24. PATCH = "PATCH"
  25. HEAD = "HEAD"
  26. OPTIONS = "OPTIONS"
  27. Json = "application/json"
  28. Xml = "application/xml"
  29. Raw = "application/octet-stream"
  30. Form = "application/x-www-form-urlencoded"
  31. Header = "Header"
  32. Query = "Query"
  33. Body = "Body"
  34. Path = "Path"
  35. TEST = "TEST"
  36. PRE = "PRE"
  37. RELEASE = "RELEASE"
  38. HeaderSeparator = "\n"
  39. )
  40. type Host struct {
  41. Default string
  42. Func func(string) string
  43. }
  44. var debug utils.Debug
  45. func init() {
  46. debug = utils.Init("request")
  47. }
  48. type AcsRequest interface {
  49. GetReadTimeout() time.Duration
  50. GetConnectTimeout() time.Duration
  51. SetReadTimeout(readTimeOut time.Duration)
  52. SetConnectTimeout(connectTimeOut time.Duration)
  53. SetHTTPSInsecure(isInsecure bool)
  54. GetHTTPSInsecure() *bool
  55. GetQueryParams() map[string]string
  56. GetFormParams() map[string]string
  57. GetMethod() string
  58. GetScheme() string
  59. GetDomain() Host
  60. SetDomain(host Host)
  61. GetActionName() string
  62. GetAcceptFormat() string
  63. GetAccept() string
  64. GetHeaders() map[string]string
  65. GetStyle() string
  66. InitWithApiInfo(domain Host, version, urlPath string)
  67. GetEnv() string
  68. SetEnv(string)
  69. BuildUrl() string
  70. BuildQueries() string
  71. SetScheme(scheme string)
  72. SetContent(content []byte)
  73. SetStringToSign(stringToSign string)
  74. GetStringToSign() string
  75. GetBodyReader() io.Reader
  76. AddHeaderParam(key, value string)
  77. addQueryParam(key, value string)
  78. addFormParam(key, value string)
  79. }
  80. type baseRequest struct {
  81. Scheme string
  82. Method string
  83. Port string
  84. Domain Host
  85. From string
  86. ReadTimeout time.Duration
  87. ConnectTimeout time.Duration
  88. isInsecure *bool
  89. Env string
  90. AcceptFormat string
  91. actionName string
  92. userAgent map[string]string
  93. product string
  94. version string
  95. QueryParams map[string]string
  96. Headers map[string]string
  97. FormParams map[string]string
  98. Content []byte
  99. queries string
  100. stringToSign string
  101. }
  102. func (request *baseRequest) GetEnv() string {
  103. return request.Env
  104. }
  105. func (request *baseRequest) SetEnv(e string) {
  106. request.Env = e
  107. }
  108. func (request *baseRequest) GetStringToSign() string {
  109. return request.stringToSign
  110. }
  111. func (request *baseRequest) SetContent(content []byte) {
  112. request.Content = content
  113. }
  114. func (request *baseRequest) GetAcceptFormat() string {
  115. return request.AcceptFormat
  116. }
  117. func (request *baseRequest) GetAccept() string {
  118. switch request.GetAcceptFormat() {
  119. case JSON:
  120. return Json
  121. case XML:
  122. return Xml
  123. }
  124. return ""
  125. }
  126. func (request *baseRequest) GetHeaders() map[string]string {
  127. return request.Headers
  128. }
  129. func (request *baseRequest) GetActionName() string {
  130. return request.actionName
  131. }
  132. func (request *baseRequest) SetScheme(scheme string) {
  133. request.Scheme = scheme
  134. }
  135. func (request *baseRequest) SetDomain(host Host) {
  136. request.Domain = host
  137. }
  138. func (request *baseRequest) GetScheme() string {
  139. return request.Scheme
  140. }
  141. func (request *baseRequest) GetDomain() Host {
  142. return request.Domain
  143. }
  144. func (request *baseRequest) GetMethod() string {
  145. return request.Method
  146. }
  147. func (request *baseRequest) GetFormParams() map[string]string {
  148. return request.FormParams
  149. }
  150. func (request *baseRequest) GetQueryParams() map[string]string {
  151. return request.QueryParams
  152. }
  153. func (request *baseRequest) SetHTTPSInsecure(isInsecure bool) {
  154. request.isInsecure = &isInsecure
  155. }
  156. func (request *baseRequest) GetHTTPSInsecure() *bool {
  157. return request.isInsecure
  158. }
  159. func (request *baseRequest) GetReadTimeout() time.Duration {
  160. return request.ReadTimeout
  161. }
  162. func (request *baseRequest) GetConnectTimeout() time.Duration {
  163. return request.ConnectTimeout
  164. }
  165. func (request *baseRequest) SetReadTimeout(readTimeOut time.Duration) {
  166. request.ReadTimeout = readTimeOut
  167. }
  168. func (request *baseRequest) SetConnectTimeout(connectTimeOut time.Duration) {
  169. request.ConnectTimeout = connectTimeOut
  170. }
  171. func (request *baseRequest) SetStringToSign(stringToSign string) {
  172. request.stringToSign = stringToSign
  173. }
  174. func (request *baseRequest) AddHeaderParam(key, val string) {
  175. request.Headers[key] = val
  176. }
  177. func (request *baseRequest) addQueryParam(key, val string) {
  178. request.QueryParams[key] = val
  179. }
  180. func (request *baseRequest) addFormParam(key, val string) {
  181. request.FormParams[key] = val
  182. }
  183. func defaultBaseRequest() (request *baseRequest) {
  184. request = &baseRequest{
  185. Scheme: HTTP,
  186. AcceptFormat: JSON,
  187. Method: GET,
  188. QueryParams: make(map[string]string),
  189. Headers: map[string]string{
  190. "Gr-Sdk-Client": "golang/1.14",
  191. "Gr-Sdk-Invoke-Type": "normal",
  192. "Accept-Encoding": Json,
  193. },
  194. FormParams: make(map[string]string),
  195. }
  196. return
  197. }
  198. func InitParam(request AcsRequest) (err error) {
  199. reflectValue := reflect.ValueOf(request).Elem()
  200. err = flatRepeatedList(reflectValue, request, "")
  201. return nil
  202. }
  203. func flatRepeatedList(reflectValue reflect.Value, request AcsRequest, position string) (err error) {
  204. reflectType := reflectValue.Type()
  205. for i := 0; i < reflectType.NumField(); i++ {
  206. field := reflectType.Field(i)
  207. name, isContiansNameTag := field.Tag.Lookup("field")
  208. fieldPosition := position
  209. if fieldPosition == "" {
  210. fieldPosition, _ = field.Tag.Lookup("position")
  211. }
  212. fieldDefault, _ := field.Tag.Lookup("default")
  213. debug("%s %s %s", name, fieldPosition, fieldDefault)
  214. if isContiansNameTag {
  215. var value string
  216. switch field.Type.Kind() {
  217. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  218. value = strconv.FormatInt(reflectValue.Field(i).Int(), 10)
  219. case reflect.Uintptr, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  220. value = strconv.FormatUint(reflectValue.Field(i).Uint(), 10)
  221. case reflect.Float32, reflect.Float64:
  222. value = strconv.FormatFloat(reflectValue.Field(i).Float(), 'E', -1, 64)
  223. case reflect.Bool:
  224. value = strconv.FormatBool(reflectValue.Field(i).Bool())
  225. case reflect.Complex64, reflect.Complex128:
  226. value = fmt.Sprint(cmplx.Sqrt(reflectValue.Field(i).Complex()))
  227. default:
  228. value = reflectValue.Field(i).String()
  229. }
  230. if len(value) == 0 {
  231. value = fieldDefault
  232. }
  233. if value == "0" && fieldDefault != "" && fieldDefault != "0" {
  234. value = fieldDefault
  235. }
  236. err = addParam(request, fieldPosition, name, value)
  237. }
  238. }
  239. return
  240. }
  241. func addParam(request AcsRequest, position, key, value string) (err error) {
  242. if len(value) > 0 {
  243. switch position {
  244. case Header:
  245. request.AddHeaderParam(key, value)
  246. case Query:
  247. request.addQueryParam(key, value)
  248. case Body:
  249. request.addFormParam(key, value)
  250. default:
  251. errmsg := fmt.Sprintf("unsupport positions add param `%s`", position)
  252. err = errors.New(errmsg)
  253. }
  254. }
  255. return
  256. }