|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package proxy
-
- import (
- "io"
-
- "github.com/gin-gonic/gin"
- "gitlink.org.cn/cloudream/common/utils/io2"
- "gitlink.org.cn/cloudream/jcs-pub/client/internal/cluster"
- "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/types"
- "gitlink.org.cn/cloudream/jcs-pub/common/ecode"
- clirpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/client"
- )
-
- type ClusterProxy struct {
- clster *cluster.Cluster
- }
-
- func NewClusterProxy(clster *cluster.Cluster) *ClusterProxy {
- return &ClusterProxy{
- clster: clster,
- }
- }
-
- func (p *ClusterProxy) Proxy(c *gin.Context) {
- if p.clster.IsMaster() {
- c.Next()
- return
- }
-
- mstCli := p.clster.MasterClient()
- defer mstCli.Release()
-
- preq := clirpc.HTTPProxyRequest{
- URI: c.Request.RequestURI,
- Method: c.Request.Method,
- }
-
- for k, v := range c.Request.Header {
- for _, vv := range v {
- preq.Header = append(preq.Header, &clirpc.HeaderKV{
- Key: k,
- Value: vv,
- })
- }
- }
-
- if c.Request.Body != nil {
- data, err := io.ReadAll(c.Request.Body)
- if err != nil {
- c.AbortWithStatusJSON(500, types.Failed(ecode.OperationFailed, "read body: %v", err))
- return
- }
-
- preq.Body = data
- }
-
- resp, err := mstCli.HTTPProxy(c.Request.Context(), &preq)
- if err != nil {
- c.AbortWithStatusJSON(500, types.Failed(ecode.OperationFailed, "proxy: %v", err))
- return
- }
-
- c.Status(int(resp.StatusCode))
-
- for _, h := range resp.Header {
- c.Header(h.Key, h.Value)
- }
-
- if len(resp.Body) > 0 {
- io2.WriteAll(c.Writer, resp.Body)
- }
-
- c.Abort()
- }
|