insrequester

package
v0.11.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 15, 2025 License: Apache-2.0 Imports: 14 Imported by: 3

README

Requester Package

The insrequester package is designed to provide a resilient way to make HTTP requests while incorporating various features like retry, circuit breaking, and timeout handling. This package aims to simplify the process of making HTTP requests by handling common scenarios like network failures, high request loads, and service timeouts, all while providing a clean and flexible API for integrating into your codebase.

Usage in Apps

import (
    "github.com/useinsider/go-pkg/insrequester"
)
Creating a Requester

To create a new instance of the Requester, you can use the NewRequester() function:

requester := insrequester.NewRequester()
Making a Request

The Requester interface provides methods for making various HTTP requests, such as GET, POST, PUT, and DELETE. Here's an example of making a GET request:

requestEntity := insrequester.RequestEntity{
    Endpoint: "https://api.example.com/resource",
}

response, err := requester.Get(requestEntity)
if err != nil {
    // Handle the error
} else {
    // Process the response
}
Adding Resilience Features
Retry

You can add retry functionality to your requests by chaining the WithRetry method to the Requester:

retryConfig := insrequester.RetryConfig{
    WaitBase: time.Millisecond * 200,
    Times:    3,
}
requester.WithRetry(retryConfig)
Circuit Breaker

To implement a circuit breaker pattern, use the WithCircuitbreaker method:

circuitBreakerConfig := insrequester.CircuitBreakerConfig{
    MinimumRequestToOpen:         3,
    SuccessfulRequiredOnHalfOpen: 1,
    WaitDurationInOpenState:      5 * time.Second,
}

requester.WithCircuitbreaker(circuitBreakerConfig)
Timeout

For setting a timeout on requests, you can utilize the WithTimeout method:

timeout := 30 * time.Duration
requester.WithTimeout(timeout) // this timeout overrides the default timeout
Default Headers

For applying default headers to all requests, you can use the WithDefaultHeaders method:

headers := insrequester.Headers{{"Authorization": "Bearer token"}}
requester.WithHeaders(headers)

It should be noted that you can still override these default headers by providing the same header in the request entity.

Loading Middlewares

After configuring the desired resilience features, load the configured middlewares using the Load method:

requester.Load()

Documentation

Overview

Package insrequester is a generated GoMock package.

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrCircuitBreakerOpen = errors.New("circuit breaker is open")
	ErrTimeout            = errors.New("timeout")

	ErrRetryable   = errors.New("retryable error")
	ErrReadingBody = errors.New("error reading body")
)

Functions

This section is empty.

Types

type CircuitBreakerConfig

type CircuitBreakerConfig struct {
	MinimumRequestToOpen         int
	SuccessfulRequiredOnHalfOpen int
	WaitDurationInOpenState      time.Duration
}

type Headers

type Headers []map[string]interface{}

type MockRequester

type MockRequester struct {
	// contains filtered or unexported fields
}

MockRequester is a mock of Requester interface.

func NewMockRequester

func NewMockRequester(ctrl *gomock.Controller) *MockRequester

NewMockRequester creates a new mock instance.

func (*MockRequester) Delete

func (m *MockRequester) Delete(re RequestEntity) (*http.Response, error)

Delete mocks base method.

func (*MockRequester) EXPECT

EXPECT returns an object that allows the caller to indicate expected use.

func (*MockRequester) Get

Get mocks base method.

func (*MockRequester) Load

func (m *MockRequester) Load() *Request

Load mocks base method.

func (*MockRequester) Post

func (m *MockRequester) Post(re RequestEntity) (*http.Response, error)

Post mocks base method.

func (*MockRequester) Put

Put mocks base method.

func (*MockRequester) WithCircuitbreaker

func (m *MockRequester) WithCircuitbreaker(config CircuitBreakerConfig) *Request

WithCircuitbreaker mocks base method.

func (*MockRequester) WithHeaders

func (m *MockRequester) WithHeaders(headers Headers) *Request

WithHeaders mocks base method.

func (*MockRequester) WithRetry

func (m *MockRequester) WithRetry(config RetryConfig) *Request

WithRetry mocks base method.

func (*MockRequester) WithTimeout

func (m *MockRequester) WithTimeout(timeout time.Duration) *Request

WithTimeout mocks base method.

type MockRequesterMockRecorder

type MockRequesterMockRecorder struct {
	// contains filtered or unexported fields
}

MockRequesterMockRecorder is the mock recorder for MockRequester.

func (*MockRequesterMockRecorder) Delete

func (mr *MockRequesterMockRecorder) Delete(re interface{}) *gomock.Call

Delete indicates an expected call of Delete.

func (*MockRequesterMockRecorder) Get

func (mr *MockRequesterMockRecorder) Get(re interface{}) *gomock.Call

Get indicates an expected call of Get.

func (*MockRequesterMockRecorder) Load

Load indicates an expected call of Load.

func (*MockRequesterMockRecorder) Post

func (mr *MockRequesterMockRecorder) Post(re interface{}) *gomock.Call

Post indicates an expected call of Post.

func (*MockRequesterMockRecorder) Put

func (mr *MockRequesterMockRecorder) Put(re interface{}) *gomock.Call

Put indicates an expected call of Put.

func (*MockRequesterMockRecorder) WithCircuitbreaker

func (mr *MockRequesterMockRecorder) WithCircuitbreaker(config interface{}) *gomock.Call

WithCircuitbreaker indicates an expected call of WithCircuitbreaker.

func (*MockRequesterMockRecorder) WithHeaders

func (mr *MockRequesterMockRecorder) WithHeaders(headers interface{}) *gomock.Call

WithHeaders indicates an expected call of WithHeaders.

func (*MockRequesterMockRecorder) WithRetry

func (mr *MockRequesterMockRecorder) WithRetry(config interface{}) *gomock.Call

WithRetry indicates an expected call of WithRetry.

func (*MockRequesterMockRecorder) WithTimeout

func (mr *MockRequesterMockRecorder) WithTimeout(timeout interface{}) *gomock.Call

WithTimeout indicates an expected call of WithTimeout.

type Request

type Request struct {
	// contains filtered or unexported fields
}

func (*Request) Delete

func (r *Request) Delete(re RequestEntity) (*http.Response, error)

Delete sends HTTP put request to the given endpoint and returns *http.Response and an error.

func (*Request) Get

func (r *Request) Get(re RequestEntity) (*http.Response, error)

Get sends HTTP get request to the given endpoint and returns *http.Response and an error.

func (*Request) Load

func (r *Request) Load() *Request

func (*Request) Post

func (r *Request) Post(re RequestEntity) (*http.Response, error)

Post sends HTTP post request to the given endpoint and returns *http.Response and an error.

func (*Request) Put

func (r *Request) Put(re RequestEntity) (*http.Response, error)

Put sends HTTP put request to the given endpoint and returns *http.Response and an error.

func (*Request) WithCircuitbreaker

func (r *Request) WithCircuitbreaker(config CircuitBreakerConfig) *Request

func (*Request) WithHeaders

func (r *Request) WithHeaders(headers Headers) *Request

func (*Request) WithRetry

func (r *Request) WithRetry(config RetryConfig) *Request

func (*Request) WithTimeout

func (r *Request) WithTimeout(timeout time.Duration) *Request

type RequestEntity

type RequestEntity struct {
	Headers  Headers
	Endpoint string
	Body     []byte
}

RequestEntity contains required information for sending http request.

type Requester

type Requester interface {
	Get(re RequestEntity) (*http.Response, error)
	Post(re RequestEntity) (*http.Response, error)
	Put(re RequestEntity) (*http.Response, error)
	Delete(re RequestEntity) (*http.Response, error)
	WithRetry(config RetryConfig) *Request
	WithCircuitbreaker(config CircuitBreakerConfig) *Request
	WithTimeout(timeout time.Duration) *Request
	WithHeaders(headers Headers) *Request
	Load() *Request
}

Requester represent the package structure, with creating exactly the same interface your own codebase you can easily mock the functions inside this package while writing unit tests.

func NewRequester

func NewRequester() Requester

NewRequester ...

type RetryConfig

type RetryConfig struct {
	WaitBase time.Duration
	Times    int
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL