| 
				
			 | 
			
			
				@@ -0,0 +1,90 @@ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				1
			 | 
			
			
				+package check 
			 | 
		
	
		
			
			| 
				
			 | 
			
				2
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				3
			 | 
			
			
				+import ( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				4
			 | 
			
			
				+	"encoding/json" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				5
			 | 
			
			
				+	"fmt" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				6
			 | 
			
			
				+	"github.com/gin-gonic/gin" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				7
			 | 
			
			
				+	"net/http" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				8
			 | 
			
			
				+) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				9
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				10
			 | 
			
			
				+type ( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				11
			 | 
			
			
				+	errorWriter struct { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				12
			 | 
			
			
				+		gin.ResponseWriter 
			 | 
		
	
		
			
			| 
				
			 | 
			
				13
			 | 
			
			
				+		data []byte 
			 | 
		
	
		
			
			| 
				
			 | 
			
				14
			 | 
			
			
				+	} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				15
			 | 
			
			
				+) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				16
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				17
			 | 
			
			
				+func (ew *errorWriter) WriteString(data string) (int, error) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				18
			 | 
			
			
				+	ew.data = append(ew.data, []byte(data)...) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				19
			 | 
			
			
				+	return ew.ResponseWriter.WriteString(data) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				20
			 | 
			
			
				+} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				21
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				22
			 | 
			
			
				+func (ew *errorWriter) Write(data []byte) (int, error) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				23
			 | 
			
			
				+	ew.data = append(ew.data, data...) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				24
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				25
			 | 
			
			
				+	return ew.ResponseWriter.Write(data) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				26
			 | 
			
			
				+} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				27
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				28
			 | 
			
			
				+func (ew *errorWriter) successful() bool { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				29
			 | 
			
			
				+	switch ew.Status() { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				30
			 | 
			
			
				+	case 200, 201, 202, 204: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				31
			 | 
			
			
				+		return true 
			 | 
		
	
		
			
			| 
				
			 | 
			
				32
			 | 
			
			
				+	case 400, 401, 403, 404, 406, 410, 422, 500: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				33
			 | 
			
			
				+		return false 
			 | 
		
	
		
			
			| 
				
			 | 
			
				34
			 | 
			
			
				+	default: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				35
			 | 
			
			
				+		panic(fmt.Sprintf("unsupported status code %d", ew.Status())) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				36
			 | 
			
			
				+	} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				37
			 | 
			
			
				+} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				38
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				39
			 | 
			
			
				+func CodeAnalysis() gin.HandlerFunc { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				40
			 | 
			
			
				+	return func(ctx *gin.Context) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				41
			 | 
			
			
				+		ew := &errorWriter{ResponseWriter: ctx.Writer} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				+		ctx.Writer = ew 
			 | 
		
	
		
			
			| 
				
			 | 
			
				43
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				44
			 | 
			
			
				+		ctx.Next() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				45
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				+		switch ew.Header().Get("Content-Type") { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				47
			 | 
			
			
				+		case "application/json; charset=utf-8": 
			 | 
		
	
		
			
			| 
				
			 | 
			
				48
			 | 
			
			
				+			rps := map[string]string{} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				50
			 | 
			
			
				+			err := json.Unmarshal(ew.data, &rps) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				51
			 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+				panic("unsupported data format, only json now.") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				+			} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				54
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				55
			 | 
			
			
				+			if !ew.successful() { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				+				if len(rps) != 1 || rps["msg"] == "" { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				+					panic(fmt.Sprintf("you need return %s but, %s", `{"msg":"content can't empty'"}`, string(ew.data))) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				+				} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				59
			 | 
			
			
				+			} else { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				+				// 如果post请求的状态码不是201的话返回错误 
			 | 
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				+				if ctx.Request.Method == "POST" && ew.Status() != http.StatusCreated { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				+					panic(fmt.Sprintf("you need set http status to %d", http.StatusCreated)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				63
			 | 
			
			
				+				} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				64
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				+				// 如果状态码是201但是请求方式不是post的话返回错误 
			 | 
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				+				if ew.Status() == http.StatusCreated && ctx.Request.Method != "POST" { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				+					panic(fmt.Sprintf("the http status %d can set when method=POST", http.StatusCreated)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+				} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				70
			 | 
			
			
				+				// 如果返回的数据为nil则报错 
			 | 
		
	
		
			
			| 
				
			 | 
			
				71
			 | 
			
			
				+				if rps == nil { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				72
			 | 
			
			
				+					panic(fmt.Sprintf("if response body is null, please only set http status")) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				73
			 | 
			
			
				+				} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				74
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				75
			 | 
			
			
				+				// 如果返回状态码为204则body不能有任何数据 
			 | 
		
	
		
			
			| 
				
			 | 
			
				76
			 | 
			
			
				+				if ew.Status() == http.StatusNoContent && len(ew.data) != 0 { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				77
			 | 
			
			
				+					panic(fmt.Sprintf("if response stauts is %d, can't have reponse body", http.StatusNoContent)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				78
			 | 
			
			
				+				} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				79
			 | 
			
			
				+			} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				80
			 | 
			
			
				+		default: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				81
			 | 
			
			
				+			if len(ew.data) == 0 && ew.Status() != http.StatusNoContent { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				82
			 | 
			
			
				+				panic(fmt.Sprintf("if response body is null, please only set http status %d", http.StatusNoContent)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				83
			 | 
			
			
				+			} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				84
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				85
			 | 
			
			
				+			if len(ew.data) != 0 { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				86
			 | 
			
			
				+				panic("unsupported data format, only json now.") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				87
			 | 
			
			
				+			} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				+		} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				89
			 | 
			
			
				+	} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				90
			 | 
			
			
				+} 
			 |