connector.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package http
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "log"
  7. "net"
  8. "net/http"
  9. "rocommon"
  10. "rocommon/socket"
  11. "strings"
  12. "time"
  13. )
  14. type httpConnector struct {
  15. socket.NetServerNodeProperty
  16. socket.NetContextSet
  17. socket.NetProcessorRPC //事件处理相关
  18. }
  19. func (this *httpConnector) Start() rocommon.ServerNode {
  20. return this
  21. }
  22. func (this *httpConnector) Stop() {
  23. }
  24. func (this *httpConnector) TypeOfName() string {
  25. return "httpConnector"
  26. }
  27. func (this *httpConnector) Request(method, path string, param *rocommon.HTTPRequest) error {
  28. codecProc := rocommon.GetHttpCodec(param.ReqCodecName)
  29. if method == "POST" {
  30. data, err := codecProc.Marshal(param.ReqMsg)
  31. if err != nil {
  32. return err
  33. }
  34. url := fmt.Sprintf("http://%s%s", this.GetAddr(), path)
  35. if strings.Contains(this.GetAddr(), "http") {
  36. url = fmt.Sprintf("%s%s", this.GetAddr(), path)
  37. }
  38. req, err := http.NewRequest(method, url, data.(io.Reader))
  39. if err != nil {
  40. return nil
  41. }
  42. mimeType := codecProc.(interface {
  43. MimeType() string
  44. }).MimeType()
  45. req.Header.Set("Content-Type", mimeType)
  46. resp, err := defaultHttpClient.Do(req)
  47. if resp != nil {
  48. defer resp.Body.Close()
  49. }
  50. if err != nil {
  51. return err
  52. }
  53. //log.Println("[header]:", resp.Header, resp.Status, resp.Body)
  54. return codecProc.Unmarshal(resp.Body, param.ResMsg)
  55. } else {
  56. url := fmt.Sprintf("http://%s%s", this.GetAddr(), path)
  57. if strings.Contains(this.GetAddr(), "http") {
  58. url = fmt.Sprintf("%s%s", this.GetAddr(), path)
  59. }
  60. req, err := http.NewRequest(method, url, nil)
  61. if err != nil {
  62. return nil
  63. }
  64. mimeType := codecProc.(interface {
  65. MimeType() string
  66. }).MimeType()
  67. req.Header.Set("Content-Type", mimeType)
  68. resp, err := defaultHttpClient.Do(req)
  69. if resp != nil {
  70. defer resp.Body.Close()
  71. }
  72. if err != nil {
  73. return err
  74. }
  75. //log.Println("[header]:", resp.Header, resp.Status, resp.Body)
  76. return codecProc.Unmarshal(resp.Body, param.ResMsg)
  77. }
  78. }
  79. var defaultHttpClient *http.Client = nil
  80. func defaultClient() {
  81. defaultHttpClient = &http.Client{
  82. Transport: &http.Transport{
  83. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  84. deadline := time.Now().Add(time.Second * 30)
  85. c, err := net.DialTimeout(network, addr, time.Second*30)
  86. if err != nil {
  87. return nil, err
  88. }
  89. c.SetDeadline(deadline)
  90. return c, nil
  91. },
  92. },
  93. }
  94. }
  95. func init() {
  96. log.Println("httpConnector server node register")
  97. socket.RegisterServerNode(func() rocommon.ServerNode {
  98. node := &httpConnector{}
  99. return node
  100. })
  101. defaultClient()
  102. }