Categorygithub.com/Alter17Ego/generic-http
module
1.0.0
Repository: https://github.com/alter17ego/generic-http.git
Documentation: pkg.go.dev

# README

Generic-HTTP

Overview

This library will improve your http transport layer.

How To Use

Rendering HTTP response

Rendering HTTP Error Message

import (
    ...
	"github.com/Alter17Ego/generic-app/errors/codederrors"
	"github.com/Alter17Ego/generic-http/responses/errorresp"
)

/// Render CodedError as an error response
func HelloEndpoint(w http.ResponseWriter, r *http.Request) {
   ...
   if err := r.userService.Modify(userSession,profile); err != nil {
     if err == user.MissMatchUserErr {
         resp := errorresp.Forbidden(err) // 403
         render.Render(w,r,resp)
      }else if err == user.UnkownErr {
         resp := errorresp.InternalServerError(err) // 500
         render.Render(w,r,resp)
      } else if err == user.InvalidParamterErr {
         resp := errorresp.BadRequest(err) // 400
         render.Render(w,r,resp)
      } else if err == user.SessionExpiredErr {
         resp := errorresp.Unauthorized(err) // 401
         render.Render(w,r,resp)
      }
   }
   ...
}

/// Wrap go error type then render as an error response
func HelloEndpoint(w http.ResponseWriter, r *http.Request) {
 if err := json.NewDecoder(r.Body).Decode(&requestBody); err != nil {
		wrappedErr := codederrors.Wrap(err, "-1", "something went wrong while decoding request")
		resp := errorresp.InternalServerError(wrappedErr)
		render.Render(w, r, resp)
		return
	}
}

Rendering Responses

import (
    ...
    "github.com/Alter17Ego/generic-http/responses"
)

type HelloResponse struct {
	*responses.StatusCodedResponse
	Message string `json:"message"`
}

func newHelloResponse(msg string) *HelloResponse {
	return &HelloResponse{Message: msg, StatusCodedResponse: responses.New(200)}
}

func HelloEndpoint(w http.ResponseWriter, r *http.Request) {
	var requestBody HelloRequest
    ...
	render.Render(w, r, newHelloResponse(fmt.Sprint("Hello", " ", requestBody.Name)))
	return
}

Rate limiter

Use pre defined config

import (
	...
	"github.com/Alter17Ego/generic-http/limiter"
)

func main() {
	router := chi.NewRouter()

	router.Use(limiter.NewChiMiddleware(limiter.
		New(&limiter.
			Setting{
			ExpirationIn:         time.Hour,
			MaxRequestsPerSecond: 1, // limit request to 1 rps
		},
			limiter.UseProductionConfig())))

	router.Post("/hello", HelloEndpoint)
	router.Post("/hello2", HelloEndpoint)
	http.ListenAndServe(":8080", router)
}

Customizing via setter

import (
	...
	"github.com/Alter17Ego/generic-http/limiter"
)

func main() {
	router := chi.NewRouter()

	router.Use(limiter.NewChiMiddleware(limiter.
		New(&limiter.
			Setting{
			ExpirationIn:         time.Hour,
			MaxRequestsPerSecond: 1, // limit request to 1 rps
		},
            //manually config via setter
			limiter.UseProxyIpLookups(),
            limiter.Use...
            )))

	router.Post("/hello", HelloEndpoint)
	router.Post("/hello2", HelloEndpoint)
	http.ListenAndServe(":8080", router)
}

Injecting tollbolt

import (
	...
	"github.com/Alter17Ego/generic-http/limiter"
)

...
    router := chi.NewRouter()
    tollboltLimitter := limitter.New(...)
    ...
	router.Use(limiter.NewChiMiddleware(tollboltLimitter))

	router.Post("/hello", HelloEndpoint)
	router.Post("/hello2", HelloEndpoint)
	http.ListenAndServe(":8080", router)

# Packages

No description provided by the author
No description provided by the author