redirect.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package cluster
  2. import (
  3. "errors"
  4. "io"
  5. "net/http"
  6. "strconv"
  7. )
  8. // RedirectRequest redirects the request to the specified node
  9. func (c *Cluster) RedirectRequest(
  10. node_id string, request *http.Request,
  11. ) (int, http.Header, io.ReadCloser, error) {
  12. node, ok := c.nodes.Load(node_id)
  13. if !ok {
  14. return 0, nil, nil, errors.New("node not found")
  15. }
  16. ips := c.SortIps(node)
  17. if len(ips) == 0 {
  18. return 0, nil, nil, errors.New("no available ip found")
  19. }
  20. ip := ips[0]
  21. // create a new request
  22. redirected_request, err := http.NewRequest(
  23. request.Method,
  24. "http://"+ip.Address+":"+strconv.FormatUint(uint64(c.port), 10)+request.URL.Path,
  25. request.Body,
  26. )
  27. if err != nil {
  28. return 0, nil, nil, err
  29. }
  30. // copy headers
  31. for key, values := range request.Header {
  32. for _, value := range values {
  33. redirected_request.Header.Add(key, value)
  34. }
  35. }
  36. client := http.DefaultClient
  37. resp, err := client.Do(redirected_request)
  38. if err != nil {
  39. return 0, nil, nil, err
  40. }
  41. return resp.StatusCode, resp.Header, resp.Body, nil
  42. }