Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
15a4b2a713 | |||
493c6ebae8 | |||
fb847b03af | |||
f826633e6e
|
|||
edeae23bf1
|
|||
a038b86147
|
|||
ede0b99d3a
|
@@ -68,6 +68,9 @@ func NewEngine(allowCors bool, ginDebug bool, timeout time.Duration) *GinWrapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *GinWrapper) ListenAndServeHTTP(addr string, postInit func(port string)) (chan error, *http.Server) {
|
func (w *GinWrapper) ListenAndServeHTTP(addr string, postInit func(port string)) (chan error, *http.Server) {
|
||||||
|
|
||||||
|
w.DebugPrintRoutes()
|
||||||
|
|
||||||
httpserver := &http.Server{
|
httpserver := &http.Server{
|
||||||
Addr: addr,
|
Addr: addr,
|
||||||
Handler: w.engine,
|
Handler: w.engine,
|
||||||
@@ -92,7 +95,7 @@ func (w *GinWrapper) ListenAndServeHTTP(addr string, postInit func(port string))
|
|||||||
log.Info().Str("address", httpserver.Addr).Msg("HTTP-Server started on http://localhost:" + port)
|
log.Info().Str("address", httpserver.Addr).Msg("HTTP-Server started on http://localhost:" + port)
|
||||||
|
|
||||||
if postInit != nil {
|
if postInit != nil {
|
||||||
postInit(port)
|
postInit(port) // the net.Listener a few lines above is at this point actually already buffering requests
|
||||||
}
|
}
|
||||||
|
|
||||||
errChan <- httpserver.Serve(ln)
|
errChan <- httpserver.Serve(ln)
|
||||||
@@ -115,8 +118,8 @@ func (w *GinWrapper) DebugPrintRoutes() {
|
|||||||
line := [4]string{
|
line := [4]string{
|
||||||
spec.Method,
|
spec.Method,
|
||||||
spec.URL,
|
spec.URL,
|
||||||
strings.Join(spec.Middlewares, " --> "),
|
strings.Join(spec.Middlewares, " -> "),
|
||||||
spec.Method,
|
spec.Handler,
|
||||||
}
|
}
|
||||||
|
|
||||||
lines = append(lines, line)
|
lines = append(lines, line)
|
||||||
@@ -129,8 +132,8 @@ func (w *GinWrapper) DebugPrintRoutes() {
|
|||||||
|
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
|
|
||||||
fmt.Printf("Gin-Route: [%s] @ %s --> %s --> %s\n",
|
fmt.Printf("Gin-Route: %s %s --> %s --> %s\n",
|
||||||
langext.StrPadRight(line[0], " ", pad[0]),
|
langext.StrPadRight("["+line[0]+"]", " ", pad[0]+2),
|
||||||
langext.StrPadRight(line[1], " ", pad[1]),
|
langext.StrPadRight(line[1], " ", pad[1]),
|
||||||
langext.StrPadRight(line[2], " ", pad[2]),
|
langext.StrPadRight(line[2], " ", pad[2]),
|
||||||
langext.StrPadRight(line[3], " ", pad[3]))
|
langext.StrPadRight(line[3], " ", pad[3]))
|
||||||
|
@@ -25,7 +25,7 @@ func Wrap(w *GinWrapper, fn WHandlerFunc) gin.HandlerFunc {
|
|||||||
Str("trace", stackTrace).
|
Str("trace", stackTrace).
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
wrap = APIError(g, err)
|
wrap = Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if g.Writer.Written() {
|
if g.Writer.Written() {
|
||||||
|
@@ -52,7 +52,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailURI).
|
WithType(exerr.TypeBindFailURI).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.uri)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.uri)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailQuery).
|
WithType(exerr.TypeBindFailQuery).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,13 +73,13 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailJSON).
|
WithType(exerr.TypeBindFailJSON).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body").
|
err := exerr.New(exerr.TypeBindFailJSON, "missing JSON body").
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.body)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,13 +90,13 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailFormData).
|
WithType(exerr.TypeBindFailFormData).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err := exerr.New(exerr.TypeBindFailFormData, "missing form body").
|
err := exerr.New(exerr.TypeBindFailFormData, "missing form body").
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.form)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ func (pctx PreContext) Start() (*AppContext, *gin.Context, *HTTPResponse) {
|
|||||||
WithType(exerr.TypeBindFailHeader).
|
WithType(exerr.TypeBindFailHeader).
|
||||||
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
Str("struct_type", fmt.Sprintf("%T", pctx.query)).
|
||||||
Build()
|
Build()
|
||||||
return nil, nil, langext.Ptr(APIError(pctx.ginCtx, err))
|
return nil, nil, langext.Ptr(Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -170,12 +170,18 @@ func Redirect(sc int, newURL string) HTTPResponse {
|
|||||||
return &redirectHTTPResponse{statusCode: sc, url: newURL}
|
return &redirectHTTPResponse{statusCode: sc, url: newURL}
|
||||||
}
|
}
|
||||||
|
|
||||||
func APIError(g *gin.Context, e error) HTTPResponse {
|
func Error(e error) HTTPResponse {
|
||||||
return &jsonAPIErrResponse{
|
return &jsonAPIErrResponse{
|
||||||
err: exerr.FromError(e),
|
err: exerr.FromError(e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NotImplemented(g *gin.Context) HTTPResponse {
|
func ErrWrap(e error, errorType exerr.ErrorType, msg string) HTTPResponse {
|
||||||
return APIError(g, exerr.New(exerr.TypeNotImplemented, "").Build())
|
return &jsonAPIErrResponse{
|
||||||
|
err: exerr.FromError(exerr.Wrap(e, msg).WithType(errorType).Build()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotImplemented() HTTPResponse {
|
||||||
|
return Error(exerr.New(exerr.TypeNotImplemented, "").Build())
|
||||||
}
|
}
|
||||||
|
@@ -3,8 +3,10 @@ package ginext
|
|||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||||
|
"gogs.mikescher.com/BlackForestBytes/goext/rext"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -123,12 +125,25 @@ func (w *GinWrapper) NoRoute(handler WHandlerFunc) {
|
|||||||
|
|
||||||
func nameOfFunction(f any) string {
|
func nameOfFunction(f any) string {
|
||||||
|
|
||||||
n := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
|
fname := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
|
||||||
|
|
||||||
split := strings.Split(n, "/")
|
split := strings.Split(fname, "/")
|
||||||
if len(split) == 0 {
|
if len(split) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
return split[len(split)-1]
|
fname = split[len(split)-1]
|
||||||
|
|
||||||
|
// https://stackoverflow.com/a/32925345/1761622
|
||||||
|
if strings.HasSuffix(fname, "-fm") {
|
||||||
|
fname = fname[:len(fname)-len("-fm")]
|
||||||
|
}
|
||||||
|
|
||||||
|
suffix := rext.W(regexp.MustCompile("\\.func[0-9]+$"))
|
||||||
|
|
||||||
|
if match, ok := suffix.MatchFirst(fname); ok {
|
||||||
|
fname = fname[:len(fname)-match.FullMatch().Length()]
|
||||||
|
}
|
||||||
|
|
||||||
|
return fname
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
package goext
|
package goext
|
||||||
|
|
||||||
const GoextVersion = "0.0.202"
|
const GoextVersion = "0.0.209"
|
||||||
|
|
||||||
const GoextVersionTimestamp = "2023-07-24T18:34:56+0200"
|
const GoextVersionTimestamp = "2023-07-25T10:56:03+0200"
|
||||||
|
Reference in New Issue
Block a user