redirect.go 983 B

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