129 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
package server
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"net/http"
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/gin-gonic/gin"
 | 
						|
	"github.com/pkg/errors"
 | 
						|
	log "github.com/sirupsen/logrus"
 | 
						|
 | 
						|
	"github.com/oceanbase/configserver/lib/codec"
 | 
						|
	"github.com/oceanbase/configserver/lib/net"
 | 
						|
	"github.com/oceanbase/configserver/lib/trace"
 | 
						|
)
 | 
						|
 | 
						|
var invalidActionOnce sync.Once
 | 
						|
var invalidActionFunc func(*gin.Context)
 | 
						|
 | 
						|
func getInvalidActionFunc() func(*gin.Context) {
 | 
						|
	invalidActionOnce.Do(func() {
 | 
						|
		invalidActionFunc = handlerFunctionWrapper(invalidAction)
 | 
						|
	})
 | 
						|
	return invalidActionFunc
 | 
						|
}
 | 
						|
 | 
						|
func getServerIdentity() string {
 | 
						|
	ip, _ := net.GetLocalIpAddress()
 | 
						|
	return ip
 | 
						|
}
 | 
						|
 | 
						|
func handlerFunctionWrapper(f func(context.Context, *gin.Context) *ApiResponse) func(*gin.Context) {
 | 
						|
	fn := func(c *gin.Context) {
 | 
						|
		tStart := time.Now()
 | 
						|
		traceId := trace.RandomTraceId()
 | 
						|
		ctxlog := trace.ContextWithTraceId(traceId)
 | 
						|
		log.WithContext(ctxlog).Infof("handle request: %s %s", c.Request.Method, c.Request.RequestURI)
 | 
						|
		response := f(ctxlog, c)
 | 
						|
		cost := time.Now().Sub(tStart).Milliseconds()
 | 
						|
		response.TraceId = traceId
 | 
						|
		response.Cost = cost
 | 
						|
		response.Server = getServerIdentity()
 | 
						|
		responseJson, err := codec.MarshalToJsonString(response)
 | 
						|
		if err != nil {
 | 
						|
			log.WithContext(ctxlog).Errorf("response: %s", "response serialization error")
 | 
						|
			c.JSON(http.StatusInternalServerError, NewErrorResponse(errors.Wrap(err, "serialize response")))
 | 
						|
		} else {
 | 
						|
			log.WithContext(ctxlog).Infof("response: %s", responseJson)
 | 
						|
			c.String(response.Code, string(responseJson))
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return fn
 | 
						|
}
 | 
						|
 | 
						|
func invalidAction(ctxlog context.Context, c *gin.Context) *ApiResponse {
 | 
						|
	log.WithContext(ctxlog).Error("invalid action")
 | 
						|
	return NewIllegalArgumentResponse(errors.New("invalid action"))
 | 
						|
}
 | 
						|
 | 
						|
func getHandler() gin.HandlerFunc {
 | 
						|
	fn := func(c *gin.Context) {
 | 
						|
		action := c.Query("Action")
 | 
						|
		switch action {
 | 
						|
		case "ObRootServiceInfo":
 | 
						|
			getObRootServiceGetFunc()(c)
 | 
						|
 | 
						|
		case "GetObProxyConfig":
 | 
						|
			getObProxyConfigFunc()(c)
 | 
						|
 | 
						|
		case "GetObRootServiceInfoUrlTemplate":
 | 
						|
			getObProxyConfigWithTemplateFunc()(c)
 | 
						|
 | 
						|
		case "ObIDCRegionInfo":
 | 
						|
			getObIdcRegionInfoFunc()(c)
 | 
						|
 | 
						|
		default:
 | 
						|
			getInvalidActionFunc()(c)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return gin.HandlerFunc(fn)
 | 
						|
}
 | 
						|
 | 
						|
func postHandler() gin.HandlerFunc {
 | 
						|
 | 
						|
	fn := func(c *gin.Context) {
 | 
						|
		action, _ := c.GetQuery("Action")
 | 
						|
		switch action {
 | 
						|
		case "ObRootServiceInfo":
 | 
						|
			getObRootServicePostFunc()(c)
 | 
						|
 | 
						|
		case "GetObProxyConfig":
 | 
						|
			getObProxyConfigFunc()(c)
 | 
						|
 | 
						|
		case "GetObRootServiceInfoUrlTemplate":
 | 
						|
			getObProxyConfigWithTemplateFunc()(c)
 | 
						|
		default:
 | 
						|
			getInvalidActionFunc()(c)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return gin.HandlerFunc(fn)
 | 
						|
}
 | 
						|
 | 
						|
func deleteHandler() gin.HandlerFunc {
 | 
						|
	fn := func(c *gin.Context) {
 | 
						|
		action, _ := c.GetQuery("Action")
 | 
						|
		switch action {
 | 
						|
		case "ObRootServiceInfo":
 | 
						|
			getObRootServiceDeleteFunc()(c)
 | 
						|
		default:
 | 
						|
			getInvalidActionFunc()(c)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return gin.HandlerFunc(fn)
 | 
						|
}
 |