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)
 | |
| }
 | 
