Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions core/restc/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package restc

import (
"net/http"
"sync"
"time"
)

type Client interface {
Verb(verb string) *Request
SetHeader(headers http.Header)
}

type Opt func(client *client) error

type client struct {
lock *sync.RWMutex
addr string

retryTimes int
retryDelay time.Duration

headers http.Header

// Set specific behavior of the client. If not set http.DefaultClient will be used.
client *http.Client

// middleware
beforeRequest []RequestMiddleware
}

func (c *client) SetHeader(headers http.Header) {
c.headers = headers
}

type RequestMiddleware func(Client, *Request) error

func (c *client) requestMiddlewares() []RequestMiddleware {
c.lock.RLock()
defer c.lock.RUnlock()
return c.beforeRequest
}

func (c *client) executeRequestMiddlewares(req *Request) (err error) {
for _, f := range c.requestMiddlewares() {
if err = f(c, req); err != nil {
return err
}
}
return nil
}

func (c *client) Verb(verb string) *Request {
return NewRequest(c).Verb(verb)
}

func NewClient(addr string, ops ...Opt) (Client, error) {
c := &client{
lock: &sync.RWMutex{},
addr: addr,
}

for _, op := range ops {
if err := op(c); err != nil {
return nil, err
}
}

if c.client == nil {
c.client = &http.Client{}
}
if c.headers == nil {
c.headers = make(http.Header)
}
return c, nil
}
43 changes: 43 additions & 0 deletions core/restc/option.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package restc

import (
"net/http"
"time"
)

func WithHeaders(headers http.Header) Opt {
return func(c *client) error {
c.headers = headers
return nil
}
}

func WithRetryTimes(times int) Opt {
return func(c *client) error {
c.retryTimes = times
return nil
}
}

func WithRetryDelay(time time.Duration) Opt {
return func(c *client) error {
c.retryDelay = time
return nil
}
}

func WithClient(c *http.Client) Opt {
return func(client *client) error {
client.client = c
return nil
}
}

func WithRequestMiddleware(middleware RequestMiddleware) Opt {
return func(c *client) error {
c.lock.Lock()
defer c.lock.Unlock()
c.beforeRequest = append(c.beforeRequest, middleware)
return nil
}
}
Loading
Loading