http_util.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package common
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/emqx/kuiper/xstream/api"
  7. "io/ioutil"
  8. "net/http"
  9. "net/url"
  10. "strings"
  11. )
  12. var BodyTypeMap = map[string]string{"none": "", "text": "text/plain", "json": "application/json", "html": "text/html", "xml": "application/xml", "javascript": "application/javascript", "form": ""}
  13. func Send(logger api.Logger, client *http.Client, bodyType string, method string, u string, headers map[string]string, sendSingle bool, v interface{}) (*http.Response, error) {
  14. var req *http.Request
  15. var err error
  16. switch bodyType {
  17. case "none":
  18. req, err = http.NewRequest(method, u, nil)
  19. if err != nil {
  20. return nil, fmt.Errorf("fail to create request: %v", err)
  21. }
  22. case "json", "text", "javascript", "html", "xml":
  23. var body = &(bytes.Buffer{})
  24. switch t := v.(type) {
  25. case []byte:
  26. body = bytes.NewBuffer(t)
  27. default:
  28. return nil, fmt.Errorf("invalid content: %v", v)
  29. }
  30. req, err = http.NewRequest(method, u, body)
  31. if err != nil {
  32. return nil, fmt.Errorf("fail to create request: %v", err)
  33. }
  34. req.Header.Set("Content-Type", BodyTypeMap[bodyType])
  35. case "form":
  36. form := url.Values{}
  37. im, err := convertToMap(v, sendSingle)
  38. if err != nil {
  39. return nil, err
  40. }
  41. for key, value := range im {
  42. var vstr string
  43. switch value.(type) {
  44. case []interface{}, map[string]interface{}:
  45. if temp, err := json.Marshal(value); err != nil {
  46. return nil, fmt.Errorf("fail to parse from value: %v", err)
  47. } else {
  48. vstr = string(temp)
  49. }
  50. default:
  51. vstr = fmt.Sprintf("%v", value)
  52. }
  53. form.Set(key, vstr)
  54. }
  55. body := ioutil.NopCloser(strings.NewReader(form.Encode()))
  56. req, err = http.NewRequest(method, u, body)
  57. if err != nil {
  58. return nil, fmt.Errorf("fail to create request: %v", err)
  59. }
  60. req.Header.Set("Content-Type", "application/x-www-form-urlencoded;param=value")
  61. default:
  62. return nil, fmt.Errorf("unsupported body type %s", bodyType)
  63. }
  64. if len(headers) > 0 {
  65. for k, v := range headers {
  66. req.Header.Set(k, v)
  67. }
  68. }
  69. logger.Debugf("do request: %#v", req)
  70. return client.Do(req)
  71. }
  72. func convertToMap(v interface{}, sendSingle bool) (map[string]interface{}, error) {
  73. switch t := v.(type) {
  74. case []byte:
  75. r := make(map[string]interface{})
  76. if err := json.Unmarshal(t, &r); err != nil {
  77. if sendSingle {
  78. return nil, fmt.Errorf("fail to decode content: %v", err)
  79. } else {
  80. r["result"] = string(t)
  81. }
  82. }
  83. return r, nil
  84. default:
  85. return nil, fmt.Errorf("invalid content: %v", v)
  86. }
  87. return nil, fmt.Errorf("invalid content: %v", v)
  88. }