transporter

package module
v0.0.1 Latest Latest
Warning

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

Go to latest
Published: Jun 7, 2022 License: MIT Imports: 1 Imported by: 0

README

go-http-default-request-header-transporter .github/workflows/check.yml codecov Go Reference

A utility http.Transport to inject the given default request header.

Synopsis

import (
	"http"
	"time"

	"github.com/moznion/go-http-default-request-header-transporter"
)

func main() {
	defaultHeader := http.Header{}
	defaultHeader.Set("user-agent", "custom-UA/0.0.1")
	defaultHeader.Add("x-test", "foo")
	defaultHeader.Add("x-test", "bar")

	hc := &http.Client{}
	hc.Timeout = 3 * time.Second
	hc.Transport = transporter.NewDefaultRequestHeaderTransporter(hc.Transport, defaultHeader)
	resp, err := hc.Get(httpURL) // <= this request header has the values of `defaultHeader`
}

Please also refer to the examples_test.go.

Documentations

Go Reference

Author

moznion (moznion@mail.moznion.net)

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type DefaultRequestHeaderTransporter

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

DefaultRequestHeaderTransporter is a utility http.Transport to inject the default request header.

func NewDefaultRequestHeaderTransporter

func NewDefaultRequestHeaderTransporter(originalTransporter http.RoundTripper, header http.Header) *DefaultRequestHeaderTransporter

NewDefaultRequestHeaderTransporter makes a new instance of DefaultRequestHeaderTransporter. Created DefaultRequestHeaderTransporter injects given header value into every requests' header. If given originalTransporter is nil, it uses http.DefaultTransport instead.

func (*DefaultRequestHeaderTransporter) RoundTrip

RoundTrip inherits the original transporter's RoundTrip with injecting the default header values.

Example
listenerPortCh := make(chan int)

mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
	// output custom default request header values
	for _, h := range r.Header.Values("user-agent") {
		fmt.Printf("%s\n", h)
	}
	for _, h := range r.Header.Values("x-test") {
		fmt.Printf("%s\n", h)
	}

	w.WriteHeader(200)
})

server := &http.Server{
	Handler: mux,
}

go func(server *http.Server) {
	listener, err := net.Listen("tcp", ":0")
	if err != nil {
		log.Fatal(err)
	}

	listenerPortCh <- listener.Addr().(*net.TCPAddr).Port

	err = server.Serve(listener)
	if err != nil {
		log.Printf("server shutdown: %s", err)
	}
}(server)
defer func() {
	err := server.Shutdown(context.Background())
	if err != nil {
		log.Printf("[error] failed to shutdown the http server: %s", err)
	}
}()

port := <-listenerPortCh
httpURL := fmt.Sprintf("http://127.0.0.1:%d", port)

defaultHeader := http.Header{}
defaultHeader.Set("user-agent", "custom-UA/0.0.1")
defaultHeader.Add("x-test", "foo")
defaultHeader.Add("x-test", "bar")

hc := &http.Client{}
hc.Timeout = 3 * time.Second
hc.Transport = NewDefaultRequestHeaderTransporter(hc.Transport, defaultHeader)
resp, err := hc.Get(httpURL)
if err != nil {
	log.Fatal(err)
}
_, _ = io.Copy(io.Discard, resp.Body)
_ = resp.Body.Close()
Output:

custom-UA/0.0.1
foo
bar

Jump to

Keyboard shortcuts

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