...

Source file src/github.com/gin-gonic/gin/debug.go

Documentation: github.com/gin-gonic/gin

     1  // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
     2  // Use of this source code is governed by a MIT style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gin
     6  
     7  import (
     8  	"fmt"
     9  	"html/template"
    10  	"runtime"
    11  	"strconv"
    12  	"strings"
    13  )
    14  
    15  const ginSupportMinGoVer = 18
    16  
    17  // IsDebugging returns true if the framework is running in debug mode.
    18  // Use SetMode(gin.ReleaseMode) to disable debug mode.
    19  func IsDebugging() bool {
    20  	return ginMode == debugCode
    21  }
    22  
    23  // DebugPrintRouteFunc indicates debug log output format.
    24  var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int)
    25  
    26  func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) {
    27  	if IsDebugging() {
    28  		nuHandlers := len(handlers)
    29  		handlerName := nameOfFunction(handlers.Last())
    30  		if DebugPrintRouteFunc == nil {
    31  			debugPrint("%-6s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers)
    32  		} else {
    33  			DebugPrintRouteFunc(httpMethod, absolutePath, handlerName, nuHandlers)
    34  		}
    35  	}
    36  }
    37  
    38  func debugPrintLoadTemplate(tmpl *template.Template) {
    39  	if IsDebugging() {
    40  		var buf strings.Builder
    41  		for _, tmpl := range tmpl.Templates() {
    42  			buf.WriteString("\t- ")
    43  			buf.WriteString(tmpl.Name())
    44  			buf.WriteString("\n")
    45  		}
    46  		debugPrint("Loaded HTML Templates (%d): \n%s\n", len(tmpl.Templates()), buf.String())
    47  	}
    48  }
    49  
    50  func debugPrint(format string, values ...any) {
    51  	if IsDebugging() {
    52  		if !strings.HasSuffix(format, "\n") {
    53  			format += "\n"
    54  		}
    55  		fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...)
    56  	}
    57  }
    58  
    59  func getMinVer(v string) (uint64, error) {
    60  	first := strings.IndexByte(v, '.')
    61  	last := strings.LastIndexByte(v, '.')
    62  	if first == last {
    63  		return strconv.ParseUint(v[first+1:], 10, 64)
    64  	}
    65  	return strconv.ParseUint(v[first+1:last], 10, 64)
    66  }
    67  
    68  func debugPrintWARNINGDefault() {
    69  	if v, e := getMinVer(runtime.Version()); e == nil && v < ginSupportMinGoVer {
    70  		debugPrint(`[WARNING] Now Gin requires Go 1.18+.
    71  
    72  `)
    73  	}
    74  	debugPrint(`[WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
    75  
    76  `)
    77  }
    78  
    79  func debugPrintWARNINGNew() {
    80  	debugPrint(`[WARNING] Running in "debug" mode. Switch to "release" mode in production.
    81   - using env:	export GIN_MODE=release
    82   - using code:	gin.SetMode(gin.ReleaseMode)
    83  
    84  `)
    85  }
    86  
    87  func debugPrintWARNINGSetHTMLTemplate() {
    88  	debugPrint(`[WARNING] Since SetHTMLTemplate() is NOT thread-safe. It should only be called
    89  at initialization. ie. before any route is registered or the router is listening in a socket:
    90  
    91  	router := gin.Default()
    92  	router.SetHTMLTemplate(template) // << good place
    93  
    94  `)
    95  }
    96  
    97  func debugPrintError(err error) {
    98  	if err != nil && IsDebugging() {
    99  		fmt.Fprintf(DefaultErrorWriter, "[GIN-debug] [ERROR] %v\n", err)
   100  	}
   101  }
   102  

View as plain text