Files
mps/context.go
telanflow 1b6a370f99 init
2020-08-09 02:38:46 +08:00

101 lines
2.3 KiB
Go

package mps
import (
"context"
"crypto/tls"
"net/http"
)
type Context struct {
Context context.Context
Request *http.Request
Response *http.Response
Transport *http.Transport
// In some cases it is not always necessary to remove the Proxy Header.
// For example, cascade proxy
KeepHeader bool
// KeepDestinationHeaders indicates the proxy should retain any headers
// present in the http.Response before proxying
KeepDestinationHeaders bool
// requests Middleware
mi int
middlewares []Middleware
}
func NewContext() *Context {
return &Context{
Context: context.Background(),
Transport: &http.Transport{
//DialContext: (&net.Dialer{
// Timeout: 15 * time.Second,
// KeepAlive: 30 * time.Second,
// DualStack: true,
//}).DialContext,
////ForceAttemptHTTP2: true,
//MaxIdleConns: 100,
//IdleConnTimeout: 90 * time.Second,
//TLSHandshakeTimeout: 10 * time.Second,
//ExpectContinueTimeout: 1 * time.Second,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
Proxy: http.ProxyFromEnvironment,
},
Request: nil,
Response: nil,
KeepHeader: false,
KeepDestinationHeaders: false,
mi: -1,
middlewares: make([]Middleware, 0),
}
}
func (ctx *Context) Use(middleware ...Middleware) {
if ctx.middlewares == nil {
ctx.middlewares = make([]Middleware, 0)
}
ctx.middlewares = append(ctx.middlewares, middleware...)
}
func (ctx *Context) UseFunc(fns ...MiddlewareFunc) {
if ctx.middlewares == nil {
ctx.middlewares = make([]Middleware, 0)
}
for _, fn := range fns {
ctx.middlewares = append(ctx.middlewares, fn)
}
}
func (ctx *Context) Next(req *http.Request) (*http.Response, error) {
var (
err error
total = len(ctx.middlewares)
)
ctx.mi++
if ctx.mi >= total {
ctx.mi = -1
return ctx.Transport.RoundTrip(req)
}
middleware := ctx.middlewares[ctx.mi]
ctx.Response, err = middleware.Handle(req, ctx)
ctx.mi = -1
return ctx.Response, err
}
func (ctx *Context) Copy() *Context {
return &Context{
Context: context.Background(),
Request: nil,
Response: nil,
KeepHeader: false,
KeepDestinationHeaders: false,
Transport: ctx.Transport,
mi: -1,
middlewares: ctx.middlewares,
}
}