Skip to content

Latest commit

 

History

History
81 lines (63 loc) · 2.68 KB

README.md

File metadata and controls

81 lines (63 loc) · 2.68 KB

mediary

Go Report Card Coverage Status Build Status Go package dev

Add interceptors to http.Client and you will be able to

  • Dump request and/or response to a Log
  • Alter your requests before they are sent or responses before they are returned
  • Add Tracing information using Opentracing/Jaeger
  • Send metrics to statsd

All this and more while using a "regular" http.Client

Usage

var client *http.Client
client = mediary.Init().AddInterceptors(your interceptor).Build()
client.Get("https://golang.org")

Dump Example

client := mediary.Init().AddInterceptors(dumpInterceptor).Build()
client.Get("https://golang.org")

func dumpInterceptor(req *http.Request, handler mediary.Handler) (*http.Response, error) {
	if bytes, err := httputil.DumpRequestOut(req, true); err == nil {
		fmt.Printf("%s", bytes)

		//GET / HTTP/1.1
		//Host: golang.org
		//User-Agent: Go-http-client/1.1
		//Accept-Encoding: gzip
	}
	return handler(req)
}

Interceptor

Interceptor is a function

type Interceptor func(*http.Request, Handler) (*http.Response, error)

Handler is just an alias to http.Roundtripper function called RoundTrip

type Handler func(*http.Request) (*http.Response, error)

Multiple interceptors

It's possible to chain interceptors

client := mediary.Init().
    AddInterceptors(First Interceptor, Second Interceptor).
    AddInterceptors(Third Interceptor).
    Build()

This is how it actually works

  • First Intereptor: Request
    • Second Interceptor: Request
      • Third Interceptor: Request
        • Handler <-- Actual http call
      • Third Interceptor: Response
    • Second Interceptor: Response
  • First Interceptor: Response

Using custom client/transport

If you already have a pre-configured http.Client you can use it as well

yourClient := &http.Client{}
yourClientWithInterceptor := mediary.Init().
    WithPreconfiguredClient(yourClient).
    AddInterceptors(your interceptor).
    Build()

Read this for more information