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

proxy.go 1.5 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package proxy
  2. import (
  3. "io"
  4. "github.com/gin-gonic/gin"
  5. "gitlink.org.cn/cloudream/common/utils/io2"
  6. "gitlink.org.cn/cloudream/jcs-pub/client/internal/cluster"
  7. "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/types"
  8. "gitlink.org.cn/cloudream/jcs-pub/common/ecode"
  9. clirpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/client"
  10. )
  11. type ClusterProxy struct {
  12. clster *cluster.Cluster
  13. }
  14. func NewClusterProxy(clster *cluster.Cluster) *ClusterProxy {
  15. return &ClusterProxy{
  16. clster: clster,
  17. }
  18. }
  19. func (p *ClusterProxy) Proxy(c *gin.Context) {
  20. if p.clster.IsMaster() {
  21. c.Next()
  22. return
  23. }
  24. mstCli := p.clster.MasterClient()
  25. defer mstCli.Release()
  26. preq := clirpc.HTTPProxyRequest{
  27. URI: c.Request.RequestURI,
  28. Method: c.Request.Method,
  29. }
  30. for k, v := range c.Request.Header {
  31. for _, vv := range v {
  32. preq.Header = append(preq.Header, &clirpc.HeaderKV{
  33. Key: k,
  34. Value: vv,
  35. })
  36. }
  37. }
  38. if c.Request.Body != nil {
  39. data, err := io.ReadAll(c.Request.Body)
  40. if err != nil {
  41. c.AbortWithStatusJSON(500, types.Failed(ecode.OperationFailed, "read body: %v", err))
  42. return
  43. }
  44. preq.Body = data
  45. }
  46. resp, err := mstCli.HTTPProxy(c.Request.Context(), &preq)
  47. if err != nil {
  48. c.AbortWithStatusJSON(500, types.Failed(ecode.OperationFailed, "proxy: %v", err))
  49. return
  50. }
  51. c.Status(int(resp.StatusCode))
  52. for _, h := range resp.Header {
  53. c.Header(h.Key, h.Value)
  54. }
  55. if len(resp.Body) > 0 {
  56. io2.WriteAll(c.Writer, resp.Body)
  57. }
  58. c.Abort()
  59. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。